sleep cycle mode (experimental)

This commit is contained in:
Klaus K Wilting 2020-12-04 17:32:10 +01:00
parent 40a1ef1e08
commit 04a055b329
6 changed files with 34 additions and 11 deletions

View File

@ -515,6 +515,11 @@ Send for example `8386` as Downlink on Port 2 to get battery status and time/dat
0 = disabled [default] 0 = disabled [default]
1 = enabled 1 = enabled
0x19 set sleep cycle
0 ... 255 device sleep cycle in seconds/2
e.g. 120 -> device sleeps 240 seconds after each send cycle [default = 0]
0x80 get device configuration 0x80 get device configuration
Device answers with it's current configuration on Port 3. Device answers with it's current configuration on Port 3.

View File

@ -84,6 +84,7 @@ typedef struct __attribute__((packed)) {
uint8_t countermode; // 0=cyclic unconfirmed, 1=cumulative, 2=cyclic confirmed uint8_t countermode; // 0=cyclic unconfirmed, 1=cumulative, 2=cyclic confirmed
int16_t rssilimit; // threshold for rssilimiter, negative value! int16_t rssilimit; // threshold for rssilimiter, negative value!
uint8_t sendcycle; // payload send cycle [seconds/2] uint8_t sendcycle; // payload send cycle [seconds/2]
uint8_t sleepcycle; // sleep cycle [seconds/2]
uint8_t wifichancycle; // wifi channel switch cycle [seconds/100] uint8_t wifichancycle; // wifi channel switch cycle [seconds/100]
uint8_t blescantime; // BLE scan cycle duration [seconds] uint8_t blescantime; // BLE scan cycle duration [seconds]
uint8_t blescan; // 0=disabled, 1=enabled uint8_t blescan; // 0=disabled, 1=enabled

View File

@ -42,6 +42,7 @@ static void defaultConfig(configData_t *myconfig) {
COUNTERMODE; // 0=cyclic, 1=cumulative, 2=cyclic confirmed COUNTERMODE; // 0=cyclic, 1=cumulative, 2=cyclic confirmed
myconfig->rssilimit = 0; // threshold for rssilimiter, negative value! myconfig->rssilimit = 0; // threshold for rssilimiter, negative value!
myconfig->sendcycle = SENDCYCLE; // payload send cycle [seconds/2] myconfig->sendcycle = SENDCYCLE; // payload send cycle [seconds/2]
myconfig->sleepcycle = SLEEPCYCLE; // sleep cycle [seconds/2]
myconfig->wifichancycle = myconfig->wifichancycle =
WIFI_CHANNEL_SWITCH_INTERVAL; // wifi channel switch cycle [seconds/100] WIFI_CHANNEL_SWITCH_INTERVAL; // wifi channel switch cycle [seconds/100]
myconfig->blescantime = myconfig->blescantime =

View File

@ -54,6 +54,12 @@ void set_sendcycle(uint8_t val[]) {
cfg.sendcycle * 2); cfg.sendcycle * 2);
} }
void set_sleepcycle(uint8_t val[]) {
cfg.sleepcycle = val[0];
ESP_LOGI(TAG, "Remote command: set sleep cycle to %d seconds",
cfg.sleepcycle * 2);
}
void set_wifichancycle(uint8_t val[]) { void set_wifichancycle(uint8_t val[]) {
cfg.wifichancycle = val[0]; cfg.wifichancycle = val[0];
// update Wifi channel rotation timer period // update Wifi channel rotation timer period
@ -365,10 +371,11 @@ static const cmd_t table[] = {
{0x13, set_sensor, 2, true}, {0x14, set_payloadmask, 1, true}, {0x13, set_sensor, 2, true}, {0x14, set_payloadmask, 1, true},
{0x15, set_bme, 1, true}, {0x16, set_batt, 1, true}, {0x15, set_bme, 1, true}, {0x16, set_batt, 1, true},
{0x17, set_wifiscan, 1, true}, {0x18, set_enscount, 1, true}, {0x17, set_wifiscan, 1, true}, {0x18, set_enscount, 1, true},
{0x80, get_config, 0, false}, {0x81, get_status, 0, false}, {0x19, set_sleepcycle, 1, true}, {0x80, get_config, 0, false},
{0x83, get_batt, 0, false}, {0x84, get_gps, 0, false}, {0x81, get_status, 0, false}, {0x83, get_batt, 0, false},
{0x85, get_bme, 0, false}, {0x86, get_time, 0, false}, {0x84, get_gps, 0, false}, {0x85, get_bme, 0, false},
{0x87, set_time, 0, false}, {0x99, set_flush, 0, false}}; {0x86, get_time, 0, false}, {0x87, set_time, 0, false},
{0x99, set_flush, 0, false}};
static const uint8_t cmdtablesize = static const uint8_t cmdtablesize =
sizeof(table) / sizeof(table[0]); // number of commands in command table sizeof(table) / sizeof(table[0]); // number of commands in command table

View File

@ -69,12 +69,12 @@ void enter_deepsleep(const int wakeup_sec, const gpio_num_t wakeup_gpio) {
if ((!wakeup_sec) && (!wakeup_gpio) && (RTC_runmode == RUNMODE_NORMAL)) if ((!wakeup_sec) && (!wakeup_gpio) && (RTC_runmode == RUNMODE_NORMAL))
return; return;
// assure LMIC is in safe state // wait until LMIC is in safe state before going to sleep
#if (HAS_LORA) #if (HAS_LORA)
if (os_queryTimeCriticalJobs(ms2osticks(10000))) while (os_queryTimeCriticalJobs(ms2osticks(wakeup_sec * 1000)))
return; vTaskDelay(pdMS_TO_TICKS(100));
// to be done: save LoRaWAN channel configuration here // to be done: save current LoRaWAN configuration here
#endif #endif
@ -99,10 +99,15 @@ void enter_deepsleep(const int wakeup_sec, const gpio_num_t wakeup_gpio) {
dp_shutdown(); dp_shutdown();
#endif #endif
// switch off wifi & ble /*
// switch off radio
#if (BLECOUNTER) #if (BLECOUNTER)
stop_BLEscan(); btStop();
#endif #endif
#if (WIFICOUNTER)
switch_wifi_sniffer(0);
#endif
*/
// reduce power if has PMU // reduce power if has PMU
#ifdef HAS_PMU #ifdef HAS_PMU

View File

@ -188,6 +188,10 @@ void sendData() {
mask <<= 1; mask <<= 1;
} // while (bitmask) } // while (bitmask)
// goto sleep if we have a sleep cycle
if ((cfg.sleepcycle) && (RTC_runmode == RUNMODE_NORMAL))
enter_deepsleep(cfg.sleepcycle * 2, HAS_BUTTON);
} // sendData() } // sendData()
void flushQueues() { void flushQueues() {