修复发送训练实时数据;修复设置训练面板死机bug;增加发送训练状态;
authorCaisking <3449750381@qq.com>
Fri, 26 Apr 2024 10:03:15 +0000 (18:03 +0800)
committerCaisking <3449750381@qq.com>
Fri, 26 Apr 2024 10:03:15 +0000 (18:03 +0800)
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/include/TraingCardPresenter.h
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.h
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleService.c

index 6edd1c6..b640594 100644 (file)
@@ -105,8 +105,8 @@ namespace OHOS
     // 运动状态
     enum class ExerciseState
     {
-        Start = 0,
-        End,
+        End = 0,
+        Start,
         Pause,
         Continue,
         General,
@@ -282,7 +282,7 @@ namespace OHOS
         int sportTag_ = 0; // 训练目标
         int totalHeartRate = 0;
         int countHeartRate = 0;
-        int freq = 0; // 训练频率
+        int freq = 0; // 训练发送数据频率
 
         bool Gettagstuats{false}; // 训练达标标志位
         bool Startstate{false};   // 开始训练标志位
index b408865..cc6f2f8 100644 (file)
@@ -247,6 +247,10 @@ namespace OHOS
     /*设置运动状态*/
     void TraingModel::SetSportState(ExerciseState state)
     {
+        if (state != ExerciseState::General)
+        {
+            sendtraningstatedata(static_cast<uint8_t>(state), sportdata->duration);
+        }
         sportState_ = state;
     }
     /*获取运动状态*/
@@ -335,6 +339,7 @@ namespace OHOS
             sportdata->Reset(); // 重置结构体
 
             /*将Model的成员变量赋值到结构体里面*/
+            printf("SetTimestamp::time:%u \r\n", time);
             sportdata->starttime = time;
             sportdata->sportType = sportType_; // 训练类型
             Gettagstuats = false;              // 重置训练达标标志位
@@ -383,6 +388,7 @@ namespace OHOS
             }
             // PRINT("end_time [%s]\r\n", end_time);
             sportdata->end_time = std::string(end_time);
+            sportState_ = ExerciseState::General;
             Openstate = false; // 关闭运动标志位
 
             free(end_time); // 释放内存
@@ -407,7 +413,7 @@ namespace OHOS
             Endstate = true;
         }
     }
-    // 获取训练时长时间戳
+    // 获取训练时长时间
     std::string TraingModel::GetTrainingTime()
     {
         int hour = sportdata->duration / NUM_TIME_HOUR;
@@ -674,7 +680,9 @@ namespace OHOS
     void TraingModel::SendLiveData()
     {
         msg_get_train_data_info_t data;
-        data.st = sportdata->starttime / 1000;
+        memset(&data, 0, sizeof(msg_get_train_data_info_t));
+        PRINT("sportdata->starttime %d \r\n", sportdata->starttime);
+        data.st = (uint32)(sportdata->starttime / 1000);
         data.hr = sportdata->heart;
         data.ca = sportdata->calories;
         data.stp = sportdata->steps;
index 3c5f8f4..9072508 100644 (file)
@@ -53,12 +53,19 @@ namespace OHOS
         void RefreshData(); // 更新数据\r
         bool send_sport_cmd(training_ble *cmd);\r
 \r
+        /*控制*/\r
+        void handleStartState();\r
+        void handleEndState();\r
+        void handlePauseState();\r
+        void handleContinueState();\r
+\r
     private:\r
         // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;\r
         bool OnClick(UIView &view, const ClickEvent &event) override;\r
         bool OnDrag(UIView &view, const DragEvent &event) override;\r
         int tag_ = 0;\r
         bool opensensorstuats{false};\r
+        bool goalSet{nullptr};\r
         // bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
     };\r
 } // namespace OHOS\r
index d89bb68..227dafe 100644 (file)
@@ -1,4 +1,9 @@
-\r
+/***\r
+ * @Date: 2024-04-26 09:23:18\r
+ * @LastEditors: Caisking 3449750381@qq.com\r
+ * @LastEditTime: 2024-04-26 10:25:05\r
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp\r
+ */\r
 \r
 #include "AppViewIDs.h"\r
 #include "components/ui_label_ext.h"\r
