@@ -62,8 +62,15 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
6262 file.read ((uint8_t *)&_prefs->bridge_delay , sizeof (_prefs->bridge_delay )); // 128
6363 file.read ((uint8_t *)&_prefs->bridge_pkt_src , sizeof (_prefs->bridge_pkt_src )); // 130
6464 file.read ((uint8_t *)&_prefs->bridge_baud , sizeof (_prefs->bridge_baud )); // 131
65- file.read ((uint8_t *)&_prefs->bridge_channel , sizeof (_prefs->bridge_channel )); // 132
66- file.read ((uint8_t *)&_prefs->bridge_secret , sizeof (_prefs->bridge_secret )); // 133
65+ file.read ((uint8_t *)&_prefs->bridge_channel , sizeof (_prefs->bridge_channel )); // 135
66+ file.read ((uint8_t *)&_prefs->bridge_secret , sizeof (_prefs->bridge_secret )); // 136
67+ file.read (pad, 4 ); // 152
68+ file.read ((uint8_t *)&_prefs->gps_enabled , sizeof (_prefs->gps_enabled )); // 156
69+ file.read ((uint8_t *)&_prefs->gps_interval , sizeof (_prefs->gps_interval )); // 157
70+ if (file.read ((uint8_t *)&_prefs->advert_loc_policy , sizeof (_prefs->advert_loc_policy )) == -1 ) {
71+ _prefs->advert_loc_policy = ADVERT_LOC_PREFS; // default value
72+ } // 161
73+ // 162
6774
6875 // sanitise bad pref values
6976 _prefs->rx_delay_base = constrain (_prefs->rx_delay_base , 0 , 20 .0f );
@@ -84,6 +91,9 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
8491 _prefs->bridge_baud = constrain (_prefs->bridge_baud , 9600 , 115200 );
8592 _prefs->bridge_channel = constrain (_prefs->bridge_channel , 0 , 14 );
8693
94+ _prefs->gps_enabled = constrain (_prefs->gps_enabled , 0 , 1 );
95+ _prefs->advert_loc_policy = constrain (_prefs->advert_loc_policy , 0 , 2 );
96+
8797 file.close ();
8898 }
8999}
@@ -131,8 +141,13 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
131141 file.write ((uint8_t *)&_prefs->bridge_delay , sizeof (_prefs->bridge_delay )); // 128
132142 file.write ((uint8_t *)&_prefs->bridge_pkt_src , sizeof (_prefs->bridge_pkt_src )); // 130
133143 file.write ((uint8_t *)&_prefs->bridge_baud , sizeof (_prefs->bridge_baud )); // 131
134- file.write ((uint8_t *)&_prefs->bridge_channel , sizeof (_prefs->bridge_channel )); // 132
135- file.write ((uint8_t *)&_prefs->bridge_secret , sizeof (_prefs->bridge_secret )); // 133
144+ file.write ((uint8_t *)&_prefs->bridge_channel , sizeof (_prefs->bridge_channel )); // 135
145+ file.write ((uint8_t *)&_prefs->bridge_secret , sizeof (_prefs->bridge_secret )); // 136
146+ file.write (pad, 4 ); // 152
147+ file.write ((uint8_t *)&_prefs->gps_enabled , sizeof (_prefs->gps_enabled )); // 156
148+ file.write ((uint8_t *)&_prefs->gps_interval , sizeof (_prefs->gps_interval )); // 157
149+ file.write ((uint8_t *)&_prefs->advert_loc_policy , sizeof (_prefs->advert_loc_policy )); // 161
150+ // 162
136151
137152 file.close ();
138153 }
@@ -504,6 +519,126 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
504519 sprintf (reply, " %s (Build: %s)" , _callbacks->getFirmwareVer (), _callbacks->getBuildDate ());
505520 } else if (memcmp (command, " board" , 5 ) == 0 ) {
506521 sprintf (reply, " %s" , _board->getManufacturerName ());
522+ } else if (memcmp (command, " sensor get " , 11 ) == 0 ) {
523+ const char * key = command + 11 ;
524+ const char * val = sensors.getSettingByKey (key);
525+ if (val != NULL ) {
526+ sprintf (reply, " > %s" , val);
527+ } else {
528+ strcpy (reply, " null" );
529+ }
530+ } else if (memcmp (command, " sensor set " , 11 ) == 0 ) {
531+ strcpy (tmp, &command[11 ]);
532+ const char *parts[2 ];
533+ int num = mesh::Utils::parseTextParts (tmp, parts, 2 , ' ' );
534+ const char *key = (num > 0 ) ? parts[0 ] : " " ;
535+ const char *value = (num > 1 ) ? parts[1 ] : " null" ;
536+ if (sensors.setSettingByKey (key, value)) {
537+ strcpy (reply, " ok" );
538+ } else {
539+ strcpy (reply, " can't find custom var" );
540+ }
541+ } else if (memcmp (command, " sensor list" , 11 ) == 0 ) {
542+ char * dp = reply;
543+ int start = 0 ;
544+ int end = sensors.getNumSettings ();
545+ if (strlen (command) > 11 ) {
546+ start = _atoi (command+12 );
547+ }
548+ if (start >= end) {
549+ strcpy (reply, " no custom var" );
550+ } else {
551+ sprintf (dp, " %d vars\n " , end);
552+ dp = strchr (dp, 0 );
553+ int i;
554+ for (i = start; i < end && (dp-reply < 134 ); i++) {
555+ sprintf (dp, " %s=%s\n " ,
556+ sensors.getSettingName (i),
557+ sensors.getSettingValue (i));
558+ dp = strchr (dp, 0 );
559+ }
560+ if (i < end) {
561+ sprintf (dp, " ... next:%d" , i);
562+ } else {
563+ *(dp-1 ) = 0 ; // remove last CR
564+ }
565+ }
566+ #if ENV_INCLUDE_GPS == 1
567+ } else if (memcmp (command, " gps on" , 6 ) == 0 ) {
568+ if (sensors.setSettingByKey (" gps" , " 1" )) {
569+ _prefs->gps_enabled = 1 ;
570+ savePrefs ();
571+ strcpy (reply, " ok" );
572+ } else {
573+ strcpy (reply, " gps toggle not found" );
574+ }
575+ } else if (memcmp (command, " gps off" , 7 ) == 0 ) {
576+ if (sensors.setSettingByKey (" gps" , " 0" )) {
577+ _prefs->gps_enabled = 0 ;
578+ savePrefs ();
579+ strcpy (reply, " ok" );
580+ } else {
581+ strcpy (reply, " gps toggle not found" );
582+ }
583+ } else if (memcmp (command, " gps sync" , 8 ) == 0 ) {
584+ LocationProvider * l = sensors.getLocationProvider ();
585+ if (l != NULL ) {
586+ l->syncTime ();
587+ }
588+ } else if (memcmp (command, " gps setloc" , 10 ) == 0 ) {
589+ _prefs->node_lat = sensors.node_lat ;
590+ _prefs->node_lon = sensors.node_lon ;
591+ savePrefs ();
592+ strcpy (reply, " ok" );
593+ } else if (memcmp (command, " gps advert" , 10 ) == 0 ) {
594+ if (strlen (command) == 10 ) {
595+ switch (_prefs->advert_loc_policy ) {
596+ case ADVERT_LOC_NONE:
597+ strcpy (reply, " > none" );
598+ break ;
599+ case ADVERT_LOC_PREFS:
600+ strcpy (reply, " > prefs" );
601+ break ;
602+ case ADVERT_LOC_SHARE:
603+ strcpy (reply, " > share" );
604+ break ;
605+ default :
606+ strcpy (reply, " error" );
607+ }
608+ } else if (memcmp (command+11 , " none" , 4 ) == 0 ) {
609+ _prefs->advert_loc_policy = ADVERT_LOC_NONE;
610+ savePrefs ();
611+ strcpy (reply, " ok" );
612+ } else if (memcmp (command+11 , " share" , 5 ) == 0 ) {
613+ _prefs->advert_loc_policy = ADVERT_LOC_SHARE;
614+ savePrefs ();
615+ strcpy (reply, " ok" );
616+ } else if (memcmp (command+11 , " prefs" , 4 ) == 0 ) {
617+ _prefs->advert_loc_policy = ADVERT_LOC_PREFS;
618+ savePrefs ();
619+ strcpy (reply, " ok" );
620+ } else {
621+ strcpy (reply, " error" );
622+ }
623+ } else if (memcmp (command, " gps" , 3 ) == 0 ) {
624+ LocationProvider * l = sensors.getLocationProvider ();
625+ if (l != NULL ) {
626+ bool enabled = l->isEnabled (); // is EN pin on ?
627+ bool fix = l->isValid (); // has fix ?
628+ int sats = l->satellitesCount ();
629+ bool active = !strcmp (sensors.getSettingByKey (" gps" ), " 1" );
630+ if (enabled) {
631+ sprintf (reply, " on, %s, %s, %d sats" ,
632+ active?" active" :" deactivated" ,
633+ fix?" fix" :" no fix" ,
634+ sats);
635+ } else {
636+ strcpy (reply, " off" );
637+ }
638+ } else {
639+ strcpy (reply, " Can't find GPS" );
640+ }
641+ #endif
507642 } else if (memcmp (command, " log start" , 9 ) == 0 ) {
508643 _callbacks->setLoggingOn (true );
509644 strcpy (reply, " logging on" );
0 commit comments