kindring 1 year ago
parent
commit
d66eb0e81d
7 changed files with 73 additions and 53 deletions
  1. 6 3
      src/OSAL_wrist.c
  2. 3 5
      src/app_wrist.c
  3. 17 12
      src/ble/wrist_service.c
  4. 2 4
      src/control/btn.c
  5. 1 1
      src/control/btn.h
  6. 38 21
      src/light.c
  7. 6 7
      src/light.h

+ 6 - 3
src/OSAL_wrist.c

@@ -34,6 +34,8 @@
 /* Application */
 #include "app_wrist.h"
 
+#include "log.h"
+
 /*********************************************************************
  * GLOBAL VARIABLES
  */
@@ -50,7 +52,8 @@ const pTaskEventHandlerFn tasksArr[] =
   GAPRole_ProcessEvent,
   GATTServApp_ProcessEvent,
   Key_ProcessEvent,
-  appWristProcEvt,
+  Light_ProcessEvent,
+  appWristProcEvt
 };
 
 const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] );
@@ -100,10 +103,10 @@ void osalInitTasks( void )
   GATTServApp_Init( taskID++ );
 
   /** 初始化按钮 事件*/
-  btn_init(taskID++);
+  btn_init( taskID++ );
   LOG("btn_init end\n");
   /** 初始化灯光*/
-  light_init(taskID++);
+  light_init( taskID++ );
   LOG("light_init end\n");
   /* Application */
   appWristInit( taskID );

+ 3 - 5
src/app_wrist.c

@@ -93,7 +93,7 @@ static void appWristProcOSALMsg( osal_event_hdr_t *pMsg )
 // Notification from the profile of a state change
 static void WristGapStateCB(gaprole_States_t newState)
 {
-    LOG("app is start WristGapStateCB: %d \n", newState);
+    LOG("app is start gapProfileState: %d WristGapStateCB: %d  \n", gapProfileState,  newState);
     // if connected
     if (newState == GAPROLE_CONNECTED)
     {
@@ -308,15 +308,13 @@ void appWristInit( uint8 task_id)
 
     // Setup a delayed profile startup
     osal_set_event( AppWrist_TaskID, START_DEVICE_EVT );
-
+    // light_init(-1);
     LOG("appWristInit end\n");
-    
     // 初始化按键
     temp_set(5500, 0, NULL);
     LOG("temp_set end\n");
-    light_set(100, 0, NULL);
+    light_set(10, 0, NULL);
     LOG("appWristInit end\n");
-
 }
 
 // 事件处理器

+ 17 - 12
src/ble/wrist_service.c

@@ -83,6 +83,7 @@ CONST uint8 wristServUUID[ATT_BT_UUID_SIZE] =
   LO_UINT16(WRIST_SERV_UUID), HI_UINT16(WRIST_SERV_UUID)
 };
 
