Browse Source

fix: 蓝牙命令
修复蓝牙命令部分导致的异常问题

kindring 1 year ago
parent
commit
fb78c2ee07
3 changed files with 27 additions and 25 deletions
  1. 3 3
      src/ble/wrist_service.c
  2. 20 20
      src/light.c
  3. 4 2
      src/light.h

+ 3 - 3
src/ble/wrist_service.c

@@ -380,7 +380,7 @@ int on_recieved_cmd_packet(const uint8* data, uint16 len)
   uint8 err_data = 0;
   LOG("RX Cmd:");
   print_hex(data, len);
-  int i = 0,ret = 0;
+  int i = 0;
   uint8 *resData;
   uint16 resLen;
   // 第一位为命令字 第二位为 值
@@ -429,8 +429,8 @@ static int cmd_response(const uint8* data, uint16 len)
   return wristProfile_Notify(&notif);
 }
 
-CallbackFunc light_callback(uint8 *res, uint16 len){
-  return cmd_response(res, len);
+void  light_callback(uint8 *res, uint16 len){
+   cmd_response(res, len);
 }
 
 

+ 20 - 20
src/light.c

@@ -16,14 +16,13 @@ uint32_t _light_total = TOTAl_LEVEL;
 light_data_t light_data = {true, TEMP_MAX, 100, LIGHT_MODE_DEFAULT, 100};
 
 // 通知回调函数
-CallbackFunc notify_callback = NULL;
+LightCallbackFunc notify_callback = NULL;
 
 int light_init(int taskId){
     LOG("[light_init]\n");
-    task_light_id = taskId
+    task_light_id = taskId;
     // 初始化pwm
     int ret = 0;
-    // if()
     ret = pwm_light_init(WARM_CH, GPIO_WARM, _light_total, _light_total, 5, PWM_CLK_DIV_16);
     ret = pwm_light_init(WARM_CH, GPIO_WARM2, _light_total, _light_total, 5, PWM_CLK_DIV_16);
     if(ret != 0){
@@ -102,12 +101,12 @@ int comLightVal(){
 // }
 
 // 计算命令响应码
-uint16 comCmdResCode(uint8_t cmd, uint8_t sn, uint8* data, uint16 len  uint8_t *res){
+uint16 comCmdResCode(uint8_t cmd, uint8_t sn, uint8* data, uint16 len, uint8_t *res){
     // 响应码 `起始码` `长度` `命令码` `sn码` `数据1` `数据2`
     // 0x6c 0x06 0x01 0x64 
     if (res == NULL)
     {
-        return;
+        return -1;
     }
     // 判断是否有sn码,有则为响应,没有则为通知
     if(sn == 0)
@@ -156,7 +155,7 @@ uint16 close_light(uint8_t sn , uint8 *res){
         resLen = comCmdResCode(CMD_CLOSE, sn, NULL, 0, res);
         notify_callback(res, resLen);
     }else{
-        resLen = (CMD_CLOSE, sn, NULL, 0, res);
+        resLen = comCmdResCode(CMD_CLOSE, sn, NULL, 0, res);
     }
     return resLen;
 }
@@ -210,7 +209,7 @@ uint16 temp_set(int temp, uint8_t sn , uint8 *res){
     if(res == NULL && notify_callback != NULL)
     {
         resLen = comCmdResCode(CMD_TEMP, sn, data, 2, res);
-        notify_callback(res);
+        notify_callback(res,resLen);
     }else{
         resLen = comCmdResCode(CMD_TEMP, sn, data, 2, res);
     }
@@ -232,7 +231,7 @@ uint16 change_light_mode (light_cmd_start_code mode, uint8_t sn, uint8 *res)
     {
         // 全亮模式, 切换至最大模式
         light_data.light = 100;
-        light_data.fun = 100;
+        light_data.fan = 100;
         // 添加定时器, 1分钟后切换至默认模式 
         osal_start_timerEx( task_light_id, LIGHT_EVT_DEFAULT_MODE, FULL_MODE_WAIT_TIME * 1000);
     }
@@ -242,7 +241,7 @@ uint16 change_light_mode (light_cmd_start_code mode, uint8_t sn, uint8 *res)
     if(res == NULL && notify_callback != NULL)
     {
         resLen = comCmdResCode(CMD_MODE, sn, data, 1, res);
-        notify_callback(res);
+        notify_callback(res, resLen);
     }else{
         resLen = comCmdResCode(CMD_MODE, sn, data, 1, res);
     }
@@ -269,7 +268,7 @@ uint16 parse_light_code(uint8* data, uint16 len, uint8 *res)
     }
 
     light_cmd_t light_cmd;
-
+    uint16 resLen = 0;
     memcpy(&light_cmd, data, len);
     // 现在你可以使用 light_cmd 结构体中的数据了
     printf("Start Code: %d\n", light_cmd.startCode);
@@ -279,29 +278,29 @@ uint16 parse_light_code(uint8* data, uint16 len, uint8 *res)
     switch (light_cmd.cmd)
     {
     case CMD_OPEN:
-        return open_light(light_cmd.sn, &res);
+        resLen = open_light(light_cmd.sn, res);
         break;
     case CMD_CLOSE:
-        return close_light(light_cmd.sn, &res);
+         resLen = close_light(light_cmd.sn, res);
         break;
     case CMD_QUERY:
-        return query_light(light_cmd.sn, &res);
+         resLen = query_light(light_cmd.sn, res);
         break;
     case CMD_LIGTH:
-        return light_set(light_cmd.data[0], light_cmd.sn, &res);
+         resLen = light_set(light_cmd.data[0], light_cmd.sn, res);
         break;
     case CMD_TEMP:
-        return temp_set(light_cmd.data[0] << 8 | light_cmd.data[1], light_cmd.sn, &res);
+         resLen = temp_set(light_cmd.data[0] << 8 | light_cmd.data[1], light_cmd.sn, res);
         break;
     case CMD_MODE:
-        return change_light_mode(light_cmd.data[0], light_cmd.sn, &res);
+         resLen = change_light_mode(light_cmd.data[0], light_cmd.sn, res);
         break;
     }
-    return -1;
+    return resLen;
 }
 
 // 注册通知回调函数,用于再某些情况下通知上位机
-void light_register_notify_callback(CallbackFunc callback)
+void light_register_notify_callback(LightCallbackFunc callback)
 {
     notify_callback = callback;
 }
@@ -316,9 +315,10 @@ uint16 Light_ProcessEvent( uint8 task_id, uint16 events )
     if( events & LIGHT_EVT_DEFAULT_MODE){
         // 切换至默认模式
         uint8 *res;
-        change_light_mode(LIGHT_MODE_DEFAULT, 0, res);
+        uint16 resLen = 0;
+        resLen = change_light_mode(LIGHT_MODE_DEFAULT, 0, res);
         if(notify_callback != NULL){
-            notify_callback(res);
+            notify_callback(res, resLen);
         }
         return (events ^ LIGHT_EVT_DEFAULT_MODE);
     }

+ 4 - 2
src/light.h

@@ -81,7 +81,7 @@ typedef struct {
 extern light_data_t light_data;
 
 // 通知回调函数
-typedef void (*CallbackFunc)(uint8 *res, uint16 len);
+typedef void (*LightCallbackFunc) (uint8 *res, uint16 len);
 
 
 extern int light_init(int taskId);
@@ -91,6 +91,8 @@ extern int light_ch_set(uint8_t ch, uint16_t val);
 // 计算冷暖光的亮度值,并且设置
 int comLightVal();
 
+uint16 comCmdResCode(uint8_t cmd, uint8_t sn, uint8* data, uint16 len,  uint8_t *res);
+
 extern uint16 light_set(uint8_t val, uint8_t sn, uint8 *res);
 extern uint16 temp_set(int temp, uint8_t sn, uint8 *res);
 extern uint16 open_light(uint8_t sn, uint8 *res);
@@ -98,7 +100,7 @@ extern uint16 close_light(uint8_t sn, uint8 *res);
 extern uint16 change_light_mode (light_cmd_start_code mode, uint8_t sn, uint8 *res);
 extern uint16 parse_light_code(uint8* data, uint16 len, uint8 *res);
 
-extern void light_register_notify_callback(CallbackFunc callback);
+extern void light_register_notify_callback(LightCallbackFunc callback);