Files
TAIXIN/project/wifi_pairled.c

234 lines
6.9 KiB
C
Raw Normal View History

#include "sys_config.h"
#include "typesdef.h"
#include "list.h"
#include "dev.h"
#include "devid.h"
#include "osal/string.h"
#include "osal/semaphore.h"
#include "osal/mutex.h"
#include "osal/irq.h"
#include "osal/work.h"
#include "osal/sleep.h"
#include "osal/timer.h"
#include "hal/gpio.h"
#include "hal/uart.h"
#include "lib/common/common.h"
#include "lib/common/sysevt.h"
#include "lib/heap/sysheap.h"
#include "lib/syscfg/syscfg.h"
#include "lib/lmac/lmac.h"
#include "lib/skb/skbpool.h"
#include "lib/atcmd/libatcmd.h"
#include "lib/bus/xmodem/xmodem.h"
#include "lib/net/skmonitor/skmonitor.h"
#include "lib/net/dhcpd/dhcpd.h"
#include "lib/umac/ieee80211.h"
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/netdb.h"
#include "lwip/sys.h"
#include "lwip/ip_addr.h"
#include "lwip/tcpip.h"
#include "netif/ethernetif.h"
#include "syscfg.h"
/* WiFi配对LED控制 */
#if SYS_WIFI_PAIR_LED
static struct os_work ledctrl_wk;
static struct os_work pairkey_wk;
struct {
uint8 init: 1, last_val: 1, def_val: 1;
} sys_pairctrl;
struct {
uint8 conn: 1, rssi1: 1, rssi2: 1, rssi3: 1, val: 1, init: 1, res: 1, pair: 1;
uint8 wk_delay;
} sys_ledctrl;
static int32 sys_pairkey_val(void)
{
int32 i, v;
int32 v0 = 0, v1 = 0;
for (i = 0; i < 50; i++) {
v = gpio_get_val(WIFI_PAIRKEY_IO);
if (v) {
v1++;
} else {
v0++;
}
}
return (v1 > v0 ? 1 : 0);
}
static int32 sys_pairled_work(struct os_work *work)
{
//init parameters
if ((sys_ledctrl.init) == 0) {
sys_ledctrl.init = 1;
sys_ledctrl.wk_delay = 100;
sys_ledctrl.val = 1;
sys_ledctrl.pair = 0;
gpio_set_dir(WIFI_RSSI_IO1, GPIO_DIR_OUTPUT);
gpio_set_dir(WIFI_RSSI_IO2, GPIO_DIR_OUTPUT);
gpio_set_dir(WIFI_RSSI_IO3, GPIO_DIR_OUTPUT);
gpio_set_val(WIFI_RSSI_IO1, 0);
gpio_set_val(WIFI_RSSI_IO2, 0);
gpio_set_val(WIFI_RSSI_IO3, 0);
}
if (!sys_ledctrl.pair) {
//rssi led show, after connect and stop pair
if (sys_ledctrl.conn) {
gpio_set_val(WIFI_RSSI_IO1, sys_ledctrl.rssi1);
gpio_set_val(WIFI_RSSI_IO2, sys_ledctrl.rssi2);
gpio_set_val(WIFI_RSSI_IO3, sys_ledctrl.rssi3);
} else {
gpio_set_val(WIFI_RSSI_IO1, 0);
gpio_set_val(WIFI_RSSI_IO2, 0);
gpio_set_val(WIFI_RSSI_IO3, 0);
}
} else {
//pair state
gpio_set_val(WIFI_RSSI_IO1, 0);
if (sys_ledctrl.val) {
gpio_set_val(WIFI_RSSI_IO2, 1);
gpio_set_val(WIFI_RSSI_IO3, 0);
} else {
gpio_set_val(WIFI_RSSI_IO2, 0);
gpio_set_val(WIFI_RSSI_IO3, 1);
}
sys_ledctrl.val = !sys_ledctrl.val;
}
os_run_work_delay(&ledctrl_wk, sys_ledctrl.wk_delay);
return 0;
}
static int32 sys_pairkey_work(struct os_work *work)
{
int32 new_val;
if (!sys_pairctrl.init) {
sys_pairctrl.init = 1;
gpio_set_dir(WIFI_PAIRKEY_IO, GPIO_DIR_INPUT);
gpio_set_mode(WIFI_PAIRKEY_IO, GPIO_PULL_UP, GPIO_PULL_LEVEL_4_7K);
new_val = sys_pairkey_val();
sys_pairctrl.def_val = new_val;
sys_pairctrl.last_val = new_val;
} else {
new_val = sys_pairkey_val();
if (new_val != sys_pairctrl.last_val) {
if (new_val == sys_pairctrl.def_val) {
ieee80211_pairing(sys_cfgs.wifi_mode, 0);
} else {
ieee80211_pairing(sys_cfgs.wifi_mode, 1);
}
sys_pairctrl.last_val = new_val;
}
}
os_run_work_delay(&pairkey_wk, 100);
return 0;
}
int32 sys_wifi_event_hdl_pairled(uint8 ifidx, uint16 evt, uint32 param1, uint32 param2)
{
int32 ret = 0;
switch (evt) {
case IEEE80211_EVENT_CONNECTED:
if (!sys_ledctrl.pair) {
sys_ledctrl.conn = 1;
sys_ledctrl.rssi1 = 1;
sys_ledctrl.rssi2 = 1;
sys_ledctrl.rssi3 = 1;
}
break;
case IEEE80211_EVENT_DISCONNECTED:
if (ifidx == WIFI_MODE_STA && !sys_ledctrl.pair) {
sys_ledctrl.conn = 0;
sys_ledctrl.rssi1 = 0;
sys_ledctrl.rssi2 = 0;
sys_ledctrl.rssi3 = 0;
}
break;
case IEEE80211_EVENT_RSSI:
if (ifidx == WIFI_MODE_STA && !sys_ledctrl.pair) {
if ((int8)param1 > -48 && sys_ledctrl.conn) {
sys_ledctrl.rssi1 = 1;
sys_ledctrl.rssi2 = 1;
sys_ledctrl.rssi3 = 1;
} else if ((int8)param1 > -60 && sys_ledctrl.conn) {
sys_ledctrl.rssi1 = 1;
sys_ledctrl.rssi2 = 1;
sys_ledctrl.rssi3 = 0;
} else {
sys_ledctrl.rssi1 = 0;
sys_ledctrl.rssi2 = 0;
sys_ledctrl.rssi3 = 0;
}
}
break;
case IEEE80211_EVENT_INTERFACE_DISABLE:
sys_ledctrl.conn = 0;
sys_ledctrl.rssi1 = 0;
sys_ledctrl.rssi2 = 0;
sys_ledctrl.rssi3 = 0;
break;
case IEEE80211_EVENT_INTERFACE_ENABLE:
//rssi leds show all if mode is AP
if (ifidx == WIFI_MODE_AP) {
sys_ledctrl.conn = 1;
sys_ledctrl.rssi1 = 1;
sys_ledctrl.rssi2 = 1;
sys_ledctrl.rssi3 = 1;
}
break;
//rate of led overturn determined "sys_ledctrl.wk_delay" changes slowly,
case IEEE80211_EVENT_PAIR_START:
sys_ledctrl.pair = 1;
sys_ledctrl.conn = 0;
sys_ledctrl.rssi1 = 0;
sys_ledctrl.rssi2 = 0;
sys_ledctrl.rssi3 = 0;
sys_ledctrl.wk_delay = 255;
break;
//wait for connect done, even though in pairkey lock state.
//rate of led overturn determined "sys_ledctrl.wk_delay" changes fastly,
case IEEE80211_EVENT_PAIR_SUCCESS:
sys_ledctrl.wk_delay = 80;
break;
//wait for pairkey unlock
case IEEE80211_EVENT_PAIR_DONE:
if (ifidx == WIFI_MODE_AP) {
sys_ledctrl.conn = 1;
sys_ledctrl.rssi1 = 1;
sys_ledctrl.rssi2 = 1;
sys_ledctrl.rssi3 = 1;
} else {
sys_ledctrl.conn = 0;
sys_ledctrl.rssi1 = 0;
sys_ledctrl.rssi2 = 0;
sys_ledctrl.rssi3 = 0;
}
sys_ledctrl.pair = 0;
sys_ledctrl.wk_delay = 100;
break;
default:
break;
}
return ret;
}
void sys_wifi_pair_led_init(void)
{
OS_WORK_INIT(&ledctrl_wk, sys_pairled_work, 20);
OS_WORK_INIT(&pairkey_wk, sys_pairkey_work, 0);
os_run_work_delay(&ledctrl_wk, 100);
os_run_work_delay(&pairkey_wk, 100);
}
#endif