增加蓝牙开启关闭获取获取实时数据;优化部分显示逻辑
authorCaisking <3449750381@qq.com>
Sun, 28 Apr 2024 06:57:35 +0000 (14:57 +0800)
committerCaisking <3449750381@qq.com>
Sun, 28 Apr 2024 06:57:35 +0000 (14:57 +0800)
code/sdk/application/wearable/fd230app/nativeui/config/include/ConfigModel.h
code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.h
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c

index 7990109..9778300 100644 (file)
@@ -64,13 +64,16 @@ namespace OHOS
             CONFIGMODEL_ITEM_SPORTS_GOAL_DURATION,    //运动目标时长
             CONFIGMODEL_ITEM_SPORTS_GOAL_DISTANCE,    //运动目标距离
             CONFIGMODEL_ITEM_DNOTDISTURB,//勿扰模式
-            CONFIGMODEL_ITEM_TRANING_FREQ,//训练实时数据上传频率
             CONFIGMODEL_ITEM_SYSTEM_VOLUME,//系统音量
             CONFIGMODEL_ITEM_CALL_VOLUME,//通话音量
             CONFIGMODEL_ITEM_VOLTE_CALL,//VoLTE通话
             CONFIGMODEL_ITEM_MOTIONRECOGNITION,//运动识别
             CONFIGMODEL_ITEM_HFP, //通话蓝牙开关
             CONFIGMODEL_ITEM_A2DP,//媒体蓝牙开关
+
+            CONFIGMODEL_ITEM_TRANING_FREQ,//训练实时数据上传频率
+            CONFIGMODEL_ITEM_TRANING_AUTO,//开启关闭自动获取实时数据
+
             CONFIFMOFEL_ITEM_HEARTRATE_DETECTED,//心率周期频率  0(关闭) 1 5 10
             CONFIFMOFEL_ITEM_HEARTRATE_MAX,//最大心率
             CONFIFMOFEL_ITEM_HEARTRATE_MIN,//最小心率
@@ -214,17 +217,19 @@ namespace OHOS
             {ConfigDataType::DATATYPE_INT,      "GoalDuration",             "30"    },// CONFIGMODEL_ITEM_SPORTS_GOAL_DURATION,    //运动目标时长   30(分钟)
             {ConfigDataType::DATATYPE_DOUBLE,   "GoalDistance",             "8.0"   },// CONFIGMODEL_ITEM_SPORTS_GOAL_DISTANCE,    //运动目标距离   8.0(km)
             {ConfigDataType::DATATYPE_BOOL,     "Dnotdisturb",              "false" },// CONFIGMODEL_ITEM_DNOTDISTURB //勿扰模式默认关闭
-            {ConfigDataType::DATATYPE_INT,     "traningfreq",              "10" },// CONFIGMODEL_ITEM_TRANING_FREQ //训练实时数据上传频率//单位秒
             {ConfigDataType::DATATYPE_INT,     "SystemVolume",               "100"  },// CONFIGMODEL_ITEM_SYSTEM_VOLUME //
             {ConfigDataType::DATATYPE_INT,     "CallVolume",                 "100"  },// CONFIGMODEL_ITEM_CALL_VOLUME //
             {ConfigDataType::DATATYPE_BOOL,     "VoLTECall",                "false" },// CONFIGMODEL_ITEM_VOLTE_CALL
             {ConfigDataType::DATATYPE_BOOL,     "MotionRecognition",        "false" },// CONFIGMODEL_ITEM_MOTIONRECOGNITION
             {ConfigDataType::DATATYPE_BOOL,     "HFP",                      "false" },// CONFIGMODEL_ITEM_HFP
             {ConfigDataType::DATATYPE_BOOL,     "A2DP",                     "false" },// CONFIGMODEL_ITEM_A2DP
+
+            {ConfigDataType::DATATYPE_INT,     "traningfreq",              "10" },// CONFIGMODEL_ITEM_TRANING_FREQ //训练实时数据上传频率//单位秒
+            {ConfigDataType::DATATYPE_BOOL,    "traningauto",              "false" },//CONFIGMODEL_ITEM_TRANING_AUTO,//开启关闭自动获取实时数据
+            {ConfigDataType::DATATYPE_INT,      "traningheart",             "190"  },//CONFIGMODEL_ITEM_TRAINING_HEART_MAX//训练最高心率
             {ConfigDataType::DATATYPE_INT,      "HeartRateDetected",        "0"     },// CONFIFMOFEL_ITEM_HEARTRATE_DETECTED//心率周期检测频率
             {ConfigDataType::DATATYPE_INT,      "HeartRateMax",             "0"     },// CONFIFMOFEL_ITEM_HEARTRATE_MAX//最大心率
             {ConfigDataType::DATATYPE_INT,      "HeartRateMin",             "0"     },// CONFIFMOFEL_ITEM_HEARTRATE_MIN//最小心率