+
 // Characteristic 1 UUID: 0xFF02
 CONST uint8 wristProfilecharCommandUUID[ATT_BT_UUID_SIZE] =
 { 
@@ -353,14 +354,6 @@ static int cmd_get_time(const uint8* data, uint16 len)
 //  return cmd_response_err(data, len, APP_SUCCESS);
 //}
 
-static int cmd_light_ctrl(const uint8_t* data, uint16_t len)
-{
-  int ret;
-  wristCmdLight_t* plight = (wristCmdLight_t*)data;
-  ret = light_ctrl(plight->ch, plight->value);
-  ret = (ret == PPlus_SUCCESS) ? APP_SUCCESS: APP_ERR_PARAM;
-  return cmd_response_err(data, len, ret);
-}
 
 static int cmd_lookup_bracelet(const uint8* data, uint16 len)
 {
@@ -386,10 +379,12 @@ int on_recieved_cmd_packet(const uint8* data, uint16 len)
   // 第一位为命令字 第二位为 值
   // cmdParse();
   resLen = parse_light_code(data, len, resData);
+  LOG("resLen: %d\n", resLen);
   if(resLen < 1){
+    LOG("parse_light_code error use set light %d\n", data[0]);
     resLen = light_set(data[0], 0, resData);
   }
-  LOG("response all data");
+  print_hex(resData, resLen);
   cmd_response(resData, resLen);
   return ret;
 }
@@ -419,7 +414,11 @@ static int cmd_response(const uint8* data, uint16 len)
 {
   int i;
   attHandleValueNoti_t notif;
-  
+  if (data == NULL || len < 1)
+  {
+    LOG("cmd_response: data is empty\n");
+    return -1;
+  }
   memset(&notif, 0, sizeof(notif));
 
   notif.len = len;
@@ -429,8 +428,14 @@ static int cmd_response(const uint8* data, uint16 len)
   return wristProfile_Notify(&notif);
 }
 
-void  light_callback(uint8 *res, uint16 len){
-   cmd_response(res, len);
+void light_callback(uint8 *res, uint16 len){
+  // log
+  LOG("light_callback[%d]: %s ", len, &res);
+  if(res == NULL || len < 1){
+    LOG("data is empty len: %d\n", len);
+    return;
+  }
+  cmd_response(res, len);
 }
 
 

+ 2 - 4
src/control/btn.c

@@ -98,9 +98,9 @@ static void key_press_evt(uint8_t i,key_evt_t key_evt)
 // key_state 引入
 
 // 初始化按钮
-int btn_init(task_id){
+void btn_init(uint8 taskId){
     LOG("[btn_init]\n");
-    task_btn_id = task_id;
+    task_btn_id = taskId;
     // 初始化pwm
     for (int i = 0; i < HAL_KEY_NUM; i++)
     {
@@ -113,8 +113,6 @@ int btn_init(task_id){
     key_state.task_id = task_btn_id;
 	key_state.key_callbank = key_press_evt;
 	key_init();
-
-    return 1;
 }
 
 // 按钮事件处理函数

+ 1 - 1
src/control/btn.h

@@ -34,7 +34,7 @@ typedef struct {
 extern btn_all_pressed_t btn_all_pressed[];
 
 // 按钮状态
-extern int btn_init();
+extern void btn_init(uint8 taskId );
 
 
 uint16 Key_ProcessEvent( uint8 task_id, uint16 events );

+ 38 - 21
src/light.c

@@ -18,7 +18,7 @@ light_data_t light_data = {true, TEMP_MAX, 100, LIGHT_MODE_DEFAULT, 100};
 // 通知回调函数
 LightCallbackFunc notify_callback = NULL;
 
-int light_init(int taskId){
+void light_init(uint8 taskId){
     LOG("[light_init]\n");
     task_light_id = taskId;
     // 初始化pwm
@@ -27,21 +27,20 @@ int light_init(int taskId){
     ret = pwm_light_init(WARM_CH, GPIO_WARM2, _light_total, _light_total, 5, PWM_CLK_DIV_16);
     if(ret != 0){
         LOG("[light_init] pwm_light_init warm failed %d \n", ret);
-        return ret;
+        return ;
     }
 
     ret = pwm_light_init(COLD_CH, GPIO_COLD, _light_total, _light_total, 5, PWM_CLK_DIV_16);
     ret = pwm_light_init(COLD_CH, GPIO_COLD2, _light_total, _light_total, 5, PWM_CLK_DIV_16);
     if(ret != 0){
         LOG("[light_init] pwm_light_init cold failed  %d \n", ret);
-        return ret;
+        return ;
     }
 
     // 拉低 warm2 与 cold2 的电平
 
     // hal_gpio_pull_set(GPIO_WARM2, PULL_DOWN);
     // hal_gpio_pull_set(GPIO_COLD2, PULL_DOWN);
-    return ret;
 }
 
 int light_ch_set(uint8_t ch, uint16_t val){
@@ -54,7 +53,7 @@ int light_ch_set(uint8_t ch, uint16_t val){
 
 
 // 计算 冷暖光的亮度值
-int comLightVal(){
+uint8_t comLightVal(){
     int light_val = light_data.light, temp_val = light_data.temp;
     // 根据色温与亮度来计算冷暖灯光对应的亮度值
     // 亮度值范围 0~100 翻 100倍
@@ -104,11 +103,9 @@ int comLightVal(){
 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 -1;
-    }
     // 判断是否有sn码,有则为响应,没有则为通知
+    // 申请内存
+    res = (uint8_t *)osal_mem_alloc(len + 4);
     if(sn == 0)
     {
         res[0] = START_CODE_NOTIFY;
@@ -124,8 +121,10 @@ uint16 comCmdResCode(uint8_t cmd, uint8_t sn, uint8* data, uint16 len, uint8_t *
     res[3] = sn;
     // 数据可能为空
     if(len > 0){
+        // 数据拷贝
         memcpy(res + 4, data, len);
     }
+    // 打印hex值
     return len + 4;
 }
 
@@ -172,7 +171,7 @@ uint16 query_light(uint8_t sn , uint8 *res){
 }
 
 // 亮度调节
-uint16 light_set(uint8_t val, uint8_t sn , uint8 *res){
+uint16 light_set(uint8 val, uint8_t sn , uint8 *res){
     // LOG("[light_set] set light val to %d \n", val);
     // 亮度值为 0~100
     if(val > 100){
@@ -180,7 +179,7 @@ uint16 light_set(uint8_t val, uint8_t sn , uint8 *res){
     }
     light_data.light = val;
     comLightVal();
-    uint8_t data[1] = {val};
+    uint8 data[1] = {val};
     uint16 resLen = 0;
     if(res == NULL && notify_callback != NULL)
     {
@@ -219,12 +218,13 @@ uint16 temp_set(int temp, uint8_t sn , uint8 *res){
 /**
  * led 模式切换
 */
-uint16 change_light_mode (light_cmd_start_code mode, uint8_t sn, uint8 *res)
+uint16 change_light_mode (int mode, uint8_t sn, uint8 *res)
 {
+    uint16 resLen = 0;
     if (mode == light_data.mode)
     {
         // 模式相同, 不做处理
-        return -1;
+        return resLen;
     }
     light_data.mode = mode;
     if (mode == LIGHT_MODE_FULL)
@@ -237,7 +237,7 @@ uint16 change_light_mode (light_cmd_start_code mode, uint8_t sn, uint8 *res)
     }
     comLightVal();
     uint8_t data[1] = {mode};
-    uint16 resLen = 0;
+    
     if(res == NULL && notify_callback != NULL)
     {
         resLen = comCmdResCode(CMD_MODE, sn, data, 1, res);
@@ -260,48 +260,65 @@ uint16 change_light_mode (light_cmd_start_code mode, uint8_t sn, uint8 *res)
 */
 uint16 parse_light_code(uint8* data, uint16 len, uint8 *res)
 {
+    light_cmd_t light_cmd;
+    uint16 resLen = 0;
     // 判断是否为灯光指令 
     if (len < 4 || data[0] != START_CODE_CMD)
     {
         LOG("[parse_light_code] not light cmd \n");
-        return -1;
+        return resLen;
     }
-
-    light_cmd_t light_cmd;
-    uint16 resLen = 0;
+    // 假设 len 是数据的长度
     memcpy(&light_cmd, data, len);
+    LOG("[parse_light_code] cmd: %d, sn: %d, len: %d \n", light_cmd.cmd, light_cmd.sn, light_cmd.len);
+    // 为data分配内存
+    light_cmd.data = (uint8_t *)osal_mem_alloc(light_cmd.len - 2);
+    memcpy(light_cmd.data, data + 4, light_cmd.len - 2);
+    // 打印对应的hex数据体
+    LOG("[parse_light_code] data: ");
+    for (int i = 0; i < light_cmd.len - 2; i++)
+    {
+        LOG("%02x ", light_cmd.data[i]);
+    }
+    LOG("\n");
     // 现在你可以使用 light_cmd 结构体中的数据了
-    printf("Start Code: %d\n", light_cmd.startCode);
-    printf("Length: %d\n", light_cmd.len);
-    printf("Command Code: %d\n", light_cmd.cmd);
     // 如果需要访问数据部分,可以使用 light_cmd.data 指针
     switch (light_cmd.cmd)
     {
     case CMD_OPEN:
+        LOG("[parse_light_code] CMD_OPEN \n");
         resLen = open_light(light_cmd.sn, res);
         break;
     case CMD_CLOSE:
+        LOG("[parse_light_code] CMD_CLOSE \n");
          resLen = close_light(light_cmd.sn, res);
         break;
     case CMD_QUERY:
+        LOG("[parse_light_code] CMD_QUERY \n");
          resLen = query_light(light_cmd.sn, res);
         break;
     case CMD_LIGTH:
+        LOG("[parse_light_code] CMD_LIGTH %d\n", light_cmd.data[0]);
          resLen = light_set(light_cmd.data[0], light_cmd.sn, res);
         break;
     case CMD_TEMP:
+        LOG("[parse_light_code] CMD_TEMP %d\n", light_cmd.data[0] << 8 | light_cmd.data[1]);
          resLen = temp_set(light_cmd.data[0] << 8 | light_cmd.data[1], light_cmd.sn, res);
         break;
     case CMD_MODE:
+        LOG("[parse_light_code] CMD_MODE %d\n", light_cmd.data[0]);
          resLen = change_light_mode(light_cmd.data[0], light_cmd.sn, res);
         break;
     }
+    // 释放内存
+    osal_mem_free(light_cmd.data);
     return resLen;
 }
 
 // 注册通知回调函数,用于再某些情况下通知上位机
 void light_register_notify_callback(LightCallbackFunc callback)
 {
+    LOG("init light notify callback \n");
     notify_callback = callback;
 }
 

+ 6 - 7
src/light.h

@@ -75,7 +75,7 @@ typedef struct {
     uint8_t len;
     light_cmd_code cmd;
     uint8_t sn;
-    uint8_t *data;
+    uint8 *data;
 } light_cmd_t;
 
 extern light_data_t light_data;
@@ -84,26 +84,25 @@ extern light_data_t light_data;
 typedef void (*LightCallbackFunc) (uint8 *res, uint16 len);
 
 
-extern int light_init(int taskId);
+extern void light_init(uint8 taskId);
 
 extern int light_ch_set(uint8_t ch, uint16_t val);
 
 // 计算冷暖光的亮度值,并且设置
-int comLightVal();
+uint8_t 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 light_set(uint8_t val, uint8 sn, uint8 *res);
 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 (light_cmd_start_code mode, 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 void light_register_notify_callback(LightCallbackFunc callback);
 
-
-
+uint16 Light_ProcessEvent( uint8 task_id, uint16 events );