Browse Source

feat: 蓝牙状态提示
发送设备状态至服务端

kindring 1 year ago
parent
commit
82ed69d998
4 changed files with 79 additions and 28 deletions
  1. 2 2
      src/OSAL_wrist.c
  2. 18 5
      src/ble/wrist_service.c
  3. 48 20
      src/light.c
  4. 11 1
      src/light.h

+ 2 - 2
src/OSAL_wrist.c

@@ -56,7 +56,7 @@ const pTaskEventHandlerFn tasksArr[] =
   GATTServApp_ProcessEvent,
   Key_ProcessEvent,
   Light_ProcessEvent,
-  adc_ProcessEvent,
+  // adc_ProcessEvent,
   appWristProcEvt
 };
 
@@ -113,7 +113,7 @@ void osalInitTasks( void )
   light_init( taskID++ );
   LOG("light_init end\n");
   /** 初始化adc*/
-  adc_Init( taskID++ );
+  // adc_Init( taskID++ );
   /* Application */
   appWristInit( taskID );
 }

+ 18 - 5
src/ble/wrist_service.c

@@ -59,6 +59,7 @@
 #include "error.h"
 
 #include "wrist_service.h"
+#include "light.h"
 #include "app_wrist.h"
 /*********************************************************************
  * MACROS
@@ -374,7 +375,7 @@ int on_recieved_cmd_packet(const uint8* data, uint16 len)
   LOG("RX Cmd:");
   print_hex(data, len);
   int i = 0;
-  uint8 *resData;
+  uint8 *resData = osal_mem_alloc(128);
   uint16 resLen;
   // 第一位为命令字 第二位为 值
   // cmdParse();
@@ -384,8 +385,14 @@ int on_recieved_cmd_packet(const uint8* data, uint16 len)
     LOG("parse_light_code error use set light %d\n", data[0]);
     resLen = light_set(data[0], 0, resData);
   }
-  print_hex(resData, resLen);
+  LOG("parse res data: ");
+  for (int i = 0; i < resLen; i++)
+  {
+      LOG("%02x ", resData[i]);
+  }
+  LOG("\n");
   cmd_response(resData, resLen);
+  osal_mem_free(resData);
   return ret;
 }
 
@@ -414,7 +421,7 @@ static int cmd_response(const uint8* data, uint16 len)
 {
   int i;
   attHandleValueNoti_t notif;
-  if (data == NULL || len < 1)
+  if (len < 1)
   {
     LOG("cmd_response: data is empty\n");
     return -1;
@@ -430,8 +437,14 @@ static int cmd_response(const uint8* data, uint16 len)
 
 void light_callback(uint8 *res, uint16 len){
   // log
-  LOG("light_callback[%d]: %s ", len, &res);
-  if(res == NULL || len < 1){
+  LOG("light_callback[%d]: ", len);
+ for (int i = 0; i < len; i++)
+  {
+      LOG("%02x ", res[i]);
+  }
+  LOG("\n");
+  
+  if(len < 1){
     LOG("data is empty len: %d\n", len);
     return;
   }

+ 48 - 20
src/light.c

@@ -105,7 +105,6 @@ uint16 comCmdResCode(uint8_t cmd, uint8_t sn, uint8* data, uint16 len, uint8_t *
     // 0x6c 0x06 0x01 0x64 
     // 判断是否有sn码,有则为响应,没有则为通知
     // 申请内存
-    res = (uint8_t *)osal_mem_alloc(len + 4);
     if(sn == 0)
     {
         res[0] = START_CODE_NOTIFY;
@@ -114,7 +113,7 @@ uint16 comCmdResCode(uint8_t cmd, uint8_t sn, uint8* data, uint16 len, uint8_t *
         res[0] = START_CODE_RES;
     }
     // 数据长度
-    res[1] = len + 2;
+    res[1] = len + CMD_LEN_LEN;
     // 命令码
     res[2] = cmd;
     // sn码
@@ -122,24 +121,34 @@ uint16 comCmdResCode(uint8_t cmd, uint8_t sn, uint8* data, uint16 len, uint8_t *
     // 数据可能为空
     if(len > 0){
         // 数据拷贝
-        memcpy(res + 4, data, len);
+        memcpy(res + CMD_HEADER_LEN, data, len);
     }
-    // 打印hex值
+    // 打印对应的hex数据体
+    LOG("[comCmdResCode] data: ");
+    for (int i = 0; i < len + CMD_HEADER_LEN; i++)
+    {
+        LOG("%02x ", res[i]);
+    }
+    LOG("\n");
     return len + 4;
 }
 
 
-// 灯光控制功能
+/**
+ * 开灯
+ */
 uint16 open_light(uint8_t sn , uint8 *res){
     light_data.open = true;
     comLightVal();
     uint16 resLen = 0;
     if(res == NULL && notify_callback != NULL)
     {
-        resLen = comCmdResCode(CMD_CLOSE, sn, NULL, 0, res);
+        uint8 *_res = osal_mem_alloc(CMD_MAX_LEN);
+        resLen = comCmdResCode(CMD_OPEN, sn, NULL, 0, _res);
         notify_callback(res, resLen);
+        osal_mem_free(_res);
     }else{
-        resLen =  comCmdResCode(CMD_CLOSE, sn, NULL, 0, res);
+        resLen =  comCmdResCode(CMD_OPEN, sn, NULL, 0, res);
     }
     return resLen;
 }
