近期有幸申请到XR806开发板的试用,从拿到板子烧录编译好的镜像以后,就一直在忙,今天临时抽空做了一个小测试:使用指示灯指示wifi连接状态。
STA模式控制代码
XR806开发板提供了一系列控制wifi的控制台命令:
hm net sta enable:使能STA模式
hm net sta scan:搜索周边热点,并返回搜索到的热点。
hm net sta connect < ssid > < psk >:连接指定热点,ssid表示要连接的wifi名称,psk表示连接WiFi需要填充的密钥
hm net sta disconnect:断开wifi连接
hm net sta disable:退出STA模式
对应的代码在device/xradio/xr806/adapter/console/src/cmd\\\_hm\\\_net\\\_sta.c文件。
上述命令对应的实现函数如下:
enable --> cmd_net_sta_enable_exec
scan --> cmd_net_scan_once_exec
connect --> cmd_net_connect_exec
disconnect --> cmd_net_disconnect_exec
disable --> cmd_net_sta_disable_exec
实现思路
实现思路比较简单:
- 当使能STA模式时,初始化GPIO,并把GPIO配置为Output模式
- 当禁用STA模式时,deinit GPIO
- 使用connect命令连接WiFi成功后,创建并启用一个线程,这个线程会间隔进行点灯、关灯的动作,表示WiFi此时处理连接状态
- 使用disconnect命令关闭WiFi连接后,销毁创建的闪灯线程
代码实现
diff --git a/xr806/adapter/console/src/cmd_hm_net_sta.c b/xr806/adapter/console/src/cmd_hm_net_sta.c
index e18cfce..e5a40f4 100755
--- a/xr806/adapter/console/src/cmd_hm_net_sta.c
+++ b/xr806/adapter/console/src/cmd_hm_net_sta.c
@@ -33,10 +33,15 @@
#include "common/cmd/cmd.h"
#include "wifi_device.h"
#include "cmd_hm_net_ap.h"
+#include "iot_gpio.h"
+
+#define GPIO_ID_PA21 21
#define cmd_nitems(a) (sizeof((a)) / sizeof((a)[0]))
#define WIFI_DEVICE_SCAN_RESULT_MAX (30)
+static OS_Thread_t led_thread;
+
static WifiEvent sta_event;
WifiScanInfo scan_results[WIFI_DEVICE_SCAN_RESULT_MAX];
static unsigned int scan_num = 0;
@@ -118,6 +123,9 @@ static enum cmd_status cmd_net_sta_enable_exec(char *cmd)
return CMD_STATUS_FAIL;
}
+ IoTGpioInit(GPIO_ID_PA21);
+ IoTGpioSetDir(GPIO_ID_PA21, IOT_GPIO_DIR_OUT);
+
return CMD_STATUS_OK;
}
@@ -133,6 +141,8 @@ static enum cmd_status cmd_net_sta_disable_exec(char *cmd)
return CMD_STATUS_FAIL;
}
+ IoTGpioDeinit(GPIO_ID_PA21);
+
return CMD_STATUS_OK;
}
@@ -224,6 +234,16 @@ static enum cmd_status cmd_net_auto_connect_exec(char *cmd)
return CMD_STATUS_OK;
}
+static void led_thread_func(void *arg)
+{
+ while (1) {
+ IoTGpioSetOutputVal(GPIO_ID_PA21, 1);
+ OS_MSleep(500);
+ IoTGpioSetOutputVal(GPIO_ID_PA21, 0);
+ OS_MSleep(500);
+ }
+}
+
static enum cmd_status cmd_net_connect_exec(char *cmd)
{
WifiErrorCode error;
@@ -289,6 +309,9 @@ static enum cmd_status cmd_net_connect_exec(char *cmd)
}
printf("ConnectTo Success\n");
+ if (OS_ThreadCreate(&led_thread, "LedThread", led_thread_func, NULL,
+ OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK)
+
return CMD_STATUS_OK;
}
@@ -350,6 +373,8 @@ static enum cmd_status cmd_net_disconnect_exec(char *cmd)
return CMD_STATUS_FAIL;
}
+ OS_ThreadDelete(&led_thread);
+
return CMD_STATUS_OK;
}
上述代码中定义了两个全局变量:GPIO\\_ID\\_PA21表示GPIO号;led\\_thread用于点灯的handle。
led\\_thread\\_func函数是点灯的主函数体,间隔500ms点灯、熄灯,实现闪烁的效果。
OS\\_ThreadCreate用于创建闪灯的线程,OS\\_ThreadDelete则用于销毁闪灯的线程。
代码编译
修改完成代码后,进行编译,注意修改程序后,会造成bin互相覆盖的情况:
解决方案:
1、寻找.img.cfg所在的文件位置
device/xradio/xr806/xr\_skylark/project/demo/wlan\_ble\_demo/image/xr806/.image.cfg
2、.image.cfg文件实际上是由image\_wlan\_ble.cfg文件生成的,因此把image\_auto\_cal.cfg替换image\_wlan\_ble.cfg后,重新执行hb build编译即可
烧录程序并运行
在windows下使用phoenixMC\_v3.1.21014b.exe程序烧录编译的image,然后在控制台执行相关命令,连接成功后,效果如下(这里放不了动画,使用两张图替代):