|
|
|
#include <esp8266.h>
|
|
|
|
#include "config.h"
|
|
|
|
#include "serled.h"
|
|
|
|
#include "cgiwifi.h"
|
|
|
|
|
|
|
|
static ETSTimer ledTimer;
|
|
|
|
|
|
|
|
static void ICACHE_FLASH_ATTR setLed(int on) {
|
|
|
|
int8_t pin = flashConfig.conn_led_pin;
|
|
|
|
if (pin < 0) return; // disabled
|
|
|
|
// LED is active-low
|
|
|
|
if (on) {
|
|
|
|
gpio_output_set(0, (1<<pin), (1<<pin), 0);
|
|
|
|
} else {
|
|
|
|
gpio_output_set((1<<pin), 0, (1<<pin), 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static uint8_t ledState = 0;
|
|
|
|
static uint8_t wifiState = 0;
|
|
|
|
|
|
|
|
static void ICACHE_FLASH_ATTR ledTimerCb(void *v) {
|
|
|
|
int time = 1000;
|
|
|
|
|
|
|
|
if (wifiState == wifiGotIP) {
|
|
|
|
// connected, all is good, solid light
|
|
|
|
ledState = 1-ledState;
|
|
|
|
time = ledState ? 2900 : 100;
|
|
|
|
} else if (wifiState == wifiIsConnected) {
|
|
|
|
// waiting for DHCP, go on/off every second
|
|
|
|
ledState = 1 - ledState;
|
|
|
|
time = 1000;
|
|
|
|
} else {
|
|
|
|
// idle
|
|
|
|
switch (wifi_get_opmode()) {
|
|
|
|
case 1: // STA
|
|
|
|
ledState = 0;
|
|
|
|
break;
|
|
|
|
case 2: // AP
|
|
|
|
ledState = 1-ledState;
|
|
|
|
time = ledState ? 50 : 1950;
|
|
|
|
break;
|
|
|
|
case 3: // STA+AP
|
|
|
|
ledState = 1-ledState;
|
|
|
|
time = ledState ? 50 : 950;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
setLed(ledState);
|
|
|
|
os_timer_arm(&ledTimer, time, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
// change the wifi state
|
|
|
|
void ICACHE_FLASH_ATTR statusWifiUpdate(uint8_t state) {
|
|
|
|
wifiState = state;
|
|
|
|
// schedule an update (don't want to run into concurrency issues)
|
|
|
|
os_timer_disarm(&ledTimer);
|
|
|
|
os_timer_setfn(&ledTimer, ledTimerCb, NULL);
|
|
|
|
os_timer_arm(&ledTimer, 500, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ICACHE_FLASH_ATTR statusInit(void) {
|
|
|
|
if (flashConfig.conn_led_pin >= 0) {
|
|
|
|
makeGpio(flashConfig.conn_led_pin);
|
|
|
|
setLed(1);
|
|
|
|
}
|
|
|
|
os_printf("CONN led=%d\n", flashConfig.conn_led_pin);
|
|
|
|
|
|
|
|
os_timer_disarm(&ledTimer);
|
|
|
|
os_timer_setfn(&ledTimer, ledTimerCb, NULL);
|
|
|
|
os_timer_arm(&ledTimer, 2000, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|