-            {ConfigDataType::DATATYPE_INT,      "traningheart",             "250"  },//CONFIGMODEL_ITEM_TRAINING_HEART_MAX//训练最高心率
         };
         ConfigModel();                                        // 私有构造函数,确保无法在外部实例化
         ConfigModel(const ConfigModel &) = delete;            // 禁止拷贝构造
index 853c1e3..6a396a4 100644 (file)
@@ -277,7 +277,7 @@ namespace OHOS
         UIResourceTextId sportId_ = STR_EXTREME_SPORTS;     // 训练项目
         Exercisetype sportType_ = Exercisetype::FITNESS;    // 训练类型
         ExerciseState sportState_ = ExerciseState::General; // 训练状态
-        ExerciseTag sportTagType_ = ExerciseTag::Distance;  // 训练目标类型
+        ExerciseTag sportTagType_ = ExerciseTag::UNKNOW;  // 训练目标类型
 
         int sportTag_ = 0; // 训练目标
         int totalHeartRate = 0;
index 70917ef..f8b5cd1 100644 (file)
@@ -29,6 +29,7 @@
 #include <mutex>
 #include <memory>
 #include "bleEvent.h"
+#include "power_display_service.h"
 
 #define TIMER 1
 #define BLETEST 0
@@ -705,9 +706,14 @@ namespace OHOS
         if (g_motionTimes != 0)
         {
             sportdata->duration = g_motionTimes; // 训练时长
-            if (sportdata->duration % freq == 0)
+            /*判断是否开启自动获取*/
+            if (ConfigModel::GetInstance()->get_configData_bool(ConfigModel::CONFIGMODEL_ITEM_TRANING_AUTO))
             {
-                SendLiveData(); // 发送实时数据
+                if (sportdata->duration % freq == 0)
+                {
+                    PRINT("SendLiveData\r\n");
+                    SendLiveData(); // 发送实时数据
+                }
             }
             PRINT("duration:[%d] g_motionTimes[%d]\r\n", sportdata->duration, g_motionTimes);
         }
@@ -715,11 +721,12 @@ namespace OHOS
         int hour = g_motionTimes / NUM_TIME_HOUR;
         int min = (g_motionTimes % NUM_TIME_HOUR) / NUM_TIME_MIN;
         int sec = (g_motionTimes % NUM_TIME_HOUR) % NUM_TIME_MIN;
-
+        // PRINT("ostringstream is end!\r\n");
         std::ostringstream oss;
         oss << std::setfill('0') << std::setw(2) << hour << ":" << std::setw(2) << min << ":" << std::setw(2) << sec;
-
+        // PRINT("motionDuration is end!\r\n");
         motionDuration = oss.str();
+        // PRINT("DisplayMotionDuration is end!\r\n");
         return motionDuration;
     }
 #ifdef __cplusplus
@@ -737,6 +744,7 @@ namespace OHOS
                 return;
             }
             gTraingCardPresenter->ModifiesTime();
+            PRINT("TraingTimerCallback\r\n");
         }
 
         /* 开启定时器 */
index 227dafe..5c38158 100644 (file)
@@ -17,6 +17,7 @@
 #include "traing/training_card/include/TrainingControlView.h"\r
 #include "traing/include/TraingModel.h"\r
 #include "uicomponents/UIComponents.h"\r
+#include "config/include/ConfigModel.h"\r
 #include "custom_utils.h"\r
 #include "vibrator_service.h"\r
 #include <iomanip>\r
@@ -92,7 +93,13 @@ namespace OHOS
     // 计时器更新timer\r
     void TraingCardPresenter::ModifiesTime()\r
     {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ModifiesTime begin");\r
         std ::string TimeStr = TraingModel::GetInstance()->DisplayMotionDuration();\r
+\r
+        /*灭屏状态不刷新UI*/\r
+        if (uapi_get_screen_state() == 1)\r
+            return;\r
+\r
         if (TimeStr.empty())\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingModel::GetInstance()->DisplayMotionDuration() nullptr");\r
@@ -106,6 +113,7 @@ namespace OHOS
         {\r
             TrainingDataView::GetInstance()->GetTimeLabel()->SetText(TimeStr.c_str());\r
         }\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ModifiesTime end");\r
     }\r
 \r
     /* --------------------------------- cywee库操作 -------------------------------- */\r
@@ -273,12 +281,22 @@ namespace OHOS
             {\r
                 // 设置目标:在非运动情况下设置  [单指令,执行后退出]\r
                 TraingModel::GetInstance()->SetSportTag(static_cast<ExerciseTag>(cmd->sportTagType), cmd->sportTag);\r
+                PRINT("SetSportTag is succeed!\r\n");\r
                 return true;\r
             }\r
             break;\r