@@ -151,8 +160,10 @@ uint16 close_light(uint8_t sn , uint8 *res){
     uint16 resLen = 0;
     if(res == NULL && notify_callback != NULL)
     {
-        resLen = comCmdResCode(CMD_CLOSE, sn, NULL, 0, res);
+        uint8 *_res = osal_mem_alloc(CMD_MAX_LEN);
+        resLen = comCmdResCode(CMD_CLOSE, sn, NULL, 0, _res);
         notify_callback(res, resLen);
+        osal_mem_free(_res);
     }else{
         resLen = comCmdResCode(CMD_CLOSE, sn, NULL, 0, res);
     }
@@ -183,11 +194,21 @@ uint16 light_set(uint8 val, uint8_t sn , uint8 *res){
     uint16 resLen = 0;
     if(res == NULL && notify_callback != NULL)
     {
-        resLen = comCmdResCode(CMD_LIGTH, sn, data, 1, res);
-        notify_callback(res, resLen);
+        uint8 *_res = osal_mem_alloc(CMD_MAX_LEN);
+        resLen = comCmdResCode(CMD_LIGTH, sn, data, 1, _res);
+        notify_callback(_res, resLen);
+        osal_mem_free(_res);
     }else{
         resLen = comCmdResCode(CMD_LIGTH, sn, data, 1, res);
     }
+    // 输出hex数据
+    LOG("[light_set] res: ");
+    for (int i = 0; i < resLen; i++)
+    {
+        LOG("%02x ", res[i]);
+    }
+    LOG("\n");
+    
     return resLen;
 }
 
@@ -207,8 +228,10 @@ uint16 temp_set(int temp, uint8_t sn , uint8 *res){
     uint16 resLen = 0;
     if(res == NULL && notify_callback != NULL)
     {
-        resLen = comCmdResCode(CMD_TEMP, sn, data, 2, res);
-        notify_callback(res,resLen);
+        uint8 *_res = osal_mem_alloc(CMD_MAX_LEN);
+        resLen = comCmdResCode(CMD_TEMP, sn, data, 2, _res);
+        notify_callback(res, resLen);
+        osal_mem_free(_res);
     }else{
         resLen = comCmdResCode(CMD_TEMP, sn, data, 2, res);
     }
@@ -240,8 +263,10 @@ uint16 change_light_mode (int mode, uint8_t sn, uint8 *res)
     
     if(res == NULL && notify_callback != NULL)
     {
-        resLen = comCmdResCode(CMD_MODE, sn, data, 1, res);
+        uint8 *_res = osal_mem_alloc(CMD_MAX_LEN);
+        resLen = comCmdResCode(CMD_MODE, sn, data, 1, _res);
         notify_callback(res, resLen);
+        osal_mem_free(_res);
     }else{
         resLen = comCmdResCode(CMD_MODE, sn, data, 1, res);
     }
@@ -258,7 +283,7 @@ uint16 change_light_mode (int mode, uint8_t sn, uint8 *res)
  * @param {uint16} len 数据长度
  * @param {uint8*} res 返回数据 
 */
-uint16 parse_light_code(uint8* data, uint16 len, uint8 *res)
+uint16 parse_light_code(const uint8* data, uint16 len, uint8 *res)
 {
     light_cmd_t light_cmd;
     uint16 resLen = 0;
@@ -310,6 +335,12 @@ uint16 parse_light_code(uint8* data, uint16 len, uint8 *res)
          resLen = change_light_mode(light_cmd.data[0], light_cmd.sn, res);
         break;
     }
+    LOG("[parse_light_code] res: ");
+    for (int i = 0; i < resLen; i++)
+    {
+        LOG("%02x ", res[i]);
+    }
+    LOG("\n");
     // 释放内存
     osal_mem_free(light_cmd.data);
     return resLen;
@@ -331,12 +362,9 @@ uint16 Light_ProcessEvent( uint8 task_id, uint16 events )
 	}
     if( events & LIGHT_EVT_DEFAULT_MODE){
         // 切换至默认模式
-        uint8 *res;
-        uint16 resLen = 0;
-        resLen = change_light_mode(LIGHT_MODE_DEFAULT, 0, res);
-        if(notify_callback != NULL){
-            notify_callback(res, resLen);
-        }
+        uint8 *res = osal_mem_alloc(CMD_MAX_LEN);
+        change_light_mode(LIGHT_MODE_DEFAULT, 0, res);
+        osal_mem_free(res);
         return (events ^ LIGHT_EVT_DEFAULT_MODE);
     }
 }

+ 11 - 1
src/light.h

@@ -38,6 +38,7 @@
 // 全亮模式下自动关闭时间 秒
 #define FULL_MODE_WAIT_TIME 60
 
+
 // 灯光控制命令起始码
 typedef enum {
     // 下发命令
@@ -70,6 +71,13 @@ typedef struct {
     int fan;
 } light_data_t;
 
+// 命令头长度
+#define CMD_HEADER_LEN 4
+// 命令除去起始码与长度的长度
+#define CMD_LEN_LEN 2
+// 命令最大长度,包含起始码,长度,命令码,sn码,数据
+#define CMD_MAX_LEN 128
+
 typedef struct {
     light_cmd_start_code startCode;
     uint8_t len;
@@ -78,6 +86,8 @@ typedef struct {
     uint8 *data;
 } light_cmd_t;
 
+
+
 extern light_data_t light_data;
 
 // 通知回调函数
@@ -98,7 +108,7 @@ extern uint16 temp_set(int temp, uint8_t sn, uint8 *res);
 extern uint16 open_light(uint8_t sn, uint8 *res);
 extern uint16 close_light(uint8_t sn, uint8 *res);
 extern uint16 change_light_mode (int mode, uint8_t sn, uint8 *res);
-extern uint16 parse_light_code(uint8* data, uint16 len, uint8 *res);
+extern uint16 parse_light_code(const uint8* data, uint16 len, uint8 *res);
 
 extern void light_register_notify_callback(LightCallbackFunc callback);