@@ -213,32 +218,17 @@ namespace OHOS
         // 点击暂停按键\r
         if (strcmp(view.GetViewId(), BUTTONSTOP) == 0)\r
         {\r
-            // 开始状态\r
-            if (TraingModel::GetInstance()->GetSportState() == ExerciseState::Start || TraingModel::GetInstance()->GetSportState() == ExerciseState::Continue)\r
+            // 进行状态\r
+            if (TraingModel::GetInstance()->GetSportState() == ExerciseState::Continue || TraingModel::GetInstance()->GetSportState() == ExerciseState::Start)\r
             {\r
-                TrainingControlView::GetInstance()->GetLabel()->SetText("继续");\r
-                TrainingControlView::GetInstance()->GetButton()->SetImageSrc(SPORT_CONTINUE_IMAGE, SPORT_CONTINUE_IMAGE);\r
-                // 设置为暂停状态\r
-                TraingModel::GetInstance()->SetSportState(ExerciseState::Pause);\r
-                // 暂停计时器\r
-                PauseTimer();\r
-                // 暂停运动库\r
-                ControlSensor(ExerciseState::Pause);\r
-                return true;\r
+                handlePauseState();\r
             }\r
             // 暂停状态\r
-            if (TraingModel::GetInstance()->GetSportState() == ExerciseState::Pause)\r
+            else if (TraingModel::GetInstance()->GetSportState() == ExerciseState::Pause)\r
             {\r
-                TrainingControlView::GetInstance()->GetLabel()->SetText("暂停");\r
-                TrainingControlView::GetInstance()->GetButton()->SetImageSrc(SPORT_PAUSE_IMAGE, SPORT_PAUSE_IMAGE);\r
-                // 设置为继续状态\r
-                TraingModel::GetInstance()->SetSportState(ExerciseState::Continue);\r
-                // 恢复计时器\r
-                ResumeTimer();\r
-                // 恢复运动库\r
-                ControlSensor(ExerciseState::Continue);\r
-                return true;\r
+                handleContinueState();\r
             }\r
+            return true;\r
         }\r
         // 点击结束按键,弹窗显示\r
         if (strcmp(view.GetViewId(), BUTTONEND) == 0)\r
@@ -251,20 +241,7 @@ namespace OHOS
         // 退出按键\r
         if (strcmp(view.GetViewId(), BUTTONEXIT) == 0)\r
         {\r
-            TraingModel::GetInstance()->SetSportState(ExerciseState::End);\r
-            ControlSensor(ExerciseState::End);\r
-#if DATATEST\r
-            NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA);\r
-#endif\r
-            if (TraingModel::GetInstance()->GetMomentum())\r
-            {\r
-                NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA);\r
-            }\r
-            else\r
-            {\r
-                // 训练量不足进入训练记录界面\r
-                NativeAbility::GetInstance().ChangeSlice(VIEW_TRAINING_RECORD);\r
-            }\r
+            handleEndState();\r
         }\r
         // 返回按键\r
         if (strcmp(view.GetViewId(), BUTTONBACK) == 0)\r
@@ -281,48 +258,54 @@ namespace OHOS
         return true;\r
     }\r
 \r
-    /*蓝牙控制接口*/\r
     bool TraingCardPresenter::send_sport_cmd(training_ble *cmd)\r
     {\r
-\r
-        if (cmd == nullptr || cmd->sportType < 0)\r
+        if (cmd == nullptr)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid sport command");\r
             return false;\r
         }\r
 \r
-        //命令为设置目标\r
-        if (cmd->controlmd == 4)\r
+        switch (cmd->controlmd)\r
         {\r
-            TraingModel::GetInstance()->SetSportTag(static_cast<ExerciseTag>(cmd->sportTagType), cmd->sportTag);\r
-            return true; //设置目标为单指令\r
+        case SETGOAL:\r
+            if (TraingModel::GetInstance()->GetSportState() == ExerciseState::General)\r
+            {\r
+                // 设置目标:在非运动情况下设置  [单指令,执行后退出]\r
+                TraingModel::GetInstance()->SetSportTag(static_cast<ExerciseTag>(cmd->sportTagType), cmd->sportTag);\r
+                return true;\r
+            }\r
+            break;\r
+        case SENDDATA:\r
+            TraingModel::GetInstance()->SendLiveData(); // 发送实时数据 [单指令,执行后退出]\r
+            return true;\r
+        default:\r
+            break;\r
         }\r
 \r
-        uapi_set_screen_on_api(); // 亮屏检测\r
         if (TraingCardView::GetInstance() == nullptr)\r
         {\r
-            NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGCRAD); // 切换Slice\r
-            //对训练项目的选择只进行一次判断\r
+            uapi_set_screen_on_api(); // 亮屏\r
+            NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGCRAD);\r
+            // 设置目标类型和项目有且只有一次\r
             switch (cmd->sportType)\r
             {\r
-            // 室外走路\r
             case 0:\r
+                TraingModel::GetInstance()->SetSportEvent(STR_EXERCISE_OUTDOORWALKING);\r
                 OpenSensor(ExerciseClass::FREE_TRAINING);\r
-                break;\r
-            // 室外跑步\r
             case 1:\r
-                OpenSensor(ExerciseClass::OUTDOOR);\r
+                TraingModel::GetInstance()->SetSportEvent(STR_EXERCISE_OUTDOORBIKING);\r
+                OpenSensor(ExerciseClass::FREE_TRAINING);\r
                 break;\r
-            // 室外骑行\r
             case 2:\r
-                OpenSensor(ExerciseClass::FREE_TRAINING);\r
+                TraingModel::GetInstance()->SetSportEvent(STR_EXERCISE_OUTDOORRUNNING);\r
+                OpenSensor(ExerciseClass::OUTDOOR);\r
                 break;\r
             default:\r
                 break;\r
             }\r
         }\r
 \r