+\r
         case SENDDATA:\r
             TraingModel::GetInstance()->SendLiveData(); // 发送实时数据 [单指令,执行后退出]\r
+            PRINT("SendLiveData is succeed!\r\n");\r
             return true;\r
+\r
+        case SETAUTO:\r
+            // 设置开启关闭获取实时数据 [单指令,执行后退出]\r
+            ConfigModel::GetInstance()->set_condigData_Bool(ConfigModel::CONFIGMODEL_ITEM_TRANING_AUTO, cmd->controlauto);\r
+            PRINT("SendTrainingAuto is succeed!\r\n");\r
+            return true;\r
+\r
         default:\r
             break;\r
         }\r
index 227c994..fbac848 100644 (file)
@@ -66,8 +66,9 @@ enum TRANING
     START,
     STOP,
     RECOVER,
-    SETGOAL,
-    SENDDATA,
+    SETGOAL,//设置训练目标
+    SENDDATA,//获取实时训练数据
+    SETAUTO,//开启关闭自动获取实时数据
 };
 
 typedef struct
@@ -75,6 +76,7 @@ typedef struct
     uint8_t sportType;    //训练项目
     uint8_t sportTagType; //训练目标类型
     uint32_t sportTag;     //训练目标
+    uint8_t controlauto;  //开启关闭自动获取实时数据
     uint8_t controlmd;    //训练控制md
 } training_ble;
 
index cb29478..440068e 100644 (file)
@@ -273,37 +273,37 @@ void sendDataNow(uint8_t *buf,uint16_t len)
     }\r
 }\r
 \r
-void send_big_data(uint8_t flag,char *data,int datalen,int total,uint32_t Packet_id,uint32_t packet_total,uint8_t type_id,uint8_t type)\r
+void send_big_data(uint8_t flag, char *data, int datalen, int total, uint32_t Packet_id, uint32_t packet_total, uint8_t type_id, uint8_t type)\r
 {\r
-    uint8_t buf[512]={0};\r
-    buf[0]=0x72;\r
-    buf[1]=type;\r
-    buf[2]=type_id;\r
-    memcpy(buf+3,&packet_total,4);\r
-    memcpy(buf+7,&total,4);\r
-    memcpy(buf+11,&Packet_id,4);\r
-    memcpy(buf+15,&datalen,2);\r
-    if(data==NULL)\r
-    {\r
-        data="\0";\r
-      //  buf[17+datalen] = Calculate_CRC_Big((uint8_t *)data,datalen);\r
-        if(flag)\r
-        sendDataNow(buf,17+1);\r
-        else\r
-        sendBleData(buf,17+1);\r
+    uint8_t *buf = malloc(17 + datalen + 1); // 动态分配内存空间,防止堆栈溢出\r
+    if (buf == NULL) {\r
+        printf("内存分配失败\n");\r
+        return;\r
+    }\r
 \r
-    }else\r
-    {\r
-        memcpy(buf+17,data,datalen);\r
-        buf[17+datalen] = Calculate_CRC_Big((uint8_t *)data,datalen);\r
-        printf("xxxxxxxxxxxxx\r\n");\r
-        if(flag)\r
-        sendDataNow(buf,17+datalen+1);\r
-        else\r
-        sendBleData(buf,17+datalen+1);\r
+    buf[0] = 0x72;\r
+    buf[1] = type;\r
+    buf[2] = type_id;\r
+    memcpy(buf + 3, &packet_total, 4);\r
+    memcpy(buf + 7, &total, 4);\r
+    memcpy(buf + 11, &Packet_id, 4);\r
+    memcpy(buf + 15, &datalen, 2);\r
+\r
+    if (data == NULL) {\r
+        data = "\0";\r
+        buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen);\r
+    } else {\r
+        memcpy(buf + 17, data, datalen);\r
+        buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen);\r
+    }\r
 \r
+    if (flag) {\r
+        sendDataNow(buf, 17 + datalen + 1);\r
+    } else {\r
+        sendBleData(buf, 17 + datalen + 1);\r
     }\r
-   // }\r
+\r
+    free(buf); // 释放内存空间\r
 }\r
 //发送训练状态\r
 void sendtraningstatedata(uint8_t state ,uint16_t time)\r
@@ -331,10 +331,11 @@ void sendtraningdata(msg_get_train_data_info_t *data)
     char *jsonString = cJSON_PrintUnformatted(dataJSON);\r
     \r
     uint32_t data_len=strlen(jsonString);\r
+    cJSON_Delete(dataJSON);\r
     printf("发送训练实时数据%d %s\r\n",data_len,jsonString);\r
     send_big_data(0,jsonString,data_len,data_len,1,1,0x0f,1);\r
     cJSON_free(jsonString);\r
