bool ilka_save(struct ilka_region *r) { return persist_save(&r->persist); }
static void ICACHE_FLASH_ATTR timer_fn(void *timer_data) { uint32_t delay = MAX_LOOP_TIMER_MS; os_timer_disarm(&timer); PRINTF("state: %d\n\r", state); switch(state) { case STATE_LOAD_PERSIST: if(persist_load()) { PRINTF("persist data sensor value: %d\r\n", persist_data_ptr()->sensor_value); PRINTF("persist data sensor poll count: %d\r\n", persist_data_ptr()->poll_counter); state = STATE_HF_READ; persist_data_ptr()->poll_counter += 1; if(persist_data_ptr()->poll_counter >= 10) { // read low-frequency sensor (temp etc) persist_data_ptr()->poll_counter = 0; } persist_dirty(); } else { PRINTF("err loading persist\r\n"); // todo: goto error state (blink led?) state = STATE_IDLE; } delay = MIN_LOOP_TIMER_MS; break; case STATE_INIT_PERSIST: persist_init(); state = STATE_HF_READ; delay = MIN_LOOP_TIMER_MS; break; case STATE_HF_READ: state = STATE_LF_READ; if(GPIO_INPUT_GET(GPIO_SWITCH)) { if(!(persist_data_ptr()->sensor_value)) { persist_data_ptr()->sensor_value = true; persist_dirty(); state = STATE_HF_WIFI_CONNECT; } } else { if(persist_data_ptr()->sensor_value) { persist_data_ptr()->sensor_value = false; persist_dirty(); state = STATE_HF_WIFI_CONNECT; } } break; case STATE_HF_WIFI_CONNECT: if(wifi_station_get_connect_status()==STATION_GOT_IP) { state = STATE_HF_SEND; } else { wifi_connect(); state = STATE_HF_WIFI_WAIT; } break; case STATE_HF_WIFI_WAIT: if(wifi_station_get_connect_status()==STATION_GOT_IP) { state = STATE_HF_SEND; } break; case STATE_HF_SEND: state = STATE_HF_SEND_WAIT; break; case STATE_HF_SEND_WAIT: state = STATE_LF_READ; break; case STATE_LF_READ: state = STATE_LF_WIFI_CONNECT; break; case STATE_LF_WIFI_CONNECT: if(wifi_station_get_connect_status()==STATION_GOT_IP) { state = STATE_LF_SEND; } else { wifi_connect(); state = STATE_LF_WIFI_WAIT; } break; case STATE_LF_WIFI_WAIT: if(wifi_station_get_connect_status()==STATION_GOT_IP) { state = STATE_LF_SEND; } break; case STATE_LF_SEND: state = STATE_LF_SEND_WAIT; break; case STATE_LF_SEND_WAIT: state = STATE_IDLE; break; case STATE_IDLE: // go to deep sleep persist_save(); system_deep_sleep(SLEEP_TIME_US); return; break; default: // uhoh PRINTF("invalid state, reset\n\r"); state = STATE_IDLE; break; } os_timer_setfn(&timer, (os_timer_func_t *)timer_fn, NULL); os_timer_arm(&timer, delay, false); /* case STATE_IDLE: http_get("http://10.1.3.161/text", "", my_http_callback); state = STATE_HTTP_PENDING; timeout = 30; break; case STATE_HTTP_PENDING: timeout--; if(timeout==0) { PRINTF("timeout!\n\r"); state=STATE_IDLE; } else { delay_ms(1000); } break; default: PRINTF("invalid state, reset\n\r"); state=STATE_IDLE; break; } //system_os_post(user_procTaskPrio, 0, 0 ); */ }