-        // 增加打印\r
         PRINT("cmd->sportType[%d],cmd->controlmd[%d],cmd->sportTagType[%d],cmd->sportTag[%d]\r\n", cmd->sportType, cmd->controlmd, cmd->sportTagType, cmd->sportTag);\r
 \r
         ExerciseState cmdState = static_cast<ExerciseState>(cmd->controlmd);\r
@@ -331,47 +314,17 @@ namespace OHOS
         switch (cmdState)\r
         {\r
         case ExerciseState::End:\r
-        {\r
-            PRINT("ExerciseState::End   [%d]\r\n", cmdState);\r
-            TraingModel::GetInstance()->SetSportState(ExerciseState::End);\r
-            ControlSensor(ExerciseState::End);\r
-            if (TraingCardView::GetInstance()->RefreshEndView())\r
-            {\r
-                NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA);\r
-            }\r
-            else\r
-            {\r
-                NativeAbility::GetInstance().ChangeSlice(VIEW_TRAINING_RECORD);\r
-            }\r
+            handleEndState();\r
             break;\r
-        }\r
         case ExerciseState::Pause:\r
-        {\r
-            PRINT("ExerciseState %d\r\n", cmdState);\r
-            TraingModel::GetInstance()->SetSportState(cmdState);\r
-            TrainingControlView::GetInstance()->GetLabel()->SetText("继续");\r
-            TrainingControlView::GetInstance()->GetButton()->SetImageSrc(SPORT_CONTINUE_IMAGE, SPORT_CONTINUE_IMAGE);\r
-            TraingModel::GetInstance()->SetSportState(ExerciseState::Pause);\r
-            PauseTimer();\r
-            ControlSensor(ExerciseState::Pause);\r
+            handlePauseState();\r
             break;\r
-        }\r
         case ExerciseState::Continue:\r
-        {\r
-            TrainingControlView::GetInstance()->GetLabel()->SetText("暂停");\r
-            TrainingControlView::GetInstance()->GetButton()->SetImageSrc(SPORT_PAUSE_IMAGE, SPORT_PAUSE_IMAGE);\r
-            TraingModel::GetInstance()->SetSportState(ExerciseState::Continue);\r
-            ResumeTimer();\r
-            ControlSensor(ExerciseState::Continue);\r
+            handleContinueState();\r
             break;\r
-        }\r
         case ExerciseState::Start:\r
-        {\r
-            PRINT("ExerciseState::Start   [%d]\r\n", cmdState);\r
-            ControlSensor(cmdState);\r
-            TraingModel::GetInstance()->SetSportOpenWay(true);\r
+            handleStartState();\r
             break;\r
-        }\r
         default:\r
             break;\r
         }\r
@@ -379,4 +332,50 @@ namespace OHOS
         return true;\r
     }\r
 \r
+    /*训练结束*/\r
+    void TraingCardPresenter::handleEndState()\r
+    {\r
+        TraingModel::GetInstance()->SetSportState(ExerciseState::End);\r
+        ControlSensor(ExerciseState::End);\r
+#if DATATEST\r
+        NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA);\r
+        return;\r
+#endif\r
+        if (TraingModel::GetInstance()->GetMomentum())\r
+        {\r
+            NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA);\r
+        }\r
+        else\r
+        {\r
+            NativeAbility::GetInstance().ChangeSlice(VIEW_TRAINING_RECORD);\r
+        }\r
+    }\r
+\r
+    /*训练暂停*/\r
+    void TraingCardPresenter::handlePauseState()\r
+    {\r
+        TrainingControlView::GetInstance()->GetLabel()->SetText("继续");\r
+        TrainingControlView::GetInstance()->GetButton()->SetImageSrc(SPORT_CONTINUE_IMAGE, SPORT_CONTINUE_IMAGE);\r
+        TraingModel::GetInstance()->SetSportState(ExerciseState::Pause);\r
+        PauseTimer();\r
+        ControlSensor(ExerciseState::Pause);\r
+    }\r
+\r
+    /*训练继续*/\r
+    void TraingCardPresenter::handleContinueState()\r
+    {\r
+        TrainingControlView::GetInstance()->GetLabel()->SetText("暂停");\r
+        TrainingControlView::GetInstance()->GetButton()->SetImageSrc(SPORT_PAUSE_IMAGE, SPORT_PAUSE_IMAGE);\r
+        TraingModel::GetInstance()->SetSportState(ExerciseState::Continue);\r
+        ResumeTimer();\r
+        ControlSensor(ExerciseState::Continue);\r
+    }\r
+\r
+    /*训练开始*/\r
+    void TraingCardPresenter::handleStartState()\r
+    {\r
+        ControlSensor(ExerciseState::Start);\r
+        TraingModel::GetInstance()->SetSportOpenWay(true);\r
+    }\r
+\r
 }\r