-    cJSON_Delete(dataJSON);\r
+    \r
 }\r
 //发送ble数据\r
 uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 \r
@@ -1259,9 +1260,9 @@ void GetUTCtime(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uin
     \r
 }\r
 static training_ble training_ble_data;\r
-static uint8_t jsonCheck_targetparam(uint8_t *buf)//训练目标参数\r
+//设置训练目标\r
+static uint8_t jsonCheck_targetparam(uint8_t *buf)\r
 {\r
-    \r
     uint8_t *json;\r
     json = buf;\r
     cJSON* root = cJSON_Parse((const char *)json);\r
@@ -1269,46 +1270,48 @@ static uint8_t jsonCheck_targetparam(uint8_t *buf)//训练目标参数
         printf("时间 JSON解析错误\n");\r
         return 2;\r
     }\r
-        //     {\r
-        // "ty":0,\r
-        // "di":5000,\r
-        // }\r
-    memset(&training_ble_data,0,sizeof(training_ble));\r
+\r
+    memset(&training_ble_data, 0, sizeof(training_ble));\r
+\r
     cJSON* ty = cJSON_GetObjectItem(root, "ty");//目标类型\r
     if (cJSON_IsNumber(ty)) {\r
         printf("ty: %d\n", ty->valueint);\r
-        training_ble_data.sportTagType=ty->valueint;\r
-        training_ble_data.controlmd=SETGOAL;\r
-    }\r
-    \r
-    cJSON* di = cJSON_GetObjectItem(root, "di");//目标距离\r
-    if (cJSON_IsNumber(di)) {\r
-        printf("di: %d\n", di->valueint);\r
-        training_ble_data.sportTag=di->valueint;\r
-    }\r
-    cJSON* ca = cJSON_GetObjectItem(root, "ca");//目标卡路里\r
-    if (cJSON_IsNumber(ca)) {\r
-        printf("ca: %d\n", ca->valueint);\r
-        training_ble_data.sportTag=ca->valueint;\r
-    }\r
-    cJSON* tm = cJSON_GetObjectItem(root, "tm");//目标时间\r
-    if (cJSON_IsNumber(tm)) {\r
-        printf("tm: %d\n", tm->valueint);\r
-         training_ble_data.sportTag=tm->valueint;\r
-    }\r
-    cJSON* st = cJSON_GetObjectItem(root, "st");//目标步数\r
-    if (cJSON_IsNumber(st)) {\r
-        printf("st: %d\n", st->valueint);\r
-        training_ble_data.sportTag=st->valueint;\r
-        \r
+        training_ble_data.sportTagType = ty->valueint;\r
+        training_ble_data.controlmd = SETGOAL;\r
+\r
+        cJSON* targetItem = NULL;\r
+        switch (training_ble_data.sportTagType)\r
+        {\r
+            case 0: // 距离\r
+                targetItem = cJSON_GetObjectItem(root, "di");//目标距离\r
+                break;\r
+            case 1: // 卡路里\r
+                targetItem = cJSON_GetObjectItem(root, "ca");//目标卡路里\r
+                break;\r
+            case 2: // 时间\r
+                targetItem = cJSON_GetObjectItem(root, "tm");//目标时间\r
+                break;\r
+            case 3: // 步数\r
+                targetItem = cJSON_GetObjectItem(root, "st");//目标步数\r
+                break;\r
+            default:\r
+                break;\r
+        }\r
+\r
+        if (targetItem && cJSON_IsNumber(targetItem)) {\r
+            printf("%s: %d\n", targetItem->string, targetItem->valueint);\r
+            training_ble_data.sportTag = targetItem->valueint;\r
+            cJSON_Delete(root);\r
+            CustomEventPublish(TOPIC_EVENT_BLE_TRAINING, (uint8_t*)&training_ble_data, sizeof(training_ble));\r
+            return JSON_CHECK_OK;\r
+        }\r
     }\r
-    CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
+\r
     cJSON_Delete(root);\r
-    return 1;\r
+    return JSON_CHECK_ERR;\r
 }\r
 \r
 \r
-\r
 void GetTarinTarget(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间\r
 {\r
     uint32_t tmp = 1;\r
@@ -2521,10 +2524,14 @@ static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint8_t autoSportData = crcnum[0];//开关 1开启 0关闭\r
-\r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
+        /*进行开启关闭操作*/\r
+        training_ble_data.controlmd = SETAUTO;\r
+        training_ble_data.controlauto = autoSportData;\r
+        printf("开启自动获取 %d\r\n", training_ble_data.controlauto);\r
+        CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
     }else\r
     {\r
         value[17] = 0;\r
@@ -2553,6 +2560,7 @@ static void SetRTDataFreCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *t
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
+        /*设置获取频率*/\r
     }else\r
     {\r
         value[17] = 0;\r