index be920a3..d887711 100644 (file)
@@ -45,8 +45,7 @@ namespace OHOS
     {\r
         DeInit();\r
         g_pTraingCardView = nullptr;\r
-        DisableTimer();                                                // 关闭计时器\r
-        TraingModel::GetInstance()->SetSportState(ExerciseState::End); // 设置运动状态为结束\r
+        DisableTimer(); // 关闭计时器\r
         TraingModel::GetInstance()->SetTimestamp();\r
     }\r
 \r
index 167fa60..227c994 100644 (file)
@@ -53,10 +53,17 @@ enum PAIRING
 //         Continue,
 //         General,
 //     };
+
+/*
+0:结束
+1:开始
+2:暂停
+3:恢复
+*/
 enum TRANING
 {
-    START=0,
-    END,
+    END=0,
+    START,
     STOP,
     RECOVER,
     SETGOAL,
index deed5f7..cb29478 100644 (file)
@@ -286,11 +286,11 @@ void send_big_data(uint8_t flag,char *data,int datalen,int total,uint32_t Packet
     if(data==NULL)\r
     {\r
         data="\0";\r
-        buf[17+datalen] = Calculate_CRC_Big((uint8_t *)data,datalen);\r
+      //  buf[17+datalen] = Calculate_CRC_Big((uint8_t *)data,datalen);\r
         if(flag)\r
-        sendDataNow(buf,17+datalen+1);\r
+        sendDataNow(buf,17+1);\r
         else\r
-        sendBleData(buf,17+datalen+1);\r
+        sendBleData(buf,17+1);\r
 \r
     }else\r
     {\r
@@ -312,7 +312,7 @@ void sendtraningstatedata(uint8_t state ,uint16_t time)
     uint32_t data_len=3;\r
     data[0]=state;\r
     memcpy(&data[1],&time,2);\r
-    printf("发送训练状态数据%d %s\r\n",data_len,data);\r
+    printf("发送训练状态数据%d %d\r\n",data[0],time);\r
     send_big_data(0,data,data_len,data_len,1,1,0x50,5);\r
     \r
 }\r
@@ -1273,40 +1273,36 @@ static uint8_t jsonCheck_targetparam(uint8_t *buf)//训练目标参数
         // "ty":0,\r
         // "di":5000,\r
         // }\r
+    memset(&training_ble_data,0,sizeof(training_ble));\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
-        //CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\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
-        CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\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
-         CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
-        \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
-         CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
-        \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
-        CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
+        \r
     }\r
+    CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
     cJSON_Delete(root);\r
     return 1;\r
 }\r
@@ -2583,7 +2579,7 @@ static void SetRTDataFreCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *t
 // }\r
 void sendRealTimeDataToAPP(uint8_t flag)\r
 {\r
-    if(flag != 0)//校验失败\r
+    if(flag == 0)//校验失败\r
     {\r
         send_big_data(0,NULL,1,data_len,1,1,0x0f,1);\r
 \r
index 578680b..7c72278 100644 (file)
@@ -945,7 +945,7 @@ static void svr_ble_bt_gatts_req_write_cb(uint8_t server_id, uint16_t conn_id, g
 { \r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_server_handle %d conn_id :%d write_cb_para->length:%d write_cb_para->handle %d write_cb_para->request_id:%d",g_ble_server_handle,conn_id,write_cb_para->length,\r
     write_cb_para->handle,write_cb_para->request_id);\r
-    printf("alipay_handle%d",alipay_handle);\r
+    // printf("alipay_handle%d",alipay_handle);\r
     for(uint16_t i = 0;i<write_cb_para->length;i++)\r
     {   \r
         printf("%x ",write_cb_para->value[i]);\r
@@ -1455,6 +1455,10 @@ void openBle(void)
 #define MODE_ALIPAY_ADV_SRV (1)\r
 void ble_avd_mode_change(uint8_t mode)\r
 {\r
+    if(AdverFlag == false)\r
+    {\r
+        return;\r
+    }\r
     uint8_t adv_ok = 0;\r
     switch(mode)\r
     {\r