修改马达震动接口,优化cywee ppg控制接口函数命名,合入血压 gnss服务 2024/1
authorpenglei <1624952103@qq.com>
Thu, 31 Jul 2025 07:39:54 +0000 (15:39 +0800)
committerpenglei <1624952103@qq.com>
Thu, 31 Jul 2025 07:39:54 +0000 (15:39 +0800)
95 files changed:
code/sdk/application/brandy/brandy_standard/input_app.c
code/sdk/application/wearable/fd230/nativeapp/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/applist/src/ApplistView.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/callerlog/src/CallerLogModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/displaybrightness/src/BrightnessControlView.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/health/CheckAbnormalView.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/health/CheckInvalidView.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/main/src/VolumeSettingPresenter.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/rebootandshutdown/src/RebootAndShutdownPresenter.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/rebootandshutdown/src/ShutDownImageAnimatorView.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/record/src/RecordingModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/saveele/src/SaveElePresenter.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/include/SleepModel.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/include/SleepModelC.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/src/SleepModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/soundandvibration/src/SoundAndVibrationVolumeSettingPresenter.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/system/src/SystemPresenter.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/training_card/src/TraingCardPresenter.cpp
code/sdk/application/wearable/fd230/service/msg_center/src/notify/alarm_notification.cpp
code/sdk/application/wearable/fd230/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp
code/sdk/application/wearable/fd230/service/msg_center/src/notify/drinkReminder_notification.cpp
code/sdk/application/wearable/fd230/service/msg_center/src/notify/findwatch_notification.cpp
code/sdk/application/wearable/fd230/service/msg_center/src/notify/goal_notification.cpp
code/sdk/application/wearable/fd230/service/msg_center/src/notify/message_notification.cpp
code/sdk/application/wearable/fd230/service/msg_center/src/notify/motion_recognition_notification.cpp
code/sdk/application/wearable/fd230/service/msg_center/src/notify/pairing_notification.cpp
code/sdk/application/wearable/fd230/service/msg_center/src/notify/sedentaryReminder_notification.cpp
code/sdk/application/wearable/fd230/service/msg_center/src/notify/sleep_notification.cpp
code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp
code/sdk/application/wearable/service/msg_center/src/notify/pairing_notification.cpp
code/sdk/drivers/drivers/driver/lcd/lcd_config.c
code/sdk/drivers/drivers/driver/lcd/lcd_private.c
code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.h
code/sdk/zhihui/UI/producttest/src/testcat1.cpp
code/sdk/zhihui/UI/producttest/src/testhrsenson.cpp
code/sdk/zhihui/config/src/ConfigModel.cpp
code/sdk/zhihui/drivers/bp/CMakeLists.txt
code/sdk/zhihui/drivers/bp/bn02/bn02.c
code/sdk/zhihui/drivers/bp/bn02/bn02.h
code/sdk/zhihui/drivers/bp/service/bp_ble_service.c
code/sdk/zhihui/drivers/bp/service/bp_ble_service.h
code/sdk/zhihui/drivers/bp/service/bp_tcp_server.c [new file with mode: 0644]
code/sdk/zhihui/drivers/bp/service/bp_tcp_server.h [new file with mode: 0644]
code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c
code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h
code/sdk/zhihui/drivers/cywee/service/cywee_service.c
code/sdk/zhihui/drivers/cywee/service/cywee_service.h
code/sdk/zhihui/drivers/mag/CMakeLists.txt
code/sdk/zhihui/drivers/mag/hal/CMakeLists.txt [deleted file]
code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_hal.h
code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_main.c
code/sdk/zhihui/drivers/mag/service/CMakeLists.txt
code/sdk/zhihui/drivers/mag/service/mag_hal.c [moved from code/sdk/zhihui/drivers/mag/hal/mag_hal.c with 94% similarity]
code/sdk/zhihui/drivers/mag/service/mag_hal.h [moved from code/sdk/zhihui/drivers/mag/hal/mag_hal.h with 91% similarity]
code/sdk/zhihui/drivers/mag/service/mag_service.c
code/sdk/zhihui/drivers/mag/service/mag_service.h
code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c
code/sdk/zhihui/drivers/ppg/hx3695/hx3695.c
code/sdk/zhihui/drivers/ppg/hx3695/hx3695.h
code/sdk/zhihui/drivers/ppg/hx3695/hx3695_factory_test.c
code/sdk/zhihui/drivers/ppg/hx3695/hx3695_factory_test.h
code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.c
code/sdk/zhihui/drivers/ppg/service/CMakeLists.txt
code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp
code/sdk/zhihui/drivers/vibrator/service/vibrator_service.cpp
code/sdk/zhihui/drivers/vibrator/service/vibrator_service.h
code/sdk/zhihui/services/battery/service/battery_driver.cpp
code/sdk/zhihui/services/battery/service/battery_service.cpp
code/sdk/zhihui/services/ble_service/blemoder/ble_congfig_adapt.cpp
code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp
code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c
code/sdk/zhihui/services/gnss/CMakeLists.txt
code/sdk/zhihui/services/gnss/driver/common/interface/board_interface/board_porting/tiot_board_pin_port.h
code/sdk/zhihui/services/gnss/inc/NMEA0183.h
code/sdk/zhihui/services/gnss/inc/gnss_tcp_server.h [new file with mode: 0644]
code/sdk/zhihui/services/gnss/sample/gnss_sample/gnss_sample.c
code/sdk/zhihui/services/gnss/sample/pgnss_sample/CMakeLists.txt [new file with mode: 0644]
code/sdk/zhihui/services/gnss/sample/pgnss_sample/gnss_datatypes.h [new file with mode: 0644]
code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_encode.c [new file with mode: 0644]
code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_encode.h [new file with mode: 0644]
code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c [new file with mode: 0644]
code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.h [new file with mode: 0644]
code/sdk/zhihui/services/gnss/src/gnss_ctl.c
code/sdk/zhihui/services/gnss/src/gnss_tcp_server.c [new file with mode: 0644]
code/sdk/zhihui/services/gnss/src/uart_gnss.c
code/sdk/zhihui/utils/custom_fileoperate_service.c
code/sdk/zhihui/utils/custom_runtime.c
code/sdk/zhihui/utils/custom_runtime.h
code/sdk/zhihui/utils/custom_utils.c

index 45c0214..54cb1a7 100644 (file)
@@ -122,12 +122,12 @@ uint32_t g_button_press_time = BUTTON_PRESS_TIME_1S;
 
 button_map_t g_brandy_button_pin_map[BUTTON_PIN_MAP_MAX] = {
     { PIN_NONE, BUTTON_PWR },
-    { S_AGPIO_R10, BUTTON_1 },
-#ifdef BOARD_U8
-    { S_AGPIO_R9, BUTTON_2 },
+#ifdef BOARD_N9
+    { S_AGPIO_R3, BUTTON_1 },
 #else
-    { PIN_NONE, BUTTON_2 },
+    { S_AGPIO_R10, BUTTON_1 },
 #endif
+    { PIN_NONE, BUTTON_2 },
     { PIN_NONE, BUTTON_3 },
     { PIN_NONE, BUTTON_4 },
     { PIN_NONE, BUTTON_5 },
index 5ac771a..77b20bd 100644 (file)
@@ -166,7 +166,7 @@ void NativeLauncher::InitNativeLauncher(LaunchMode mode)
         cm_initializeScreenDuration();
 
         // 开机增加震动 页面启动震动一次
-        // ui_api_vibrate_once_func();
+        // custom_VibratorFunc_int(0);
         // #endif
     }
     // 注册开机时间  
index 4943053..c28ab18 100644 (file)
@@ -508,7 +508,7 @@ public:
         {  
             CircleListAdapter::angleIncrement = 10;//还原为drag的角度
             isEncoderEvent = false;  
-            ui_api_vibrate_once_func();  
+            custom_VibratorFunc_int(0);  
         }
     }
 
@@ -620,7 +620,7 @@ public:
                 isEncoderEvent = false;
                 if(preRotateAngle != angle) 
                 {
-                    ui_api_vibrate_once_func();
+                    custom_VibratorFunc_int(0);
                 }
             } 
             else 
index 01df559..aba2396 100644 (file)
@@ -66,9 +66,8 @@ void BloodOxygenModel::ClearDisplayData() {
 void BloodOxygenModel::Blood_Control(BloodState state) {
   if (state == BloodState::End && startspo2 == true) {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "startspo2 End");
-    uint16_t md = PPG_SERVICE_CMD_TYPE_STOP_SPO2_TEST;
 #ifdef SUPPORT_PPG_SERVICE
-    send_ppg_cmd_msg(md);
+    ppg_spo2_stop();
 #endif
     startspo2 = false;
 #ifdef SYSTEM_LOG_SERVICE
@@ -83,9 +82,8 @@ void BloodOxygenModel::Blood_Control(BloodState state) {
       return;
     }
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "startspo2 Start");
-    uint16_t md = PPG_SERVICE_CMD_TYPE_DO_SPO2_TEST;
 #ifdef SUPPORT_PPG_SERVICE
-    send_ppg_cmd_msg(md);
+    ppg_spo2_start();
 #endif
     startspo2 = true;
 #ifdef SYSTEM_LOG_SERVICE
index 7fe7d4b..83dcf6c 100644 (file)
@@ -1018,7 +1018,7 @@ static void ACLConnectionSuss(const bd_addr_t &bdAddr)
     /* -------------------------------------------------------------------------- */\r
     if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))\r
     {\r
-        ui_api_vibrate_once_func();\r
+        custom_VibratorFunc_int(0);\r
     }\r
     uapi_set_screen_on_api();\r
     /* -------------------------------------------------------------------------- */\r
@@ -1063,7 +1063,7 @@ static void ACLConnectionFail(const bd_addr_t &bdAddr)
     /* -------------------------------------------------------------------------- */\r
     if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))\r
     {\r
-        ui_api_vibrate_once_func();\r
+        custom_VibratorFunc_int(0);\r
     }\r
     uapi_set_screen_on_api();\r
     /* -------------------------------------------------------------------------- */\r
index 2774077..eb98835 100644 (file)
@@ -296,7 +296,7 @@ static void snakeCallback(int data)
 {
     if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
     {
-        ui_api_vibrate_once_func();
+        custom_VibratorFunc_int(0);
     }
 }
 
index ba43095..b81c701 100644 (file)
@@ -313,7 +313,7 @@ namespace OHOS
     bool BrightnessSliderEventListener::OnRotateEnd(UIView& view, const RotateEvent& event)\r
     {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnRotateEnd %d", value);\r
-        ui_api_vibrate_once_func();//受设置中震动强度控制\r
+        custom_VibratorFunc_int(0);//受设置中震动强度控制\r
         return true;\r
     }\r
 }\r
index 4972775..347e2b4 100644 (file)
@@ -164,7 +164,7 @@ namespace OHOS
         
         if(true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
         }
         
 
index 4fc464f..3d98a61 100644 (file)
@@ -218,7 +218,7 @@ namespace OHOS
         if(true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
             // 震动提醒
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
         }
 
         // 增加按键监听
index 57447f4..5f88e34 100644 (file)
@@ -433,11 +433,7 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) {
     display_counter_ = 0;\r
     displayheart = 0;\r
 #ifdef SUPPORT_PPG_SERVICE\r
-    uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;\r
-    errcode_t ret = send_ppg_cmd_msg(md);\r
-    if (ret != ERRCODE_SUCC) {\r
-      send_ppg_cmd_msg(md);\r
-    }\r
+    ppg_hr_stop();\r
 #endif\r
     heartstate = false;\r
     if (checkstate == HeartCheck::CARDCHECK) {\r
@@ -466,8 +462,7 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) {
     }\r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartState Start");\r
 #ifdef SUPPORT_PPG_SERVICE\r
-    uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST;\r
-    send_ppg_cmd_msg(md);\r
+    ppg_hr_start();\r
 #endif\r
     heartstate = true;\r
     checkstate = check;\r
index 7b684d5..a49cab7 100644 (file)
@@ -197,7 +197,7 @@ bool VolumeSliderEventListener::OnRotateEnd(UIView& view, const RotateEvent& eve
         if (slider == progress)\r
         {\r
             ChangeVolume(VOLUMEDRAG);\r
-            ui_api_vibrate_once_func();//受设置中震动强度控制\r
+            custom_VibratorFunc_int(0);//受设置中震动强度控制\r
         }\r
     }\r
     return true;\r
index 89bbe82..d41d378 100644 (file)
@@ -93,7 +93,7 @@ namespace OHOS
         }
         else if (strcmp(view.GetViewId(), FACTORY_RESET_BUTTON_CHECK_ON) == 0) // 恢复出厂设置确认
         {
-            ui_api_vibrate_once_func(); //恢复出厂增加震动
+            custom_VibratorFunc_int(0); //恢复出厂增加震动
             view_->ChangeView(FACTORYRESET, SHUTDOWNANIMATOR);
             ShutDownImageAnimatorView::GetInstance()->ShutDownImageAnimator_Start(2);
             isShutDownImageAnimatorStart = true;
index 997c0c3..5f32cb3 100644 (file)
@@ -110,7 +110,7 @@ namespace OHOS
         NativeAbility::GetInstance().SetCurSlicePriority(0); // 设置Slice优先级为最高,防止弹窗出现
 
         // 关机增加震动
-        ui_api_vibrate_once_func();
+        custom_VibratorFunc_int(0);
     }
 
     // 获取开机动画是否已经开始
index d3fb59f..5482c79 100644 (file)
@@ -1127,7 +1127,7 @@ namespace OHOS
                 if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
                 {
                     // 震动提醒
-                    ui_api_vibrate_once_func();
+                    custom_VibratorFunc_int(0);
                 }
                 RecordingPresenter::GetInstance()->StopRecord();  //  停止录制
                 RecordingPresenter::GetInstance()->showWarning(); // 显示警告
index ab6fbc6..da1366d 100644 (file)
@@ -200,7 +200,7 @@ namespace OHOS
                     breath->SetTextId(STR_EXHALE_NOW);
                 }
                 // 震动提醒
-                ui_api_vibrate_once_func();
+                custom_VibratorFunc_int(0);
                 breath->ForceResetText();
             }
         }
@@ -246,7 +246,7 @@ namespace OHOS
         HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); // 开启心率检测
 #endif
         RespiratoryTrainingModel::GetInstance().RT_StartTimer(RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingTime()); // 开启定时器
-        ui_api_vibrate_once_func();                                                                                                  // 震动
+        custom_VibratorFunc_int(0);                                                                                                  // 震动
     }
 
     bool RespiratoryTrainingView::OnClick(UIView &view, const ClickEvent &event)
@@ -483,7 +483,7 @@ namespace OHOS
         StartRespiratoryTraining();                                                          // 开始呼吸训练
         HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); // 开启心率检测
         RespiratoryTrainingModel::GetInstance().RT_StartTimer(ONE_MIN);                      // 开启一个一分钟的定时器
-        ui_api_vibrate_once_func();                                                          // 震动提醒
+        custom_VibratorFunc_int(0);                                                          // 震动提醒
 #endif
     }
 
index d692674..5064998 100644 (file)
@@ -75,7 +75,7 @@ bool SaveElePresenter::OnKeyAct(UIView &view, const KeyEvent &event) {
 bool SaveElePresenter::OnRotateEnd(UIView &view, const RotateEvent &event) {\r
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
                 "VolumeSliderEventListener::OnRotateEnd");\r
-//   ui_api_vibrate_once_func(); \r
+//   custom_VibratorFunc_int(0); \r
   return true;\r
 }\r
 } // namespace OHOS
\ No newline at end of file
index d7cf716..2929009 100644 (file)
 // #include "sleep/include/SleepControlPresenter.h"
 #include "string"
 
+#ifdef SUPPORT_CYWEE_SERVICE
+#include "cywee_hal.h"
+#endif
+
 #define SLEEP_TIME_PATH "/user/userdata/sleep/%s/sleep_time.bin"
 #define SLEEP_STATUS_PATH "/user/userdata/sleep/%s/sleep_status.bin"
 
@@ -37,38 +41,17 @@ void ble_sleep_init(void);
 namespace OHOS
 {
 #pragma pack(push, 1)
-    typedef struct
-    {
-        uint32_t fall_asleep_timestamp; // 入睡
-        uint32_t wake_up_timestamp;     // 出睡
-        uint16_t total_time;            // 总时长
-    } NAP_T;
-
-    typedef struct
-    {
-        uint32_t fall_asleep_timestamp; // 入睡
-        uint32_t wake_up_timestamp;     // 出睡
-        uint16_t total_time;            // 总时长
-    } SLEEP_T;
-
-    typedef struct
-    {
-        uint32_t timestamp; //时间戳
-        uint8_t stat;       // 状态
-    } SLEEP_STAT_T;
 
 #pragma pack (pop)
 
-    // bool save_nap_data(NAP_T *data);
+    // bool save_nap_data(SLEEP_T *data);
     // uint32_t get_nap_data_size(void);
     // bool sleep_mutex_init(void);
     uint32_t read_sleep_nap_data(char *data, uint32_t size, FILE *fp);
-    void set_nap_data(NAP_T *data);
-    void set_sleep_data(SLEEP_T *data);
     // bool save_sleep_data(SLEEP_T *data);
-    bool read_sleep_data(SLEEP_T *data);
+    bool read_sleep_data(void);
     void read_wear_data(void);
-    bool read_nap_data(NAP_T *data);
+    bool read_nap_data(void);
     // void clean_sleep_data(void);
     // bool create_sleep_folder(void);
     std::string get_sleep_asleep_time_str(void);
@@ -92,15 +75,22 @@ namespace OHOS
         uint32_t wake_timestamp;  // 醒来时间戳
         int totaltime;            // 睡眠总时间
     } SleepDataUI;
+
+    typedef struct
+    {
+        uint32_t timestamp; //时间戳
+        uint8_t stat;       // 状态
+
+    } WEAR_STAT_T;
+
     class SleepModel
     {
     public:
         static SleepModel &GetInstance(void);
         void update_time_info(uint32_t timestamp, std::string &timeStr);
-        void update_sleep(SLEEP_T *data);
         void ReInitData(); // 重新刷新UI
         void Msg_ReInitData();
-        void read_sleep_file_data();
+
         void msg_save_sleep_data();
 
         void set_sleep_goal();
index 9a28746..a59822b 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-10-03 17:09:01
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-10-03 18:12:11
+ * @LastEditTime: 2025-07-29 12:11:19
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepModelC.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -15,13 +15,13 @@ extern "C"
 {
 #endif
 #endif
-    void custom_save_sleep_data(void);
-    void custom_save_nap_data(void);
-    void custom_read_sleep_data(void);
-    void custom_read_nap_data(void);
-    void custom_sleep_model_updata(void);
-    void update_sleep_data(uint32_t sleep_timestamp,uint32_t wake_timestamp,uint32_t totaltime);
-    void update_nap_data(uint32_t sleep_timestamp,uint32_t wake_timestamp,uint32_t totaltime);
+    // void custom_save_sleep_data(void);
+    // void custom_save_nap_data(void);
+    // void custom_read_sleep_data(void);
+    // void custom_read_nap_data(void);
+    // void custom_sleep_model_updata(void);
+    // void update_sleep_data(uint32_t sleep_timestamp,uint32_t wake_timestamp,uint32_t totaltime);
+    // void update_nap_data(uint32_t sleep_timestamp,uint32_t wake_timestamp,uint32_t totaltime);
     void custom_read_wear_data(void);
 #ifdef __cplusplus
 #if __cplusplus
index a8fe634..13a672a 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: SLEPPNOTIFY24-06-26 19:36:48
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-05-16 18:23:47
+ * @LastEditTime: 2025-07-31 15:02:23
  * @FilePath:
  * /FD230/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp
  * @Description:
@@ -39,7 +39,7 @@
 #include "broadcast_service.h"
 #include "cmsis_os.h"
 #include "custom_runtime.h"
-//#include "cywee_service.h"
+
 #include "power_display_service.h"
 #include "sleep/include/SleepModelC.h"
 #include "thread_adapter.h"
 
 #ifdef SUPPORT_CYWEE_SERVICE
 #include "cywee_service.h"
+#include "cywee_hal.h"
 #endif
 
+#define SLEPPNOTIFY 20
+
 extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time,
                                        char date_separator, char time_separator,
                                        date_format_t format);
 extern "C" int get_sleep_time_from_config_model(void);
 extern "C" int get_wake_up_time_from_config_model();
 
+#ifdef SUPPORT_CYWEE_SERVICE
+extern "C" void cywee_get_sleep_time_data(uint32_t *fall_sleep_time,uint32_t *wake_up_time,uint16_t *total_time,uint8_t data_type);
+#endif
 
 static uint32_t len = 0;
-static OHOS::SLEEP_STAT_T *wear_stat;
+
 namespace OHOS
 {
-#define SLEPPNOTIFY 20
 
-  static NAP_T nap_data = {0};
-  static SLEEP_T sleep_data = {0};
 
-  static uint32_t sleep_update_timestamp = 0;
-  static uint32_t nap_update_timestamp = 0;
+  OHOS::WEAR_STAT_T *wear_stat = NULL;
 
   void SleepModel::clean_sleep_data(void)
   {
-      sleep_update_timestamp = 0;
-      nap_update_timestamp = 0;
-      memset(&sleep_data,0,sizeof(SLEEP_T));
-      memset(&nap_data, 0, sizeof(NAP_T));
-  }
-
-  /*获取最新睡眠时间戳*/
-  uint32_t get_sleep_update_timestamp(void)
-  {
-    if (nap_update_timestamp <= sleep_update_timestamp)
-      return sleep_update_timestamp;
-    else
-      return nap_update_timestamp;
+      sleep_total_time = 0;
+      nap_total_time = 0;
   }
 
-  static char nap_file_path[64] = {0};
-  
-
   bool is_regular_file(const std::string &file_name)
   {
     struct stat file_stat;
@@ -101,365 +89,265 @@ namespace OHOS
     return S_ISREG(file_stat.st_mode); // 检查文件是否为普通文件
   }
 
-  std::string get_wear_status_str(void) 
+  std::string get_wear_status_str(void)
   {
-      std::string result;
-      std::string wear_status;
-        // 进行文件读取
-        do_custom_fileoperate_service_check_msg(  
-            CUSTOM_FILEOPERATE_MSG_TYPE_WEAR_DATA_READ, nullptr, 0);  
-        LOS_Msleep(100); // 等待文件系统准备  
+    std::string result;
+    std::string wear_status;
+    // 进行文件读取
+    do_custom_fileoperate_service_check_msg(
+        CUSTOM_FILEOPERATE_MSG_TYPE_WEAR_DATA_READ, nullptr, 0);
+    LOS_Msleep(100); // 等待文件系统准备
+
+    if(len == 0)
+        return result;
+
+    for(int i = 0; i < len/5; i++)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data.timestamp : %d , data.stat : %d", wear_stat[i].timestamp,wear_stat[i].stat);
+        if(wear_stat[i].stat)
+            wear_status = "已配戴";
+        else
+            wear_status = "未配戴";
 
-        if(len == 0)
-            return result;
+        std::string timestr;
+        char labelTime[20] = {0};
 
-        for(int i = 0; i < len/5; i++)
+        if (uapi_get_TIME_STR(wear_stat[i].timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC)
+        {
+            timestr = "--";
+        }
+        else
         {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data.timestamp : %d , data.stat : %d", wear_stat[i].timestamp,wear_stat[i].stat);
-            if(wear_stat[i].stat)
-                wear_status = "已配戴";
-            else
-                wear_status = "未配戴";
-
-            std::string timestr;
-            char labelTime[20] = {0};
-
-            if (uapi_get_TIME_STR(wear_stat[i].timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC)  
-            {  
-                timestr = "--";  
-            }  
-            else  
-            {  
-                timestr = labelTime;  
-            } 
-
-            result += wear_status + ":"+ timestr + "\n";
+            timestr = labelTime;
         }
+
+        result += wear_status + ":"+ timestr + "\n";
+    }
+    if(wear_stat)
+    {
         free(wear_stat);
-        return result; // 返回结果字符串  
-    } 
+        wear_stat = NULL;
+    }
+
+    return result; // 返回结果字符串
+  }
 
   std::string get_sleep_star_str(void)
   {
 
-      std::string result;
-
-      uint16_t datelen = 0;
-      uint8_t sleep_data[256] = {0}; 
-      
-      uint32_t asleep_time = 0;
-      uint32_t wake_up_time = 0;
-      uint16_t total_time = 0;
-      uint16_t total_deep_sleep_time = 0;
-      uint16_t total_mild_sleep_time = 0;
-      uint16_t total_rem_sleep_time = 0;
-      uint16_t total_wake_time = 0;
-      uint32_t timestampe = 0;
-      int status = -1;
-      uint8_t index = 0;
-      char timestampe_str[10] = {0};
-      char status_str[20] = {0};
-
-      char day[12] = {0};
-      uapi_get_YYMMDD_Time(day, '\0');
-
-      char file_path[64] = {0};
-      sprintf_s(file_path, 64, SLEEP_TIME_PATH, day);
-
-      uapi_get_file_data(file_path,sleep_data,&datelen);
-
-      if(datelen == 0)
-      {
-          PRINT("fread error datelen == 0 \n");
-          return "没有文件";
-      }
+    std::string result;
 
-      asleep_time = *(uint32_t*)&sleep_data[1];
-      wake_up_time = *(uint32_t*)&sleep_data[5];
+    uint16_t datelen = 0;
+    uint8_t sleep_data[256] = {0};
 
-      total_time = sleep_data[9] * 60 + sleep_data[10];
-      total_deep_sleep_time = sleep_data[11]  * 60 + sleep_data[12];
-      total_mild_sleep_time = sleep_data[13]  * 60 + sleep_data[14];
-      total_rem_sleep_time = sleep_data[15] * 60 + sleep_data[16];
-      total_wake_time = sleep_data[17] * 60 + sleep_data[18];
+    uint32_t asleep_time = 0;
+    uint32_t wake_up_time = 0;
+    uint16_t total_time = 0;
+    uint16_t total_deep_sleep_time = 0;
+    uint16_t total_mild_sleep_time = 0;
+    uint16_t total_rem_sleep_time = 0;
+    uint16_t total_wake_time = 0;
+    uint32_t timestampe = 0;
+    int status = -1;
+    uint8_t index = 0;
+    char timestampe_str[10] = {0};
+    char status_str[20] = {0};
 
-      char asleep_time_str[10] = {0};
-      uapi_get_TIME_STR(asleep_time,asleep_time_str, '.', ':',DATE_H_M);
+    char day[12] = {0};
+    uapi_get_YYMMDD_Time(day, '\0');
 
-      char wake_up_time_str[10] = {0};
-      uapi_get_TIME_STR(wake_up_time,wake_up_time_str, '.', ':',DATE_H_M);
+    char file_path[64] = {0};
+    sprintf_s(file_path, 64, SLEEP_TIME_PATH, day);
 
+    uapi_get_file_data(file_path, sleep_data, &datelen);
 
-      result += std::string("入睡时间: ") + asleep_time_str + " " + std::to_string(asleep_time) + "\n";  
-      result += std::string("出睡时间: ") + wake_up_time_str + " " + std::to_string(wake_up_time) + "\n";  
-      result += std::string("总时长: ") + std::to_string(total_time) +  "\n";  
-      result += std::string("深睡时长: ") + std::to_string(total_deep_sleep_time) +  "\n";  
-      result += std::string("浅睡时长: ") + std::to_string(total_mild_sleep_time) +  "\n";  
-      result += std::string("快速眼动时长: ") + std::to_string(total_rem_sleep_time) +  "\n";  
-      result += std::string("清醒时长: ") + std::to_string(total_wake_time) +  "\n";   
+    if (datelen == 0)
+    {
+      printf("fread error datelen == 0 \n");
+      return "没有文件";
+    }
 
-      // PRINT("入睡时间 : %s %d \n",asleep_time_str,asleep_time);
-      // PRINT("出睡时间 : %s %d \n",wake_up_time_str,wake_up_time);
-      // PRINT("总时长 : %d 分钟\n",total_time);
-      // PRINT("深睡时长 : %d 分钟\n",total_deep_sleep_time);
-      // PRINT("浅睡时长 : %d 分钟\n",total_mild_sleep_time);
-      // PRINT("快速眼动时长 : %d 分钟\n",total_rem_sleep_time);
-      // PRINT("清醒时长 : %d 分钟\n",total_wake_time);
+    asleep_time = *(uint32_t *)&sleep_data[1];
+    wake_up_time = *(uint32_t *)&sleep_data[5];
+
+    total_time = sleep_data[9] * 60 + sleep_data[10];
+    total_deep_sleep_time = sleep_data[11] * 60 + sleep_data[12];
+    total_mild_sleep_time = sleep_data[13] * 60 + sleep_data[14];
+    total_rem_sleep_time = sleep_data[15] * 60 + sleep_data[16];
+    total_wake_time = sleep_data[17] * 60 + sleep_data[18];
+
+    char asleep_time_str[10] = {0};
+    uapi_get_TIME_STR(asleep_time, asleep_time_str, '.', ':', DATE_H_M);
+
+    char wake_up_time_str[10] = {0};
+    uapi_get_TIME_STR(wake_up_time, wake_up_time_str, '.', ':', DATE_H_M);
+
+    result += std::string("入睡时间: ") + asleep_time_str + " " + std::to_string(asleep_time) + "\n";
+    result += std::string("出睡时间: ") + wake_up_time_str + " " + std::to_string(wake_up_time) + "\n";
+    result += std::string("总时长: ") + std::to_string(total_time) + "\n";
+    result += std::string("深睡时长: ") + std::to_string(total_deep_sleep_time) + "\n";
+    result += std::string("浅睡时长: ") + std::to_string(total_mild_sleep_time) + "\n";
+    result += std::string("快速眼动时长: ") + std::to_string(total_rem_sleep_time) + "\n";
+    result += std::string("清醒时长: ") + std::to_string(total_wake_time) + "\n";
+
+    // PRINT("入睡时间 : %s %d \n",asleep_time_str,asleep_time);
+    // PRINT("出睡时间 : %s %d \n",wake_up_time_str,wake_up_time);
+    // PRINT("总时长 : %d 分钟\n",total_time);
+    // PRINT("深睡时长 : %d 分钟\n",total_deep_sleep_time);
+    // PRINT("浅睡时长 : %d 分钟\n",total_mild_sleep_time);
+    // PRINT("快速眼动时长 : %d 分钟\n",total_rem_sleep_time);
+    // PRINT("清醒时长 : %d 分钟\n",total_wake_time);
+
+    char statuspath[64] = {0};
+    uapi_get_YYMMDD_Time(day, '\0');
+    sprintf_s(statuspath, 64, SLEEP_STATUS_PATH, day);
 
-      char statuspath[64] = {0};
-      uapi_get_YYMMDD_Time(day, '\0');
-      sprintf_s(statuspath, 64, SLEEP_STATUS_PATH, day);
+    memset(sleep_data, 0, sizeof(sleep_data));
+    datelen = 0;
+    uapi_get_file_data(statuspath, sleep_data, &datelen);
 
+    if (datelen == 0)
+    {
+      printf("fread error datelen == 0 \n");
+      return result += "\n 没有状态文件";
+    }
 
-      memset(sleep_data,0,sizeof(sleep_data));
-      datelen = 0;
-      uapi_get_file_data(statuspath,sleep_data,&datelen);
-      
-      if(datelen == 0)
+    while (datelen)
+    {
+      memset(timestampe_str, 0, sizeof(timestampe_str));
+      memset(status_str, 0, sizeof(status_str));
+      timestampe = *(uint32_t *)&sleep_data[index];
+      uapi_get_TIME_STR(timestampe, timestampe_str, '.', ':', DATE_H_M);
+      status = sleep_data[index + 4];
+      // 0进入睡眠  1潜睡 2深睡 3清醒 4结束睡眠 6入睡 7出睡最后一笔输出 8未出睡最后一笔输出 12快速动眼 13取消入睡
+      switch (status)
       {
-          PRINT("fread error datelen == 0 \n");
-          return result += "\n 没有状态文件";
+      case 0:
+        strcpy(status_str, "进入睡眠");
+        break;
+      case 1:
+        strcpy(status_str, "浅睡");
+        break;
+      case 2:
+        strcpy(status_str, "深睡");
+        break;
+      case 3:
+        strcpy(status_str, "清醒");
+        break;
+      case 4:
+        strcpy(status_str, "结束睡眠");
+        break;
+      case 6:
+        strcpy(status_str, "入睡通知");
+        break;
+      case 7:
+        strcpy(status_str, "出睡最后一笔输出");
+        break;
+      case 9:
+        strcpy(status_str, "未出睡最后一笔输出");
+        break;
+      case 12:
+        strcpy(status_str, "快速动眼");
+        break;
+      case 13:
+        strcpy(status_str, "取消入睡");
+        break;
+      default:
+        break;
       }
 
-      while(datelen)
-      {
-          memset(timestampe_str,0,sizeof(timestampe_str));
-          memset(status_str,0,sizeof(status_str));
-          timestampe = *(uint32_t*)&sleep_data[index];
-          uapi_get_TIME_STR(timestampe,timestampe_str, '.', ':',DATE_H_M);
-          status = sleep_data[index + 4];
-          //0进入睡眠  1潜睡 2深睡 3清醒 4结束睡眠 6入睡 7出睡最后一笔输出 8未出睡最后一笔输出 12快速动眼 13取消入睡
-          switch(status)
-          {
-              case 0:
-                  strcpy(status_str,"进入睡眠");
-                  break;
-              case 1:
-                  strcpy(status_str,"浅睡");
-                  break;
-              case 2:
-                  strcpy(status_str,"深睡");
-                  break;
-              case 3:
-                  strcpy(status_str,"清醒");
-                  break;
-              case 4:
-                  strcpy(status_str,"结束睡眠");
-                  break;
-              case 6:
-                  strcpy(status_str,"入睡通知");
-                  break;
-              case 7:
-                  strcpy(status_str,"出睡最后一笔输出");
-                  break;
-              case 9:
-                  strcpy(status_str,"未出睡最后一笔输出");
-                  break;
-              case 12:
-                  strcpy(status_str,"快速动眼");
-                  break;
-              case 13:
-                  strcpy(status_str,"取消入睡");
-                  break;
-              default:
-                  break;
-
-          }
-
-          // PRINT("时间 :  %d %s  状态:%s\n",timestampe,timestampe_str,status_str);
-
-          result += std::string(status_str) + std::to_string(timestampe) +  "\n"; 
-
-          index+=5;
-          datelen -= 5;
-      }
-      return result;
+      // PRINT("时间 :  %d %s  状态:%s\n",timestampe,timestampe_str,status_str);
+
+      result += std::string(status_str) + std::to_string(timestampe) + "\n";
+
+      index += 5;
+      datelen -= 5;
+    }
+    return result;
   }
 
   std::string get_sleep_asleep_time_str(void)
   {
-      std::string timestr;
-      char labelTime[20] = {0};
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep_data.fall_asleep_timestamp : %d",sleep_data.fall_asleep_timestamp);
-      if (uapi_get_TIME_STR(sleep_data.fall_asleep_timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC || !sleep_data.fall_asleep_timestamp)  
-      {  
-          timestr = "--";  
-      }  
-      else  
-      {  
-          timestr = labelTime;  
-      } 
-      return timestr;
+      uint32_t sleep_fall_asleep_timestamp = 0;
+      uint32_t sleep_wake_up_timestamp = 0;
+#ifdef SUPPORT_CYWEE_SERVICE
+      cywee_get_sleep_time_data(&sleep_fall_asleep_timestamp, &sleep_wake_up_timestamp, &sleep_total_time, SLEEP_DATA_TYPE);
+#endif
+    std::string timestr;
+    char labelTime[20] = {0};
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep_data.fall_asleep_timestamp : %d",sleep_fall_asleep_timestamp);
+    if (uapi_get_TIME_STR(sleep_fall_asleep_timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC || !sleep_fall_asleep_timestamp)
+    {
+        timestr = "--";
+    }
+    else
+    {
+        timestr = labelTime;
+    }
+    return timestr;
   }
 
   std::string get_sleep_wake_time_str(void)
   {
+      uint32_t sleep_fall_asleep_timestamp = 0;
+      uint32_t sleep_wake_up_timestamp = 0;
+#ifdef SUPPORT_CYWEE_SERVICE
+      cywee_get_sleep_time_data(&sleep_fall_asleep_timestamp, &sleep_wake_up_timestamp, &sleep_total_time, SLEEP_DATA_TYPE);
+#endif
       std::string timestr;
       char labelTime[20] = {0};
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep_data.wake_up_timestamp : %d",sleep_data.wake_up_timestamp);
-      if (uapi_get_TIME_STR(sleep_data.wake_up_timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC || !sleep_data.wake_up_timestamp)  
-      {  
-          timestr = "--";  
-      }  
-      else  
-      {  
-          timestr = labelTime;  
-      } 
-      return timestr;
-  }
-
-  void read_wear_data(void)   
-  {
-      uint32_t size = 0;
-      len = uapi_get_file_size("user/userdata/wear.bin");
-      if(!len)
-        return;
-
-      wear_stat = (SLEEP_STAT_T *)malloc(len);
-      FILE *fp;
-
-      fp = fopen("user/userdata/wear.bin", "rb"); 
-      if (fp == NULL) 
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep_data.wake_up_timestamp : %d",sleep_wake_up_timestamp);
+      if (uapi_get_TIME_STR(sleep_wake_up_timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC || !sleep_wake_up_timestamp)
       {
-          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "wear file open failed");
-          free(wear_stat);
-          return;
+          timestr = "--";
       }
-
-      size = fread(wear_stat, 1, len, fp);
-      if(size != len)
+      else
       {
-          free(wear_stat);
-          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "wear file read failed");
+          timestr = labelTime;
       }
-      fclose(fp);
-  }
-  
-  bool read_sleep_data(SLEEP_T *data)
-  {
-    char day[12] = {0};
-    uapi_get_YYMMDD_Time(day, '\0');
-
-    char file_path[64] = {0};
-    sprintf_s(file_path, 64, SLEEP_TIME_PATH, day);
-
-    FILE *fp = fopen(file_path, "rb");
-    if (fp == NULL)
-    {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "read_sleep_data fopen fail %s \n",file_path);
-      // osal_mutex_unlock(&sleep_mutex);
-      return false;
-    }
-
-    // 读取睡眠类型
-    uint8_t sleep_type;
-    fread(&sleep_type, 1, 1, fp);
-
-    if (sleep_type == 0)
-    {
-      fclose(fp);
-      // osal_mutex_unlock(&sleep_mutex);
-      return false;
-    }
-
-    // 入睡时间
-    uint32_t fall_asleep_timestamp;
-    fread(&fall_asleep_timestamp, 1, 4, fp);
-
-    // 起床时间
-    uint32_t wake_up_timestamp;
-    fread(&wake_up_timestamp, 1, 4, fp);
-
-    // 睡眠总时间
-    uint8_t total_time_hour, total_time_minute;
-    fread(&total_time_hour, 1, 1, fp);
-    fread(&total_time_minute, 1, 1, fp);
-    uint16_t total_time = total_time_hour * 60 + total_time_minute;
-
-    // 累加睡眠数据
-    data->fall_asleep_timestamp = fall_asleep_timestamp;
-    data->wake_up_timestamp = wake_up_timestamp;
-    data->total_time = total_time;
-
-    sleep_update_timestamp = wake_up_timestamp;
-
-    fclose(fp);
-
-    // osal_mutex_unlock(&sleep_mutex);
-
-    return true;
+      return timestr;
   }
 
-  bool read_nap_data(NAP_T *data)
+  void read_wear_data(void)
   {
-    char day[12] = {0};
-    uapi_get_YYMMDD_Time(day, '\0');
-
-    sprintf_s(nap_file_path, 64, NAP_PATH, day);
-
-    FILE *fp = fopen(nap_file_path, "rb");
-    if (fp == NULL)
-    {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "read_nap_data  %s fopen fail", nap_file_path);
-      return false;
-    }
-
-    if(uapi_get_file_size(nap_file_path) > 14) //存在多段小睡 UI显示最新的一次数据
-       fseek(fp, -14, SEEK_END);//移到最后一段数据
-
-    fseek(fp, 3, SEEK_CUR); // 将文件指针移动到睡眠类型
-
-    //读取睡眠类型
-    uint8_t sleep_type;
-    fread(&sleep_type, 1, 1, fp);
-
-    if (sleep_type == 1)
-    {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep_type error!!!");
-      fclose(fp);
-      return false;
-    }
-    // 入睡时间
-    uint32_t fall_asleep_timestamp;
-    fread(&fall_asleep_timestamp, 1, 4, fp);
-
-    // 起床时间
-    uint32_t wake_up_timestamp;
-    fread(&wake_up_timestamp, 1, 4, fp);
-
-    // 睡眠总时间
-    uint8_t total_time_hour, total_time_minute;
-    fread(&total_time_hour, 1, 1, fp);
-    fread(&total_time_minute, 1, 1, fp);
-    uint16_t total_time = total_time_hour * 60 + total_time_minute;
-
-    // 累加睡眠数据
-    data->fall_asleep_timestamp = fall_asleep_timestamp;
-    data->wake_up_timestamp = wake_up_timestamp;
-    data->total_time = total_time;
+        uint32_t size = 0;
+        len = uapi_get_file_size("user/userdata/wear.bin");
+        if(!len)
+          return;
 
-    nap_update_timestamp = wake_up_timestamp;
+        if(wear_stat == NULL)
+          wear_stat = (OHOS :: WEAR_STAT_T*)malloc(len);
 
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "fall_asleep_timestamp : %d  wake_up_timestamp : %d  total_time : %d ", data->fall_asleep_timestamp, data->wake_up_timestamp, data->total_time);
+        if(wear_stat == NULL)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "wear stat malloc failed");
+            return;
+        }
 
-    fclose(fp);
+        FILE *fp = fopen("user/userdata/wear.bin", "rb");
+        if (fp == NULL)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "wear file open failed");
+            free(wear_stat);
+            return;
+        }
 
-    return true;
-  }
-  void set_sleep_data(SLEEP_T *data)
-  {
-    memset(&sleep_data, 0, sizeof(SLEEP_T));
-    memcpy_s(&sleep_data, sizeof(SLEEP_T), data, sizeof(SLEEP_T));
-    // 刷新model里面的数据
-    // SleepModel::GetInstance().update_sleep(&sleep_data);
+        size = fread(wear_stat, 1, len, fp);
+        if(size != len)
+        {
+            free(wear_stat);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "wear file read failed");
+        }
+        fclose(fp);
   }
+
   /* -------------------------------------------------------------------------- */
   SleepModel::SleepModel()
   {
     // 初始化配置睡眠目标
     set_sleep_goal();
     // 刷新数据
-    Msg_ReInitData();
+    ReInitData();
   }
   SleepModel::~SleepModel() {}
   SleepModel &SleepModel::GetInstance()
@@ -467,74 +355,78 @@ namespace OHOS
     static SleepModel instance;
     return instance;
   }
-  void SleepModel::Msg_ReInitData() {
-      do_custom_fileoperate_service_check_msg(
-  CUSTOM_FILEOPERATE_MSG_TYPE_SLEEPMODLE_UPDATE, nullptr, 0);
+  void SleepModel::Msg_ReInitData()
+  {
+    do_custom_fileoperate_service_check_msg(
+        CUSTOM_FILEOPERATE_MSG_TYPE_SLEEPMODLE_UPDATE, nullptr, 0);
   }
 
-
-  //更新睡眠model数据
+  // 更新睡眠model数据
   void SleepModel::ReInitData()
   {
+
+    uint32_t sleep_fall_asleep_timestamp = 0;
+    uint32_t sleep_wake_up_timestamp = 0;
+    uint32_t nap_fall_asleep_timestamp = 0;
+    uint32_t nap_wake_up_timestamp = 0;
+
+#ifdef SUPPORT_CYWEE_SERVICE
+    cywee_get_sleep_time_data(&sleep_fall_asleep_timestamp, &sleep_wake_up_timestamp, &sleep_total_time, SLEEP_DATA_TYPE);
+    cywee_get_sleep_time_data(&nap_fall_asleep_timestamp, &nap_wake_up_timestamp, &nap_total_time, NAP_DATA_TYPE);
+#endif
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "ReadSleepData sleepStr %u  wakeStr %u sleep_total_time %d",
+                  sleep_fall_asleep_timestamp,
+                  sleep_wake_up_timestamp, sleep_total_time);
+
+    if (sleep_fall_asleep_timestamp && sleep_wake_up_timestamp)
     {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                    "ReadSleepData sleepStr %u  wakeStr %u sleep_total_time %d",
-                    sleep_data.fall_asleep_timestamp,
-                    sleep_data.wake_up_timestamp, sleep_data.total_time);
-      if (sleep_data.fall_asleep_timestamp)
-      {
-        update_time_info(sleep_data.fall_asleep_timestamp, sleepStr);
-        update_time_info(sleep_data.wake_up_timestamp, wakeStr);
-      }
-      else
-      {
-        sleepStr = "--";
-        wakeStr = "--";
-      }
-      sleep_total_time = sleep_data.total_time;
+      update_time_info(sleep_fall_asleep_timestamp, sleepStr);
+      update_time_info(sleep_wake_up_timestamp, wakeStr);
     }
+    else
     {
-      if (nap_data.fall_asleep_timestamp)
-      {
-        update_time_info(nap_data.fall_asleep_timestamp, napsleepStr);
-        update_time_info(nap_data.wake_up_timestamp, napwakeStr);
-      }
-      else
-      {
-        napsleepStr = "--";
-        napwakeStr = "--";
-      }
-      nap_total_time = nap_data.total_time;
+      sleepStr = "--";
+      wakeStr = "--";
+    }
+
+    if (nap_fall_asleep_timestamp && nap_wake_up_timestamp)
+    {
+      update_time_info(nap_fall_asleep_timestamp, napsleepStr);
+      update_time_info(nap_wake_up_timestamp, napwakeStr);
+    }
+    else
+    {
+      napsleepStr = "--";
+      napwakeStr = "--";
     }
 
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
                   "ReadSleepData sleepStr %s  wakeStr %s sleep_total_time %d nap_total_time %d napsleepStr %s napwakeStr %s",
                   sleepStr.c_str(), wakeStr.c_str(), sleep_total_time, nap_total_time, napsleepStr.c_str(), napwakeStr.c_str());
-
-    // delete data; // 释放内存
   }
 
-  // 开机读取
-  void SleepModel::read_sleep_file_data() {
-    custom_read_sleep_data();
-    custom_read_nap_data();
-
-  }
   // 保存睡眠数据
- void SleepModel::msg_save_sleep_data() {
+  void SleepModel::msg_save_sleep_data()
+  {
     // 配置睡眠数据
     int cmd = 0;
 #ifdef SUPPORT_CYWEE_SERVICE
-   do_cywee_service_check_msg(CYWEE_SERVICE_CMD_GET_SLEEP_DATA,&cmd); // 获取睡眠数据 但不中止睡眠
+    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_GET_SLEEP_DATA, &cmd); // 获取睡眠数据 但不中止睡眠
 #endif
- }
+  }
 
   void SleepModel::UpdateSleepView()
   {
+
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "睡眠数据更新");
     SleepControlView *p_SleepControlView = SleepControlView::GetInstance();
     if (p_SleepControlView != nullptr)
     {
+
+      ReInitData();
+
       if (p_SleepControlView->GetSleepView())
       {
         p_SleepControlView->GetSleepView()->SleepDataRefresh();
@@ -687,62 +579,22 @@ namespace OHOS
   std::string SleepModel::GetUpdateSleepTime()
   {
     sleep_time_str.clear();
-    // 获取睡眠最新时间
-    sleep_update_time = get_sleep_update_timestamp();
-    // 获取时间戳
-    update_time_info(sleep_update_time, sleep_time_str);
+    // // 获取睡眠最新时间
+    // sleep_update_time = get_sleep_update_timestamp();
+    // // 获取时间戳
+    // update_time_info(sleep_update_time, sleep_time_str);
     return sleep_time_str;
   }
-  //校验时间更新
-  bool SleepModel::CheckSleepTime() {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CheckSleepTime %d",sleep_update_time);
-    // 获取睡眠最新时间
-    if (sleep_update_time != 0) {
-      return true;
-      }
-    return false;
-  }
-  void SleepModel::update_sleep(SLEEP_T *data)
+  // 校验时间更新
+  bool SleepModel::CheckSleepTime()
   {
-    if (data == nullptr)
-    {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid input data");
-      return;
-    }
-
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
-                  "fall_asleep_timestamp:%d wake_up_timestamp:%d total_time:%d",
-                  data->fall_asleep_timestamp, data->wake_up_timestamp,
-                  data->total_time);
-
-    SleepDataUI *UIdata = ReadSleepData();
-    if (UIdata != nullptr)
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CheckSleepTime %d", sleep_update_time);
+    // 获取睡眠最新时间
+    if (sleep_update_time != 0)
     {
-      // 入睡时间是最早时间
-      if (data->fall_asleep_timestamp < UIdata->sleep_timestamp ||
-          UIdata->sleep_timestamp == 0)
-      {
-        UIdata->sleep_timestamp = data->fall_asleep_timestamp;
-      }
-      // 起床时间是最晚时间
-      if (data->wake_up_timestamp > UIdata->wake_timestamp ||
-          UIdata->wake_timestamp == 0)
-      {
-        UIdata->wake_timestamp = data->wake_up_timestamp;
-      }
-      // 总时间需要累加
-      UIdata->totaltime += data->total_time;
-
-      update_time_info(UIdata->sleep_timestamp, sleepStr);
-      update_time_info(UIdata->wake_timestamp, wakeStr);
-      UIdata->sleeptime = sleepStr;
-      UIdata->waketime = wakeStr;
-
-      sleep_total_time = UIdata->totaltime;
-
-      SaveSleepData(*UIdata);
+      return true;
     }
-    delete UIdata; // Free memory if dynamically allocated
+    return false;
   }
 
   // 清空睡眠数据
@@ -863,7 +715,7 @@ namespace OHOS
     goal_total_time = total_hours; // 确保最小时间为0小时
 
     /*通知界面更新*/
-   // SendMsgToUIService(UI_UPDATE_SLEEP_DATA, 0, nullptr, 0);
+    // SendMsgToUIService(UI_UPDATE_SLEEP_DATA, 0, nullptr, 0);
   }
   // 获取睡眠总时长(小时)
   int SleepModel::get_sleep_hour() { return sleep_total_time / 60; }
@@ -977,44 +829,11 @@ namespace OHOS
 #endif /* __cplusplus */
 #endif /* __cplusplus */
 
-    void custom_read_sleep_data(void)
-    {
-      memset(&sleep_data, 0, sizeof(SLEEP_T));
-      read_sleep_data(&sleep_data);
-    }
-
-    void custom_read_nap_data(void)
-    {
-      memset(&nap_data, 0, sizeof(NAP_T));
-      read_nap_data(&nap_data);
-    }
-
     void custom_read_wear_data(void)
     {
         read_wear_data();
     }
 
-    void custom_sleep_model_updata(void)
-    {
-      OHOS::SleepModel::GetInstance().ReInitData();
-    }
-    // 更新睡眠数据
-    void update_sleep_data(uint32_t sleep_timestamp, uint32_t wake_timestamp,
-                           uint32_t totaltime) {
-      sleep_data.fall_asleep_timestamp = sleep_timestamp;
-      sleep_data.wake_up_timestamp = wake_timestamp;
-      sleep_data.total_time = totaltime;
-      sleep_update_timestamp = sleep_data.wake_up_timestamp;
-    }
-    // 更新小睡数据
-    void update_nap_data(uint32_t sleep_timestamp, uint32_t wake_timestamp,
-                         uint32_t totaltime) {
-      nap_data.fall_asleep_timestamp = sleep_timestamp;  
-      nap_data.wake_up_timestamp = wake_timestamp;  
-      nap_data.total_time = totaltime;  
-      nap_update_timestamp = nap_data.wake_up_timestamp;
-    }
-
 #ifdef BLE_INSTRUCT
 
 #include "bleEvent.h"
index 6e3dadc..8a00b12 100644 (file)
@@ -134,7 +134,7 @@ namespace OHOS
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "VibrationMode = %d", VibrationMode);\r
             SoundAndVibrationModel::GetInstance()->SetVibrationReminderToggleButtonStaus(VibrationMode);\r
             // uapi_vibrationModeSet(VibrationMode);\r
-            ui_api_vibrate_once_func();\r
+            custom_VibratorFunc_int(0);\r
             view_->ChangeView(VIBRATIONMODEVIEW, SOUNDANDVIBRATIONVIEW);\r
         }\r
         return true;\r
index 4f09202..e22b333 100644 (file)
@@ -204,7 +204,7 @@ namespace OHOS
     bool VoumeProcessSliderEventListener::OnRotateEnd(UIView& view, const RotateEvent& event)
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "VoumeProcessSliderEventListener::OnRotateEnd,%d",event.GetRotate());
-        ui_api_vibrate_once_func();//受设置中震动强度控制
+        custom_VibratorFunc_int(0);//受设置中震动强度控制
         return true;
     }
 }
index 72a45da..2676073 100644 (file)
@@ -215,7 +215,7 @@ namespace OHOS
         }\r
         else if (strcmp(view.GetViewId(), FACTORYRESET_CHECKON) == 0) // 恢复出厂设置确认\r
         {\r
-            ui_api_vibrate_once_func(); //恢复出厂增加震动\r
+            custom_VibratorFunc_int(0); //恢复出厂增加震动\r
             p_SystemView->ChangeView(FACTORYRESETVIEW, SHUTDOWNANIMATIONVIEW);\r
             ShutDownImageAnimatorView::GetInstance()->ShutDownImageAnimator_Start(2);\r
             isShutDownImageAnimatorStart = true;\r
index 48eaa0a..1d79fa4 100644 (file)
@@ -549,7 +549,7 @@ void TraingModel::AnalysisData(act_result_t *cyweeInfo) {
     uapi_set_screen_on_api(); // 亮屏检测
     if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() &&
         (!uapi_sleep_mode_flag_get())) {
-      ui_api_vibrate_once_func();
+      custom_VibratorFunc_int(0);
     }
     if (TraingCardView::GetInstance()) {
       GraphicService::GetInstance()->PostGraphicEvent(
@@ -1243,7 +1243,7 @@ void TraingModel::CheckSportTag() {
       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "目标完成");
       uapi_set_screen_on_api(); // 亮屏检测
       if (!OHOS::ConfigModel::GetInstance()->GetDnotdisturb()) {
-        ui_api_vibrate_once_func(); // 震动提示
+        custom_VibratorFunc_int(0); // 震动提示
       }
       if (TraingCardView::GetInstance()) {
         GraphicService::GetInstance()->PostGraphicEvent(
@@ -1268,7 +1268,7 @@ void TraingModel::CheckTimeTag() {
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "目标完成");
     uapi_set_screen_on_api(); // 亮屏检测
     if (!OHOS::ConfigModel::GetInstance()->GetDnotdisturb()) {
-      ui_api_vibrate_once_func(); // 震动提示
+      custom_VibratorFunc_int(0); // 震动提示
     }
     if (TraingCardView::GetInstance()) {
       GraphicService::GetInstance()->PostGraphicEvent(
@@ -1851,7 +1851,7 @@ void TraingTimerCallback(void) {
   // 振动反馈
   if ((sportdata->goaldegree >= 100) && (shock_count < 4)) {
     shock_count++;
-    ui_api_vibrate_once_func(); // 触发振动反馈
+    custom_VibratorFunc_int(0); // 触发振动反馈
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "触发了振动。振动计数: %d",
                   shock_count);
   }
index b557872..dc1cb0d 100644 (file)
@@ -168,25 +168,25 @@ bool TraingCardPresenter::OpenSensor(ExerciseClass type) {
   }\r
   // 根据不同的运动项目进行不同的运动\r
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingCardPresenter::OpenSensor!!");\r
-#ifdef SUPPORT_PPG_SERVICE\r
+#ifdef SUPPORT_CYWEE_SERVICE\r
   switch (type) {\r
   case ExerciseClass::NORMAL:\r
-    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NORMAL_MODE, NULL);\r
+    cywee_sport_mode_change(CYWEE_SERVICE_CMD_NORMAL_MODE);\r
     break;\r
   case ExerciseClass::TREADMILL:\r
-    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_TREADMILL_MODE, NULL);\r
+    cywee_sport_mode_change(CYWEE_SERVICE_CMD_TREADMILL_MODE);\r
     break;\r
   case ExerciseClass::OUTDOOR:\r
-    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OUTDOOR_RUNNING_MODE, NULL);\r
+    cywee_sport_mode_change(CYWEE_SERVICE_CMD_OUTDOOR_RUNNING_MODE);\r
     break;\r
   case ExerciseClass::INDOOR:\r
-    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_INDOOR_RUNNING_MODE, NULL);\r
+    cywee_sport_mode_change(CYWEE_SERVICE_CMD_INDOOR_RUNNING_MODE);\r
     break;\r
   case ExerciseClass::FITNESS_PEDOMETER:\r
-    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_FITNESS_PEDOMETER_MODE, NULL);\r
+    cywee_sport_mode_change(CYWEE_SERVICE_CMD_FITNESS_PEDOMETER_MODE);\r
     break;\r
   case ExerciseClass::FREE_TRAINING:\r
-    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_FREE_TRAINING_MODE, NULL);\r
+    cywee_sport_mode_change(CYWEE_SERVICE_CMD_FREE_TRAINING_MODE);\r
     break;\r
   default:\r
     break;\r
index 20b62a7..ffdc01b 100644 (file)
@@ -118,7 +118,7 @@ namespace OHOS
             // }\r
             if (g_alarmView)\r
             {\r
-                ui_api_vibrate_once_func();\r
+                custom_VibratorFunc_int(0);\r
             }\r
         }\r
     }\r
index 59049e7..2da51f1 100644 (file)
@@ -910,26 +910,27 @@ namespace OHOS
             //   viewIndex = GetCurViewIndex();
             return true; // 进行UI刷新
         }
-        else if (viewId == "hrs_ble_switch")
-        {
-            if (toggleButtonOffline)
-            {
-                if (toggleButtonOffline->GetState() == false)
-                {
-                    send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_CLOSE_HRS_BLE);
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hrs_ble_switch false");
-                }
-                else
-                {
-                    send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_OPEN_HRS_BLE);
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "hrs_ble_switch true");
-                }
-            }
-            else
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "组件不存在");
-            }
-            return true; // 进行UI刷新
+                else if (viewId == "hrs_ble_switch") 
+        {
+          if (toggleButtonOffline) {
+            if (toggleButtonOffline->GetState() == false) {
+                uapi_dev_runtime_set_hrs_ble_status(0);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"hrs_ble_switch false");
+                custom_ble_service_stop();
+                LOS_Msleep(500);
+                custom_ble_service_start();
+            }
+            else {
+                uapi_dev_runtime_set_hrs_ble_status(1);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"hrs_ble_switch true");
+                custom_ble_service_stop();
+                LOS_Msleep(500);
+                custom_ble_service_start();
+            }
+          } else {
+             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"组件不存在");
+          }
+            return true; //进行UI刷新
         }
         else if (viewId == "runtime_log_is_save")
         {
index 9ba0d30..6545ed2 100644 (file)
@@ -100,7 +100,7 @@ namespace OHOS
         if (true != ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
             // uapi_vibrationModeSet(ConfigModel::GetInstance()->GetVibrationReminder());
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
         }
     }
 
@@ -251,7 +251,7 @@ namespace OHOS
             /* -------------------------------------------------------------------------- */
             if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
             {
-                ui_api_vibrate_once_func(); // 震动一次
+                custom_VibratorFunc_int(0); // 震动一次
             }
 
             ScreenTurnOn(10 * 1000); // 亮屏操作  10秒关闭
index 7dfe823..d40dc89 100644 (file)
@@ -105,7 +105,7 @@ namespace OHOS
     {
         if (nullptr != FindWatchGroupView)
         {
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
         }
     }
 
index f56113b..1f8845c 100644 (file)
@@ -301,7 +301,7 @@ namespace OHOS
         {
             if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
             {
-                ui_api_vibrate_once_func();
+                custom_VibratorFunc_int(0);
             }
         }
         if (GoalviewShowCallBack_FALG == 0)
index 2170112..5991460 100644 (file)
@@ -273,7 +273,7 @@ namespace OHOS
             (!uapi_sleep_mode_flag_get()))
         {
             // 震动提醒
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
         }
 
         MessageViewEventListener::GetInstance()
index 9c83eef..889f4ee 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-08-17 16:44:20
- * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-11-05 14:55:35
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-07-31 15:09:42
  * @FilePath: /FD230/code/sdk/application/wearable/service/msg_center/src/notify/motion_recognition_notification.cpp
  */
 #include "notification_manager.h"
@@ -352,7 +352,7 @@ namespace OHOS
         // 震动一次
         if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
         }
         /* -------------------------------------------------------------------------- */
         NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeMotionRecognitionView);
index 5319d24..6f76380 100644 (file)
@@ -393,7 +393,7 @@ namespace OHOS
         // 震动一次
         if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
-            // ui_api_vibrate_once_func();
+            // custom_VibratorFunc_int(0);
         }
 
         // ScreenTurnOn(40 * 1000); // 亮屏操作  40秒关闭
@@ -558,7 +558,7 @@ namespace OHOS
         /* -------------------------------------------------------------------------- */
         if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
-            // ui_api_vibrate_once_func(); // 震动一次
+            // custom_VibratorFunc_int(0); // 震动一次
         }
 
         // ScreenTurnOff();    //先设置为0
index 3e0b087..18b528c 100644 (file)
@@ -288,7 +288,7 @@ namespace OHOS
         ScreenTurnOn(10 * 1000); // 显示时长10s
         if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
         }
         /* -------------------------------------------------------------------------- */
         NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeSedentaryReminderView);
index d6e43ee..8fcbf9f 100644 (file)
@@ -161,7 +161,7 @@ namespace OHOS
 
         if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
         }
 
         ScreenTurnOn(100000); // 亮屏操作 100000ms 10秒关闭
@@ -207,7 +207,7 @@ namespace OHOS
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Create SleepGroupView succeed!!");
         if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
         }
 
         ScreenTurnOn(600000); // 亮屏操作 600000ms 60秒关闭
index 557dec3..f31b149 100644 (file)
@@ -42,6 +42,10 @@ namespace OHOS {
 extern "C" {
 #endif
 
+#ifdef SUPPORT_CYWEE_SERVICE
+#include "cywee_data.h"
+#endif
+
 extern uint8_t g_bloodoxygen;
 extern uint16_t g_heartrate;
 extern uint32_t g_stepdata;
@@ -282,9 +286,42 @@ void MsgCenterNotifyLocationProc(const Topic topic, Request* req)
     }
 }
 
+
+void MsgCenterNotifyONtimeProc(const Topic topic, Request* req)
+{
+    unused(req);
+    AlarmClockEventData* time=(AlarmClockEventData*)req->data;
+    // The alarm notification is not displayed if the incoming call notification is already being processed
+#ifdef SUPPORT_CYWEE_SERVICE
+    cywee_save_data();
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时步数");
+
+    cywee_step_history_save(time->value);
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时站立数据");
+    if(cywee_get_stand_flag())
+    {
+        cywee_stand_history_save(time->value);
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时卡路里数据");
+
+    cywee_calories_history_save(time->value);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时距离数据");
+
+    cywee_distances_history_save(time->value);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存每小时燃脂数据");
+
+    cywee_fat_history_save(time->value);
+#endif
+    // 保存完增加一次读取数据
+    SendMsgToUIService(UI_UPDATE_GOAL, 0, nullptr, 0);
+}
+
 /* 订阅事件通知逻辑可定制 */
 static MsgCenterNotifyTable g_msgCenterNotifyTable[] = {
     {TOPIC_EVENT_ALARM_RING,         MsgCenterNotifyAlarmProc},
+    {TOPIC_EVENT_ON_TIME,            MsgCenterNotifyONtimeProc},//增加整点保存数据
     {TOPIC_EVENT_NEXTDAY_UPDATE,     MsgCenterNotifyNextDayProc},
     {TOPIC_EVENT_HFP_INCOMMING,      MsgCenterNotifyHfpIncomingProc},
     {TOPIC_EVENT_HFP_PHONE_ACTIVE,   MsgCenterNotifyHfpPhoneProc},
index f01f7f7..863284d 100644 (file)
@@ -391,7 +391,7 @@ namespace OHOS
         // 震动一次
         if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
         }
 
         ScreenTurnOn(40 * 1000); // 亮屏操作  40秒关闭
@@ -556,7 +556,7 @@ namespace OHOS
         /* -------------------------------------------------------------------------- */
         if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
         {
-            ui_api_vibrate_once_func(); // 震动一次
+            custom_VibratorFunc_int(0); // 震动一次
         }
 
         // ScreenTurnOff();    //先设置为0
index 5bc2f3a..1d7dad9 100644 (file)
@@ -143,10 +143,17 @@ const lcd_cmd_sequ g_common_cmd_display_off[] = {
 };\r
 \r
 const lcd_cmd_sequ g_common_466x466_cmd_display_off[] = {\r
+#if defined(BOARD_W9) || defined(BOARD_N9)\r
+    {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
+    {1, 1, {0x28}, 10},         /* display off */\r
+    {1, 1, {0x10}, 120},       /* sleep in */\r
+    {1, 2, {0x4f, 0x01}, 100},        /* sleep in */\r
+#else\r
     {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
     {1, 1, {0x28}, 0},         /* display off */\r
     {1, 1, {0x10}, 120},       /* sleep in */\r
-    {1, 2, {0x4f, 0x01}, 0},   /* 进deepstandby 状态 */\r
+    {1, 2, {0x4f, 0x01}, 0},   /* ��deepstandby ״̬ */\r
+#endif\r
 };\r
 /* sleep in sequence for common lcd */\r
 const lcd_cmd_sequ g_common_cmd_sleep_in[] = {\r
index 315c090..23e8c47 100644 (file)
@@ -1,3 +1,11 @@
+/*\r
+ * @Author: penglei 1624952103@qq.com\r
+ * @Date: 2025-07-29 09:33:56\r
+ * @LastEditors: penglei 1624952103@qq.com\r
+ * @LastEditTime: 2025-07-30 11:37:00\r
+ * @FilePath: /FD230/code/sdk/drivers/drivers/driver/lcd/lcd_private.c\r
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
+ */\r
 /*\r
  * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved.\r
  * Description: Lcd private interface.\r
@@ -53,7 +61,9 @@ static void lcd_drv_power_off(void)
     uapi_gpio_set_dir(VCI_LCD_GPIO, GPIO_DIRECTION_OUTPUT);\r
     uapi_gpio_set_val(VCI_LCD_GPIO, GPIO_LEVEL_LOW);\r
     #endif\r
+#if defined(BOARD_FD230)\r
     uapi_tcxo_delay_ms(10); /* delay 10 ms */\r
+#endif\r
     int resetvalue = uapi_gpio_get_output_val(RESET_LCD_GPIO);\r
     int lcd_envalue = uapi_gpio_get_output_val(VCI_LCD_GPIO);\r
     printf("Output RESET_LCD_GPIO %d , VCI_LCD_GPIO %d\r\n",resetvalue,lcd_envalue);\r
index e2f5c20..5250e76 100644 (file)
@@ -135,7 +135,7 @@ extern "C" {
 #define CST86XX_REPORT_REG        0x0186  /* 设置中断上报频率 */\r
 #define CST86XX_PIXEL_THRESHOLD_REG 0x00C3\r
 /* Register Map */\r
-#define CST86XX_SLEEP_CMD                     0xA5\r
+#define CST86XX_SLEEP_CMD                     0xE5\r
 #define CST86XX_FIRMWARE_VERSION              0xA9\r
 #define CST86XX_FACTORY_ID                    0xAA\r
 #define CST86XX_HW_ID                         0xA7\r
index 824499b..75f57b6 100644 (file)
@@ -36,6 +36,8 @@ namespace OHOS
     static osTimerId_t  Gsenson_TEST_timer=NULL;
     void testcat1View::ClearAll()
     {
+        uapi_set4GCapability(false);
+        
         if(testcat1ScrollView)
         {
             testcat1ScrollView->RemoveAll();
@@ -153,9 +155,7 @@ namespace OHOS
     {
         if(button!=NULL)
         {
-            #ifdef FD230_650
-            calldial_event_sendmsg_toUI(phone);
-            #endif
+            // calldial_event_sendmsg_toUI(phone);
             RootView::GetInstance()->Invalidate();
            
         }
@@ -277,9 +277,7 @@ namespace OHOS
         }
         testcat1ScrollView->Add(label_1_cat1vison_1);
 
-
-
-        power_on_cat1();
+        uapi_set4GCapability(true);
 
         cat1_getsignal();
         cat1_getver();
index 80f411c..7e82ccf 100644 (file)
@@ -293,9 +293,10 @@ namespace OHOS
         testhrsensonScrollView->SetTouchable(true);
         testhrsensonScrollView->SetDraggable(true);
 
+#ifdef SUPPORT_PPG_SERVICE
         int8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;
         send_ppg_cmd_msg(md);
-
+#endif
          uint8_t cnt = pm_veto_get_id_cnt(PM_ID_P_TEST);
         if (cnt == 0) {
             uapi_pm_add_sleep_veto(PM_ID_P_TEST);
index 86d869d..730f171 100644 (file)
@@ -1392,7 +1392,7 @@ void cm_initializeVibrationModel(void)
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cm_initializeVibrationModel");
     int value = OHOS::ConfigModel::GetInstance()->GetVibrationReminder();
     // uapi_vibrationModeSet(value);
-    ui_api_vibrate_once_func();
+    custom_VibratorFunc_int(0);
 }
 
 void cm_initializeSilentModel(void)
index 15776c1..99dcb82 100644 (file)
@@ -9,6 +9,7 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/service/bp_at_cmd.c
     ${CMAKE_CURRENT_SOURCE_DIR}/service/bp_service.c
     ${CMAKE_CURRENT_SOURCE_DIR}/service/bp_ble_service.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/service/bp_tcp_service.c
 )
 
 set(PUBLIC_HEADER
index 6159755..8a5af3e 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2025-01-16 12:35:15\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-02-14 11:37:22\r
+ * @LastEditTime: 2025-07-30 11:50:19\r
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.c\r
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
  */\r
 #include "i2c.h"\r
 #include "pm_definition.h"\r
 #include "bp_ble_service.h"\r
+#include "bp_tcp_server.h"\r
+\r
 \r
 #define BN02_I2C_ADDR 0x05\r
 #define BN02_I2C_BUS I2C_BUS_0\r
 #define I2C_ADDR_BN02_W      0x0a\r
 #define I2C_ADDR_BN02_R      0x0b\r
-#define P_EN          S_AGPIO_L24\r
-#define P_INT         S_AGPIO_R3\r
+#define BP_EN          S_AGPIO_L19\r
+#define BP_INT         S_AGPIO_R3\r
 \r
 #define POWER_EN      S_AGPIO_R0\r
 \r
-bool Bn02_write_reg(uint8_t data)\r
+#define BN02_FILE "user/userdata/bn02.bin"\r
+\r
+#define MAX_CNT 48 * 5 * 60\r
+\r
+static int DATA_HANDLE = 1 << 24;\r
+\r
+static FILE *fp = NULL;\r
+\r
+static int data_cnt = 0;\r
+\r
+static uint8_t *bn02_data = NULL;\r
+\r
+static uint8_t bn02_ui_data[48] = {0};\r
+\r
+void bn02_get_ui_data(uint8_t *data,uint8_t len)\r
 {\r
-       uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
-    if (cnt == 0) \r
-    {\r
-        uapi_pm_add_sleep_veto(PM_ID_BP);\r
-    }\r
+       if(data == NULL || len == 0 || len > 48)\r
+       {\r
+               printf("bn02_get_ui_data valid param \n");\r
+               return;\r
+       }\r
+       memcpy_s(data,len,bn02_ui_data,len);\r
+}\r
+\r
+bool Bn02_write_reg(uint8_t data)\r
+{      \r
+       // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+    // if (cnt == 0) \r
+    // {\r
+    //     uapi_pm_add_sleep_veto(PM_ID_BP);\r
+    // }\r
 \r
        i2c_data_t i2c_data;\r
        i2c_data.send_buf = &data;\r
@@ -42,11 +68,12 @@ bool Bn02_write_reg(uint8_t data)
        if (ret != ERRCODE_SUCC)\r
         printf("i2c Write data write fail! ret=0x%x\n", ret);\r
 \r
-       cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
-    if (cnt == 1) \r
-    {\r
-        uapi_pm_remove_sleep_veto(PM_ID_BP);\r
-    }\r
+\r
+       // cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+    // if (cnt == 1) \r
+    // {\r
+    //     uapi_pm_remove_sleep_veto(PM_ID_BP);\r
+    // }\r
 \r
     return 1;\r
 }\r
@@ -54,11 +81,11 @@ bool Bn02_write_reg(uint8_t data)
 bool Bn02_reads(uint8_t *data,int len)\r
 {\r
 \r
-       uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
-    if (cnt == 0) \r
-    {\r
-        uapi_pm_add_sleep_veto(PM_ID_BP);\r
-    }\r
+       // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+    // if (cnt == 0) \r
+    // {\r
+    //     uapi_pm_add_sleep_veto(PM_ID_BP);\r
+    // }\r
 \r
        i2c_data_t i2c_data;\r
        i2c_data.send_buf = NULL;\r
@@ -70,11 +97,11 @@ bool Bn02_reads(uint8_t *data,int len)
        if (ret != ERRCODE_SUCC) \r
         printf("i2c read data fail! ret=0x%x\n", ret);\r
 \r
-       cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
-    if (cnt == 1) \r
-    {\r
-        uapi_pm_remove_sleep_veto(PM_ID_BP);\r
-    }\r
+       // cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+    // if (cnt == 1) \r
+    // {\r
+    //     uapi_pm_remove_sleep_veto(PM_ID_BP);\r
+    // }\r
 \r
        return 1;\r
 }\r
@@ -92,32 +119,33 @@ void Bn02_Power_Ctrl(int onoff)
                uapi_gpio_set_dir(POWER_EN, GPIO_DIRECTION_OUTPUT);\r
                uapi_gpio_set_val(POWER_EN, GPIO_LEVEL_HIGH);\r
                LOS_Mdelay(1);\r
-               uapi_pin_set_mode(P_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
-               uapi_gpio_set_dir(P_EN, GPIO_DIRECTION_OUTPUT);\r
-               uapi_gpio_set_val(P_EN, GPIO_LEVEL_HIGH);\r
+               uapi_pin_set_mode(BP_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
+               uapi_gpio_set_dir(BP_EN, GPIO_DIRECTION_OUTPUT);\r
+               uapi_gpio_set_val(BP_EN, GPIO_LEVEL_HIGH);\r
                // delay_ms(20);\r
                LOS_Mdelay(50);\r
        }\r
        else\r
        {\r
-               uapi_pin_set_mode(P_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
-               uapi_gpio_set_dir(P_EN, GPIO_DIRECTION_OUTPUT);\r
-               uapi_gpio_set_val(P_EN, GPIO_LEVEL_LOW);\r
-\r
+               uapi_pin_set_mode(BP_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
+               uapi_gpio_set_dir(BP_EN, GPIO_DIRECTION_OUTPUT);\r
+               uapi_gpio_set_val(BP_EN, GPIO_LEVEL_LOW);\r
+               LOS_Mdelay(1);\r
                uapi_pin_set_mode(POWER_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
                uapi_gpio_set_dir(POWER_EN, GPIO_DIRECTION_OUTPUT);\r
                uapi_gpio_set_val(POWER_EN, GPIO_LEVEL_LOW);\r
+               LOS_Mdelay(10);\r
        }\r
 }\r
 \r
 void bn02_int_init(void)\r
 {\r
-       uapi_pin_set_ie(P_INT,HAL_PIO_IE_ENBALE);\r
+       uapi_pin_set_ie(BP_INT,HAL_PIO_IE_ENBALE);\r
 }\r
 \r
 void bn02_int_deinit(void)\r
 {\r
-       uapi_pin_set_ie(P_INT,HAL_PIO_IE_DISABLE);\r
+       uapi_pin_set_ie(BP_INT,HAL_PIO_IE_DISABLE);\r
 }\r
 \r
 void bn02_int_handle(void)\r
@@ -126,17 +154,54 @@ void bn02_int_handle(void)
        int i;\r
        memset(bn02_buf,0,sizeof(bn02_buf));\r
        Bn02_reads(bn02_buf,48);\r
+       int reply_data[16] = {0}; \r
+       int cnt = 0;\r
+       for(i = 0;i<48;i+=3,cnt++)\r
+       {\r
+               reply_data[cnt] = ((bn02_buf[i] & 0xff) << 16)\r
+        + ((bn02_buf[i + 1] & 0xff) << 8)\r
+        + (bn02_buf[i + 2] & 0xff);\r
+\r
+               if (reply_data[cnt] >= DATA_HANDLE / 2)\r
+                       reply_data[cnt] -= DATA_HANDLE;\r
 \r
-    if(bn02_get_ble_status())\r
-    {\r
-        bn02_replymsg(bn02_buf,sizeof(bn02_buf),1);\r
-    }\r
+               // printf("data[%d]:%d\n",cnt,reply_data[cnt]);\r
+               // printf("0x%x 0x%x 0x%x 0x%x\n",i,bn02_buf[i],bn02_buf[i+1],bn02_buf[i+2],reply_data[cnt]);\r
+       }\r
 \r
+       if(uapi_cat1_get_power_stat())\r
+               do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SEND_DATA,(void *)reply_data,cnt);\r
 \r
-    for(i = 0;i<48;i++)\r
+       if(bn02_data && fp)\r
        {\r
-               printf("[%d]= 0x%x\n",i,bn02_buf[i]);\r
+               if(data_cnt >= MAX_CNT)\r
+               {\r
+                       if(fwrite(bn02_data,1,data_cnt,fp) != cnt)\r
+                               printf("bn02 fwrite failed\n");\r
+                       else\r
+                       {\r
+                               printf("bn02 fwrite succed data_cnt:%d\n",cnt);\r
+                               data_cnt = 0;\r
+                               memset(bn02_data,0,MAX_CNT);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       printf("data_cnt:%d\n",data_cnt);\r
+                       memcpy_s(bn02_data + data_cnt,MAX_CNT - data_cnt,bn02_buf,48);\r
+                       // memset(bn02_ui_data,0,48);\r
+                       memcpy_s(bn02_ui_data,48,bn02_buf,48);\r
+                       // for(int i = tcp_data_cnt; i < tcp_data_cnt+len; i ++)\r
+                       // {\r
+                       //     printf("222data[%d]:%d\n",i,tcp_data[i]);\r
+                       // }\r
+                       data_cnt += 48;\r
+               }\r
        }\r
+\r
+       if(bn02_get_ble_status())\r
+               bn02_replymsg(bn02_buf,48,1);\r
+\r
 }\r
 \r
 void bn02_start(void)\r
@@ -144,6 +209,22 @@ void bn02_start(void)
        Bn02_Power_Ctrl(1);\r
        bn02_int_init();\r
        Bn02_write_reg(BN02_START_CMD);\r
+#if 0\r
+       if(bn02_data == NULL)\r
+       {\r
+               bn02_data = malloc(MAX_CNT);\r
+               if(bn02_data == NULL)\r
+                       printf("bn02_data malloc failed\n");\r
+       }\r
+\r
+       data_cnt = 0;\r
+       \r
+       fp = fopen(BN02_FILE, "ab+");\r
+       if(fp == NULL)\r
+               printf("open %s failed\n",BN02_FILE);\r
+       else\r
+               printf("open %s succed\n",BN02_FILE);\r
+#endif\r
 }\r
 \r
 void bn02_stop(void)\r
@@ -151,4 +232,25 @@ void bn02_stop(void)
        bn02_int_deinit();\r
        Bn02_write_reg(BN02_STOP_CMD);\r
        Bn02_Power_Ctrl(0);\r
+\r
+       // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+    // if (cnt == 1) \r
+    // {\r
+    //     uapi_pm_remove_sleep_veto(PM_ID_BP);\r
+    // }\r
+\r
+       // do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SERVER_DEINIT,NULL,0);\r
+\r
+#if 0\r
+       if(fp != NULL)\r
+       {\r
+               fclose(fp);\r
+               fp = NULL;\r
+       }\r
+       if(bn02_data != NULL)\r
+       {\r
+               free(bn02_data);\r
+               bn02_data = NULL;\r
+       }\r
+#endif\r
 }\r
index c4216a9..19de496 100644 (file)
@@ -2,31 +2,20 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2025-01-16 12:35:15\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-01-16 14:55:48\r
+ * @LastEditTime: 2025-07-30 11:50:25\r
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.h\r
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
  */\r
 #ifndef _BN02_H_\r
 #define _BN02_H_\r
 \r
-enum\r
-{\r
-\r
-       BN02_INT_HANDLE,\r
-       BN02_INIT_ENABLE,\r
-       BN02_START,\r
-       BN02_POWER_DISABLE,\r
-       BN02_STOP,\r
-};\r
-\r
 #define BN02_START_CMD  0x04\r
 #define BN02_STOP_CMD   0x08\r
 \r
 void bn02_int_handle(void);\r
-\r
 void bn02_start(void);\r
-\r
 void bn02_stop(void);\r
+void bn02_get_ui_data(uint8_t *data,uint8_t len);\r
 \r
 #endif // _HRS3300_H_\r
 \r
index 9a5c697..1ea0519 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2025-02-14 10:30:21
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-02-14 14:43:09
+ * @LastEditTime: 2025-07-03 11:28:00
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -11,6 +11,7 @@
 #include "custom_utils.h"
 #include "bp_service.h"
 #include "bp_ble_service.h"
+#include "factorytestService.h"
 
 #define START_CODE 0x55
 #define PPG_DATA_SIZE 3
@@ -18,6 +19,7 @@
 
 static uint8_t ble_status = 0;
 
+#pragma pack(1)
 typedef struct ble_bp_data_t
 {
     uint8_t start_code; //0x55
@@ -28,7 +30,7 @@ typedef struct ble_bp_data_t
     uint8_t* data;
     uint8_t checksum; //验内容包括起始符、功能码、数据长度、标识、数据5个部分,取其和的最后8位作为校验和
 }ble_bp_data_t;
-
+#pragma pack()
 
 static ble_bp_data_t ble_bp_data = {0};
 
@@ -41,23 +43,38 @@ uint8_t bn02_get_ble_status(void)
 uint8_t bn02_calculate_checksum(ble_bp_data_t frame) 
 {
     uint8_t checksum = 0;
+    
+    // 1. 累加起始符
     checksum += frame.start_code;
+    
+    // 2. 累加功能码
     checksum += frame.main_func_code;
     checksum += frame.sub_func_code;
-    checksum += (frame.data_length >> 8) & 0xFF; // 数据长度高字节
-    checksum += frame.data_length & 0xFF;        // 数据长度低字节
-    checksum += (frame.flags >> 8) & 0xFF;       // 标识高字节
-    checksum += frame.flags & 0xFF;              // 标识低字节
-
-    for (uint16_t i = 0; i < frame.data_length - 2; i++) { // 数据长度包含标识
-        checksum += frame.data[i];
+    
+    // 3. 累加数据长度(2字节)
+    checksum += (frame.data_length >> 8) & 0xFF; // 高字节
+    checksum += frame.data_length & 0xFF;        // 低字节
+    
+    // 4. 累加标识(2字节)
+    checksum += (frame.flags >> 8) & 0xFF;       // 高字节
+    checksum += frame.flags & 0xFF;              // 低字节
+    
+    // 5. 累加数据部分(关键修正!)
+    // 数据部分的实际字节数 = 数据长度 - 标识长度(2B)
+    uint16_t data_bytes = frame.data_length - 2;
+    
+    // 按字节访问数据(强制转换为 uint8_t* 确保每次访问1字节)
+    for (uint16_t i = 0; i < data_bytes; i++) {
+        checksum += ((uint8_t*)frame.data)[i];
     }
-    return checksum;
+    
+    // 返回低8位
+    return checksum & 0xFF;
 }
 
 errcode_t bn02_parse_frame(uint8_t *buf, uint16_t event_size)
 {
-    if(buf != NULL && event_size>=(1+2+2+2+1+1))
+    if(buf != NULL && event_size >= (1+2+2+2+1+1))
     {
         memset_s(ble_bp_data,0,sizeof(ble_bp_data),0);
         
@@ -66,20 +83,36 @@ errcode_t bn02_parse_frame(uint8_t *buf, uint16_t event_size)
         ble_bp_data.sub_func_code = buf[2];
         ble_bp_data.data_length = (buf[3] << 8) + buf[4];
         ble_bp_data.flags = (buf[5] << 8) + buf[6];
+        
         ble_bp_data.data = &buf[7];
+        // if(buf[7] == 0)
+        // {
+        //     ble_bp_data.data = &tmp;
+        // }
+
+        // else if(buf[7] == 1)
+        // {
+        //     ble_bp_data.data = &tmp;
+        // }
+
+
+
+        printf("start_code : 0x%x, main_func_code : 0x%x, sub_func_code : 0x%x, data_length : 0x%x, flags : 0x%x, data : 0x%x\n",
+        ble_bp_data.start_code,ble_bp_data.main_func_code,ble_bp_data.sub_func_code,ble_bp_data.data_length,ble_bp_data.flags,*ble_bp_data.data);
 
         if(buf[8] != bn02_calculate_checksum(ble_bp_data))
             return ERRCODE_FAIL;
 
-        if(!(*ble_bp_data.data))
+        ble_bp_data.sub_func_code += 0x80;
+
+        if(buf[7] == 0)
         {
-            do_bp_service_check_msg(BP_SERVICE_CMD_START_CHECK);
+            bp_start(BP);
             ble_status = 1;
         }
-
-        else
+        else if(buf[7] == 1)
         {   
-            do_bp_service_check_msg(BP_SERVICE_CMD_STOP_CHECK);
+            bp_stop();
             ble_status = 0;
         }   
 
@@ -95,13 +128,19 @@ errcode_t bn02_parse_frame(uint8_t *buf, uint16_t event_size)
 
 errcode_t bn02_replymsg(uint8_t *input_data,uint16_t input_len,uint8_t flags)
 {
+    if(input_data == NULL || input_len == 0)
+        return ERRCODE_FAIL;
+
     errcode_t ret;
-    ble_bp_data.sub_func_code += 0x80;
     ble_bp_data.data = input_data;
     ble_bp_data.data_length = input_len + 2;
 
-    if(ble_bp_data.flags < (1 << 14))
-        ble_bp_data.flags++;
+    uint16_t current_seq = ble_bp_data.flags & 0x1FFF;  // 仅保留低13位
+    if (current_seq < (1 << 13) - 1) {                 // 避免溢出
+        ble_bp_data.flags = (ble_bp_data.flags & 0xE000) | (current_seq + 1);
+    } else {
+        ble_bp_data.flags = (ble_bp_data.flags & 0xE000) | 0;  // 重置为0
+    }
 
     if(flags) 
     {
@@ -110,7 +149,57 @@ errcode_t bn02_replymsg(uint8_t *input_data,uint16_t input_len,uint8_t flags)
 
     ble_bp_data.checksum = bn02_calculate_checksum(ble_bp_data);
 
-    ret = ble_factorytest_server_send_input_report((uint8_t *)&ble_bp_data,sizeof(ble_bp_data));
-
+    // printf("start_code : 0x%x, main_func_code : 0x%x, sub_func_code : 0x%x, data_length : 0x%x, flags : 0x%x\n",
+    // ble_bp_data.start_code,ble_bp_data.main_func_code,ble_bp_data.sub_func_code,ble_bp_data.data_length,ble_bp_data.flags);
+
+    // ble_bp_data.data = (int *)malloc(input_len * sizeof(int));
+    // if(ble_bp_data.data == NULL)
+    //     return -1;
+
+    // memcpy_s(ble_bp_data.data,input_len * sizeof(int),input_data,input_len * sizeof(int));
+
+    // for(int i = 0;i<input_len;i++)
+       // {
+    //     if(i == input_len - 1)
+    //         printf("%d",ble_bp_data.data[i]);
+    //     else
+    //         printf("%d,",ble_bp_data.data[i]);
+       // }
+    // printf("\n");
+    // printf("check_sum : 0x%x\n",ble_bp_data.checksum);
+    // printf("ble_bp_data:%d\n",sizeof(ble_bp_data));
+
+
+    // 分配缓冲区并按协议顺序组装数据
+    uint8_t* buffer = (uint8_t*)malloc(8 + input_len);
+    if (!buffer) return -1;
+
+    uint8_t* p = buffer;
+    *p++ = ble_bp_data.start_code;
+    *p++ = ble_bp_data.main_func_code;
+    *p++ = ble_bp_data.sub_func_code;
+
+    // 按大端序写入多字节字段
+    *p++ = (ble_bp_data.data_length >> 8) & 0xFF;
+    *p++ = ble_bp_data.data_length & 0xFF;
+    *p++ = (ble_bp_data.flags >> 8) & 0xFF;
+    *p++ = ble_bp_data.flags & 0xFF;
+
+    // 复制数据部分
+    memcpy(p, ble_bp_data.data, ble_bp_data.data_length - 2);
+    p += ble_bp_data.data_length - 2;
+
+    *p = ble_bp_data.checksum;  // 添加校验和
+    // printf("input_len:%d\n",input_len);
+    ret = ble_factorytest_server_send_input_report(buffer,8 + input_len);
+    // if(ble_bp_data.data == NULL)
+    // {
+    //     free(ble_bp_data.data);
+    //     ble_bp_data.data = NULL;
+    // }
+
+    free(buffer);
+
+    // printf("ret : 0x%x \n",ret);
     return ret;
 }
index ace1004..382779e 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2025-02-14 10:30:32
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-02-14 11:35:06
+ * @LastEditTime: 2025-06-27 18:30:31
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
diff --git a/code/sdk/zhihui/drivers/bp/service/bp_tcp_server.c b/code/sdk/zhihui/drivers/bp/service/bp_tcp_server.c
new file mode 100644 (file)
index 0000000..3935495
--- /dev/null
@@ -0,0 +1,2238 @@
+#include "pinctrl.h"
+#include "debug_print.h"
+#include "rtc.h"
+#include "timer.h"
+#include "systick.h"
+
+#include "tcxo.h"
+
+#include "cmsis_os2.h"
+#include "input_app.h"
+#include "bp_service.h"
+#include "custom_utils.h"
+#include "bp_tcp_server.h"
+#include "custom_runtime.h"
+#include <dirent.h>
+#include "lwip/ip.h"
+#include "lwip/netif.h"
+#include "lwip/init.h"
+#include "lwip/inet_chksum.h"
+
+#include "lwip/err.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+#include <lwip/netdb.h>
+// #include <netinet/in.h>
+#include "lwip/inet.h"
+#include "lwip/ip_addr.h"
+#include "pm_definition.h"
+#include "mbedtls/md5.h"
+#include "mbedtls/base64.h"
+#include "cJSON.h"
+
+#define BID "hu4kZYyYMGO"
+#define KEY "tcUpJpeGpsIBXvjG"
+
+#define SERVER_HOST "iot.socket.thisiot.com"
+#define SERVER_PORT 9999
+// 6a0f3a4f7a5f1d9a4b7b8e5c6d7a8f9b
+// 89b67780ac2e2d554f25df8acfabae4f
+#define APP_KEY "d8d960b748738c2f29c676baa3f5be64"
+#define NAME "海思鸿蒙血压手表"
+#define URL_HEADER "https://test.aicaring.com/api/v0"
+
+#define LOGIN_URL "/entrance/user/login"
+#define ACTIVE_URL "/sinklib/activation"
+#define CREATE_URL "/health/synthesis/create"
+
+// #define MAX_CNT 16 * 5 * 60
+#define MAX_CNT 16 * 5 * 50
+
+
+static unsigned long g_app_queue= 0xFFFFFFFF;
+
+static int *tcp_data = NULL;
+static int tcp_data_cnt = 0;
+
+static int g_listen_sock = -1;
+
+static uint8_t LK_STATUS = 0;
+static uint8_t BP_GET_STATUS = 0;
+
+static bp_data_t bp_data = {0};
+
+static char *imei = NULL;
+
+static uint8_t bp_measure_type = 0;
+
+//激活码 zzzm3K72zxRRLPX2utu5vMZcM269/8/7ZGOHVvONFt7WPAlQT++RJjzzrHj5v5DdlnmeELWI1FUPVJb96/5mOA==
+
+#define BP_ACTIVE_CODE_FILE "/user/system/bp_active_code.bin"
+#define BP_REQUEST_CODE_FILE "/user/system/bp_request_code.bin"
+#define BP_TOKEN_FILE "/user/system/bp_token.bin"
+
+
+
+struct bp_ipaddr_t
+{
+    osSemaphoreId_t dns_done_sem;
+    ip_addr_t  ip;
+};
+
+void bp_set_adjust_data(int sbp,int dbp)
+{
+    bp_data.sbp = sbp;
+    bp_data.dbp = dbp;
+}
+
+void bp_set_measure_type(uint8_t type)
+{
+    bp_measure_type = type;
+}
+
+void bp_get_data(bp_data_t *data)
+{
+    if(data == NULL)
+        return;
+
+    memcpy_s(data,sizeof(bp_data_t),&bp_data,sizeof(bp_data_t));
+}
+
+static void bp_save_request_code(char *reqeust_code,int len)
+{
+    if(reqeust_code == NULL || len == 0)
+        return;
+
+    FILE *file = fopen(BP_REQUEST_CODE_FILE, "w");
+    if (!file) 
+    {
+        printf("%s open failed\n",BP_REQUEST_CODE_FILE);
+        return;
+    }
+
+    size_t bytes_written = fwrite(reqeust_code, 1, len, file);
+    if (bytes_written != len) 
+        printf(" %s fwrite failed\n",BP_REQUEST_CODE_FILE);
+    else
+        printf("reqeust_code: %s fwrite succed\n",reqeust_code);
+
+    fclose(file);
+}
+
+static void bp_save_active_code(char *active_code,int len)
+{
+    if(active_code == NULL || len == 0)
+        return;
+
+    FILE *file = fopen(BP_ACTIVE_CODE_FILE, "w");
+    if (!file) 
+    {
+        printf("%s open failed\n",BP_ACTIVE_CODE_FILE);
+        return;
+    }
+
+    size_t bytes_written = fwrite(active_code, 1, len, file);
+    if (bytes_written != len) 
+        printf(" %s fwrite failed\n",BP_ACTIVE_CODE_FILE);
+    else
+        printf("active_code: %s fwrite succed\n",active_code);
+
+    fclose(file);
+}
+
+static void bp_get_active_code(char *active_code,int len)
+{
+    if (active_code == NULL || len == 0) 
+    {
+        printf("active_code is NULL or len == 0\n");
+        return;
+    }
+
+    char *buffer = (char *)malloc(len);
+    if(buffer == NULL)
+        return;
+
+    FILE *file = fopen(BP_ACTIVE_CODE_FILE, "r");
+    if (!file) 
+    {
+        printf("open failed: %s\n", BP_ACTIVE_CODE_FILE);
+        return;
+    }
+
+    memset(buffer, 0, len);
+
+    size_t bytes_read = fread(buffer, 1, len - 1, file);
+    if (bytes_read > 0) 
+    {
+        buffer[bytes_read] = '\0';
+        printf("active code: %s\n", buffer);
+    } else
+        printf("read active code failed\n");
+
+    memcpy_s(active_code,bytes_read,buffer,bytes_read);
+
+    free(buffer);
+    fclose(file);
+}
+
+static void bp_get_request_code(char *request_code,int len)
+{
+    if (request_code == NULL || len == 0) 
+    {
+        printf("request_code is NULL or len == 0\n");
+        return;
+    }
+
+    char *buffer = (char *)malloc(len);
+    if(buffer == NULL)
+        return;
+
+    FILE *file = fopen(BP_REQUEST_CODE_FILE, "r");
+    if (!file) 
+    {
+        printf("open failed: %s\n", BP_REQUEST_CODE_FILE);
+        return;
+    }
+
+    // 初始化缓冲区
+    memset(buffer, 0, len);
+
+    // 安全读取文件内容(最多len-1字节,留一个位置给\0)
+    size_t bytes_read = fread(buffer, 1, len - 1, file);
+    if (bytes_read > 0) 
+    {
+        buffer[bytes_read] = '\0';
+        printf("active code: %s\n", buffer);
+    } else
+        printf("read active code failed\n");
+
+    memcpy_s(request_code,bytes_read,buffer,bytes_read);
+
+    free(buffer);
+    fclose(file);
+}
+
+static void bp_get_token(char *token,int len)
+{
+    if (token == NULL || len == 0) 
+    {
+        printf("token is NULL or len == 0\n");
+        return;
+    }
+
+    char *buffer = (char *)malloc(len);
+    if(buffer == NULL)
+        return;
+
+    FILE *file = fopen(BP_TOKEN_FILE, "r");
+    if (!file) 
+    {
+        printf("open failed: %s\n", BP_TOKEN_FILE);
+        return;
+    }
+
+    // 初始化缓冲区
+    memset(buffer, 0, len);
+
+    // 安全读取文件内容(最多len-1字节,留一个位置给\0)
+    size_t bytes_read = fread(buffer, 1, len - 1, file);
+    if (bytes_read > 0) 
+    {
+        buffer[bytes_read] = '\0';
+        printf("bp_get_token: %s\n", buffer);
+    } else
+        printf("read token failed\n");
+
+    memcpy_s(token,bytes_read,buffer,bytes_read);
+
+    free(buffer);
+    fclose(file);
+}
+
+static void bp_save_token(char *token,int len)
+{
+    if(token == NULL || len == 0)
+        return;
+
+    FILE *file = fopen(BP_TOKEN_FILE, "w");
+    if (!file) 
+    {
+        printf("%s open failed\n",BP_TOKEN_FILE);
+        return;
+    }
+
+    size_t bytes_written = fwrite(token, 1, len, file);
+    if (bytes_written != len) 
+        printf(" %s fwrite failed\n",BP_TOKEN_FILE);
+    else
+        printf("token: %s fwrite succed\n",token);
+
+    fclose(file);
+}
+
+static void dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg) 
+{
+    struct bp_ipaddr_t *ip_sem = (struct bp_ipaddr_t *)arg;
+    char ip_str[20] = {0};
+    
+    // if (ipaddr == NULL) {
+    //     printf("DNS解析失败,IP地址为空\n");
+    //     (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+    //     return;
+    // }
+    
+    printf("hostname: %s, ", hostname);
+    
+    // 处理IPv4地址(现在ip4是包含addr成员的结构体)
+    if (IP_IS_V4(ipaddr)) {
+        u32_t ip_num = ipaddr->u_addr.ip4.addr;  // 直接获取32位地址
+        
+        // 分解为4字节打印
+        u8_t byte0 = (ip_num >> 24) & 0xFF;
+        u8_t byte1 = (ip_num >> 16) & 0xFF;
+        u8_t byte2 = (ip_num >> 8) & 0xFF;
+        u8_t byte3 = ip_num & 0xFF;
+        // printf("IPv4: %d.%d.%d.%d\n", byte0, byte1, byte2, byte3);
+        
+        // 转换为struct in_addr(已为网络字节序)
+        struct in_addr ipv4_addr;
+        ipv4_addr.s_addr = ip_num;
+        inet_ntop(AF_INET, &ipv4_addr, ip_str, sizeof(ip_str));
+        printf("ip: %s\n", ip_str);
+    }
+
+    // 复制IP地址到上下文
+    if(ipaddr->u_addr.ip4.addr != 0)
+        memcpy(&(ip_sem->ip), ipaddr, sizeof(ip_addr_t));
+    (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+}
+
+int bp_tcp_socket_init(void) 
+{
+    uint8_t cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (cnt == 0) {
+        uapi_pm_add_sleep_veto(PM_ID_CAT1);
+    }
+    
+    struct sockaddr_in server_addr;
+    struct bp_ipaddr_t ip_sem = {0};  // 定义信号量结构
+    int listen_socket = -1;
+    
+    // 创建信号量
+    ip_sem.dns_done_sem = osSemaphoreNew(1, 0, NULL);
+
+    // 解析域名
+    dns_gethostbyname(SERVER_HOST, &(ip_sem.ip), dns_found, &ip_sem);
+
+    osSemaphoreAcquire(ip_sem.dns_done_sem, 1000 * 5);  // 等待 DNS 解析完成
+
+    memcpy(&server_addr.sin_addr.s_addr, &ip_sem.ip.u_addr.ip4, 4);
+    
+    // 创建套接字
+    listen_socket = lwip_socket(AF_INET, SOCK_STREAM, 0);
+    if(listen_socket < 0)
+    {
+        int err = errno;
+        printf("socket create errno: %d, reason: %s\n", err, strerror(err));
+        goto FAILED;
+    }
+
+    int opt = 1;
+    
+    lwip_setsockopt(listen_socket, SOL_SOCKET, SO_KEEPALIVE, (const void*)&opt, sizeof(opt));
+    lwip_setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR,(const void*)&opt, sizeof(opt));
+    
+    // 设置服务器地址
+    server_addr.sin_family = AF_INET;
+    server_addr.sin_port = htons(SERVER_PORT);
+    
+    // 连接服务器
+    if (connect(listen_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) 
+    {
+        printf("server_addr.sin_addr.s_addr:%d\n",server_addr.sin_addr.s_addr);
+        int err = errno;
+        printf("connect failed, errno: %d, reason: %s\n", err, strerror(err));
+        
+        goto FAILED;
+    }
+
+    
+    cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (cnt == 1) {
+        uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+    }
+    
+    printf("socket init succed\n");
+    osSemaphoreDelete(ip_sem.dns_done_sem);  // 释放信号量
+
+    return listen_socket;
+    
+FAILED:
+    if (listen_socket >= 0) 
+    {
+        lwip_close(listen_socket);
+    }
+    if (ip_sem.dns_done_sem != NULL) 
+    {
+        osSemaphoreDelete(ip_sem.dns_done_sem);
+    }
+    cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (cnt == 1) 
+    {
+        uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+    }
+    return -1;
+}
+
+void tcp_recv_data_handler(const char *input, int input_len) 
+{
+    if(input == NULL || input_len == 0)
+    {
+        return;
+    }
+
+    if (input_len < 2 || input[0] != '[' || input[input_len-1] != ']') 
+    {
+        printf("解析失败: 格式错误(缺少方括号)\n");
+        return;
+    }
+    
+    const char *data = input + 1;
+    size_t data_len = input_len - 2;
+    
+    const char *comma1 = memchr(data, ',', data_len);
+    const char *comma2 = comma1 ? memchr(comma1 + 1, ',', data_len - (comma1 - data + 1)) : NULL;
+
+    const char *star1 = memchr(data, '*', data_len);
+    const char *star2 = star1 ? memchr(star1 + 1, '*', data_len - (star1 - data + 1)) : NULL;
+    const char *star3 = star2 ? memchr(star2 + 1, '*', data_len - (star2 - data + 1)) : NULL;
+    
+    if (!star1 || !star2 || !star3) 
+    {
+        printf("解析失败: 头部格式错误(缺少星号分隔符)\n");
+        return;
+    }
+    
+    const char *bid = data;
+    const char *imei = star1 + 1;
+    const char *len_str = star2 + 1;
+    const char *cmd = star3 + 1;
+    
+    size_t bid_len = star1 - data;
+    size_t imei_len = star2 - (star1 + 1);
+    size_t len_str_len = star3 - (star2 + 1);
+    size_t cmd_len = data_len - (star3 - data + 1);
+    
+    // 打印头部解析结果
+    // printf("BID: %.*s\n", (int)bid_len, bid);
+    // printf("IMEI: %.*s\n", (int)imei_len, imei);
+    // printf("内容长度: %.*s\n", (int)len_str_len, len_str);
+    // printf("指令: %.*s\n", (int)cmd_len, cmd);
+    
+    // 验证IMEI长度(假设为15位)
+    if (imei_len != 15) 
+    {
+        printf("解析失败: IMEI长度应为15位,实际: %zu位\n", imei_len);
+        return;
+    }
+    
+    uint32_t content_len = 0;
+    sscanf(len_str, "%x", &content_len);
+    printf("解析后的内容长度: %u\n", content_len);
+
+    if (comma1 && comma2) 
+    {
+        size_t status_len = comma2 - (comma1 + 1);
+        size_t base64_len = data_len - (comma2 - data + 1);
+        
+        printf("状态码: %.*s\n", (int)status_len, comma1 + 1);
+        
+        if (strncmp(comma1 + 1, "200", status_len) != 0) 
+        {
+            printf("解析失败: 状态码必须为200,实际: %.*s\n", (int)status_len, comma1 + 1);
+            return;
+        }
+
+        size_t decoded_len = (base64_len * 3) / 4 + 1;
+        unsigned char *decoded_data = malloc(decoded_len);
+        if (!decoded_data) 
+        {
+            printf("解析失败: 内存分配失败\n");
+            return;
+        }
+        
+        size_t actual_decoded_len = 0;
+        int ret = mbedtls_base64_decode(decoded_data, decoded_len, &actual_decoded_len,(const unsigned char *)(comma2 + 1), base64_len);
+        
+        if (ret != 0)
+        {
+            printf("解析失败: Base64解码失败 (错误码: %d)\n", ret);
+            free(decoded_data);
+            return;
+        }
+        decoded_data[actual_decoded_len] = '\0';
+
+        cJSON *json_data = cJSON_Parse((const char *)decoded_data);
+        free(decoded_data);
+        
+        if (!json_data) 
+        {
+            printf("解析失败: JSON解析失败,原始数据: %s\n", decoded_data);
+            return;
+        }
+
+        printf("JSON数据: %s\n", cJSON_Print(json_data));
+        
+        cJSON *status = cJSON_GetObjectItem(json_data, "status");
+        cJSON *data_obj = cJSON_GetObjectItem(json_data, "data");
+        cJSON *activation_code = cJSON_GetObjectItem(data_obj, "activation_code");
+        cJSON *token = cJSON_GetObjectItem(data_obj, "token");
+        cJSON *sbp = cJSON_GetObjectItem(data_obj, "sbp");
+        cJSON *dbp = cJSON_GetObjectItem(data_obj, "dbp");
+        cJSON *pressure = cJSON_GetObjectItem(data_obj, "pressure");
+        cJSON *fatigue = cJSON_GetObjectItem(data_obj, "fatigue");
+        cJSON *emo = cJSON_GetObjectItem(data_obj, "emo");
+        
+        if (status && cJSON_IsTrue(status) && data_obj) 
+        {
+            if (activation_code) 
+            {
+                printf("激活状态: 成功\n");
+                printf("激活码: %s\n", activation_code->valuestring);
+                bp_save_active_code(activation_code->valuestring, strlen(activation_code->valuestring));
+            }
+            if (token) 
+            {
+                printf("token: %s\n", token->valuestring);
+                bp_save_token(token->valuestring, strlen(token->valuestring));
+            }
+            
+            if (sbp && dbp && emo && pressure && fatigue) 
+            {
+                printf("sbp: %d\n", sbp->valueint);
+                bp_data.sbp = sbp->valueint;
+
+                printf("dbp: %d\n", dbp->valueint);
+                bp_data.dbp = dbp->valueint;
+
+                printf("emo: %s\n", emo->valuestring);
+                memcpy_s(bp_data.emo,sizeof(bp_data.emo),emo->valuestring,strlen(emo->valuestring));
+
+                printf("pressure: %d\n", pressure->valueint);
+                bp_data.pressure = pressure->valueint;
+
+                printf("fatigue: %d\n", fatigue->valueint);
+                bp_data.fatigue = fatigue->valueint;
+
+                BP_GET_STATUS = 1;
+
+            }
+        }
+        else 
+        {
+            cJSON *error_code = cJSON_GetObjectItem(json_data, "error_code");
+            cJSON *error_msg = cJSON_GetObjectItem(json_data, "error_message");
+            printf("激活状态: 失败\n");
+            printf("错误码: %s\n", error_code ? error_code->valuestring : "未知");
+            printf("错误信息: %s\n", error_msg ? error_msg->valuestring : "未知");
+        }
+        
+        cJSON_Delete(json_data);
+    } 
+    else 
+    {
+        // 无逗号或只有一个逗号,仅处理指令
+        // printf("格式: 仅指令,无状态码和Base64内容\n");
+        printf("指令处理: %.*s\n", (int)cmd_len, cmd);
+        
+        // 这里可以添加仅处理指令的逻辑
+        // bp_handle_command(cmd, cmd_len);  // 假设存在指令处理函数
+        if(strstr(cmd,"LK") != NULL)
+        {
+            printf("LK succed\n");
+            LK_STATUS = 1;
+        }
+
+    }
+}
+
+       
+static int tcp_send(int listen_socket, const char *data, size_t size)
+{
+    if (data == NULL || size == 0)
+        return -1;
+
+    uint8_t retry = 0;
+    while(listen_socket < 0 && retry < 5)
+    {
+        retry++;
+        LOS_Msleep(2000);
+    }
+
+    if(listen_socket < 0)
+    {
+        printf("listen_socket < 0 \n");
+        return -1;
+    }
+
+    int ret = 0;
+
+    // const char *buffer = (const char *)data;
+    const char *buffer = (const char *)malloc(size);
+    if(buffer == NULL)
+        return -1;
+        
+    memcpy_s(buffer,size,(const char *)data,size);
+    // printf("size : %d\n",size);
+    // printf("strlen(buffer) : %d\n",strlen(buffer));
+    // printf("buffer : %s\n",buffer);
+
+    size_t total_sent = 0;
+
+    while (total_sent < size)
+    {
+        ssize_t sent = lwip_send(listen_socket, buffer + total_sent, size - total_sent, 0);
+        if (sent < 0) {
+            printf("errno : %d\n",errno);
+            // 处理错误情况
+            if (errno == EINTR) {
+                PRINT("被信号中断,继续尝试\n");
+                ret = -1;
+                continue;
+            } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
+                PRINT("非阻塞模式下暂时无法发送,可选择等待或返回\n"); 
+                ret = -1;
+                goto FAILED;
+            } else if (errno == ENETUNREACH) {
+                PRINT("网络不可达,检查路由或远程主机状态\n");
+                ret = -1;
+                goto FAILED;
+            }
+            else {
+                PRINT("其他错误(如连接断开)\n"); 
+                ret = -1;
+                goto FAILED;
+            }
+        }
+        
+        total_sent += sent;
+    }
+    printf("tcp send succed size : %d\n",total_sent);
+    ret = 0;
+FAILED:
+
+    if(buffer != NULL)
+    {
+        free(buffer);
+        buffer = NULL;
+    }
+    return ret;
+}
+
+static int active_md5_sign(const char *data,int data_len,char*md5_str)
+{
+    char md5_buf[16]={0};
+
+    char *code_str = (const char*)malloc(data_len);
+    if(md5_str == NULL)
+        return -1;
+
+    memcpy_s(code_str,data_len,data,data_len);
+    mbedtls_md5_context ctx;
+
+    // 初始化MD5上下文
+    mbedtls_md5_init(&ctx);
+
+    // 开始计算MD5哈希
+    mbedtls_md5_starts(&ctx);
+    // 更新要计算哈希的数据
+    mbedtls_md5_update(&ctx, (const unsigned char *)code_str, data_len);
+
+    // 完成哈希计算
+    mbedtls_md5_finish(&ctx, (unsigned char *)md5_buf);
+
+    // printf("md5_buf\r\n");
+    // for (int i = 0; i < 16; i++) {
+    //     printf("%02X\n", (uint8_t)md5_buf[i]);
+    // }
+    // printf("md5_buf end\r\n");
+
+    // 清理MD5上下文
+    mbedtls_md5_free(&ctx);
+    for (int i = 0; i < 16; i++) 
+        sprintf(&md5_str[i * 2], "%02x", (uint8_t)md5_buf[i]);
+
+    md5_str[32] = '\0';
+
+    free(code_str);
+
+    return 0;
+}
+
+static void calculate_md5(const char* input, char* md5_str) 
+{
+    mbedtls_md5_context md5;
+    unsigned char md5_digest[16] = {0};
+    int i;
+
+    // printf("input:%s\n",input);
+    
+    mbedtls_md5_init(&md5);
+    mbedtls_md5_starts(&md5);
+    mbedtls_md5_update(&md5, (const unsigned char*)input, strlen(input));
+    mbedtls_md5_finish(&md5, md5_digest);
+    mbedtls_md5_free(&md5);
+    
+    // 转换为十六进制字符串
+    for (i = 0; i < 16; i++) {
+        sprintf(md5_str + i*2, "%02x", md5_digest[i]);
+    }
+    md5_str[32] = '\0';  // 确保字符串终止
+}
+
+int tcp_sign_up(void)
+{
+    int ret = 0;
+    char len_str[5] = {0};
+    sprintf(len_str, "%04x", 2);
+
+    // 获取IMEI
+    if(imei == NULL)
+    {
+
+        imei = uapi_dev_runtime_get_cat1_imei();
+
+        if(imei == NULL || strlen(imei) == 0)
+        {
+            LOS_Msleep(2000);
+            imei = uapi_dev_runtime_get_cat1_imei();
+        }
+        
+        if (imei == NULL || strlen(imei) == 0) 
+        {
+            printf("IMEI get failed\n");
+            ret = -1;
+            goto FAILED;
+        }
+    }
+    // printf("imei:%s\n", imei);
+
+    // 精确计算head_str长度:BID + * + IMEI + * + len_str + * + LK + \0
+    int head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("LK") + 1;
+    char *head_str = (char *)malloc(head_len);
+    if(head_str == NULL) 
+    {
+        printf("tcp_sign_up head_str malloc failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    snprintf(head_str, head_len, "%s*%s*%s*LK", BID,imei,len_str);
+    head_len = strlen(head_str);  // 重新计算实际长度
+
+    char md5_str[33] = {0};  // MD5为32字符+1终止符
+
+    // 计算code_str长度:head_str + KEY + \0
+    int code_len = head_len + strlen(KEY) + 1;
+    char *code_str = (char *)malloc(code_len);
+    if(code_str == NULL) 
+    {
+        printf("code_str malloc failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    code_len = strlen(code_str);
+
+    if(active_md5_sign(code_str, code_len, md5_str) != 0) 
+    {
+        printf("active_md5_sign failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    // 计算send_str长度:[ + md5_str + head_str + ] + \0
+    int send_len = 1 + strlen(md5_str) + strlen(head_str) + 1 + 1;
+    char *send_str = (char *)malloc(send_len);
+    if(send_str == NULL) 
+    {
+        printf("send_str malloc failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    snprintf(send_str, send_len, "[%s%s]", md5_str, head_str);
+    send_len = strlen(send_str);
+    
+    // 打印调试信息
+    // printf("md5_str:%s\n", md5_str);
+    // printf("md5_len:%zu\n", strlen(md5_str));
+    // printf("head_len:%d\n", head_len);
+    // printf("head_str:%s\n", head_str);
+    // printf("send_len : %d\n", send_len);
+    // printf("send_str : %s\n", send_str);
+
+    // 发送数据
+    ret = tcp_send(g_listen_sock, send_str, send_len);
+    if(ret != 0)
+    {
+        printf("tcp_send failed\n");
+        goto FAILED;
+    }
+
+
+FAILED:
+    // 释放资源
+    if(head_str != NULL)
+    {
+        free(head_str);
+        head_str = NULL;
+    }
+    if(code_str != NULL)
+    {
+        free(code_str);
+        code_str = NULL;
+    }
+    if(send_str != NULL)
+    {
+        free(send_str);
+        send_str = NULL;
+    }
+
+    return ret;
+}
+
+void get_request_code(char *req_code)
+{
+    uint32_t req_code_len = 0;
+    char* fact = "hunandongni";                // 获取厂商名字(不超过32个字节的字符串)
+    const unsigned int fact_len = strlen(fact);
+
+    if(imei == NULL)
+    {
+        uint8_t retry = 0;
+        while((imei == NULL || strlen(imei) == 0) && retry < 10)
+        {
+            retry++;
+            LOS_Msleep(2000);
+            imei = uapi_dev_runtime_get_cat1_imei();
+        }
+        
+        if (imei == NULL || strlen(imei) == 0) 
+        {
+            printf("IMEI get failed\n");
+            return;
+        }
+    }
+
+    const unsigned int imei_len = strlen(imei);
+    request_validation((unsigned char*)fact, fact_len, (unsigned char*)imei, imei_len, (unsigned char*)req_code, &req_code_len);
+    printf("req_code:%s\n",req_code);
+    printf("req_code_len:%d\n",req_code_len);
+}
+
+/**
+ * 计算cnt个int数据转换为字符串并添加逗号后的Base64编码长度
+ * @param cnt int数据个数
+ * @return Base64编码后的长度,失败返回-1
+ */
+static int calculate_base64_length(int cnt) 
+{
+    if (cnt <= 0)
+        return -1;
+    
+    // 1. 计算int数组转换为字符串的最大可能长度
+    // int的最大字符串长度:11个字符(如"-2147483648")
+    // 每个int后加一个逗号(最后一个int除外)
+    int str_length = cnt * 11 + (cnt - 1);
+    
+    // 2. 计算Base64编码长度
+    // Base64编码规则:每3字节明文→4字节编码,不足3字节用'='填充
+    int base64_length = (str_length * 4 + 2) / 3;
+    
+    // 3. 确保编码长度足够容纳终止符
+    base64_length += 1;  // 预留终止符空间
+    
+    return base64_length;
+}
+
+static void upload_bp_data(void)
+{
+#if 0
+    if (data == NULL || cnt == 0)
+        return;
+
+    int ret = -1;
+    char *data_str = NULL;
+    int data_len = 0;
+    char *encode_str = NULL;
+    int encode_len = 0;
+    char *head_str = NULL;
+    int head_len = 0;
+    char *code_str = NULL;
+    int code_len = 0;
+    char *send_str = NULL;
+    int send_len = 0;
+    char *tail_encode_str = NULL;
+    uint32_t output_len = 0;
+    int temp_len = 0;
+    char len_str[5] = {0};
+    char md5_str[33] = {0};
+    uint32_t begin_time = 0;
+    uint32_t end_time = 0;
+
+       char *encode_header_str = NULL;
+    char *header_json = NULL;
+    int encode_header_len = 0;
+
+
+    // 获取测量时间
+    bp_get_measure_time(&begin_time, &end_time);
+    char *begin_time_str = (char *)malloc(64);
+    char *end_time_str = (char *)malloc(64);
+    if (begin_time_str == NULL || end_time_str == NULL)
+        goto FAILED;
+    uapi_get_TIME_STR(begin_time, begin_time_str, '-', ':',  DATE_TIME_DEFULL);
+    uapi_get_TIME_STR(end_time, end_time_str, '-', ':', DATE_TIME_DEFULL);
+    printf("begin_time_str:%s\n", begin_time_str);
+    printf("end_time_str:%s\n", end_time_str);
+
+    // 构建JSON数据前缀部分
+    header_json = (char *)malloc(256);
+    if(header_json == NULL)
+        goto FAILED;
+
+    char token[64] = {0};
+    bp_get_token(token, 64);
+    printf("bp_get_token:%s\n", token);
+    uint8_t retry = 0;
+    while(strlen(token) == 0  && retry < 10) 
+    {
+        bp_tcp_login();
+        LOS_Msleep(500);
+        bp_get_token(token, 64);
+    }
+
+    temp_len = 0;
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"headers\":[");
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"key\":\"token\",");
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "\"value\":\"%s\"}", token);
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "]}");
+
+    if(temp_len > 256)
+    {
+        goto FAILED;
+    }
+
+       encode_header_len = temp_len * 3 / 2;
+       encode_header_str = (char *)malloc(encode_header_len);
+       if(NULL == encode_header_str)
+       {
+               printf("encode_header_str malloc failed\n");
+               goto FAILED;
+       }
+
+       memset(encode_header_str,0, encode_header_len);
+    size_t output_header_len = 0;
+       if(0 != mbedtls_base64_encode((unsigned char*)encode_header_str, encode_header_len, &output_header_len, (const unsigned char*)header_json, temp_len))
+       {
+        printf("encode_header_str base64 encode failed\n");
+               goto FAILED;
+       }       
+
+    // 分配JSON缓冲区
+    int json_len = 512 + calculate_base64_length(cnt);
+    char *json_data = (char *)malloc(json_len);
+    if (json_data == NULL) 
+    {
+        printf("json_data malloc failed\n");
+        goto FAILED; 
+    }
+    printf("json_data malloc succed\n");
+
+    temp_len = 0;
+    memset(json_data, 0, json_len);
+
+    
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+    // temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"device_code\":\"%s\",", "864430010001091");
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"device_code\":\"%s\",", imei);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"measure_mode\":\"%d\",", 1);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"measure_type\":\"%d\",", 7);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"begin_time\":\"%s\",", begin_time_str);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"end_time\":\"%s\",", end_time_str);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"ppg_data\":[");
+    
+    if(temp_len > 512)
+        goto FAILED;
+
+    // // 后续Base64编码和数据发送逻辑...
+    // encode_len = 512 * 2;
+    // printf("encode_len : %d\n", encode_len);
+    // encode_str = (char *)malloc(encode_len);
+    // if (encode_str == NULL) {
+    //     printf("encode_str 分配失败\n");
+    //     goto FAILED;
+    // }
+    // printf("encode_str 分配成功\n");
+
+    // memset(encode_str, 0, encode_len);
+
+    // mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len, 
+    //                       (const unsigned char*)json_data, strlen(json_data));
+
+    // printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+    // encode_str[output_len] = '\0';
+    // printf("encode_str : %s\n",encode_str);
+
+
+    // 构建content部分
+    data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(CREATE_URL) + strlen(token) + 1 + 1 + output_len + 1 + calculate_base64_length(cnt) + 1 + strlen(tail_encode_str);
+    data_str = (char *)malloc(data_len);
+    if (data_str == NULL) {
+        printf("data_str 分配失败\n");
+        goto FAILED;
+    }
+    memset(data_str, 0, data_len);
+
+    // 后续Base64编码和数据发送逻辑...
+    encode_len = data_len * 3 / 2;
+    printf("encode_len : %d\n", encode_len);
+    encode_str = (char *)malloc(encode_len);
+    if (encode_str == NULL) {
+        printf("encode_str 分配失败\n");
+        goto FAILED;
+    }
+    printf("encode_str 分配成功\n");
+
+    memset(encode_str, 0, encode_len);
+
+    mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len, 
+                          (const unsigned char*)json_data, strlen(json_data));
+
+    printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+    encode_str[output_len] = '\0';
+    printf("encode_str : %s\n",encode_str);
+
+    
+    snprintf(data_str, data_len, ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, token, encode_str);
+
+    // 完成JSON数据,添加ppg_fs字段
+    temp_len = 0;
+    memset(json_data, 0, 512);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len,  "\"ppg_fs\":\"%d\"}", 81);
+    tail_encode_str = (char *)malloc(32);
+    memset(tail_encode_str, 0, 32);
+    mbedtls_base64_encode((unsigned char*)tail_encode_str, 32, &output_len, 
+                    (const unsigned char*)json_data, strlen(json_data));
+
+    if(output_len > 32)
+        goto FAILED;
+    tail_encode_str[output_len] = '\0';
+
+    // 计算数据长度并格式化为16进制
+    // data_len = strlen(data_str);
+    sprintf(len_str, "%04x", data_len + 8 + calculate_base64_length(cnt) + 1 + strlen(tail_encode_str));
+    printf("data_len : %d\n",data_len);
+    // 计算head_str长度
+    // head_len = strlen(BID) + 1 + strlen("864430010001091") + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    head_str = (char *)malloc(head_len);
+    if (head_str == NULL) {
+        printf("head_str 分配失败\n");
+        goto FAILED;
+    }
+
+    // snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, "864430010001091", len_str);
+    snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei,len_str);
+    head_len = strlen(head_str);
+
+    // 计算MD5
+    code_len = head_len + strlen(KEY) + 1;
+    code_str = (char *)malloc(code_len);
+    if (code_str == NULL) {
+        printf("code_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    printf("code_len:%d\n", code_len);
+
+    calculate_md5(code_str, md5_str);
+    if (strlen(md5_str) == 0) {
+        printf("MD5签名失败\n");
+        goto FAILED;
+    }
+
+    send_len = 1 + strlen(md5_str) + head_len + data_len + 1;
+    send_str = (char *)malloc(send_len);
+    if (send_str == NULL) {
+        printf("send_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(send_str, send_len, "[%s%s%s", md5_str, head_str,data_str);
+    send_len = strlen(send_str);
+    printf("send_len : %d\n", send_len);
+    printf("send_str : %s\n", send_str);
+
+    tcp_send(g_listen_sock, send_str, send_len);
+
+/*########################################################################################################*/
+
+    // 分块发送ppg_data
+    int ppg_block = 0;
+    int ppg_offset = 0;  // 已处理的int数量
+    int total_ints = cnt;  // 总int数量
+
+    while (ppg_offset < total_ints) {
+        LOS_Msleep(100);
+        temp_len = 0;  // 当前块的字符串长度
+        int ints_in_block = 0;   // 当前块包含的int数量
+        
+        memset(json_data, 0, 512);
+        
+        // 计算当前块最多能容纳多少个int
+        while (temp_len < 512 - 12 && ppg_offset < total_ints) {
+            int num = data[ppg_offset];
+            int written = 0;
+            
+            // 如果不是最后一个int,添加数字和逗号
+            if (ppg_offset < total_ints - 1) {
+                written = snprintf(
+                    json_data + temp_len,
+                    512 - temp_len,
+                    "%d,", num
+                );
+            }
+            // 最后一个int,添加数字但不添加逗号
+            else {
+                written = snprintf(
+                    json_data + temp_len,
+                    512 - temp_len,
+                    "%d", num
+                );
+            }
+            
+            if (written < 0 || written >= 512 - temp_len) {
+                break;  // 空间不足,结束当前块
+            }
+            
+            temp_len += written;
+            ppg_offset++;
+            ints_in_block++;
+        }
+        
+        // 最后一个块需要添加JSON数组结束符号
+        if (ppg_offset == total_ints && temp_len > 0) {
+            json_data[temp_len++] = ']';
+        }
+        
+        // 发送当前块
+        if (temp_len > 0) {
+            memset(encode_str, 0, encode_len);
+            mbedtls_base64_encode(
+                (unsigned char*)encode_str,
+                encode_len,
+                &output_len,
+                (const unsigned char*)json_data,
+                temp_len
+            );
+            
+            tcp_send(g_listen_sock, encode_str, output_len);
+            printf("已发送ppg数据块 %d,包含 %d 个int,字符串长度: %d encode_str:%s\n", 
+                ppg_block, ints_in_block, temp_len,encode_str);
+        }
+        
+        ppg_block++;
+    }
+    memset(send_str,0,send_len);
+    send_len = strlen(tail_encode_str) + 1;
+    snprintf(send_str, send_len, "%s]", tail_encode_str);
+    printf("send_len : %d\n", send_len);
+    printf("tail_encode_str : %s\n", tail_encode_str);
+    //发送最终数据
+    tcp_send(g_listen_sock, send_str, send_len);
+    
+    ret = 0;  // 成功
+
+FAILED:
+
+    if (tail_encode_str != NULL) {
+        free(tail_encode_str);
+        tail_encode_str = NULL;
+    }
+    if (begin_time_str != NULL) {
+        free(begin_time_str);
+        begin_time_str = NULL;
+    }
+    if (end_time_str != NULL) {
+        free(end_time_str);
+        end_time_str = NULL;
+    }
+    if (json_data != NULL) {
+        free(json_data);
+        json_data = NULL;
+    }
+    if (send_str != NULL) {
+        free(send_str);
+        send_str = NULL;
+    }
+    if (code_str != NULL) {
+        free(code_str);
+        code_str = NULL;
+    }
+    if (head_str != NULL) {
+        free(head_str);
+        head_str = NULL;
+    }
+    if (data_str != NULL) {
+        free(data_str);
+        data_str = NULL;
+    }
+    if (encode_str != NULL) {
+        free(encode_str);
+        encode_str = NULL;
+    }
+
+    printf("free\n");
+
+#else
+    if (tcp_data == NULL || tcp_data_cnt == 0)
+        return;
+
+    if(LK_STATUS != 1)
+    {
+        printf("NOT LK\n");
+        return;
+    }
+
+    int ret = -1;
+    char *data_str = NULL;
+    int data_len = 0;
+    char *encode_str = NULL;
+    int encode_len = 0;
+    char *head_str = NULL;
+    int head_len = 0;
+    char *code_str = NULL;
+    int code_len = 0;
+    char *send_str = NULL;
+    int send_len = 0;
+    uint32_t output_len = 0;
+    int temp_len = 0;
+    char len_str[5] = {0};
+    char md5_str[33] = {0};
+    uint32_t begin_time = 0;
+    uint32_t end_time = 0;
+
+       char *encode_header_str = NULL;
+    char *header_json = NULL;
+    int encode_header_len = 0;
+
+
+    // 获取测量时间
+    bp_get_measure_time(&begin_time, &end_time);
+    char *begin_time_str = (char *)malloc(64);
+    char *end_time_str = (char *)malloc(64);
+    if (begin_time_str == NULL || end_time_str == NULL)
+        goto FAILED;
+    uapi_get_TIME_STR(begin_time, begin_time_str, '-', ':',  DATE_TIME_DEFULL);
+    uapi_get_TIME_STR(end_time, end_time_str, '-', ':', DATE_TIME_DEFULL);
+    printf("begin_time_str:%s\n", begin_time_str);
+    printf("end_time_str:%s\n", end_time_str);
+
+    // 构建JSON数据前缀部分
+    header_json = (char *)malloc(256);
+    if(header_json == NULL)
+        goto FAILED;
+
+    char token[64] = {0};
+    bp_get_token(token, 64);
+
+    if (strlen(token) == 0) 
+    {
+        printf("token get failed\n");
+        goto FAILED;
+    }
+
+    temp_len = 0;
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"headers\":[");
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"key\":\"token\",");
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "\"value\":\"%s\"}", token);
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "]}");
+
+    if(temp_len > 256)
+    {
+        goto FAILED;
+    }
+
+       encode_header_len = temp_len * 3 / 2;
+       encode_header_str = (char *)malloc(encode_header_len);
+       if(NULL == encode_header_str)
+       {
+               printf("encode_header_str malloc failed\n");
+               goto FAILED;
+       }
+
+       memset(encode_header_str,0, encode_header_len);
+    size_t output_header_len = 0;
+       if(0 != mbedtls_base64_encode((unsigned char*)encode_header_str, encode_header_len, &output_header_len, (const unsigned char*)header_json, temp_len))
+       {
+        printf("encode_header_str base64 encode failed\n");
+               goto FAILED;
+       }       
+
+    // 分配JSON缓冲区
+    int json_len = 512 + calculate_base64_length(tcp_data_cnt);
+    char *json_data = (char *)malloc(json_len);
+    if (json_data == NULL) 
+    {
+        printf("json_data malloc failed\n");
+        goto FAILED; 
+    }
+    printf("json_data malloc succed\n");
+
+    temp_len = 0;
+    memset(json_data, 0, json_len);
+    
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+    // temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"device_code\":\"%s\",", "864430010001091");
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"device_code\":\"%s\",", imei);
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"measure_mode\":\"%d\",", 1);
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"measure_type\":\"%d\",", bp_measure_type);
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"begin_time\":\"%s\",", begin_time_str);
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"end_time\":\"%s\",", end_time_str);
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"ppg_data\":[");
+
+    // printf("bp_measure_type : %d\n",bp_measure_type);
+
+    for(int i = 0; i < tcp_data_cnt; i++)
+    {
+        if(i == (tcp_data_cnt - 1))
+        {
+            temp_len += snprintf(json_data + temp_len, json_len - temp_len, "%d],", tcp_data[i]);
+        }
+        else
+        {
+            temp_len += snprintf(json_data + temp_len, json_len - temp_len, "%d,", tcp_data[i]);
+        }
+    }
+
+       // temp_len += snprintf(json_data + temp_len, json_len - temp_len,"\"ppg_fs\":\"%d\"}", 81);
+
+    
+    // if(bp_measure_type == BP_ADJUST)
+    // {
+    //     
+    if(bp_measure_type == BP_ADJUST)
+    {
+        temp_len += snprintf(json_data + temp_len, json_len - temp_len,"\"ppg_fs\":\"%d\",", 81);
+        temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"cal_value\":[%d,%d]\"}",120,80);
+    }
+    else
+    {
+        temp_len += snprintf(json_data + temp_len, json_len - temp_len,"\"ppg_fs\":\"%d\"}", 81);
+    }
+    // }
+
+
+    if(temp_len > json_len)
+        goto FAILED;
+
+    encode_len = temp_len * 3 / 2;
+    printf("encode_len : %d\n", encode_len);
+    encode_str = (char *)malloc(encode_len);
+    if (encode_str == NULL) 
+    {
+        printf("encode_str malloc failed\n");
+        goto FAILED;
+    }
+
+    memset(encode_str, 0, encode_len);
+
+    mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len, 
+                          (const unsigned char*)json_data, strlen(json_data));
+
+    printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+    encode_str[output_len] = '\0';
+    // printf("encode_str : %s\n",encode_str);
+
+    // 构建content部分
+    // ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, token, encode_str
+    data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(CREATE_URL) + 1 + output_header_len + 1 + output_len + 1;
+    data_str = (char *)malloc(data_len);
+    if (data_str == NULL) 
+    {
+        printf("data_str malloc failed\n");
+        goto FAILED;
+    }
+    memset(data_str, 0, data_len);
+
+    snprintf(data_str, data_len, ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, encode_header_str, encode_str);
+
+    sprintf(len_str, "%04x", strlen(data_str) + 8);
+    printf("data_len : %d\n",data_len);
+
+    head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    head_str = (char *)malloc(head_len);
+    if (head_str == NULL) 
+    {
+        printf("head_str malloc failed\n");
+        goto FAILED;
+    }
+
+    // snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, "864430010001091", len_str);
+    snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei,len_str);
+    head_len = strlen(head_str);
+
+    // 计算MD5
+    code_len = head_len + strlen(KEY) + 1;
+    code_str = (char *)malloc(code_len);
+    if (code_str == NULL) 
+    {
+        printf("code_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    printf("code_len:%d\n", code_len);
+
+    calculate_md5(code_str, md5_str);
+    if (strlen(md5_str) == 0)
+     {
+        printf("MD5 sign failed\n");
+        goto FAILED;
+    }
+
+    send_len = 1 + strlen(md5_str) + head_len + data_len + 1;
+    send_str = (char *)malloc(send_len);
+    if (send_str == NULL) 
+    {
+        printf("send_str malloc failed\n");
+        goto FAILED;
+    }
+    snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str,data_str);
+    send_len = strlen(send_str);
+    printf("send_len : %d\n", send_len);
+    // printf("send_str : %s\n", send_str);
+
+    // ret = tcp_send(g_listen_sock, send_str, send_len);
+    // if(ret != 0)
+    // {
+    //     printf("tcp_send failed\n");
+    //     goto FAILED;
+    // }
+
+    for(int i = 0; i < send_len; i += 1024) 
+    {
+        int chunk_size = (send_len - i > 1024) ? 1024 : send_len - i; 
+        
+        ret = tcp_send(g_listen_sock, send_str + i, chunk_size);
+        if(ret != 0) 
+        {
+            printf("tcp_send failed at offset %d\n", i);
+            goto FAILED;
+        }
+        
+        LOS_Msleep(100);
+    }
+
+    // int offset = 0;
+    // while (offset < send_len) 
+    // {
+    //     size_t chunk_len = (send_len - offset > 1024) ? 1024 : send_len - offset;
+    //     // printf("send_str %zu: %.1024s\n", offset / 1024 + 1, send_str + offset);
+    //     printf("%.1024s\n",send_str + offset);
+    //     offset += chunk_len;
+    // }
+
+FAILED:
+    
+    if (encode_header_str != NULL) 
+    {
+        free(encode_header_str);
+        encode_header_str = NULL;
+    }
+
+    if (header_json != NULL) 
+    {
+        free(header_json);
+        header_json = NULL;
+    }
+
+    if (begin_time_str != NULL)
+    {
+        free(begin_time_str);
+        begin_time_str = NULL;
+    }
+
+    if (end_time_str != NULL) 
+    {
+        free(end_time_str);
+        end_time_str = NULL;
+    }
+
+    if (json_data != NULL) 
+    {
+        free(json_data);
+        json_data = NULL;
+    }
+
+    if (send_str != NULL) 
+    {
+        free(send_str);
+        send_str = NULL;
+    }
+
+    if (code_str != NULL)
+    {
+        free(code_str);
+        code_str = NULL;
+    }
+
+    if (head_str != NULL) 
+    {
+        free(head_str);
+        head_str = NULL;
+    }
+
+    if (data_str != NULL) 
+    {
+        free(data_str);
+        data_str = NULL;
+    }
+
+    if (encode_str != NULL) 
+    {
+        free(encode_str);
+        encode_str = NULL;
+    }
+
+    // printf("free\n");
+#endif
+}
+
+int bp_tcp_login(void)
+{
+    int ret = -1;
+    char *data_str = NULL;
+    int data_len = 0;
+    char *encode_str = NULL;
+    int encode_len = 0;
+    char *head_str = NULL;
+    int head_len = 0;
+    char *code_str = NULL;
+    int code_len = 0;
+    char *send_str = NULL;
+    int send_len = 0;
+    uint32_t output_len = 0;
+    int temp_len = 0;
+    
+    char len_str[5] = {0};
+    char md5_str[33] = {0};
+    // char json_data[1024] = {0};
+
+    char *json_data = (char *)malloc(512);
+    if(json_data == NULL)
+        goto FAILED; 
+
+    memset(json_data,0,512);
+
+    char birthday[32] = {0};
+    snprintf(birthday,32,"%d-%d-%d",2002,1,10);
+
+    // 构建JSON数据
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"account_type\":\"%d\",", 1);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"account\":\"%s\",", "1624952103@qq.com");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"name\":\"%s\",", "penglei");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"password\":\"%s\",", "12345678");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"gender\":\"%d\",", 1); //性别['1': 男, '2': 女, '3':未知]
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"birthday\":\"%s\",", birthday);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"height\":\"%d\",", 173);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"weight\":\"%d\"}", 100);
+
+    if(temp_len > 512)
+        goto FAILED;
+
+    printf("temp_len:%d\n",temp_len);
+    printf("json_data : %s\n", json_data);
+    printf("json_data_len : %d\n", strlen(json_data));
+
+    // encode_len = (temp_len * 4 + 2) / 3 + 1;
+    encode_len = temp_len * 2;
+    encode_str = (char *)malloc(encode_len);
+    if (encode_str == NULL) {
+        printf("encode_str 分配失败\n");
+        goto FAILED;
+    }
+    memset(encode_str, 0, encode_len);
+
+    // 执行Base64编码
+    mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len, 
+                             (const unsigned char*)json_data, strlen(json_data));
+                             
+    printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+    // 确保Base64编码字符串以NULL结尾
+    encode_str[output_len] = '\0';
+    printf("encode_str: %s\n", encode_str);
+
+    // 构建content部分
+    data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(LOGIN_URL) + 1 + 1 + output_len + 1;
+    data_str = (char *)malloc(data_len);
+    if (data_str == NULL) {
+        printf("data_str 分配失败\n");
+        goto FAILED;
+    }
+    memset(data_str, 0, data_len);
+    snprintf(data_str,data_len, ",POST,%s%s,,%s", URL_HEADER, LOGIN_URL, encode_str);
+
+    // 计算数据长度并格式化为16进制
+    data_len = strlen(data_str);
+    sprintf(len_str, "%04x", data_len + 8);
+
+    // 计算head_str长度
+    head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    // head_len = strlen(BID) + 1 + 15 + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    head_str = (char *)malloc(head_len);
+    if (head_str == NULL) {
+        printf("head_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei, len_str);
+    // snprintf(head_str, head_len, "%s*864430010001091*%s*TCP_HTTP", BID, len_str);
+    
+    head_len = strlen(head_str);
+
+    // 计算MD5
+    code_len = head_len + strlen(KEY) + 1;
+    code_str = (char *)malloc(code_len);
+    if (code_str == NULL) {
+        printf("code_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    printf("code_str:%s\n", code_str);
+    printf("code_len:%d\n", code_len);
+
+    calculate_md5(code_str,md5_str);
+    if(strlen(md5_str) == 0)
+    {
+        printf("MD5签名失败\n");
+        goto FAILED;
+    }
+    // if (active_md5_sign(code_str, code_len, md5_str) != 0) {
+    //     printf("MD5签名失败\n");
+    //     goto FAILED;
+    // }
+
+    // 构建发送字符串
+    send_len = 1 + strlen(md5_str) + head_len + data_len + 1 + 1;  // [ + md5 + head + data + ] + \0
+    printf("计算的send_len : %d\n", send_len);
+    send_str = (char *)malloc(send_len);
+    if (send_str == NULL) {
+        printf("send_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str, data_str);
+    send_len = strlen(send_str);
+    printf("实际send_len : %d\n", send_len);
+
+    // printf("md5_str:%s\n", md5_str);
+    // printf("md5_len:%zu\n", strlen(md5_str));
+    // printf("head_len:%d\n", head_len);
+    // printf("head_str:%s\n", head_str);
+    // printf("data_len:%d\n", data_len);
+    // printf("data_str:%s\n", data_str);
+    // printf("send_len : %d\n", send_len);
+    // printf("send_str : %s\n", send_str);
+
+    // 发送数据
+    tcp_send(g_listen_sock, send_str, send_len);
+
+    ret = 0;  // 成功
+
+FAILED:
+    if (json_data != NULL) {
+        free(json_data);
+        json_data = NULL;
+    }
+    if (send_str != NULL) {
+        free(send_str);
+        send_str = NULL;
+    }
+    if (code_str != NULL) {
+        free(code_str);
+        code_str = NULL;
+    }
+    if (head_str != NULL) {
+        free(head_str);
+        head_str = NULL;
+    }
+    if (data_str != NULL) {
+        free(data_str);
+        data_str = NULL;
+    }
+    if (encode_str != NULL) {
+        free(encode_str);
+        encode_str = NULL;
+    }
+
+    return ret;
+}
+
+int get_active_code(void)
+{
+    int ret = -1;
+    char *data_str = NULL;
+    int data_len = 0;
+    char *encode_str = NULL;
+    int encode_len = 0;
+    char *head_str = NULL;
+    int head_len = 0;
+    char *code_str = NULL;
+    int code_len = 0;
+    char *send_str = NULL;
+    int send_len = 0;
+    uint32_t output_len = 0;
+    int temp_len = 0;
+    
+    char len_str[5] = {0};
+    char btaddr_str[64] = {0};
+    char req_code[128] = {0};
+    char md5_str[33] = {0};
+    // char json_data[1024] = {0};
+    
+    if(imei == NULL)
+    {
+        uint8_t retry = 0;
+        while((imei == NULL || strlen(imei) == 0) && retry < 10)
+        {
+            retry++;
+            LOS_Msleep(2000);
+            imei = uapi_dev_runtime_get_cat1_imei();
+        }
+        
+        if (imei == NULL || strlen(imei) == 0) 
+        {
+            printf("IMEI get failed\n");
+            ret = -1;
+            goto FAILED;
+        }
+    }
+
+    printf("imei:%s\n", imei);
+
+    char *json_data = (char *)malloc(512);
+    if(json_data == NULL)
+        goto FAILED; 
+
+    memset(json_data,0,512);
+
+    bp_get_request_code(req_code,128);
+    printf("bp_get_request_code:%s\n",req_code);
+    if(strlen(req_code) == 0)
+    {
+        get_request_code(req_code);
+        bp_save_request_code(req_code,strlen(req_code));
+    }
+
+    // get_request_code(req_code);
+    // 构建JSON数据
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"name\":\"%s\",", NAME);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"firm\":\"%s\",", "湖南懂你");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"device_code\":\"%s\",", imei);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"model\":\"%s\",", "WATCH C2-C3-C5");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"sensor\":{\"model\":\"DN06\",\"fs\":%d},", 81);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"sinklib_version\":\"%s\",", "v0.5.3.060325");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"request_code\":\"%s\"}", req_code);
+
+    if(temp_len > 512)
+        goto FAILED;
+
+    printf("temp_len:%d\n",temp_len);
+    printf("json_data : %s\n", json_data);
+    printf("json_data_len : %d\n", strlen(json_data));
+
+    // encode_len = (temp_len * 4 + 2) / 3 + 1;
+    encode_len = temp_len * 2;
+    encode_str = (char *)malloc(encode_len);
+    if (encode_str == NULL) {
+        printf("encode_str 分配失败\n");
+        goto FAILED;
+    }
+    memset(encode_str, 0, encode_len);
+
+    // 执行Base64编码
+    mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len, 
+                             (const unsigned char*)json_data, strlen(json_data));
+                             
+    printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+    // 确保Base64编码字符串以NULL结尾
+    encode_str[output_len] = '\0';
+    printf("encode_str: %s\n", encode_str);
+
+    // 构建content部分
+    data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(ACTIVE_URL) + 1 + 1 + output_len + 1;
+    data_str = (char *)malloc(data_len);
+    if (data_str == NULL) {
+        printf("data_str 分配失败\n");
+        goto FAILED;
+    }
+    memset(data_str, 0, data_len);
+    snprintf(data_str,data_len, ",POST,%s%s,,%s", URL_HEADER,ACTIVE_URL, encode_str);
+
+    // 计算数据长度并格式化为16进制
+    data_len = strlen(data_str);
+    sprintf(len_str, "%04x", data_len + 8);
+
+    // 计算head_str长度
+    head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    // head_len = strlen(BID) + 1 + 15 + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    head_str = (char *)malloc(head_len);
+    if (head_str == NULL) {
+        printf("head_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei, len_str);
+    // snprintf(head_str, head_len, "%s*864430010001091*%s*TCP_HTTP", BID, len_str);
+    
+    head_len = strlen(head_str);
+
+    // 计算MD5
+    code_len = head_len + strlen(KEY) + 1;
+    code_str = (char *)malloc(code_len);
+    if (code_str == NULL) {
+        printf("code_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    printf("code_str:%s\n", code_str);
+    printf("code_len:%d\n", code_len);
+
+    calculate_md5(code_str,md5_str);
+    if(strlen(md5_str) == 0)
+    {
+        printf("MD5签名失败\n");
+        goto FAILED;
+    }
+    // if (active_md5_sign(code_str, code_len, md5_str) != 0) {
+    //     printf("MD5签名失败\n");
+    //     goto FAILED;
+    // }
+
+    // 构建发送字符串
+    send_len = 1 + strlen(md5_str) + head_len + data_len + 1 + 1;  // [ + md5 + head + data + ] + \0
+    printf("计算的send_len : %d\n", send_len);
+    send_str = (char *)malloc(send_len);
+    if (send_str == NULL) {
+        printf("send_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str, data_str);
+    send_len = strlen(send_str);
+    // printf("实际send_len : %d\n", send_len);
+
+    // printf("md5_str:%s\n", md5_str);
+    // printf("md5_len:%zu\n", strlen(md5_str));
+    // printf("head_len:%d\n", head_len);
+    // printf("head_str:%s\n", head_str);
+    // printf("data_len:%d\n", data_len);
+    // printf("data_str:%s\n", data_str);
+    // printf("send_len : %d\n", send_len);
+    // printf("send_str : %s\n", send_str);
+
+    // 发送数据
+    tcp_send(g_listen_sock, send_str, send_len);
+
+    ret = 0;  // 成功
+
+FAILED:
+    if (json_data != NULL) {
+        free(json_data);
+        json_data = NULL;
+    }
+    if (send_str != NULL) {
+        free(send_str);
+        send_str = NULL;
+    }
+    if (code_str != NULL) {
+        free(code_str);
+        code_str = NULL;
+    }
+    if (head_str != NULL) {
+        free(head_str);
+        head_str = NULL;
+    }
+    if (data_str != NULL) {
+        free(data_str);
+        data_str = NULL;
+    }
+    if (encode_str != NULL) {
+        free(encode_str);
+        encode_str = NULL;
+    }
+
+    return ret;
+}
+
+void bp_check_active_code(char *active_code)
+{
+    char buffer[128] = {0};
+    int buffer_size = 128;
+    FILE *file = fopen(BP_ACTIVE_CODE_FILE, "r");
+    if (file) 
+    {
+        memset(buffer, 0, buffer_size);
+        size_t bytes_read = fread(buffer, 1, buffer_size - 1, file);
+        if (bytes_read > 0) 
+        {
+            buffer[bytes_read] = '\0';
+            fclose(file);
+            printf("成功读取文件内容\n");
+            memcpy_s(active_code,bytes_read,buffer,bytes_read);
+            return ;
+        } else {
+            printf("文件为空\n");
+            fclose(file);
+        }
+    } else {
+        printf("无法打开文件读取(可能不存在): %s\n", BP_ACTIVE_CODE_FILE);
+    }
+
+    fclose(file);
+}
+
+void bp_tcp_data_clean(void)
+{
+    memset(&bp_data,0,sizeof(bp_data));
+    if(tcp_data != NULL)
+    {
+        free(tcp_data);
+        tcp_data = NULL;
+        tcp_data_cnt = 0;
+    }
+    // if (g_listen_sock >= 0) 
+    // {
+    //     lwip_close(g_listen_sock);
+    //     g_listen_sock = -1;
+    // }
+    BP_GET_STATUS = 0;
+}
+
+void do_bp_tcp_server_send_data(int cmd,int *data,uint32_t len)
+{
+    if((data == NULL || len == 0) && cmd == BP_TCP_SERVICE_CMD_SEND_DATA)
+        return;
+
+    errcode_t ret;
+    bp_tcp_data_mail_t send_data = {0};
+    send_data.cmd = cmd;
+    if(len && data)
+    {
+        send_data.len = len;
+        send_data.data = (int *)malloc(len * sizeof(int));
+        if(send_data.data == NULL)
+        {
+            PRINT("malloc failed\n");
+            return;
+        }
+        memcpy_s(send_data.data,len * sizeof(int),data,len * sizeof(int));
+    }
+
+    uint32_t send_len = sizeof(send_data);
+
+    ret = osal_msg_queue_write_copy(g_app_queue, (void *)&send_data,
+                                    send_len, 0);
+    if (ret != OSAL_SUCCESS) {
+        PRINT("Error bp Check MSG 0x send failed! err=0x%x! \r\n", ret);
+    }
+
+    // if(send_data.data != NULL)
+    //     free(send_data.data);
+}
+
+// unsigned char buf[14100] = {0};    // 算法库计算过程中所需要的缓存
+
+//int activate_algorithm(const unsigned char req_code[], const unsigned int req_code_len,const unsigned char key_code[], const unsigned int key_code_len);
+void bp_activate_algorithm(void)
+{
+#if 0
+    char req_code[128] = {0};
+    char active_code[128] = {0};
+    bp_get_request_code(req_code,128);
+    bp_get_active_code(active_code,128);
+    if(strlen(req_code) == 0 || strlen(active_code) == 0)
+    {
+        printf("read req_code or active_code failed\n");
+        return;
+    }
+    int ret = activate_algorithm((const unsigned char*)req_code,strlen(req_code),(const unsigned char*)active_code,strlen(active_code));
+    printf("activate_algorithm ret : %d\n",ret);
+    if(ret == 1)
+    {
+        printf("activate_algorithm succed\n");
+    }
+    ret = init_algorithm(buf, 8000);
+    printf("init_algorithm ret:%d\n",ret);
+    if(ret == 0)
+    {
+        printf("init_algorithm succed\n");
+    }
+#endif
+}
+
+static void bp_tcp_deinit(void)
+{
+    if (g_listen_sock >= 0) 
+    {
+        lwip_close(g_listen_sock);
+        g_listen_sock = -1;
+    }
+}
+
+int bp_tcp_init(void)
+{ 
+
+    if(tcp_sign_up() != 0)
+    {
+        printf("tcp_sign_up failed\n");
+        return -1;
+    }
+
+    // if(LK_STATUS == 0 ) 
+    // {
+    //     printf("LK failed\n");
+    //     return -1;
+    // }
+
+    char token[64] = {0};
+    bp_get_token(token, 64);
+
+    if(strlen(token) == 0)
+    {
+        bp_tcp_login();
+        LOS_Msleep(2000);
+        bp_get_token(token, 64);
+    }
+
+    if (strlen(token) == 0) 
+    {
+        printf("token get failed\n");
+        return -1;
+    }
+    return 0;
+}
+
+static void tcp_data_handler(int *data,int len)
+{
+    if(tcp_data == NULL)
+    {
+        tcp_data = (int *)malloc(MAX_CNT * sizeof(int));
+        if(tcp_data == NULL)
+        {
+            PRINT("malloc failed\n");
+            return;
+        }
+    }
+
+    if(LK_STATUS != 1 && g_listen_sock > 0)
+    {
+        bp_tcp_init();
+    }
+
+    if(tcp_data_cnt >= MAX_CNT)
+    {
+        return;
+        // printf("tcp_data_cnt : %d\n",tcp_data_cnt);
+        // bp_stop();
+        // for(int i = 0; i < tcp_data_cnt; i ++)
+        // {
+        //     printf("data[%d]:%d\n",i,tcp_data[i]);
+        // }
+        // memset((void*)tcp_data,0,MAX_CNT * sizeof(int));
+        // LOS_Msleep(1000);
+
+        // if(LK_STATUS == 1)
+        // {
+        //     upload_bp_data(tcp_data,tcp_data_cnt);
+        //     // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BP_TEST, NULL, 0);
+        // }
+            
+        // else
+        //     printf("NOT LK\n");
+
+        // LOS_Msleep(2000);
+        // bp_tcp_data_clean();
+    }
+    else
+    {
+        printf("tcp_data_cnt:%d\n",tcp_data_cnt);
+        memcpy_s(tcp_data + tcp_data_cnt,(MAX_CNT - tcp_data_cnt) * sizeof(int),data,len * sizeof(int));
+
+        // for(int i = tcp_data_cnt; i < tcp_data_cnt+len; i ++)
+        // {
+        //     printf("222data[%d]:%d\n",i,tcp_data[i]);
+        // }
+
+        tcp_data_cnt += len;
+    }
+}
+
+static void bp_tcp_server_send_task(void const *arg)
+{
+    unused(arg);
+    errcode_t ret;
+
+    bp_tcp_data_mail_t mail = {0};
+    uint32_t msgsize = sizeof(bp_tcp_data_mail_t);
+
+    while (1) {
+        ret = osal_msg_queue_read_copy(g_app_queue, (void *)&mail, &msgsize,
+                                       OSAL_MSGQ_WAIT_FOREVER);
+        if (ret != OSAL_SUCCESS) {
+            continue;
+        }
+
+        if(mail.cmd == BP_TCP_SERVICE_CMD_SEND_DATA)
+        {
+            tcp_data_handler((int *)mail.data,mail.len);
+            if(mail.data != NULL)
+            {
+                free(mail.data);
+            }
+        }
+        else if(mail.cmd == BP_TCP_SERVICE_CMD_SERVER_INIT)
+        {
+            bp_tcp_init();
+        }
+        else if(mail.cmd == BP_TCP_SERVICE_CMD_SERVER_DEINIT)
+        {
+            bp_tcp_deinit();
+        }
+        else if(mail.cmd == BP_TCP_SERVICE_CMD_DATA_UPLOAD)
+        {
+            upload_bp_data();
+            bp_tcp_data_clean();
+        }
+    }
+}
+
+
+void bp_tcp_server_recv_task(void *pvParameters)
+{
+    char rx_buffer[2048] = {0};
+
+    while (1)
+    {
+        if(!uapi_dev_runtime_get_bp_status_flag())
+        {
+            LOS_Msleep(1000);
+            continue;
+        }
+        if (!uapi_cat1_get_power_stat())
+        {
+            PRINT("wating cat1 power on\n");
+            LOS_Msleep(2000);
+            continue;
+        }
+        if (g_listen_sock < 0) 
+        {
+            g_listen_sock = bp_tcp_socket_init();
+            if (g_listen_sock < 0)
+            {
+                PRINT("wating tcp socket init\n");
+                LOS_Msleep(1000);
+                continue;
+            }
+            else
+                do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SERVER_INIT,NULL,0);
+        }
+
+        // if (tcp_socket_init() != 0) 
+        // {
+        //     PRINT("wating tcp socket init\n");
+        //     LOS_Msleep(100);
+        //     continue;
+        // }
+
+        // PRINT("tcp socket init succed\n");
+
+        // get_active_code();
+        // if(tcp_sign_up() != 0)
+        // {
+        //     LOS_Msleep(1000);
+        //     continue;
+        // }
+
+        // printf("tcp_sign_up\n");
+
+        // 接收数据
+        memset(rx_buffer, 0, 2048);
+        int len = recv(g_listen_sock, rx_buffer, 2048 - 1, 0);
+        if (len > 0) 
+        {
+            rx_buffer[len] = '\0';
+            printf("Received %d bytes: %s\n", len, rx_buffer);
+            tcp_recv_data_handler(rx_buffer,len);
+            // 解析数据
+            
+            // tcp_data_parse(rx_buffer, len);
+        }
+
+        // 关闭客户端连接
+        // close(g_listen_sock);
+    }
+
+    // 关闭监听套接字
+    // close(g_listen_sock);
+}
+
+void create_bp_tcp_queue(void)
+{
+
+    if (osal_msg_queue_create("bp_tcp_service_queue", 24, &g_app_queue,
+                              0, sizeof(bp_tcp_data_mail_t)) != ERRCODE_SUCC) {
+        PRINT("[bp][service] app create mail fail\n");
+    }
+}
+
+#define BP_TCP_BOARD_TASK_SIZE   0x2000
+errcode_t uapi_bp_tcp_server_init(void)
+{
+    PRINT("uapi_bp_tcp_server_init !\r\n");
+
+    app_task_definition_t taskcfg={0};
+    taskcfg.create_queue_handle = create_bp_tcp_queue;
+    taskcfg.attr.name="bp_tcp_server_send_task";
+    taskcfg.attr.priority = osPriorityNormal;
+    taskcfg.attr.stack_size = BP_TCP_BOARD_TASK_SIZE;
+    taskcfg.func = bp_tcp_server_send_task;
+    taskcfg.use_mem = USE_EXTEND_MEM;
+    
+    errcode_t ret=uapi_create_osThread_custom(&taskcfg);
+    if(ret != ERRCODE_SUCC)
+    {
+        PRINT("create bp_send_service failed %d!\r\n",ret);
+        return ERRCODE_FAIL;
+    }
+
+    memset(&taskcfg,0,sizeof(taskcfg));
+
+    taskcfg.create_queue_handle = NULL;
+    taskcfg.attr.name="bp_tcp_server_recv_task";
+    taskcfg.attr.priority = osPriorityNormal1;
+    taskcfg.attr.stack_size = BP_TCP_BOARD_TASK_SIZE;
+    taskcfg.func = bp_tcp_server_recv_task;
+    taskcfg.use_mem = USE_EXTEND_MEM;
+    
+    ret=uapi_create_osThread_custom(&taskcfg);
+    if(ret != ERRCODE_SUCC)
+    {
+        PRINT("create bp_recv_service failed %d!\r\n",ret);
+        return ERRCODE_FAIL;
+    }
+
+    // g_bp_service_timer = osTimerNew((osTimerFunc_t)bp_service_check_timer_callback, osTimerPeriodic, NULL, NULL);
+
+    return ERRCODE_SUCC;
+}
diff --git a/code/sdk/zhihui/drivers/bp/service/bp_tcp_server.h b/code/sdk/zhihui/drivers/bp/service/bp_tcp_server.h
new file mode 100644 (file)
index 0000000..42c9450
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-02-14 10:30:32
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-07-07 16:10:14
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+#ifndef _BP_TCP_SERVER_H_
+#define _BP_TCP_SERVER_H_
+
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#include "stdint.h"
+#include "errcode.h"
+
+typedef struct {
+    int cmd;
+    int *data;
+    uint32_t len;
+} bp_tcp_data_mail_t;
+
+
+#pragma pack(1)
+typedef struct 
+{
+    int sbp;
+    int dbp;
+    int pressure; //压力
+    int fatigue;  //疲劳度
+    char emo[20];      //情绪
+}bp_data_t;
+#pragma pack()
+
+#define BP_TCP_SERVICE_CMD_DATA_UPLOAD 0x1
+#define BP_TCP_SERVICE_CMD_SERVER_INIT 0x2
+#define BP_TCP_SERVICE_CMD_SERVER_DEINIT 0x3
+#define BP_TCP_SERVICE_CMD_SEND_DATA 0x4
+
+void do_bp_tcp_server_send_data(int cmd,int *data,uint32_t len);
+void tcp_recv_data_handler(const char *input, int input_len) ;
+void bp_tcp_data_clean(void);
+void test_algorithm(void);
+int get_active_code(void);
+int tcp_sign_up(void);
+int bp_tcp_login(void);
+void bp_activate_algorithm(void);
+void bp_get_data(bp_data_t *data);
+void bp_set_measure_type(uint8_t type);
+
+void bp_set_adjust_data(int sbp,int dbp);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif
\ No newline at end of file
index 121c6ff..7cd7be5 100644 (file)
@@ -81,15 +81,14 @@ static char cywee_version[20] = {0};
 
 static SLEEP_STAT_T sleep_stat[SLEEP_STATUS_LENGTH] = {0};
 static inact_ext_result_t sleep_time = {0};
-// static SLEEP_T nap_data = {0};
+static SLEEP_T ui_nap_data = {0};
+static SLEEP_T ui_sleep_data = {0};
 static int stat_num = 0;
 static int current_year = 0;
 static uint32_t fall_asleep_timestamp = 0;
 static uint32_t wake_up_timestamp = 0;
 static uint32_t abs_static_timestampe = 0;
 static uint32_t asleep_timestampe = 0;
-static uint32_t nap_update_timestamp = 0;
-static uint32_t sleep_update_timestamp = 0;
 
 static uint16_t total_time = 0;
 static uint16_t total_deep_sleep_time = 0;
@@ -119,7 +118,6 @@ uint8_t cywee_ble_service_flag = 0;
 
 #define SPORT_CHECK_MS 1000
 
-
 #ifdef CYWEE_MAC_ACTIVE
 int cm__hs1__mac_c1_init(void);
 int cm__hs1__deinit(void);
@@ -129,14 +127,24 @@ int cm__hs1__init(void);
 int cm__hs1__deinit(void);
 #endif
 
-void cywee_get_sleep_time_data(SLEEP_T *sleep_data)
+void cywee_get_sleep_time_data(uint32_t *fall_sleep_time,uint32_t *wake_up_time,uint16_t *total_time,uint8_t data_type)
 {
-    if (sleep_data == NULL)
+    if (fall_sleep_time == NULL || wake_up_time == NULL || total_time == NULL)
         return;
 
-    sleep_data->fall_asleep_timestamp = fall_asleep_timestamp;
-    sleep_data->wake_up_timestamp = wake_up_timestamp;
-    sleep_data->total_time = total_time;
+    if(data_type == SLEEP_DATA_TYPE)
+    {
+        *fall_sleep_time = ui_sleep_data.fall_asleep_timestamp;
+        *wake_up_time = ui_sleep_data.wake_up_timestamp;
+        *total_time = ui_sleep_data.total_time;
+    }
+    else if(data_type == NAP_DATA_TYPE)
+    {
+        *fall_sleep_time = ui_nap_data.fall_asleep_timestamp;
+        *wake_up_time = ui_nap_data.wake_up_timestamp;
+        *total_time = ui_nap_data.total_time;
+    }
+
 }
 
 uint8_t cywee_get_log_flag(void)
@@ -278,10 +286,82 @@ static void clean_sleep_data(void)
     wake_up_flag = 0;
 }
 
+void cywee_read_nap_data(void)
+{
+    char day[12] = {0};
+    uapi_get_YYMMDD_Time(day, '\0');
+
+    sprintf_s(nap_file_path, 64, NAP_PATH, day);
+
+    FILE *fp = fopen(nap_file_path, "rb");
+    if (fp == NULL)
+    {
+        CWM_OS_dbgPrintf("read_nap_data  %s fopen failed", nap_file_path);
+        return;
+    }
+
+    if(uapi_get_file_size(nap_file_path) > 14)
+        fseek(fp, -14, SEEK_END);
+
+    fseek(fp, 3, SEEK_CUR);
+
+    uint8_t sleep_type;
+    fread(&sleep_type, 1, 1, fp);
+
+    if (sleep_type == 1)
+    {
+        CWM_OS_dbgPrintf("sleep_type error!!!");
+        fclose(fp);
+        return;
+    }
+
+    uint32_t fall_asleep_timestamp;
+    if(fread(&fall_asleep_timestamp, 1, 4, fp) != 4)
+    {
+        printf("fread fall_asleep_timestamp failed\n");
+        fclose(fp);
+        return;
+    }
+
+    uint32_t wake_up_timestamp;
+
+    if(fread(&wake_up_timestamp, 1, 4, fp) != 4)
+    {
+        printf("fread wake_up_timestamp failed\n");
+        fclose(fp);
+        return;
+    }
+
+    uint8_t total_time_hour, total_time_minute;
+
+    if(fread(&total_time_hour, 1, 1, fp) != 1)
+    {
+        printf("fread total_time_hour failed\n");
+        fclose(fp);
+        return;
+    }
+
+    if(fread(&total_time_minute, 1, 1, fp) != 1)
+    {
+        printf("fread total_time_minute failed\n");
+        fclose(fp);
+        return;
+    }
+
+    uint16_t total_time = total_time_hour * 60 + total_time_minute;
+
+    ui_nap_data.fall_asleep_timestamp = fall_asleep_timestamp;
+    ui_nap_data.wake_up_timestamp = wake_up_timestamp;
+    ui_nap_data.total_time = total_time;
+
+    CWM_OS_dbgPrintf("fall_asleep_timestamp : %d  wake_up_timestamp : %d  total_time : %d ",
+    ui_nap_data.fall_asleep_timestamp, ui_nap_data.wake_up_timestamp, ui_nap_data.total_time);
+
+    fclose(fp);
+}
 
 void cywee_read_sleep_data(void)
 {
-    #if FD230_650_0723  //需要改
     char day[12] = {0};
     uapi_get_YYMMDD_Time(day, '\0');
 
@@ -292,7 +372,7 @@ void cywee_read_sleep_data(void)
     if (fp == NULL)
     {
         CWM_OS_dbgPrintf("read_sleep_data fopen fail %s \n",file_path);
-        return false;
+        return;
     }
 
     // 读取睡眠类型
@@ -302,34 +382,54 @@ void cywee_read_sleep_data(void)
     if (sleep_type == 0)
     {
         fclose(fp);
-        return false;
+        return;
     }
 
     // 入睡时间
     uint32_t fall_asleep_timestamp;
-    fread(&fall_asleep_timestamp, 1, 4, fp);
+
+    if(fread(&fall_asleep_timestamp, 1, 4, fp) != 4)
+    {
+        printf("fread fall_asleep_timestamp failed\n");
+        fclose(fp);
+        return;
+    }
 
     // 起床时间
     uint32_t wake_up_timestamp;
-    fread(&wake_up_timestamp, 1, 4, fp);
+
+    if(fread(&wake_up_timestamp, 1, 4, fp) != 4)
+    {
+        printf("fread wake_up_timestamp failed\n");
+        fclose(fp);
+        return;
+    }
 
     // 睡眠总时间
     uint8_t total_time_hour, total_time_minute;
-    fread(&total_time_hour, 1, 1, fp);
-    fread(&total_time_minute, 1, 1, fp);
+
+    if(fread(&total_time_hour, 1, 1, fp) != 1)
+    {
+        printf("fread total_time_hour failed\n");
+        fclose(fp);
+        return;
+    }
+
+    if(fread(&total_time_minute, 1, 1, fp) != 1)
+    {
+        printf("fread total_time_hour failed\n");
+        fclose(fp);
+        return;
+    }
+
     uint16_t total_time = total_time_hour * 60 + total_time_minute;
 
     // 累加睡眠数据
-    sleep_data.fall_asleep_timestamp = fall_asleep_timestamp;
-    sleep_data.wake_up_timestamp = wake_up_timestamp;
-    sleep_data.total_time = total_time;
-
-    sleep_update_timestamp = wake_up_timestamp;
+    ui_sleep_data.fall_asleep_timestamp = fall_asleep_timestamp;
+    ui_sleep_data.wake_up_timestamp = wake_up_timestamp;
+    ui_sleep_data.total_time = total_time;
 
     fclose(fp);
-
-    return true;
-    #endif
 }
 
 static void cywee_set_sleep_time_data(inact_ext_result_t *sleep_data)
@@ -420,6 +520,9 @@ static void cywee_save_sleep_time_data(void)
     CWM_OS_dbgPrintf("total_time[%d], total_deep_sleep_time[%d], total_mild_sleep_time[%d], total_rem_sleep_time[%d], total_wake_time[%d] \n",
     total_time,total_deep_sleep_time,total_mild_sleep_time,total_rem_sleep_time,total_wake_time);
 
+    ui_sleep_data.fall_asleep_timestamp = fall_asleep_timestamp;
+    ui_sleep_data.wake_up_timestamp = wake_up_timestamp;
+    ui_sleep_data.total_time = total_time;
     // update_sleep_data(fall_asleep_timestamp,wake_up_timestamp,total_time);
 
 }
@@ -503,7 +606,6 @@ static void cywee_set_sleep_stat_data(inact_result_t c_inact_result_t)
                 sleep_stat[stat_num].timestamp = timestamp;
             }
             wake_up_timestamp = sleep_stat[stat_num].timestamp;
-            sleep_update_timestamp = wake_up_timestamp;
         }
         stat_num ++;
     }
@@ -558,6 +660,10 @@ static void cywee_save_nap_time_data(void)
 
     CWM_OS_dbgPrintf("save_nap_sleep_data succ \n");
 
+    ui_nap_data.fall_asleep_timestamp = fall_asleep_timestamp;
+    ui_nap_data.wake_up_timestamp = wake_up_timestamp;
+    ui_nap_data.total_time = total_time;
+
     fclose(fp);
 
 }
@@ -973,14 +1079,14 @@ void cywee_set_activity_mode_setstatus(int cmd)
     if(cmd == 0)
     {
 #ifdef SUPPORT_PPG_SERVICE
-        send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_PPG_TEST);
+        ppg_hr_start();
 #endif
         uapi_save_runtime_log(RUNTIME_LOG_HEART_SPORT_MEASURE);
     }
     else
     {
 #ifdef SUPPORT_PPG_SERVICE
-        send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST);
+        ppg_hr_stop();
 #endif
         uapi_save_runtime_log(RUNTIME_LOG_OXYGEN_SPORT_MEASURE_END);
     }
@@ -1282,7 +1388,7 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) {
                 if((int)sensorEVT->fData[2] == 1)
                 {
 #ifdef SUPPORT_PPG_SERVICE
-                    send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_PPG_TEST);
+                    ppg_hr_start();
 #endif
                     uapi_save_runtime_log(RUNTIME_LOG_HEART_SPORT_MEASURE);
                     // hrs = 0;//运动开始,清零心率
@@ -1290,7 +1396,7 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) {
                 else
                 {
 #ifdef SUPPORT_PPG_SERVICE
-                    send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST);
+                    ppg_hr_stop();
 #endif
                     uapi_save_runtime_log(RUNTIME_LOG_OXYGEN_SPORT_MEASURE_END);
                 }
@@ -1437,11 +1543,9 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) {
                     uapi_dev_runtime_set_nap_status(0);
                     //获取小睡出睡时间戳
                     uapi_get_timestampe_ss_extend(&wake_up_timestamp,current_year,c_inact_result_t.month,c_inact_result_t.day,c_inact_result_t.hour,c_inact_result_t.minute,0);
-                    nap_update_timestamp = wake_up_timestamp;
                 }
-                CWM_OS_dbgPrintf("fall_asleep_timestamp : %d\n,fall_asleep_timestampn");
-                CWM_OS_dbgPrintf("nap_update_timestamp : %d\n,nap_update_timestamp");
-                // cywee_func(CYWEE_MSG_TYPE_INACTIVITY_UPDATE,&c_inact_result_t,sizeof(inact_result_t));
+
+               // cywee_func(CYWEE_MSG_TYPE_INACTIVITY_UPDATE,&c_inact_result_t,sizeof(inact_result_t));
 
             }else if((int)sensorEVT->fData[0] == 32){
 
index 2072b2a..59d9c74 100644 (file)
@@ -50,6 +50,9 @@ extern "C" {
 #define   INACTIVITY_MODE_SLEEPING_ACCUMULATE_TIME_OUTPUT    31        // 睡眠累计
 #define   INACTIVITY_MODE_NAP_ACCUMULATE_TIME_OUTPUT    32             // 小睡累计
 
+#define SLEEP_DATA_TYPE 0
+#define NAP_DATA_TYPE 1
+
 typedef struct {
     float x;
     float y;
@@ -183,6 +186,8 @@ void cywee_get_version(char *databuf,uint8_t len);
 
 void cywee_save_sleep_data(void);
 void cywee_save_nap_data(void);
+void cywee_read_nap_data(void);
+void cywee_read_sleep_data(void);
 
 void cywee_reset_history_daily_data(void);
 void cywee_check_acc(void);
@@ -199,7 +204,7 @@ void cywee_int_handler(void);
 void cywee_get_act_data(act_result_t *data);
 void cywee_get_act_ext_data(act_ext_result_t *data);
 
-void cywee_get_sleep_time_data(SLEEP_T *sleep_data);
+void cywee_get_sleep_time_data(uint32_t *fall_sleep_time,uint32_t *wake_up_time,uint16_t *total_time,uint8_t data_type);
 
 #ifdef __cplusplus
 #if __cplusplus
index 227684a..4c13f57 100644 (file)
@@ -458,6 +458,8 @@ errcode_t uapi_cywee_service_init(void)
     // cywee_register_msg_callback(cywee_msg_callback);
     do_cywee_service_check_msg(CYWEE_SERVICE_CMD_START_CHECK, NULL);
     do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_SPORTDATA_READ, NULL, 0);
+    do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_SLEEPDATA_READ, NULL, 0);
+    do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_NAPDATA_READ, NULL, 0);
 
     return ERRCODE_SUCC;
 }
@@ -477,6 +479,21 @@ void cywee_hand_wake_switch(uint8_t cmd)
         do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OPEN_HAND_UPDOWN,NULL);
 }
 
+void cywee_sport_mode_change(uint8_t mode)
+{
+    do_cywee_service_check_msg(mode,NULL);
+}
+
+void cywee_wear_status_update(uint8_t *wear_status)
+{
+    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,wear_status);
+}
+
+void cywee_charge_status_update(uint8_t *charge_status)
+{
+    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_ONCHARGING_CHANGE,charge_status);
+}
+
 // void cywee_service_service_resume(void)
 // {
 //     PRINT("cywee_service_service resume!\r\n");
index 2e19c49..6632772 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-03-26 20:29:58
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-07-11 14:44:49
+ * @LastEditTime: 2025-07-30 09:44:07
  * @FilePath: /FD230/code/sdk/drivers/peripheral/cywee/Inc/cywee_service.h
  * @Description: 
  * 
@@ -108,6 +108,11 @@ void cywee_int_callback(pin_t pin, uintptr_t param);
 
 void cywee_hand_wake_switch(uint8_t cmd);
 
+void cywee_sport_mode_change(uint8_t mode);
+
+void cywee_wear_status_update(uint8_t *wear_status);
+void cywee_charge_status_update(uint8_t *charge_status);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 19b960d..a37147b 100644 (file)
@@ -1,3 +1,2 @@
 add_subdirectory_if_exist(service)
-add_subdirectory_if_exist(hal)
 add_subdirectory_if_exist(mmc5603)
\ No newline at end of file
diff --git a/code/sdk/zhihui/drivers/mag/hal/CMakeLists.txt b/code/sdk/zhihui/drivers/mag/hal/CMakeLists.txt
deleted file mode 100644 (file)
index 7f82aa0..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#===============================================================================
-# @brief    cmake file
-# Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved.
-#===============================================================================
-
-set(COMPONENT_NAME "mag_hal")
-
-set(PUBLIC_HEADER
-${CMAKE_CURRENT_SOURCE_DIR}
-)
-
-set(SOURCES
-${CMAKE_CURRENT_SOURCE_DIR}/mag_hal.c
-)
-
-set(COMPONENT_PUBLIC_CCFLAGS
-)
-
-set(COMPONENT_CCFLAGS
-
-)
-
-set(WHOLE_LINK
-    true
-)
-
-set(MAIN_COMPONENT
-    false
-)
-
-set(PUBLIC_DEFINES
-)
-
-set(PRIVATE_DEFINES
-)
-
-build_component()
index 5b95cb8..4968ca2 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2025-05-15 11:28:07
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-05-16 16:52:10
+ * @LastEditTime: 2025-07-29 10:54:34
  * @FilePath: /FD230/code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_hal.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -33,9 +33,6 @@ int mmc5603_stop(void);
 int mmc5603_check(void);
 int mmc5603_start(void);
 
-int mmc5603_savePara_infile(void);
-int mmc5603_readPara_infile(void);
-
 void mmc5603_poweron(void);
 void mmc5603_poweroff(void);
 
index a131c35..d88f6e9 100644 (file)
@@ -304,7 +304,7 @@ int SavePara(float *p)
 \r
 #define MMC_DATA_PATH "/user/userdata/mmc_para.bin"\r
 \r
-int mmc5603_savePara_infile(void)\r
+int mag_savePara_infile(void)\r
 {      \r
        FILE * fp = fopen(MMC_DATA_PATH,"wb");\r
        size_t ret = 0;\r
@@ -326,7 +326,7 @@ int mmc5603_savePara_infile(void)
        return 1;\r
 }\r
 \r
-int mmc5603_readPara_infile(void)\r
+int mag_readPara_infile(void)\r
 {\r
        FILE * fp = fopen(MMC_DATA_PATH,"rb");\r
     if(fp==NULL)\r
index 9a135ef..b51ee11 100644 (file)
@@ -12,6 +12,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}
 set(SOURCES
 ${CMAKE_CURRENT_SOURCE_DIR}/mag_at_cmd.c
 ${CMAKE_CURRENT_SOURCE_DIR}/mag_service.c
+${CMAKE_CURRENT_SOURCE_DIR}/mag_hal.c
 )
 
 set(COMPONENT_PUBLIC_CCFLAGS
similarity index 94%
rename from code/sdk/zhihui/drivers/mag/hal/mag_hal.c
rename to code/sdk/zhihui/drivers/mag/service/mag_hal.c
index 124b501..87ee4af 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2025-05-16 11:36:48
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-07-11 14:23:20
+ * @LastEditTime: 2025-07-29 14:17:17
  * @FilePath: /FD230/code/sdk/zhihui/drivers/mag/hal/mag_hal.c
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -15,7 +15,7 @@
 #endif
 
 
-void mag_sensor_check(void)
+void mag_timer_handler(void)
 {
 #ifdef MAG_MMC5603
     mmc5603_check();
similarity index 91%
rename from code/sdk/zhihui/drivers/mag/hal/mag_hal.h
rename to code/sdk/zhihui/drivers/mag/service/mag_hal.h
index 591ec71..1833818 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-06-07 11:18:26
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-07-11 14:23:42
+ * @LastEditTime: 2025-07-29 14:17:19
  * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.h
  * @Description: 
  * 
@@ -22,6 +22,7 @@ extern "C" {
 #define MAG_SENSOR_CHIP_ID 0
 #endif
 
+void mag_timer_handler(void);
 
 void mag_sensonr_start(void);
 void mag_sensonr_stop(void);
index 97a439f..e261154 100644 (file)
@@ -96,12 +96,12 @@ static void mag_service_check_task(void const *arg)
             // mag_service_check_and_enable_charge();
             // MMC_LOG("MAG_SERVICE_CMD_TIMER_CHECK\r\n");
             // mmc5603_check();
-            mag_sensor_check();
+            mag_timer_handler();
         }else if (mail.comm.app == MAG_SERVICE_CMD_START_CHECK){
             uapi_dev_runtime_set_mmc_status(1);
             do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_MMCDATA_READ, NULL, 0);
             // mmc5603_start();
-            mag_sensonr_start();
+            mag_sensor_start();
             LOS_Mdelay(20);
             mag_service_running_stat = true;
             // uapi_pm_add_sleep_veto(PM_ID_SCREEN);
@@ -113,7 +113,7 @@ static void mag_service_check_task(void const *arg)
             mag_service_running_stat = false;
             osTimerStop(g_mag_service_timer);
             // mmc5603_stop();
-            mag_sensonr_stop();
+            mag_sensor_stop();
             LOS_Mdelay(20);
 
             // uapi_pm_remove_sleep_veto(PM_ID_SCREEN);
index 47682f4..d568ec2 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-12-16 09:56:44
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-05-16 15:24:45
+ * @LastEditTime: 2025-07-29 10:56:02
  * @FilePath: /sdk615/code/sdk/drivers/peripheral/mag/service/mag_service.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -41,6 +41,8 @@ void do_mag_service_check_msg(int cmd);
 void mag_start(void);
 void mag_stop(void);
 
+int mag_savePara_infile(void);
+int mag_readPara_infile(void);
 
 #ifdef __cplusplus
 #if __cplusplus
index 7ad6353..ed35c71 100644 (file)
@@ -170,9 +170,7 @@ void ppg_send_cmd_to_driver(char* mode, uint8_t enable)
 void ppg_get_leaklight_data(uint32_t *ch0,uint32_t *ch1,uint32_t *ch2)
 {
 #ifdef PPG_HX3695
-    #if FD230_650_0723  //需要改
     hx3695_get_leaklight_data(ch0,ch1,ch2);
-    #endif
 #elif defined PPG_VC9202
     vc9202_get_leaklight_data(ch0,ch1,ch2);
 #elif defined PPG_PAH8009
@@ -186,9 +184,7 @@ int32_t ppg_get_factory_data(void)
 #ifdef PPG_PAH8009  
     data =  pah8009_get_factory_data();
 #elif defined PPG_HX3695
-    #if FD230_650_0723  //需要改
-    data =  hx3695_get_factory_data(&green,&red,&ir);
-    #endif
+    data =  hx3695_get_factory_data();
 #endif
     return data;
 }
index 94b0de8..de17454 100644 (file)
@@ -2757,7 +2757,8 @@ void hx3695_wearstatus_update(void)
     {\r
         history_wear_status = wear_status;\r
 #ifdef SUPPORT_CYWEE_SERVICE\r
-        do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,&wear_status);\r
+        // do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,&wear_status);\r
+        cywee_wear_status_update(&wear_status);\r
 #endif\r
     }\r
 }\r
@@ -3907,5 +3908,12 @@ void hx3695_control(char *mode,uint8_t enable)
     }\r
 }\r
 \r
+int32_t hx3695_get_factory_data(void)\r
+{\r
+    int32_t data = factory_data;\r
+    factory_data = 0;\r
+    return data;\r
+}\r
+\r
 #endif  //CHIP_HX3695\r
 \r
index 6ceb1a2..f976cb8 100644 (file)
@@ -304,5 +304,6 @@ uint8_t hx3695_get_hrs_ble_swtich(void);
 uint8_t hx3695_get_hrs(void);\r
 uint8_t hx3695_get_spo2(void);\r
 uint8_t hx3695_get_wear_status(void);\r
+int32_t hx3695_get_factory_data(void);\r
 \r
 #endif\r
index 37992c2..9a94ffa 100644 (file)
@@ -2919,7 +2919,7 @@ FT_RESULTS_t hx3695_factroy_test(TEST_MODE_t  test_mode)
     return ft_result;\r
 }\r
 \r
-void hx3695_get_factory_data(uint32_t *green,uint32_t *red,uint32_t *ir)\r
+void hx3695_get_leaklight_data(uint32_t *green,uint32_t *red,uint32_t *ir)\r
 {\r
     *green = factory_green;\r
     *red = factory_red;\r
index 397a971..4def261 100644 (file)
@@ -48,6 +48,8 @@ void hx3695_lab_test_read(void);
 \r
 void hx3695_get_factory_data(uint32_t *green,uint32_t *red,uint32_t *ir);\r
 \r
+void hx3695_get_leaklight_data(uint32_t *green,uint32_t *red,uint32_t *ir);\r
+\r
 \r
 #endif // _HX3695_FACTORY_TEST_H_\r
 \r
index d03000b..960bb7b 100644 (file)
@@ -126,9 +126,6 @@ static void pah8009_unwearstatus_update(void)
     printf("uapi_dev_runtime_get_train_status() : %d\n",uapi_dev_runtime_get_train_status());    \r
     if(uapi_dev_runtime_get_train_status())\r
     {\r
-#ifdef SUPPORT_CYWEE_SERVICE\r
-        do_cywee_service_check_msg(CYWEE_SERVICE_CMD_HRS_CHANGE,&data);\r
-#endif\r
     }\r
     else\r
     {\r
@@ -153,7 +150,7 @@ static void pah8009_wearstatus_update(int wear_status)
     {\r
         history_wear_status = wear_status;\r
 #ifdef SUPPORT_CYWEE_SERVICE\r
-        do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,(uint8_t *)&history_wear_status);\r
+        cywee_wear_status_update((uint8_t *)&history_wear_status);\r
 #endif\r
         // if(wear_status != 1)\r
         // {\r
index 8315e76..ab98aa3 100644 (file)
@@ -49,7 +49,6 @@ set(MAIN_COMPONENT
 )
 
 set(PUBLIC_DEFINES
-SUPPORT_PPG_SERVICE
 SUPPORT_AT_PPG
 )
 
index 6cdc1dc..506db16 100644 (file)
@@ -1,27 +1,3 @@
-/**
- * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n
- *
- * Description: Test  source \n
- * Author: @CompanyNameTag \n
- * History: \n
- * 2022-08-16, Create file. \n
- */
-
-#include "wearable_log.h"
-#include "securec.h"
-#include "broadcast_service.h"
-#include "broadcast_feature.h"
-#include "service_id_define.h"
-#include "samgr_lite.h"
-#include "thread_adapter.h"
-#include "graphic_service.h"
-
-#ifdef __cplusplus
-#if __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-#endif /* __cplusplus */
-
 #include "pinctrl.h"
 #include "debug_print.h"
 #include "soc_osal.h"
@@ -46,25 +22,9 @@ extern "C" {
 #include "custom_save_runtime.h"
 #include "ppg_hal.h"
 
-#ifdef PPG_HX3695
-#include "hx3695.h"
-#endif
-
-#if defined(PPG_VC9202)
-#include "vc9202_hal.h"
-#include "vc9202_user.h"
-#elif  defined(PPG_VC921X)
-#include "vc921x_hal.h"
-#include "vc921x_user_app.h"
-#elif  defined(PPG_GH3X2X)
-// #include "gh_demo.h"
-#else
-#endif
 
 static bool g_ppg_service_initialled = false;
 
-uint8_t card_databuf[64] = {0};
-uint8_t light_databuf[64] = {0};
 /***
  * 其他cmd在Header里定义,对外开放
 */
@@ -89,93 +49,6 @@ void set_keep_in_wear_det_mode(uint8_t mod)
     keep_in_wear_det_mod = mod;
 }
 
-// //血氧
-// errcode_t update_spo2_event_notify(uint8_t spo2)
-// {
-//     CustomEventPublish(TOPIC_EVENT_SPO2_UPDATE,(uint8_t*)&spo2,sizeof(spo2));
-//     return 0;
-// }
-// errcode_t update_spo2_event_sendmsg_toUI(uint8_t spo2)
-// {
-//     /**通过UI事件发送Notify*/
-//     GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_spo2_event_notify, spo2));
-//     return ERRCODE_SUCC;
-// }
-
-// //心率
-// errcode_t update_hrs_event_notify(uint8_t hrs)
-// {
-//     CustomEventPublish(TOPIC_EVENT_HEARTRATE_UPDATA,(uint8_t*)&hrs,sizeof(hrs));
-//     return 0;
-// }
-// errcode_t update_hrs_event_sendmsg_toUI(uint8_t hrs)
-// {
-//     /**通过UI事件发送Notify*/
-//     GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_hrs_event_notify, hrs));
-//     return ERRCODE_SUCC;
-// }
-
-
-// //穿戴状态
-// errcode_t update_wearstatus_event_notify(int32_t wearstatus)
-// {
-//     CustomEventPublish(TOPIC_EVENT_WEARSTATE_UPDATE,(uint8_t*)&wearstatus,sizeof(wearstatus));
-//     return 0;
-// }
-// errcode_t update_wearstatus_event_sendmsg_toUI(int32_t wearstatus)
-// {
-//     /**通过UI事件发送Notify*/
-//     GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_wearstatus_event_notify, wearstatus));
-//     return ERRCODE_SUCC;
-// }
-
-// //静息心率
-// errcode_t update_static_hrs_event_notify(int32_t hrs)
-// {
-//     CustomEventPublish(TOPIC_EVENT_STATIC_HEARTRATE_UPDATA,(uint8_t*)&hrs,sizeof(hrs));
-//     return 0;
-// }
-// errcode_t update_static_hrs_event_sendmsg_toUI(int32_t hrs)
-// {
-//     /**通过UI事件发送Notify*/
-//     GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_static_hrs_event_notify, hrs));
-//     return ERRCODE_SUCC;
-// }
-
-// void ppg_msg_callback(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen)
-// {
-//     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ppg_msg_callback");
-
-//     if(msg_datalen > 1 || msg_data == NULL)
-//         return;
-
-//     switch(msg_type)
-//     {
-//         case PPG_MSG_TYPE_HRS_UPDATE:
-//            //每秒心率
-//             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_HRS_UPDATE = %d", *msg_data);
-//             update_hrs_event_sendmsg_toUI(*msg_data);
-//             break;
-//         case PPG_MSG_TYPE_HRV_UPDATE:
-//             break;
-//         case PPG_MSG_TYPE_SPO2_UPDATE:
-//             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_SPO2_UPDATE = %d", *msg_data);
-//             update_spo2_event_sendmsg_toUI(*msg_data);
-//             break;
-//         case PPG_MSG_TYPE_WEARSTAT_UPDATE:
-//             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_WEARSTATUS_UPDATE = %d", *msg_data);
-//             update_wearstatus_event_sendmsg_toUI(*msg_data);
-//             break;
-//         case PPG_MSG_TYPE_STATIC_HRS_UPDATE:
-//             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_STATIC_HRS_UPDATE = %d", *msg_data);
-//             update_static_hrs_event_sendmsg_toUI(*msg_data);
-//             break;
-//         default:
-//             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Unknown sensor message type");
-//             break;
-//     }
-// }
-
 void uapi_ppg_service_deinit(void)
 {
     ppg_service_running_stat = false;
@@ -226,36 +99,18 @@ static void ppg_service_check_task(void  *arg)
         char* cmd = "hrs";
         int enable = 1;
         if (mail == PPG_SERVICE_CMD_TYPE_DO_PPG_HRS_TIMER_CALLBACK){
-// #ifdef PPG_HX3695
-//         heart_rate_meas_timeout_handler(NULL);
-// #endif
-            // ppg_hrs_timer_handler();
             ppg_timer_handler(HRS_TIMER_MODE);
             continue;
         }else if (mail == PPG_SERVICE_CMD_TYPE_DO_PPG_AGC_TIMER_CALLBACK){
-// #ifdef PPG_HX3695
-//             agc_timeout_handler(NULL);
-// #endif
             ppg_timer_handler(AGC_TIMER_MODE);
             continue;
         }else if(mail == PPG_SERVICE_CMD_TYPE_DO_WEAR_MODE_TIMER_CALLBACK){
-// #ifdef PPG_HX3695
-//             wear_mode_timeout_handler(NULL);
-// #endif
-            // ppg_wear_timer_handler();
             ppg_timer_handler(WEAR_TIMER_MODE);
             continue;
         }else if (mail == PPG_SERVICE_CMD_TYPE_DO_PPG_TEST){
-            //do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OPEN_GET_ACC,NULL);
             uapi_save_runtime_log(RUNTIME_LOG_HEART_DRIVER_MEASURE);
             cmd = "hrs";
             enable = 1;
-            // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);
-            // if (cnt == 0) 
-            // {
-            //     uapi_pm_add_sleep_veto(PM_ID_HEART);
-            // }
-
         }else if (mail == PPG_SERVICE_CMD_TYPE_DO_HRV_TEST){
             cmd = "hrv";
             enable = 1;
@@ -289,30 +144,12 @@ static void ppg_service_check_task(void  *arg)
             uapi_save_runtime_log(RUNTIME_LOG_HEART_DRIVER_MEASURE_END);
             cmd = "hrs";
             enable = 0;
-            // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);
-            // if (cnt == 1) 
-            // {
-            //     uapi_pm_remove_sleep_veto(PM_ID_HEART);
-            // }
         }else if (mail == PPG_SERVICE_CMD_TYPE_STOP_SPO2_TEST){
    
             cmd = "spo2";
             enable = 0;
         }
         else if (mail == PPG_SERVICE_CMD_TYPE_INT_HANDLER){
-// #ifdef PPG_VC9202
-//             vc9202_usr_interrupt_handler(SPORT_TYPE_NORMAL,0);
-// #elif defined PPG_VC921X
-//             cmd = "int";
-//             enable = 1;
-//             ppg_send_cmd_to_vc921x_driver(cmd,enable);
-// #elif defined PPG_GH3X2X
-//             hal_gh3x2x_afe_int_handler_call_back();
-//             GH3X2X_AFE_ChipPro();
-// #elif defined PPG_PAH8009
-//             hal_gh3x2x_afe_int_handler_call_back();
-//             GH3X2X_AFE_ChipPro();
-// #endif
             ppg_int_handler();
             continue;
         }
@@ -356,6 +193,7 @@ static void ppg_service_check_task(void  *arg)
     }
     }
 }
+
 void create_ppg_queue(void)
 {
     if (osal_msg_queue_create("ppg_service_queue", PPG_SERVICE_MSG_COUNT, &g_app_queue,
@@ -363,6 +201,7 @@ void create_ppg_queue(void)
         PRINT_ERR("[ppg][service] app create mail fail\n");
     }
 }
+
 errcode_t uapi_ppg_service_init(void)
 {
     PRINT("uapi_ppg_service_init !\r\n");
@@ -378,19 +217,14 @@ errcode_t uapi_ppg_service_init(void)
         }
     }
 
-    // ppg_register_msg_callback(ppg_msg_callback);//注册驱动回调
-    // ppg_send_cmd_to_driver("wear",0);
-
     ppg_sensor_exist = true;
 
     app_task_definition_t taskcfg={0};
     taskcfg.create_queue_handle = create_ppg_queue;
     taskcfg.attr.name="ppg_service";
-// #ifdef BOARD_FD230
+
     taskcfg.attr.priority = osPriorityBelowNormal4;
-// #else
-//     taskcfg.attr.priority = osPriorityAboveNormal5;
-// #endif
+
     taskcfg.attr.stack_size = PPG_SERVICE_TASK_SIZE;
     taskcfg.func = ppg_service_check_task;
     taskcfg.use_mem = USE_EXTEND_MEM;
@@ -402,6 +236,8 @@ errcode_t uapi_ppg_service_init(void)
         return ERRCODE_FAIL;
     }
 
+    send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_WEAR_MODE_TEST);
+
     return ERRCODE_SUCC;
 }
 
@@ -413,6 +249,27 @@ void ppg_int_callback(pin_t pin, uintptr_t param)
     // PRINT("ppg_int_callback %d 0x%X   tm : %d \n",pin,param,tm);
     send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_INT_HANDLER);
 }
+
+void ppg_hr_start(void)
+{
+    send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_PPG_TEST);
+}
+
+void ppg_hr_stop(void)
+{
+    send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST);
+}
+
+void ppg_spo2_start(void)
+{
+    send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_SPO2_TEST);
+}
+
+void ppg_spo2_stop(void)
+{
+    send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_SPO2_TEST);
+}
+
 // void ppg_service_service_resume(void)
 // {
 //     DEBUG_PRINTF("ppg_service_service resume!\r\n");
@@ -422,10 +279,3 @@ void ppg_int_callback(pin_t pin, uintptr_t param)
 // {
 //     DEBUG_PRINTF("ppg_service_service suspend!\r\n");
 // }
-
-
-#ifdef __cplusplus
-#if __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* __cplusplus */
index 9cb5d98..8d8d826 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-08-08 16:33:23
- * @LastEditors: SnickerSun snickersun@163.com
- * @LastEditTime: 2024-12-20 15:02:17
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-07-31 15:11:35
  * @FilePath: /FD230/code/sdk/drivers/peripheral/vibrator/service/vibrator_service.cpp
  * @Description: 
  * 
@@ -28,31 +28,9 @@ extern "C" {
 #endif /* __cplusplus */
 #endif /* __cplusplus */
 
-
-#include "pinctrl.h"
 #include "debug_print.h"
-#include "soc_osal.h"
-#include "tcxo.h"
-#include "irmalloc.h"
-#include "errcode.h"
-#include "common_def.h"
-
-#include "chip_core_irq.h"
-#include "chip_io.h"
-#include "gpio.h"
-#include "pm_veto.h"
-
-#include "rtc.h"
-#include "timer.h"
-#include "systick.h"
-
 
-static bool g_batter_service_initialled = false;
-
-#include "tcxo.h"
-
-#include "cmsis_os2.h"
-#include "input_app.h"
+#include "errcode.h"
 
 #include "vibrator_service.h"
 #include "vibrator_hal.h"
@@ -67,7 +45,8 @@ void custom_VibratorFunc_int(int vibratorType)
     uapi_save_runtime_log(RUNTIME_LOG_MOTOR_START);
     
     //忽略系统调用参数,只按照configmodel里保存的值来震动
-    uint8_t vibmod=uapi_dev_runtime_get_vibmod();
+    uint8_t vibmod = uapi_dev_runtime_get_vibmod();
+    
     vibrator_cmd_t mail = {0};
     if(vibratorType == 4)
         vibmod = 4;
@@ -119,37 +98,17 @@ void custom_VibratorFunc(OHOS::VibratorType vibratorType)
     } 
 }
 
-// UI 界面震动一次接口
-void ui_api_vibrate_once_func(void)
-{
-    custom_VibratorFunc_int(0);
-}
-
-void ui_api_vibrate_once_with_judgement_func(void)
-{
-    if(false == mmi_play_vibrate_is_permitted())
-    {
-        return;
-    }
-
-    custom_VibratorFunc_int(0);
-}
+// // UI 界面震动一次接口
+// void ui_api_vibrate_once_func(void)
+// {
+//     custom_VibratorFunc_int(0);
+// }
 
-
-#define MAG_CHECK_MS 20
 static unsigned long g_app_queue= 0xFFFFFFFF;
 
 static bool vibrator_service_running_stat = false;
 
 
-void uapi_vibrator_service_deinit(void)
-{
-
-}
-
-
-
-
 errcode_t do_vibrator_cmd(vibrator_cmd_t cmd)
 {
     int ret;
@@ -189,12 +148,13 @@ static void vibrator_service_check_task(void  *arg)
                 g_VibratorFunc( mail.duty ,  mail.cycle_time_ms, mail.duration_time_ms);
                 break;
             case 1:
-                touch_screen_resume();
+                // touch_screen_resume();
                 break;
         }
        
     }
 }
+
 void create_vib_queue(void)
 {
     if (osal_msg_queue_create("vibrator_service_queue", APP_BOARD_MSG_COUNT, &g_app_queue,
@@ -202,6 +162,7 @@ void create_vib_queue(void)
         PRINT("[mag][service] app create mail fail\n");
     }
 }
+
 errcode_t uapi_vibrator_service_init(void)
 {
     PRINT("uapi_vibrator_service_init !\r\n");
@@ -223,12 +184,18 @@ errcode_t uapi_vibrator_service_init(void)
     OHOS::VibratorManager::GetInstance()->RegisterVibratorFunc(custom_VibratorFunc);
 
     /* ---------------------------------- 开机震动一次 ---------------------------------- */
-    ui_api_vibrate_once_func();
+
+    custom_VibratorFunc_int(0);
     /* -------------------------------------------------------------------------- */
     
     return ERRCODE_SUCC;
 }
 
+void uapi_vibrator_service_deinit(void)
+{
+
+}
+
 
 #ifdef __cplusplus
 #if __cplusplus
index c9dcbe4..9bf9cca 100644 (file)
@@ -33,8 +33,8 @@ typedef struct {
 extern errcode_t do_vibrator_cmd(vibrator_cmd_t cmd);
 
 // UI 界面震动一次接口
-void ui_api_vibrate_once_func(void);
-void ui_api_vibrate_once_with_judgement_func(void);
+// void ui_api_vibrate_once_func(void);
+// void ui_api_vibrate_once_with_judgement_func(void);
 
 void custom_VibratorFunc_int(int vibratorType);
 
index 9baecca..165b31a 100644 (file)
@@ -233,29 +233,6 @@ float battery_ntc_map[][2]={
 
 
 float battery_percent_map[][2]={
-#ifdef BOARD_U8
-    {3.8, 100},
-    {3.782, 95},
-    {3.764, 90},
-    {3.746, 85},
-    {3.728, 80},
-    {3.71, 75},
-    {3.692, 70},
-    {3.674, 65},
-    {3.656, 60},
-    {3.638, 55},
-    {3.62, 50},
-    {3.602, 45},
-    {3.584, 40},
-    {3.566, 35},
-    {3.548, 30},
-    {3.53, 25},
-    {3.512, 20},
-    {3.494, 15},
-    {3.476, 10},
-    {3.405, 5},
-    {3.3, 0}
-#else
     {4.3,100},
     {4.264,95},
     {4.228,90},
@@ -277,16 +254,12 @@ float battery_percent_map[][2]={
     {3.652,10},
     {3.41,5},
     {3.3,0}
-#endif
 };
 
-#ifdef BOARD_U8
-#define batteryservice_VOLTAGE_MAX (3.8f)
-#define batteryservice_VOLTAGE_MIN (3.3f)
-#else
+
 #define batteryservice_VOLTAGE_MAX (4.3f)
 #define batteryservice_VOLTAGE_MIN (3.3f)
-#endif
+
 static uint32_t g_adc_sample_times = 0;
 static uint32_t g_adc_sample_discard = 0;
 static uint32_t g_adc_sample_stick = 0;
index 46731f3..d94b05e 100644 (file)
@@ -68,6 +68,9 @@ errcode_t uapi_battery_init(void);
 #include "battery_service.h"
 
 #include "custom_utils.h"
+#ifdef SUPPORT_CYWEE_SERVICE
+#include "cywee_service.h"
+#endif
 
 /**
  * 临时性去除充电禁止能力,待海思更新 充电线静态检测能力再回复。
@@ -530,14 +533,17 @@ static void battery_check_task(void *arg)
         }else if (mail.comm.event == BATTERY_CMD_CHARGE_PLUG) {
             // PRINT("[battery][service] charger_plug_event_ui_sendmsg_toUI plugged \n");
             oncharging_status = 1;
-            // do_cywee_service_check_msg(CYWEE_SERVICE_CMD_ONCHARGING_CHANGE,&oncharging_status);
-                
+#ifdef SUPPORT_CYWEE_SERVICE
+            cywee_charge_status_update(&oncharging_status);
+#endif
             battery_check_chargement();
             charger_plug_event_ui_sendmsg_toUI(1);
         }else if (mail.comm.event == BATTERY_CMD_CHARGE_UNPLUG) {
             // PRINT("[battery][service] charger_plug_event_ui_sendmsg_toUI unplugged \n");
             oncharging_status = 0;
-            // do_cywee_service_check_msg(CYWEE_SERVICE_CMD_ONCHARGING_CHANGE,&oncharging_status);
+#ifdef SUPPORT_CYWEE_SERVICE
+            cywee_charge_status_update(&oncharging_status);
+#endif
             #ifndef DISABLE_VBUS_CHECK
             disable_charge();
             #endif
@@ -611,11 +617,11 @@ errcode_t charger_plug_event_notify(uint8_t plugged)
         ChargerEventPublish(TOPIC_EVENT_CHARGE_UNPLUG,0);
     } 
    #else
-    if(plugged == 1){
-        ChargerEventPublish(TOPIC_EVENT_STEPDATA_UPDATE,1);
-    }else{
-        ChargerEventPublish(TOPIC_EVENT_STEPDATA_UPDATE,0);
-    } 
+    // if(plugged == 1){
+    //     ChargerEventPublish(TOPIC_EVENT_STEPDATA_UPDATE,1);
+    // }else{
+    //     ChargerEventPublish(TOPIC_EVENT_STEPDATA_UPDATE,0);
+    // } 
    #endif
    return 0;
 }
@@ -631,6 +637,7 @@ void set_lowpower_show( uint8_t type,uint8_t data)
         low_power_flag_1=data;
     }
 }
+
 errcode_t Play_shutdown_animation_notify(uint8_t alarm_level)
 {
     //PRINT("alarm_level[%d],low_power_flag_1[%d],low_power_flag_2[%d]\n",alarm_level,low_power_flag_1,low_power_flag_2);
@@ -647,9 +654,7 @@ errcode_t Play_shutdown_animation_notify(uint8_t alarm_level)
     {
         ChargerEventPublish(TOPIC_EVENT_LOWPOWER_ALARM,alarm_level);
     }
-   
 
-    
    return 0;
 }
 
index e751812..788b911 100644 (file)
@@ -343,7 +343,7 @@ void set_vibrationremiander_(uint8_t falg)//设置震动模式
     p_ConfigModel->SetVibrationReminder(falg);
     // uapi_vibrationModeSet(falg);
     #ifdef SUPPORT_VIBRATE
-    ui_api_vibrate_once_func();
+    custom_VibratorFunc_int(0);
     SendMsgToUIService(UI_UPDATE_VIBRATION_MODE,0,nullptr,0);
     #endif
     return ;
index 82cffc2..9915642 100644 (file)
@@ -2114,7 +2114,7 @@ void set_vibrationremiander(uint8_t falg)//设置震动模式
     OHOS::ConfigModel *p_ConfigModel  =   OHOS::ConfigModel::GetInstance();
     p_ConfigModel->SetVibrationReminder(falg);
     // uapi_vibrationModeSet(falg);
-    ui_api_vibrate_once_func();
+    custom_VibratorFunc_int(0);
     SendMsgToUIService(UI_UPDATE_VIBRATION_MODE,0,nullptr,0);
     return ;
 }
@@ -3792,7 +3792,7 @@ void set_vibrationremiander(uint8_t falg)//设置震动模式
     OHOS::ConfigModel *p_ConfigModel  =   OHOS::ConfigModel::GetInstance();
     p_ConfigModel->SetVibrationReminder(falg);
     // uapi_vibrationModeSet(falg);
-    ui_api_vibrate_once_func();
+    custom_VibratorFunc_int(0);
 
     return ;
 }
index f1b5a41..2c051f7 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2024-06-17 14:31:08\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-07-28 16:50:17\r
+ * @LastEditTime: 2025-07-29 14:46:36\r
  * @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c\r
  * @Description: \r
  * \r
@@ -175,13 +175,30 @@ static void func_button_callback_long_press_2s(void)
 void ble_vibrator_check_timer_callback(void)\r
 {\r
     // uapi_vibrationModeSet(3);\r
-    ui_api_vibrate_once_func();\r
+    custom_VibratorFunc_int(0);\r
 }\r
 \r
 void ble_acc_check_timer_callback(void)\r
 {\r
     uint8_t databuf[6];\r
-    get_gsensor_single(databuf);\r
+\r
+#ifdef SUPPORT_CYWEE_SERVICE     \r
+    gsenson_t t;\r
+    cywee_get_gsensor_data(1,&t);\r
+    uint16_t x,y,z;    \r
+    x = t.x*2048;\r
+    y = t.y*2048;\r
+    z = t.z*2048;\r
+\r
+    databuf[0] = (uint8_t)((x & 0xFF00) >> 8);\r
+    databuf[1] = (uint8_t)(x & 0x00FF);\r
+\r
+    databuf[2] = (uint8_t)((y & 0xFF00) >> 8);\r
+    databuf[3] = (uint8_t)(y & 0x00FF);\r
+\r
+    databuf[4] = (uint8_t)((z & 0xFF00) >> 8);\r
+    databuf[5] = (uint8_t)(z & 0x00FF);\r
+#endif\r
 \r
     factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
             BLE_TEST_CMD_SOFT_TEST_SUB_MODE_ACC,\r
@@ -1369,7 +1386,23 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
             {\r
                 //单次获得acc\r
                 uint8_t databuf[6];\r
-                get_gsensor_single(databuf);\r
+#ifdef SUPPORT_CYWEE_SERVICE     \r
+                gsenson_t t;\r
+                cywee_get_gsensor_data(1,&t);\r
+                uint16_t x,y,z;    \r
+                x = t.x*2048;\r
+                y = t.y*2048;\r
+                z = t.z*2048;\r
+\r
+                databuf[0] = (uint8_t)((x & 0xFF00) >> 8);\r
+                databuf[1] = (uint8_t)(x & 0x00FF);\r
+\r
+                databuf[2] = (uint8_t)((y & 0xFF00) >> 8);\r
+                databuf[3] = (uint8_t)(y & 0x00FF);\r
+\r
+                databuf[4] = (uint8_t)((z & 0xFF00) >> 8);\r
+                databuf[5] = (uint8_t)(z & 0x00FF);\r
+#endif\r
 \r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_ACC,\r
index 8516172..637cfa9 100644 (file)
@@ -12,6 +12,7 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/src/uart_gnss.c
     ${CMAKE_CURRENT_SOURCE_DIR}/src/gnss_ctl.c
     ${CMAKE_CURRENT_SOURCE_DIR}/src/NMEA0183.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/gnss_tcp_server.c
     ${TIOT_SRC_LIST}
 )
 set(PUBLIC_HEADER
@@ -73,4 +74,5 @@ build_component()
 
 
 
-add_subdirectory(sample/gnss_sample)
+# add_subdirectory(sample/gnss_sample)
+add_subdirectory(sample/pgnss_sample)
\ No newline at end of file
index 4d84908..51810a8 100644 (file)
@@ -29,19 +29,7 @@ extern "C" {
  */\r
 #define TIOT_PIN_NONE        0xFFFFFFFFU\r
 \r
-#ifdef BOARD_U8\r
-#define TIOT_UART_PORT  UART_BUS_0\r
-#define TIOT_PIN_WAKEUP_HOST_NUM    S_AGPIO_L31    /* 用于唤醒HOST. */\r
-#define TIOT_PIN_WAKEUP_GNSS_NUM    TIOT_PIN_NONE    /* 用于 唤醒GNSS. */\r
-#define TIOT_PIN_POWER      S_AGPIO_L30     /* 用于开启GNSS. */\r
-\r
-#define TIOT_PIN_UART_TX    S_MGPIO19\r
-#define TIOT_PIN_UART_RX    S_MGPIO20\r
-#define TIOT_PIN_UART_CTS   S_MGPIO22\r
-#define TIOT_PIN_UART_RTS   S_MGPIO21\r
-#define TIOT_PINMUX HAL_PIO_FUNC_UART1\r
-\r
-#elif defined(BOARD_L22) || defined(BOARD_W9) || defined(BOARD_N9) \r
+#if defined(BOARD_W9) || defined(BOARD_N9)\r
 #define TIOT_UART_PORT  UART_BUS_1\r
 #define TIOT_PIN_WAKEUP_HOST_NUM    S_AGPIO_L15    /* 用于唤醒HOST. */\r
 #define TIOT_PIN_WAKEUP_GNSS_NUM    S_HGPIO0    /* 用于 唤醒GNSS. */\r
index ba7690c..831baec 100644 (file)
@@ -258,6 +258,7 @@ char* get_gps_sentence_type_str(sentence_types sentencetype);
 void dump_location_data(gps_data_t *locationdata);\r
 void dump_location_data_to_buf(gps_data_t *locationdata,char* buf,int max_buflen);\r
 gps_data_t * getGPSGlobaldata(void);\r
+gps_data_t * getPGPSGlobaldata(void);\r
 \r
 void dump_location_data_to_factory(gps_data_t *locationdata,char* buf,int max_buflen);\r
 \r
diff --git a/code/sdk/zhihui/services/gnss/inc/gnss_tcp_server.h b/code/sdk/zhihui/services/gnss/inc/gnss_tcp_server.h
new file mode 100644 (file)
index 0000000..e67dfcd
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-02-14 10:30:32
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-07-17 12:13:52
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/gnss/service/gnss_ble_service.h
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+#ifndef _GNSS_TCP_SERVER_H_
+#define _GNSS_TCP_SERVER_H_
+
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#include "stdint.h"
+#include "errcode.h"
+
+typedef struct {
+    int cmd;
+    char *data;
+    uint32_t len;
+} gnss_tcp_data_mail_t;
+
+
+#define GNSS_TCP_SERVICE_CMD_DATA_UPLOAD 0x1
+#define GNSS_TCP_SERVICE_CMD_SERVER_INIT 0x2
+#define GNSS_TCP_SERVICE_CMD_SERVER_DEINIT 0x3
+
+// void do_gnss_tcp_server_send_data(int cmd,int *data,uint32_t len);
+int gnss_tcp_init(void);
+errcode_t uapi_gnss_tcp_server_init(void);
+int gnss_tcp_sign_up(void);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif
\ No newline at end of file
index e59debb..a4984ce 100644 (file)
 #include "pm_definition.h"\r
 #include "gnss_ctl.h"\r
 \r
+#ifdef SUPPORT_CYWEE_SERVICE\r
+#include "cywee_hal.h"\r
+#include "cywee_service.h"\r
+#endif\r
+\r
 #define COLDSTART_FIXMODEGPS_NMEAALL_SAMPLE        0\r
 #define AUTOSTART_FIXMODEALL_NMEADEF_SAMPLE        1\r
 \r
@@ -97,6 +102,10 @@ static int decode_nmea(char c)
             memcpy_s(&g_global_gpsData,sizeof(gps_data_t),&(g_nmeadata.gpsData),sizeof(gps_data_t));\r
             ret = 1;\r
             memset(&g_nmeadata,0,sizeof(g_nmeadata));\r
+#ifdef SUPPORT_CYWEE_SERVICE\r
+            if(uapi_dev_runtime_get_train_status())\r
+                do_cywee_service_check_msg(CYWEE_SERVICE_CMD_GNSS_UPDATE,NULL);\r
+#endif\r
         }\r
     } \r
 \r
diff --git a/code/sdk/zhihui/services/gnss/sample/pgnss_sample/CMakeLists.txt b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/CMakeLists.txt
new file mode 100644 (file)
index 0000000..2e4b603
--- /dev/null
@@ -0,0 +1,42 @@
+#===============================================================================
+# @brief    cmake make file
+# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.
+#===============================================================================
+set(COMPONENT_NAME "pgnss_sample")
+
+set(SOURCES
+    ${CMAKE_CURRENT_SOURCE_DIR}/pgnss_sample.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/pgnss_encode.c
+)
+
+set(PRIVATE_HEADER
+    ${TIOT_HEADER_LIST}
+)
+
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+set(PRIVATE_DEFINES
+)
+
+set(PUBLIC_DEFINES
+CONFIG_PGNSS_SAMPLE
+)
+
+set(COMPONENT_CCFLAGS
+    -Wno-implicit-function-declaration
+)
+
+set(WHOLE_LINK
+true
+)
+
+set(BUILD_AS_OBJ
+false
+)
+
+set(MAIN_COMPONENT
+false
+)
+build_component()
diff --git a/code/sdk/zhihui/services/gnss/sample/pgnss_sample/gnss_datatypes.h b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/gnss_datatypes.h
new file mode 100644 (file)
index 0000000..4d4a9a3
--- /dev/null
@@ -0,0 +1,65 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+ * Description: gnss datatypes\r
+ * Author:\r
+ * Create:\r
+ */\r
+#ifndef GNSS_DATATYPES_H\r
+#define GNSS_DATATYPES_H\r
+\r
+#include <stdint.h>\r
+\r
+#define MSG_CONTENT_IDX             2\r
+#define LISTEN_TIME_THR             1000\r
+#define REPORT_MAX_BYTES            10000\r
+\r
+// 消息类型\r
+typedef enum {\r
+    CMD_INJECT_HIS_INFO = 0x0101,               // 历史信息注入\r
+    CMD_PGNSS_INJECT_REF_GPS_TIME = 0x0201,     // GPS时间注入\r
+    CMD_PGNSS_INJECT_REF_LOC = 0x0202,          // 参考位置注入\r
+    CMD_PGNSS_INJECT_EPH_GPS = 0x0203,          // GPS星历注入\r
+    CMD_PGNSS_INJECT_EPH_GANSS = 0x0204,        // 非GPS星历注入\r
+    CMD_PGNSS_INJECT_UTC_GPS = 0x0205,          // GPS UTC注入\r
+    CMD_PGNSS_INJECT_RTI_GPS = 0x0206,          // GPS完好性信息注入\r
+    CMD_PGNSS_INJECT_RTI_GANSS = 0x0207,        // 非GPS完好性信息注入\r
+    CMD_PGNSS_INJECT_ION_GPS = 0x0208,          // GPS电离层参数注入\r
+    CMD_PGNSS_INJECT_AUX_GANSS = 0x0209,        // 非GPS频点转换关系信息注入\r
+    CMD_XGNSS_INJECT_UTC_TIME = 0x0404,         // 最开始注入的UTC时间\r
+    CMD_BUTT,\r
+} GnssCmdType;\r
+\r
+#pragma pack(1)\r
+typedef struct {\r
+    uint16_t  cmd;          // 消息类型\r
+    uint16_t  checkSum;     // 校验和,只计算实际数据部分,不包含头\r
+    uint16_t  sequence;     // 序列号,host下发\r
+    uint16_t  dataLength;   // 数据长度,实际数据的长度,不包含头\r
+    uint8_t   data[0];\r
+} GnssMsg;\r
+\r
+typedef struct {\r
+    uint16_t year;          // YYYY\r
+    uint8_t  month;         // MM, 1~12\r
+    uint8_t  day;           // DD, 1~31\r
+    uint8_t  hour;          // hh, 0~23\r
+    uint8_t  minute;        // mm, 0~59\r
+    uint8_t  second;        // ss, 0~59\r
+    uint16_t ms;            // ms, 0~999\r
+    uint8_t  valid;         // 0: invalid, 1: valid\r
+} GnssUtcTime;\r
+\r
+typedef struct {\r
+    uint32_t time;          // eph reference time\r
+    uint16_t cmd;           // cmd type to injected eph\r
+    uint32_t len;           // actual length of injected eph\r
+} EphHeadInfo;\r
+\r
+typedef struct {\r
+    uint16_t cmd;           // cmd type to injected other assist info\r
+    uint32_t len;           // actual length of injected other assist info\r
+} OtherAssistHeadInfo;\r
+\r
+#pragma pack()\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_encode.c b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_encode.c
new file mode 100644 (file)
index 0000000..5d677d4
--- /dev/null
@@ -0,0 +1,603 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+ * Description: pgnss encode\r
+ * Author:\r
+ * Create:\r
+ */\r
+#include "pgnss_encode.h"\r
+#include <stdio.h>\r
+#include <dirent.h>\r
+#include <string.h>\r
+#include "securec.h"\r
+#include "tiot_service_interface.h"\r
+#include "gnss_datatypes.h"\r
+\r
+\r
+#define GNSS_ENCODE_BUFF_MAX_LEN 9300\r
+#define FILE_PATH_LEN            1024\r
+#define GLO_EPH_VALID_TIME       900\r
+#define OTHER_EPH_VALID_TIME     7200\r
+#define ONE_CENTURY_YEARS        100\r
+#define FOUR_CENTURY_YEARS       400\r
+#define LEAP_YEAR_LENGTH         4\r
+#define UNIX_TIME_START_YEAR     1970    // start year of unix time\r
+#define TIME_UNIT                1000\r
+#define SECONDS_PER_MIN          (60)\r
+#define SECONDS_PER_HOUR         (60 * SECONDS_PER_MIN)\r
+#define SECONDS_PER_DAY          (24 * SECONDS_PER_HOUR)\r
+#define SECONDS_PER_NORMAL_YEAR  (365 * SECONDS_PER_DAY)\r
+#define NON_GLO_GNSS_TYPES       4\r
+#define GLO_EPH_NUM_ONE_FILE     8\r
+#define OTHER_ASSIST_TYPES       7\r
+#define INJECT_SLEEP_MS_TIME     500\r
+#define PGNSS_FILE_MAX_SIZE      1024000\r
+\r
+/** days per month on normal and leap year */\r
+int32_t g_normMonthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\r
+int32_t g_leapMonthDays[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\r
+// 监听消息\r
+static uint8_t g_ackBuff[REPORT_MAX_BYTES] = { 0 };\r
+\r
+/* 获取begin和end年份之间的闰年数 */\r
+int32_t GetLeapYearNum(uint16_t begin, uint16_t end)\r
+{\r
+    if (end <= begin || end < 1) {\r
+        return 0;\r
+    }\r
+    int32_t numPer400Year = (end - 1) / FOUR_CENTURY_YEARS - begin / FOUR_CENTURY_YEARS;\r
+    int32_t numPer100Year = (end - 1) / ONE_CENTURY_YEARS - begin / ONE_CENTURY_YEARS;\r
+    int32_t numPer4Year = (end - 1) / LEAP_YEAR_LENGTH - begin / LEAP_YEAR_LENGTH;\r
+    return (numPer400Year + numPer4Year - numPer100Year);\r
+}\r
+\r
+/* 闰年判断 */\r
+int32_t CheckIfLeapYear(uint16_t year)\r
+{\r
+    if ((year % ONE_CENTURY_YEARS) == 0) {\r
+        if ((year % FOUR_CENTURY_YEARS) == 0) {\r
+            return 1;\r
+        }\r
+    } else {\r
+        if ((year % LEAP_YEAR_LENGTH) == 0) {\r
+            return 1;\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* 将日历时(年月日时分秒) 转换为 unix时间(1970年1月1日起的时间秒数) */\r
+int32_t Utc2UnixTime(GnssUtcTime utcTime, uint32_t *unixTime)\r
+{\r
+    if (unixTime == NULL) {\r
+        printf("\nerror: [Utc2UnixTime] null pointer!\n");\r
+        return 0;\r
+    }\r
+\r
+    if (utcTime.month > 12 || utcTime.valid == 0) {\r
+        printf("\nerror: [Utc2UnixTime] utcTime invalid!\n");\r
+        return 0;\r
+    }\r
+\r
+    // 判断是否为闰年\r
+    int32_t *monthDays = (CheckIfLeapYear(utcTime.year) == 1) ? g_leapMonthDays : g_normMonthDays;\r
+\r
+    // 计算从1970.01.01开始的unix 秒数\r
+    uint32_t timestamp = 0;\r
+    timestamp += (uint32_t)(utcTime.year - UNIX_TIME_START_YEAR) * SECONDS_PER_NORMAL_YEAR;\r
+    timestamp += (uint32_t)GetLeapYearNum(UNIX_TIME_START_YEAR, utcTime.year) * SECONDS_PER_DAY;\r
+\r
+    for (int32_t i = 1; i < utcTime.month; i++) {\r
+        timestamp += (uint32_t)monthDays[i - 1] * SECONDS_PER_DAY;\r
+    }\r
+\r
+    timestamp += (uint32_t)(utcTime.day - 1) * SECONDS_PER_DAY;\r
+    timestamp += (uint32_t)utcTime.hour * SECONDS_PER_HOUR;\r
+    timestamp += (uint32_t)utcTime.minute * SECONDS_PER_MIN;\r
+    uint32_t timestampSec = (uint32_t)(utcTime.second + utcTime.ms / TIME_UNIT);\r
+\r
+    *unixTime = timestamp + timestampSec;\r
+    return 1;\r
+}\r
+\r
+/* 计算命令内容校准和 */\r
+static uint16_t CalcChecksum(uint8_t *buff, uint16_t len)\r
+{\r
+    uint16_t checksum = 0;\r
+    uint16_t i = 0;\r
+    while (i++ < len) {\r
+        checksum += *buff;\r
+        buff++;\r
+    }\r
+    return checksum;\r
+}\r
+\r
+int32_t PgnssInjectUtcTime(tiot_handle handle, GnssUtcTime *utcTime, uint32_t* ts)\r
+{\r
+    uint8_t *buff = (uint8_t *)malloc(GNSS_ENCODE_BUFF_MAX_LEN);\r
+    if (buff == NULL) {\r
+        printf("\nerror: malloc failed in PgnssINjectUtcTime\r\n");\r
+        return 0;\r
+    }\r
+    memset_s(buff, GNSS_ENCODE_BUFF_MAX_LEN, 0, GNSS_ENCODE_BUFF_MAX_LEN);\r
+\r
+    GnssMsg *hdr = (GnssMsg *)buff;\r
+    hdr->cmd = 0x0404;\r
+    hdr->sequence = 0;\r
+    errno_t copyRet = memcpy_s(hdr->data, (GNSS_ENCODE_BUFF_MAX_LEN - sizeof(GnssMsg)), utcTime, sizeof(GnssUtcTime));\r
+    if (copyRet != EOK) {\r
+        printf("\nmemcpy UtcTime failed! Errno is %d\r\n", copyRet);\r
+        free(buff);\r
+        return 0;\r
+    }\r
+    hdr->dataLength = sizeof(GnssUtcTime);\r
+    hdr->checkSum = CalcChecksum(hdr->data, hdr->dataLength);\r
+    int32_t ret = tiot_service_write(handle, buff, (sizeof(GnssMsg) + hdr->dataLength));\r
+    if (ret < 0) {\r
+        printf("\nerror: PgnssInjectUtcTime error: %d\r\n", ret);\r
+        free(buff);\r
+        return 0;\r
+    }\r
+    if (Utc2UnixTime((*utcTime), ts) == 0) {\r
+        printf("\nerror: Utc2UnixTime error\r\n");\r
+        free(buff);\r
+        return 0;\r
+    }\r
+\r
+    free(buff);\r
+    return 1;\r
+}\r
+\r
+static uint16_t FillGnssMessageData(uint8_t *inBuff, uint32_t inLen, uint8_t *outBuff, uint32_t outLen)\r
+{\r
+    errno_t ret = memcpy_s(outBuff, outLen, inBuff, inLen);\r
+    if (ret != EOK) {\r
+        printf("memcpy XgnssData failed! Errno is %d \r\n", ret);\r
+        return 0;\r
+    }\r
+\r
+    return inLen;\r
+}\r
+\r
+static int32_t EncodeGnssMsg(uint8_t *inBuff, uint32_t inLen, uint8_t *outBuff, uint32_t outLen)\r
+{\r
+    uint16_t len = FillGnssMessageData(inBuff, inLen, outBuff, outLen);\r
+    if (len > 0) {\r
+        return 1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+static void ListenAck(tiot_handle handle)\r
+{\r
+    int32_t i = 0;\r
+    for (;;) {\r
+        // 监听\r
+        int32_t ret = tiot_service_read(handle, g_ackBuff, REPORT_MAX_BYTES, LISTEN_TIME_THR);\r
+        if (ret > 0) {\r
+            uint16_t *type = (uint16_t *)g_ackBuff;\r
+            // 二进制消息类型\r
+            if (type[0] == 0) {\r
+                g_ackBuff[ret] = '\0';\r
+                printf("%s\r\n", (char *)&g_ackBuff[MSG_CONTENT_IDX]);\r
+            }\r
+            i++;\r
+        }\r
+        if (i >= 1) {\r
+            printf("\r\ncnt enough\r\n");\r
+            break;\r
+        }\r
+    }\r
+}\r
+\r
+static int32_t EncodeAndInjectCmd(tiot_handle handle, GnssCmdType cmdType, uint8_t* inBuff, uint32_t inLen)\r
+{\r
+    // 获取GNSS业务消息头\r
+    int32_t len = 0;\r
+    uint8_t *buff = (uint8_t *)malloc(GNSS_ENCODE_BUFF_MAX_LEN);\r
+    if (buff == NULL) {\r
+        printf("\r\nerror: malloc failed in EncodeAndInjectCmd\r\n");\r
+        return 0;\r
+    }\r
+    memset_s(buff, GNSS_ENCODE_BUFF_MAX_LEN, 0, GNSS_ENCODE_BUFF_MAX_LEN);\r
+\r
+    GnssMsg *gnssHdr = (GnssMsg *)buff;\r
+    len += sizeof(GnssMsg);\r
+\r
+    gnssHdr->sequence = 0;\r
+\r
+    int32_t retLen = EncodeGnssMsg(inBuff, inLen, buff + len, (GNSS_ENCODE_BUFF_MAX_LEN - len));\r
+    if (retLen != 1) {\r
+        printf("\nerror: Encode Cmd failed: %d\r\n", cmdType);\r
+        free(buff);\r
+        return retLen;\r
+    }\r
+    gnssHdr->cmd = cmdType;\r
+    gnssHdr->dataLength = inLen;\r
+    gnssHdr->checkSum = CalcChecksum(gnssHdr->data, gnssHdr->dataLength);\r
+    int32_t ret = tiot_service_write(handle, buff, (sizeof(GnssMsg) + gnssHdr->dataLength));\r
+    if (ret < 0) {\r
+        printf("\r\nerror: Inject Cmd failed: %d\r\n", cmdType);\r
+        free(buff);\r
+        return 0;\r
+    }\r
+    ListenAck(handle);\r
+    printf("\r\nInject Cmd SUCCESS: %x\r\n", cmdType);\r
+    free(buff);\r
+    return 1;\r
+}\r
+\r
+void PgnssSendFileContent(tiot_handle handle, const char *fileName, GnssCmdType cmdType)\r
+{\r
+    FILE *fp = fopen(fileName, "rb");\r
+    if (fp == NULL) {\r
+        printf("\r\nerror: open file failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    fseek(fp, 0, SEEK_END);\r
+    int32_t len = ftell(fp);\r
+    fseek(fp, 0, SEEK_SET);\r
+    if (len < 0 || len > PGNSS_FILE_MAX_SIZE) {\r
+        fclose(fp);\r
+        printf("\r\nerror: get file len failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    uint8_t *buff = (uint8_t *)malloc(len);\r
+    if (buff == NULL) {\r
+        fclose(fp);\r
+        printf("\r\nerror: malloc file len failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    int32_t dataSize = fread(buff, len, 1, fp);\r
+    if (dataSize < 0) {\r
+        fclose(fp);\r
+        printf("\r\nerror: read file failed: %s\r\n", fileName);\r
+        free(buff);\r
+        return;\r
+    }\r
+    fclose(fp);\r
+    EncodeAndInjectCmd(handle, cmdType, buff, len);\r
+    free(buff);\r
+}\r
+\r
+int32_t FormatFileName(char *fileName, char *dName)\r
+{\r
+    int32_t ret = snprintf_s(fileName, FILE_PATH_LEN, (FILE_PATH_LEN - 1), "%s%s", "/user/userdata/gnss/", dName);\r
+    if (ret <= 0) {\r
+        return 0;\r
+    }\r
+    return 1;\r
+}\r
+\r
+int32_t GetEphFileName(int32_t ts, const char *prefix, char *fileName)\r
+{\r
+    int32_t interval = (strcmp(prefix, "GLO") == 0) ? GLO_EPH_VALID_TIME : OTHER_EPH_VALID_TIME;\r
+    DIR *dir = opendir("/user/userdata/gnss/");\r
+    if (dir == NULL) {\r
+        printf("Failed to open /user/xgnss directory.\r\n");\r
+        return 0;\r
+    }\r
+    int32_t time, ret;\r
+    struct dirent *entry;\r
+    for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) {\r
+        // 检查文件名\r
+        if (strstr(entry->d_name, ".eph") != NULL) {\r
+            char *p = strrchr(entry->d_name, '_');\r
+            if (p != NULL) {\r
+                char *q = strstr(entry->d_name, prefix);\r
+                if (q != NULL) {\r
+                    time = atoi(p + 1);\r
+                    if (abs(time - ts) <= interval) {\r
+                        ret = FormatFileName(fileName, entry->d_name);\r
+                        closedir(dir);\r
+                        return ret;\r
+                    }\r
+                    else\r
+                    {\r
+                        printf("time:%d,ts:%d,interval:%d\r\n",time,ts,interval);\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+    closedir(dir);\r
+    printf("closedir(dir);\r\n");\r
+    return 0;\r
+}\r
+\r
+void PgnssSendEphFile(tiot_handle handle, const char *prefix, GnssCmdType cmdType, uint32_t ts)\r
+{\r
+    char fileName[FILE_PATH_LEN] = {0};\r
+    int32_t ret = GetEphFileName(ts, prefix, fileName);\r
+    if (ret == 0) {\r
+        printf("\r\nerror: GetEphFileName failed\r\n");\r
+        return;\r
+    }\r
+    printf("\nGetEphFileName success\r\n");\r
+    PgnssSendFileContent(handle, fileName, cmdType);\r
+}\r
+\r
+void PgnssInjectAllEph(tiot_handle handle, uint32_t ts)\r
+{\r
+    PgnssSendEphFile(handle, "GPS", CMD_PGNSS_INJECT_EPH_GPS, ts);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send GPS eph success\r\n");\r
+    PgnssSendEphFile(handle, "GLO", CMD_PGNSS_INJECT_EPH_GANSS, ts);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send GLO eph success\r\n");\r
+    PgnssSendEphFile(handle, "BDS", CMD_PGNSS_INJECT_EPH_GANSS, ts);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send BDS eph success\r\n");\r
+    PgnssSendEphFile(handle, "GAL", CMD_PGNSS_INJECT_EPH_GANSS, ts);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send GAL eph success\r\n");\r
+    PgnssSendEphFile(handle, "QZS", CMD_PGNSS_INJECT_EPH_GANSS, ts);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send QZS eph success\r\n");\r
+}\r
+\r
+void PgnssInjectOtherAssist(tiot_handle handle)\r
+{\r
+    PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_UTC.dat", CMD_PGNSS_INJECT_UTC_GPS);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send GPS_UTC success\r\n");\r
+    PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_RTI.dat", CMD_PGNSS_INJECT_RTI_GPS);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send GPS_RTI success\r\n");\r
+    PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_ION.dat", CMD_PGNSS_INJECT_ION_GPS);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send GPS_ION success\r\n");\r
+    PgnssSendFileContent(handle, "/user/userdata/gnss/GLO_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send GLO_RTI success\r\n");\r
+    PgnssSendFileContent(handle, "/user/userdata/gnss/GLO_AUX.dat", CMD_PGNSS_INJECT_AUX_GANSS);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send GLO_AUX success\r\n");\r
+    PgnssSendFileContent(handle, "/user/userdata/gnss/BDS_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send BDS_RTI success\r\n");\r
+    PgnssSendFileContent(handle, "/user/userdata/gnss/GAL_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS);\r
+    osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    printf("send GAL_RTI success\r\n");\r
+}\r
+\r
+void PgnssInject(tiot_handle handle, uint32_t ts)\r
+{\r
+    // 注入Pgnss辅助数据\r
+    PgnssInjectAllEph(handle, ts);\r
+    PgnssInjectOtherAssist(handle);\r
+}\r
+\r
+\r
+// 以下为使用PGNSS解析数据合并输出接口生成的星历文件进行注入的代码\r
+int32_t GetNonGloEphFileName(int32_t ts, char *fileName)\r
+{\r
+    const char prefix[] = "NonGlo";\r
+    DIR *dir = opendir("/user/userdata/gnss/");\r
+    if (dir == NULL) {\r
+        printf("Failed to open /user/xgnss directory.\r\n");\r
+        return 0;\r
+    }\r
+    int32_t time, ret;\r
+    int32_t minDist = OTHER_EPH_VALID_TIME;\r
+    int32_t closestTime = 0;\r
+    struct dirent *entry;\r
+    for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) {\r
+        // 检查文件名\r
+        if (strstr(entry->d_name, ".eph") != NULL) {\r
+            char *p = strrchr(entry->d_name, '_');\r
+            if (p != NULL) {\r
+                char *q = strstr(entry->d_name, prefix);\r
+                if (q != NULL) {\r
+                    time = atoi(p + 1);\r
+                    // 查找星历文件时间戳与当前时间相差2小时以内且距离最近的\r
+                    if (abs(time - ts) < minDist) {\r
+                        minDist = abs(time - ts);\r
+                        closestTime = time;\r
+                    }\r
+                    else\r
+                    {\r
+                        printf("time:%d,ts:%d,minDist:%d\r\n",time,ts,minDist);\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+    if (closestTime != 0) {\r
+        ret = snprintf_s(fileName, FILE_PATH_LEN, (FILE_PATH_LEN - 1), "%s%d%s", "/user/userdata/gnss/NonGlo_", closestTime,\r
+            ".eph");\r
+        printf("closest eph fileName:%s\r\n", fileName);\r
+        closedir(dir);\r
+        return ((ret <= 0) ? 0 : 1);\r
+    }\r
+    else\r
+    {\r
+        printf("closestTime == 0\r\n");\r
+    }\r
+    closedir(dir);\r
+    return 0;\r
+}\r
+\r
+int32_t GetGloEphFileName(int32_t ts, char *fileName)\r
+{\r
+    const char prefix[] = "GLO";\r
+    DIR *dir = opendir("/user/userdata/gnss/");\r
+    if (dir == NULL) {\r
+        printf("Failed to open /user/xgnss directory.\r\n");\r
+        return 0;\r
+    }\r
+    int32_t ephTime, ret;\r
+    struct dirent *entry;\r
+    for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) {\r
+        // 检查文件名\r
+        if (strstr(entry->d_name, ".eph") != NULL) {\r
+            char *p = strrchr(entry->d_name, '_');\r
+            if (p != NULL) {\r
+                char *q = strstr(entry->d_name, prefix);\r
+                if (q != NULL) {\r
+                    ephTime = atoi(p + 1);\r
+                    printf("ephTime:%ld, ts:%ld\n", ephTime, ts);\r
+                    // 当前时间大于GLO星历文件时间戳,则需要选取相差2小时以内的星历\r
+                    // 当前时间小于GLO星历文件时间戳,则需要选取相差小于15分钟的星历\r
+                    if (((ts - ephTime) >= 0 && abs(ephTime - ts) < OTHER_EPH_VALID_TIME) ||\r
+                        ((ts - ephTime) <= 0 && abs(ephTime - ts) < GLO_EPH_VALID_TIME)) {\r
+                        ret = FormatFileName(fileName, entry->d_name);\r
+                        printf("glo eph fileName:%s\n", fileName);\r
+                        closedir(dir);\r
+                        return ret;\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+    closedir(dir);\r
+    return 0;\r
+}\r
+\r
+void PgnssSendNonGloEph(tiot_handle handle, const char *fileName)\r
+{\r
+    FILE *fp = fopen(fileName, "rb");\r
+    if (fp == NULL) {\r
+        printf("\nerror: open file failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    fseek(fp, 0, SEEK_END);\r
+    int32_t len = ftell(fp);\r
+    fseek(fp, 0, SEEK_SET);\r
+    if (len < 0 || len > PGNSS_FILE_MAX_SIZE) {\r
+        fclose(fp);\r
+        printf("\nerror: get file len failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    uint8_t *buff = (uint8_t *)malloc(len);\r
+    if (buff == NULL) {\r
+        fclose(fp);\r
+        printf("\nerror: malloc file len failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    int32_t dataSize = fread(buff, len, 1, fp);\r
+    if (dataSize < 0) {\r
+        fclose(fp);\r
+        printf("\nerror: read file failed: %s\r\n", fileName);\r
+        free(buff);\r
+        return;\r
+    }\r
+    fclose(fp);\r
+    int32_t fileLen = 0;\r
+    for (int32_t i = 0; i < NON_GLO_GNSS_TYPES && fileLen <= len; i++) {\r
+        EphHeadInfo *ephHdr = (EphHeadInfo *)(buff + fileLen);\r
+        EncodeAndInjectCmd(handle, ephHdr->cmd, (buff + fileLen + sizeof(EphHeadInfo)), ephHdr->len);\r
+        fileLen += (ephHdr->len + sizeof(EphHeadInfo));\r
+        osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    }\r
+    free(buff);\r
+}\r
+\r
+void PgnssSendGloEph(tiot_handle handle, const char *fileName, int32_t ts)\r
+{\r
+    FILE *fp = fopen(fileName, "rb");\r
+    if (fp == NULL) {\r
+        printf("\nerror: open file failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    fseek(fp, 0, SEEK_END);\r
+    int32_t len = ftell(fp);\r
+    fseek(fp, 0, SEEK_SET);\r
+    if (len < 0 || len > PGNSS_FILE_MAX_SIZE) {\r
+        fclose(fp);\r
+        printf("\nerror: get file len failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    uint8_t *buff = (uint8_t *)malloc(len);\r
+    if (buff == NULL) {\r
+        fclose(fp);\r
+        printf("\nerror: malloc file len failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    int32_t dataSize = fread(buff, len, 1, fp);\r
+    if (dataSize < 0) {\r
+        fclose(fp);\r
+        printf("\nerror: read file failed: %s\r\n", fileName);\r
+        free(buff);\r
+        return;\r
+    }\r
+    fclose(fp);\r
+    int32_t fileLen = 0;\r
+    for (int32_t i = 0; i < GLO_EPH_NUM_ONE_FILE && fileLen <= len; i++) {\r
+        EphHeadInfo *ephHdr = (EphHeadInfo *)(buff + fileLen);\r
+        printf("glo eph, time:%u, ts:%d\r\n", ephHdr->time, ts);\r
+        if (abs((int32_t)ephHdr->time - ts) < GLO_EPH_VALID_TIME) {\r
+            EncodeAndInjectCmd(handle, ephHdr->cmd, (buff + fileLen + sizeof(EphHeadInfo)), ephHdr->len);\r
+            osal_msleep(INJECT_SLEEP_MS_TIME);\r
+            break;\r
+        }\r
+        fileLen += (ephHdr->len + sizeof(EphHeadInfo));\r
+    }\r
+    free(buff);\r
+}\r
+\r
+void PgnssInjectAllEphLessFiles(tiot_handle handle, uint32_t ts)\r
+{\r
+    char fileName[FILE_PATH_LEN] = {0};\r
+    if (GetNonGloEphFileName(ts, fileName) == 0) {\r
+        printf("\nerror: GetNonGloEphFileName failed\r\n");\r
+        return;\r
+    }\r
+    PgnssSendNonGloEph(handle, fileName);\r
+    if (GetGloEphFileName(ts, fileName) == 0) {\r
+        printf("\nerror: GetGloEphFileName failed\r\n");\r
+        return;\r
+    }\r
+    PgnssSendGloEph(handle, fileName, ts);\r
+}\r
+\r
+void PgnssSendOtherAssistInfo(tiot_handle handle, const char *fileName)\r
+{\r
+    FILE *fp = fopen(fileName, "rb");\r
+    if (fp == NULL) {\r
+        printf("\nerror: open file failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    fseek(fp, 0, SEEK_END);\r
+    int32_t len = ftell(fp);\r
+    fseek(fp, 0, SEEK_SET);\r
+    if (len < 0 || len > PGNSS_FILE_MAX_SIZE) {\r
+        fclose(fp);\r
+        printf("\nerror: get file len failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    uint8_t *buff = (uint8_t *)malloc(len);\r
+    if (buff == NULL) {\r
+        fclose(fp);\r
+        printf("\nerror: malloc file len failed: %s\r\n", fileName);\r
+        return;\r
+    }\r
+    int32_t dataSize = fread(buff, len, 1, fp);\r
+    if (dataSize < 0) {\r
+        fclose(fp);\r
+        printf("\nerror: read file failed: %s\r\n", fileName);\r
+        free(buff);\r
+        return;\r
+    }\r
+    fclose(fp);\r
+    int32_t fileLen = 0;\r
+    for (int32_t i = 0; i < OTHER_ASSIST_TYPES && fileLen <= len; i++) {\r
+        OtherAssistHeadInfo *otherHdr = (OtherAssistHeadInfo *)(buff + fileLen);\r
+        EncodeAndInjectCmd(handle, otherHdr->cmd, (buff + fileLen + sizeof(OtherAssistHeadInfo)), otherHdr->len);\r
+        fileLen += (otherHdr->len + sizeof(OtherAssistHeadInfo));\r
+        osal_msleep(INJECT_SLEEP_MS_TIME);\r
+    }\r
+    free(buff);\r
+}\r
+\r
+void PgnssInjectOtherAssistLessFiles(tiot_handle handle)\r
+{\r
+    PgnssSendOtherAssistInfo(handle, "/user/userdata/gnss/AssistInfo.dat");\r
+}\r
+\r
+// 注入PGNSS解析数据合并输出接口生成的星历文件\r
+void PgnssInjectLessFiles(tiot_handle handle, uint32_t ts)\r
+{\r
+    // 注入Pgnss辅助数据\r
+    PgnssInjectAllEphLessFiles(handle, ts);\r
+    PgnssInjectOtherAssistLessFiles(handle);\r
+}
\ No newline at end of file
diff --git a/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_encode.h b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_encode.h
new file mode 100644 (file)
index 0000000..a666edc
--- /dev/null
@@ -0,0 +1,16 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+ * Description: pgnss encode\r
+ * Author:\r
+ * Create:\r
+ */\r
+#ifndef PGNSS_ENCODE_H\r
+#define PGNSS_ENCODE_H\r
+\r
+#include "gnss_datatypes.h"\r
+#include "tiot_service_interface.h"\r
+\r
+int32_t PgnssInjectUtcTime(tiot_handle handle, GnssUtcTime *utcTime, uint32_t* ts);\r
+void PgnssInject(tiot_handle handle, uint32_t ts);\r
+void PgnssInjectLessFiles(tiot_handle handle, uint32_t ts);\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c
new file mode 100644 (file)
index 0000000..aaba6b5
--- /dev/null
@@ -0,0 +1,368 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+ * Description: pgnss sample\r
+ * Author:\r
+ * Create:\r
+ */\r
+#include "pgnss_sample.h"\r
+#include <stdio.h>\r
+#include "securec.h"\r
+#include "tiot_service_interface.h"\r
+#include "pm_definition.h"\r
+#include "gnss_datatypes.h"\r
+#include "pgnss_encode.h"\r
+#include "NMEA0183.h"\r
+#include "sys/time.h"\r
+#include "time.h"\r
+#include "gnss_ctl.h"\r
+\r
+\r
+#define PGNSS_FIXMODEALL_NMEADEF_SAMPLE            0\r
+#define PGNSS_LESS_FILES_FIXMODEALL_NMEADEF_SAMPLE 0\r
+\r
+#ifndef ARRAY_SIZE\r
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))\r
+#endif\r
+#define MSG_TYPE_BINRY              0\r
+#define MSG_TYPE_ASCII              1\r
+#define LISTEN_DATA_MAX_LINES       1000\r
+\r
+static FILE* g_gnssLogFp = NULL;\r
+static uint8_t g_gnssServiceBuff[REPORT_MAX_BYTES] = { 0 };\r
+\r
+typedef int32_t (*GnssCfgFunc)(tiot_handle handle);\r
+\r
+typedef struct {\r
+    uint16_t    sampleId;\r
+    GnssCfgFunc cfgHandle;\r
+} GnssSamplesCfgTable;\r
+\r
+static NMEA0183 g_nmeadata={0};\r
+static gps_data_t g_global_gpsData={0};\r
+\r
+/**GPS状态位*/\r
+static int g_is_pgnss_poweron=0;\r
+static int g_is_pgnss_logon=0;\r
+static int g_pgnss_stopflag=0;\r
+\r
+static int32_t QryVersion(tiot_handle handle)\r
+{\r
+    const uint8_t qryVersion[] = {0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00};\r
+    // 查询版本号\r
+    int32_t ret = tiot_service_write(handle, qryVersion, sizeof(qryVersion));\r
+    if (ret < 0) {\r
+        printf("\nerror: QryVersion error: %d\r\n", ret);\r
+        return 0;\r
+    }\r
+    return 1;\r
+}\r
+\r
+static int decode_nmea(char c)\r
+{\r
+    int ret=0;\r
+    ret=0;\r
+    if(nmea_decode(&g_nmeadata,c) ==1 ) ///调用解析函数\r
+    {\r
+        dump_nmea_str(&(g_nmeadata.gpsParse));\r
+        if (g_nmeadata.gpsParse.sentence_type == GPS_SENTENCE_TH002 )\r
+        {\r
+            //一组数据最后一条\r
+            memcpy_s(&g_global_gpsData,sizeof(gps_data_t),&(g_nmeadata.gpsData),sizeof(gps_data_t));\r
+            ret = 1;\r
+            memset(&g_nmeadata,0,sizeof(g_nmeadata));\r
+        }\r
+    } \r
+\r
+    return ret;\r
+}\r
+\r
+gps_data_t * getPGPSGlobaldata(void)\r
+{\r
+    return &g_global_gpsData;\r
+}\r
+\r
+\r
+// 注入PGNSS,使用默认配置启动\r
+int32_t InjectPgnssCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle)\r
+{\r
+    const uint8_t cfgLogLevelInfo[] = {0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x10, 0x01, 0x00, 0x03};\r
+\r
+    // 配置log级别:info级别。\r
+    int32_t ret = tiot_service_write(handle, cfgLogLevelInfo, sizeof(cfgLogLevelInfo));\r
+    if (ret < 0) {\r
+        printf("\nerror: cfgLogLevelInfo error: %d\r\n", ret);\r
+        return 0;\r
+    }\r
+\r
+    // 注入UTC时间, 注入Pgnss辅助数据前必须先注入参考时间\r
+    GnssUtcTime utcTime = {2024, 2, 26, 6, 0, 0, 0, 1}; // 需要用当前的UTC时间替换\r
+\r
+    time_t rawtime;\r
+    struct tm* timeinfo;\r
+\r
+    time(&rawtime);          // 获取UTC时间戳\r
+    timeinfo = gmtime(&rawtime);  // 转换为UTC时间(无时区偏移)\r
+\r
+    utcTime.year = timeinfo->tm_year + 1900;\r
+    utcTime.month = timeinfo->tm_mon + 1;\r
+    utcTime.day = timeinfo->tm_mday;\r
+    utcTime.hour = timeinfo->tm_hour;\r
+    utcTime.minute = timeinfo->tm_min;\r
+    utcTime.second = timeinfo->tm_sec;\r
+\r
+    printf("year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n",\r
+    utcTime.year,utcTime.month,utcTime.day,\r
+    utcTime.hour,utcTime.minute,utcTime.second);\r
+\r
+    uint32_t ts = 0;\r
+    ret = PgnssInjectUtcTime(handle, &utcTime, &ts);\r
+    if (ret == 0) {\r
+        printf("\nerror: PgnssInjectUtcTime failed!\r\n");\r
+        return 0;\r
+    }\r
+    printf("\nPgnssInjectUtcTime success!\r\n");\r
+\r
+    // PGNSS注入\r
+    // 注意,默认PGNSS星历文件存放在/user/xgnss/目录中,如修改目录,请全局搜索替换\r
+    PgnssInject(handle, ts);\r
+\r
+    return 1;\r
+}\r
+\r
+// 注入PGNSS,使用默认配置启动\r
+int32_t InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle)\r
+{\r
+    const uint8_t cfgLogLevelInfo[] = {0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x10, 0x01, 0x00, 0x03};\r
+\r
+    // 配置log级别:info级别。\r
+    int32_t ret = tiot_service_write(handle, cfgLogLevelInfo, sizeof(cfgLogLevelInfo));\r
+    if (ret < 0) {\r
+        printf("\nerror: cfgLogLevelInfo error: %d\r\n", ret);\r
+        return 0;\r
+    }\r
+\r
+    // 注入UTC时间, 注入Pgnss辅助数据前必须先注入参考时间\r
+    GnssUtcTime utcTime = {2024, 3, 14, 12, 0, 0, 0, 1}; // 需要用当前的UTC时间替换\r
+\r
+    time_t rawtime;\r
+    struct tm* timeinfo;\r
+\r
+    time(&rawtime);          // 获取UTC时间戳\r
+    timeinfo = gmtime(&rawtime);  // 转换为UTC时间(无时区偏移)\r
+\r
+    utcTime.year = timeinfo->tm_year + 1900;\r
+    utcTime.month = timeinfo->tm_mon + 1;\r
+    utcTime.day = timeinfo->tm_mday;\r
+    utcTime.hour = timeinfo->tm_hour;\r
+    utcTime.minute = timeinfo->tm_min;\r
+    utcTime.second = timeinfo->tm_sec;\r
+\r
+    printf("year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n",\r
+    utcTime.year,utcTime.month,utcTime.day,\r
+    utcTime.hour,utcTime.minute,utcTime.second);\r
+\r
+\r
+    uint32_t ts = 0;\r
+    ret = PgnssInjectUtcTime(handle, &utcTime, &ts);\r
+    if (ret == 0) {\r
+        printf("\nerror: PgnssInjectUtcTime failed!\r\n");\r
+        return 0;\r
+    }\r
+    printf("\nPgnssInjectUtcTime success!\r\n");\r
+\r
+    // PGNSS注入\r
+    // 注意,默认PGNSS星历文件存放在/user/xgnss/目录中,如修改目录,请全局搜索替换\r
+    PgnssInjectLessFiles(handle, ts);\r
+\r
+    return 1;\r
+}\r
+\r
+static const GnssSamplesCfgTable g_gnssSamplesCfg[] = {\r
+    // {PGNSS_FIXMODEALL_NMEADEF_SAMPLE,            InjectPgnssCfgAutoStartFixModeAndNmeaDefault},\r
+    {PGNSS_LESS_FILES_FIXMODEALL_NMEADEF_SAMPLE, InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault}\r
+};\r
+\r
+static int32_t StartGnss(tiot_handle handle)\r
+{\r
+    const uint8_t startCmd[] = {0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,\r
+        0x01, 0x00, 0x00, 0x00, 0x00, 0x00};\r
+    // 启动GNSS\r
+    int32_t ret = tiot_service_write(handle, startCmd, sizeof(startCmd));\r
+    if (ret < 0) {\r
+        printf("\nerror: start gnss error: %d\r\n", ret);\r
+        return 0;\r
+    }\r
+    printf("\nstart gnss\r\n");\r
+    return 1;\r
+}\r
+\r
+static int32_t StopGnss(tiot_handle handle)\r
+{\r
+    const uint8_t stopCmd[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r
+    // 停止GNSS\r
+    int32_t ret = tiot_service_write(handle, stopCmd, sizeof(stopCmd));\r
+    if (ret < 0) {\r
+        printf("\nerror: stop gnss error: %d\r\n", ret);\r
+        return 0;\r
+    }\r
+    printf("\nstop gnss\r\n");\r
+    return 1;\r
+}\r
+\r
+\r
+static void ListenGnssData(tiot_handle handle)\r
+{\r
+    int32_t i = 0;\r
+    // 写日志\r
+    for (;;) {  // 写日志条件\r
+\r
+        if (i >= LISTEN_DATA_MAX_LINES) {\r
+            printf("\r\ncnt enough\r\n");\r
+            break;\r
+        }\r
+        if (g_pgnss_stopflag == 1)\r
+        {\r
+            break;\r
+        }\r
+        // 监听\r
+        int32_t ret = tiot_service_read(handle, g_gnssServiceBuff, REPORT_MAX_BYTES, LISTEN_TIME_THR);\r
+        if (ret > 0) {\r
+            uint16_t *type = (uint16_t *)g_gnssServiceBuff;\r
+            if (type[0] == MSG_TYPE_ASCII) {\r
+                g_gnssServiceBuff[ret] = '\0';\r
+                char* pbuf=(char *)&g_gnssServiceBuff[MSG_CONTENT_IDX];\r
+                printf("%s\r\n", pbuf);\r
+                if (g_is_pgnss_logon)\r
+                    fprintf(g_gnssLogFp, "%s\n", pbuf);\r
+                for (int index=0;index < ret ;index++)\r
+                {\r
+                    if (decode_nmea(pbuf[index])==1)\r
+                    {\r
+                        // dump_location_data(&g_global_gpsData);\r
+                        printf("decode_nmea done\r\n");\r
+                    }\r
+                }\r
+            }\r
+            i++;\r
+        }\r
+\r
+    }\r
+}\r
+\r
+void PGnssServerStop(void)\r
+{\r
+    g_pgnss_stopflag=1;\r
+}\r
+\r
+int getPGnssServerStat(void)\r
+{\r
+    return g_is_pgnss_poweron;\r
+}\r
+\r
+int is_PGnssLogEnabled(void)\r
+{\r
+    return g_is_pgnss_logon;\r
+}\r
+\r
+int PGnssLogEnable(bool enable)\r
+{\r
+    if (enable)\r
+        g_is_pgnss_logon = 1;\r
+    else\r
+        g_is_pgnss_logon = 0;\r
+\r
+    return g_is_pgnss_logon;\r
+}\r
+\r
+\r
+void PGnssServerStart(void)\r
+{\r
+    printf("\nenter gnss samples\r\n");\r
+    if(g_is_pgnss_poweron == 1)\r
+    {\r
+        printf("gnss already on\r\n");\r
+        return ;\r
+    }\r
+    uapi_pm_add_sleep_veto(PM_ID_SYS);\r
+\r
+    #ifdef DOWNLOAD_GNSS_SWITCH\r
+    download_gnss_switch(SWITCH_TO_GNSS);\r
+    #endif\r
+    g_is_pgnss_poweron = 1;\r
+    g_pgnss_stopflag = 0;\r
+\r
+    // Step1: init\r
+    int32_t ret = tiot_service_init();\r
+    if (ret != 0) {\r
+        printf("tiot service init fail\r\n");\r
+        g_is_pgnss_poweron = 0;\r
+        g_pgnss_stopflag = 1;\r
+    }\r
+\r
+    // 打开日志文件\r
+    if (g_is_pgnss_logon)\r
+    {\r
+        g_gnssLogFp = fopen("/user/log/gnss.log", "w");\r
+        if (g_gnssLogFp == NULL) {\r
+            printf("error: open log file error\n");\r
+            return;\r
+        }\r
+    }\r
+    printf("before open tiot service\n");\r
+\r
+    // Step2: power on gnss\r
+    tiot_handle handle = tiot_service_open("gn71", NULL);\r
+    if (handle == 0) {\r
+        printf("open tiot service fail\r\n");\r
+        g_is_pgnss_poweron = 0;\r
+        g_pgnss_stopflag = 1;\r
+        return;\r
+    }\r
+    printf("open tiot service success\r\n");\r
+\r
+    int32_t cfgRet;\r
+    // ---- loop ----------\r
+    for (uint16_t i = 0; i < ARRAY_SIZE(g_gnssSamplesCfg); i++) {\r
+        cfgRet = 0;\r
+        if (g_gnssSamplesCfg[i].sampleId == i) {\r
+            // Step3: config gnss\r
+            if (g_gnssSamplesCfg[i].cfgHandle != NULL) {\r
+                cfgRet = g_gnssSamplesCfg[i].cfgHandle(handle);\r
+            }\r
+            if (cfgRet == 0) {\r
+                continue;\r
+            }\r
+            printf("cfg sample id:%u\r\n", g_gnssSamplesCfg[i].sampleId);\r
+            QryVersion(handle);\r
+\r
+            // Step4: start gnss\r
+            if (StartGnss(handle) == 0) {\r
+                continue;\r
+            }\r
+            // Step5: listening gnss data\r
+            ListenGnssData(handle);\r
+            // Step6: stop gnss\r
+            if (StopGnss(handle) == 0) {\r
+                continue;\r
+            }\r
+        }\r
+    }\r
+    // ---------------------\r
+    // Step7: power off gnss\r
+    tiot_service_close(handle);\r
+    // 关日志文件\r
+    if (g_is_pgnss_logon)\r
+    {\r
+        fclose(g_gnssLogFp);\r
+        g_gnssLogFp = NULL;\r
+    }\r
+    // Step8: deinit\r
+    tiot_service_deinit();\r
+\r
+    #ifdef DOWNLOAD_GNSS_SWITCH\r
+    download_gnss_switch(SWITCH_TO_DOWNLOAD);\r
+    #endif\r
+    uapi_pm_remove_sleep_veto(PM_ID_SYS);\r
+    g_is_pgnss_poweron=0;\r
+    printf("finish gnss samples\r\n");\r
+}\r
diff --git a/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.h b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.h
new file mode 100644 (file)
index 0000000..37d7d51
--- /dev/null
@@ -0,0 +1,26 @@
+/*\r
+ * @Author: penglei 1624952103@qq.com\r
+ * @Date: 2025-07-11 16:41:59\r
+ * @LastEditors: penglei 1624952103@qq.com\r
+ * @LastEditTime: 2025-07-18 17:39:28\r
+ * @FilePath: /FD230/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.h\r
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
+ */\r
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+ * Description: pgnss sample\r
+ * Author:\r
+ * Create:\r
+ */\r
+#ifndef PGNSS_SAMPLE_H\r
+#define PGNSS_SAMPLE_H\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif /* __cplusplus */\r
+void PGnssServerStart(void);\r
+void PGnssServerStop(void);\r
+int getPGnssServerStat(void);\r
+#ifdef __cplusplus\r
+}\r
+#endif /* __cplusplus */\r
+#endif
\ No newline at end of file
index b0fe28f..57eca61 100644 (file)
 #include "gnss_ctl.h"
 #include "gpio.h"
 #include "uart_gnss.h"
-#include "gnss_sample.h"
+// #include "gnss_sample.h"
+#include "pgnss_sample.h"
+// #include "cywee_hal.h"
 
 errcode_t gnss_power_on(void)
 {
 
-     errcode_t ret=0;
-#if defined(BOARD_U8)
-/*
-S_AGPIO_L23  GPS_BAT_ON
-S_AGPIO_L30  GPS_PWRON
-S_AGPIO_L28    GPS_1V8
-*/
-    ret=uapi_gpio_set_dir(S_AGPIO_L23,GPIO_DIRECTION_OUTPUT);
-    if (ret != ERRCODE_SUCC)  PRINT("set_dir S_AGPIO_L23,GPIO_DIRECTION_OUTPUT ret %d\n",ret);
-    ret=uapi_gpio_set_dir(S_AGPIO_L30,GPIO_DIRECTION_OUTPUT);
-    if (ret != ERRCODE_SUCC)  PRINT("set_dir S_AGPIO_L30,GPIO_DIRECTION_OUTPUT ret %d\n",ret);
-    ret=uapi_gpio_set_dir(S_AGPIO_L28,GPIO_DIRECTION_OUTPUT);
-    if (ret != ERRCODE_SUCC)  PRINT("set_dir S_AGPIO_L28,GPIO_DIRECTION_OUTPUT ret %d\n",ret);
-
-    ret=uapi_gpio_set_val(S_AGPIO_L28 , GPIO_LEVEL_HIGH);   // gps V3.3 sw en
-    PRINT("GPS_1V8 set_value S_AGPIO_L28  GPIO_LEVEL_HIGH ret %d\n",ret);
-
-    ret=uapi_gpio_set_val(S_AGPIO_L23, GPIO_LEVEL_HIGH);   // crystal sw
-    PRINT("GPS_BAT_ON  set_value S_AGPIO_L23 GPIO_LEVEL_HIGH  ret %d\n",ret);
-  
-    ret=uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_LOW);   //gps reset
-    PRINT("GPS_PWREN set_value S_AGPIO_L30 GPIO_LEVEL_LOW ret %d\n",ret);
-    osDelay(1000);
-    ret=uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_HIGH);   //gps reset
-    PRINT("GPS_PWREN set_value S_AGPIO_L30 GPIO_LEVEL_HIGH ret %d\n",ret);
-
-
-#elif defined (BOARD_L22) || defined (BOARD_W9) || defined(BOARD_N9) 
+    errcode_t ret=0;
+#if defined (BOARD_W9) || defined(BOARD_N9)
 
     ret=uapi_gpio_set_dir(S_AGPIO_L16,GPIO_DIRECTION_OUTPUT);
     PRINT("set_dir S_AGPIO_L16,GPIO_DIRECTION_OUTPUT ret %d\n",ret);
@@ -103,31 +79,9 @@ S_AGPIO_L28    GPS_1V8
 errcode_t gnss_power_off(void)
 {
     
-     errcode_t ret=0;
-#if defined(BOARD_U8)
-/*
-S_AGPIO_L23  GPS_BAT_ON
-S_AGPIO_L30  GPS_PWRON
-S_AGPIO_L28    GPS_1V8
-*/
-    ret=uapi_gpio_set_dir(S_AGPIO_L23,GPIO_DIRECTION_OUTPUT);
-    if (ret != ERRCODE_SUCC)  PRINT("set_dir S_AGPIO_L23,GPIO_DIRECTION_OUTPUT ret %d\n",ret);
-    ret=uapi_gpio_set_dir(S_AGPIO_L30,GPIO_DIRECTION_OUTPUT);
-    if (ret != ERRCODE_SUCC)  PRINT("set_dir S_AGPIO_L30,GPIO_DIRECTION_OUTPUT ret %d\n",ret);
-    ret=uapi_gpio_set_dir(S_AGPIO_L28,GPIO_DIRECTION_OUTPUT);
-    if (ret != ERRCODE_SUCC)  PRINT("set_dir S_AGPIO_L28,GPIO_DIRECTION_OUTPUT ret %d\n",ret);
-
-    ret=uapi_gpio_set_val(S_AGPIO_L23, GPIO_LEVEL_HIGH);   // crystal sw
-    PRINT("GPS_BAT_ON  set_value S_AGPIO_L23 GPIO_LEVEL_HIGH  ret %d\n",ret);
-
-    ret=uapi_gpio_set_val(S_AGPIO_L28 , GPIO_LEVEL_HIGH);   // gps V3.3 sw en
-    PRINT("GPS_1V8 set_value S_AGPIO_L28  GPIO_LEVEL_HIGH ret %d\n",ret);
-
-    ret=uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_LOW);   //gps reset
-    PRINT("GPS_PWRON set_value S_AGPIO_L30 GPIO_LEVEL_LOW ret %d\n",ret);
+    errcode_t ret=0;
 
-  
-#elif defined (BOARD_L22) || defined (BOARD_W9) || defined(BOARD_N9) 
+#if defined (BOARD_W9) || defined(BOARD_N9)
 
     ret=uapi_gpio_set_dir(S_AGPIO_L16,GPIO_DIRECTION_OUTPUT);
     PRINT("set_dir S_AGPIO_L16,GPIO_DIRECTION_OUTPUT ret %d\n",ret);
@@ -176,7 +130,8 @@ errcode_t gnss_stop(void)
     // uint8_t cmd = GNSS_CMD_STOP;
     // do_gnss_cmd(GNSS_CMD_WRITEDATA, &cmd,1);
     // g_gnss_status = 0;
-    GnssServerStop();
+    // GnssServerStop();
+    PGnssServerStop();
     return 0;
 
 }
diff --git a/code/sdk/zhihui/services/gnss/src/gnss_tcp_server.c b/code/sdk/zhihui/services/gnss/src/gnss_tcp_server.c
new file mode 100644 (file)
index 0000000..21c9f01
--- /dev/null
@@ -0,0 +1,1216 @@
+#include "pinctrl.h"
+#include "debug_print.h"
+#include "rtc.h"
+#include "timer.h"
+#include "systick.h"
+
+#include "tcxo.h"
+
+#include "cmsis_os2.h"
+#include "input_app.h"
+#include "gnss_service.h"
+#include "custom_utils.h"
+#include "gnss_tcp_server.h"
+#include "custom_runtime.h"
+#include <dirent.h>
+#include "lwip/ip.h"
+#include "lwip/netif.h"
+#include "lwip/init.h"
+#include "lwip/inet_chksum.h"
+
+#include "lwip/err.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+#include <lwip/netdb.h>
+// #include <netinet/in.h>
+#include "lwip/inet.h"
+#include "lwip/ip_addr.h"
+#include "pm_definition.h"
+#include "mbedtls/md5.h"
+#include "mbedtls/base64.h"
+#include "cJSON.h"
+#include "mbedtls/hmac_drbg.h"
+
+#define BID "hu4kZYyYMGO"
+#define KEY "tcUpJpeGpsIBXvjG"
+
+#define HOST "iot.socket.thisiot.com"
+#define PORT 9999
+
+#define URL "https://geo-drcn.platform.dbankcloud.cn/higeo/v1/xgnss/agnss"
+#define APP_ID "coolwearable"
+#define APP_SECRET "a0e0852c9fd25fad56b6e281b542020d7d01c975907c0b9585ed7f9462447a59"
+
+#define PGNSS_DATA_PATH          "/user/userdata/gnss"
+
+static unsigned long g_app_queue= 0xFFFFFFFF;
+
+static int g_tcp_sock = -1;
+
+static uint8_t LK_STATUS = 0;
+
+static char *imei = NULL;
+
+static char *rx_buffer = NULL;
+
+static uint8_t GNSS_TCP_SERVER_STAT = 0;
+
+static app_task_definition_t send_taskcfg={0};
+static app_task_definition_t recv_taskcfg={0};
+
+struct gnss_ipaddr_t
+{
+    osSemaphoreId_t dns_done_sem;
+    ip_addr_t  ip;
+};
+
+
+// Base64 编码函数
+static char *base64_encode(const unsigned char *input, size_t length) 
+{
+    // 计算 Base64 编码后的最大长度
+    size_t encoded_len = 4 * ((length + 2) / 3) + 1;
+    char *encoded = (char *)malloc(encoded_len);
+    if (encoded == NULL) {
+        return NULL;
+    }
+
+    size_t output_len;
+    int ret = mbedtls_base64_encode((unsigned char *)encoded, encoded_len, &output_len, input, length);
+    if (ret != 0) {
+        free(encoded);
+        return NULL;
+    }
+
+    return encoded;
+}
+
+static char *compute_hmac_sha256_base64(const char *str_to_sign) 
+{
+    if (str_to_sign == NULL) {
+        fprintf(stderr, "Error: str_to_sign is NULL\n");
+        return NULL;
+    }
+
+    // 输出缓冲区
+    unsigned char hmac_result[32];
+    size_t hmac_len = sizeof(hmac_result);
+    
+    // Base64 编码结果缓冲区
+    size_t b64_len = 4 * ((hmac_len + 2) / 3) + 1;
+    char *base64_result = (char *)malloc(b64_len);
+    if (base64_result == NULL) {
+        fprintf(stderr, "Memory allocation failed\n");
+        return NULL;
+    }
+
+    // 获取 SHA-256 算法信息
+    const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
+    if (md_info == NULL) {
+        fprintf(stderr, "Failed to get SHA-256 algorithm\n");
+        goto cleanup;
+    }
+
+    // 使用标准 HMAC 计算 API
+    int ret = mbedtls_md_hmac(
+        md_info,                  // 算法信息
+        (const unsigned char *)APP_SECRET,  // 密钥
+        strlen(APP_SECRET),       // 密钥长度
+        (const unsigned char *)str_to_sign, // 待签名数据
+        strlen(str_to_sign),      // 数据长度
+        hmac_result               // 输出结果
+    );
+    
+    if (ret != 0) {
+        fprintf(stderr, "HMAC calculation failed: %d\n", ret);
+        goto cleanup;
+    }
+    
+    // 调试输出
+    printf("HMAC-SHA256 result (hex): ");
+    for (int i = 0; i < hmac_len; i++) {
+        printf("%02x", hmac_result[i]);
+    }
+    printf("\n");
+    
+    // Base64 编码
+    size_t olen;
+    ret = mbedtls_base64_encode(
+        (unsigned char *)base64_result, 
+        b64_len, 
+        &olen, 
+        hmac_result, 
+        hmac_len
+    );
+    
+    if (ret != 0) {
+        fprintf(stderr, "Base64 encoding failed: %d\n", ret);
+        free(base64_result);
+        base64_result = NULL;
+        goto cleanup;
+    }
+    
+    printf("Base64 result: %s\n", base64_result);
+
+cleanup:
+    return base64_result;
+}
+
+static void dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg) 
+{
+    struct gnss_ipaddr_t *ip_sem = (struct gnss_ipaddr_t *)arg;
+    char ip_str[20] = {0};
+    
+    // if (ipaddr == NULL) {
+    //     printf("DNS解析失败,IP地址为空\n");
+    //     (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+    //     return;
+    // }
+    
+    printf("hostname: %s, ", hostname);
+    
+    // 处理IPv4地址(现在ip4是包含addr成员的结构体)
+    if (IP_IS_V4(ipaddr)) {
+        u32_t ip_num = ipaddr->u_addr.ip4.addr;  // 直接获取32位地址
+        
+        // 分解为4字节打印
+        u8_t byte0 = (ip_num >> 24) & 0xFF;
+        u8_t byte1 = (ip_num >> 16) & 0xFF;
+        u8_t byte2 = (ip_num >> 8) & 0xFF;
+        u8_t byte3 = ip_num & 0xFF;
+        // printf("IPv4: %d.%d.%d.%d\n", byte0, byte1, byte2, byte3);
+        
+        // 转换为struct in_addr(已为网络字节序)
+        struct in_addr ipv4_addr;
+        ipv4_addr.s_addr = ip_num;
+        inet_ntop(AF_INET, &ipv4_addr, ip_str, sizeof(ip_str));
+        printf("ip: %s\n", ip_str);
+    }
+
+    // 复制IP地址到上下文
+    if(ipaddr->u_addr.ip4.addr != 0)
+        memcpy(&(ip_sem->ip), ipaddr, sizeof(ip_addr_t));
+    (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+}
+
+int gnss_tcp_socket_init(void) 
+{
+    uint8_t cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (cnt == 0) {
+        uapi_pm_add_sleep_veto(PM_ID_CAT1);
+    }
+    
+    struct sockaddr_in server_addr;
+    struct gnss_ipaddr_t ip_sem = {0};  // 定义信号量结构
+    int listen_socket = -1;
+    
+    // 创建信号量
+    ip_sem.dns_done_sem = osSemaphoreNew(1, 0, NULL);
+
+    // 解析域名
+    dns_gethostbyname(HOST, &(ip_sem.ip), dns_found, &ip_sem);
+
+    osSemaphoreAcquire(ip_sem.dns_done_sem, 1000);  // 等待 DNS 解析完成
+
+    memcpy(&server_addr.sin_addr.s_addr, &ip_sem.ip.u_addr.ip4, 4);
+    
+    // 创建套接字
+
+    if(listen_socket < 0)
+    {
+        listen_socket = lwip_socket(AF_INET, SOCK_STREAM, 0);
+        if(listen_socket < 0)
+        {
+            int err = errno;
+            printf("socket create errno: %d, reason: %s\n", err, strerror(err));
+            goto FAILED;
+        }
+    }
+
+    int opt = 1;
+    
+    lwip_setsockopt(listen_socket, SOL_SOCKET, SO_KEEPALIVE, (const void*)&opt, sizeof(opt));
+    lwip_setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR,(const void*)&opt, sizeof(opt));
+    
+    // 设置服务器地址
+    server_addr.sin_family = AF_INET;
+    server_addr.sin_port = htons(PORT);
+    
+    // 连接服务器
+    if (lwip_connect(listen_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) 
+    {
+        printf("server_addr.sin_addr.s_addr:%d\n",server_addr.sin_addr.s_addr);
+        int err = errno;
+        printf("connect failed, errno: %d, reason: %s\n", err, strerror(err));
+        
+        goto FAILED;
+    }
+
+    printf("socket init succed\n");
+    osSemaphoreDelete(ip_sem.dns_done_sem);  // 释放信号量
+
+    cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (cnt == 1) {
+        uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+    }
+
+    return listen_socket;
+    
+FAILED:
+    if (listen_socket >= 0) 
+    {
+        lwip_close(listen_socket);
+    }
+    if (ip_sem.dns_done_sem != NULL) 
+    {
+        osSemaphoreDelete(ip_sem.dns_done_sem);
+    }
+    cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (cnt == 1) 
+    {
+        uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+    }
+    return -1;
+}
+
+static int tcp_send(int listen_socket, const char *data, size_t size)
+{
+    if (data == NULL || size == 0)
+        return -1;
+
+    uint8_t retry = 0;
+    while(listen_socket < 0 && retry < 5)
+    {
+        retry++;
+        LOS_Msleep(2000);
+    }
+
+    if(listen_socket < 0)
+    {
+        printf("listen_socket < 0 \n");
+        return -1;
+    }
+
+    int ret = 0;
+
+    // const char *buffer = (const char *)data;
+    const char *buffer = (const char *)malloc(size);
+    if(buffer == NULL)
+        return -1;
+        
+    memcpy_s(buffer,size,(const char *)data,size);
+    // printf("size : %d\n",size);
+    // printf("strlen(buffer) : %d\n",strlen(buffer));
+    // printf("buffer : %s\n",buffer);
+
+    size_t total_sent = 0;
+
+    while (total_sent < size)
+    {
+        ssize_t sent = lwip_send(listen_socket, buffer + total_sent, size - total_sent, 0);
+        if (sent < 0) {
+            printf("errno : %d\n",errno);
+            // 处理错误情况
+            if (errno == EINTR) {
+                PRINT("被信号中断,继续尝试\n");
+                ret = -1;
+                continue;
+            } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
+                PRINT("非阻塞模式下暂时无法发送,可选择等待或返回\n"); 
+                ret = -1;
+                goto FAILED;
+            } else if (errno == ENETUNREACH) {
+                PRINT("网络不可达,检查路由或远程主机状态\n");
+                ret = -1;
+                goto FAILED;
+            }
+            else {
+                PRINT("其他错误(如连接断开)\n"); 
+                ret = -1;
+                goto FAILED;
+            }
+        }
+        
+        total_sent += sent;
+    }
+    printf("tcp send succed size : %d\n",total_sent);
+    ret = 0;
+FAILED:
+
+    if(buffer != NULL)
+    {
+        free(buffer);
+        buffer = NULL;
+    }
+    return ret;
+}
+
+static int active_md5_sign(const char *data,int data_len,char*md5_str)
+{
+    char md5_buf[16]={0};
+
+    char *code_str = (const char*)malloc(data_len);
+    if(md5_str == NULL)
+        return -1;
+
+    memcpy_s(code_str,data_len,data,data_len);
+    mbedtls_md5_context ctx;
+
+    // 初始化MD5上下文
+    mbedtls_md5_init(&ctx);
+
+    // 开始计算MD5哈希
+    mbedtls_md5_starts(&ctx);
+    // 更新要计算哈希的数据
+    mbedtls_md5_update(&ctx, (const unsigned char *)code_str, data_len);
+
+    // 完成哈希计算
+    mbedtls_md5_finish(&ctx, (unsigned char *)md5_buf);
+
+    // printf("md5_buf\r\n");
+    // for (int i = 0; i < 16; i++) {
+    //     printf("%02X\n", (uint8_t)md5_buf[i]);
+    // }
+    // printf("md5_buf end\r\n");
+
+    // 清理MD5上下文
+    mbedtls_md5_free(&ctx);
+    for (int i = 0; i < 16; i++) 
+        sprintf(&md5_str[i * 2], "%02x", (uint8_t)md5_buf[i]);
+
+    md5_str[32] = '\0';
+
+    free(code_str);
+
+    return 0;
+}
+
+static void calculate_md5(const char* input, char* md5_str) 
+{
+    mbedtls_md5_context md5;
+    unsigned char md5_digest[16] = {0};
+    int i;
+
+    // printf("input:%s\n",input);
+    
+    mbedtls_md5_init(&md5);
+    mbedtls_md5_starts(&md5);
+    mbedtls_md5_update(&md5, (const unsigned char*)input, strlen(input));
+    mbedtls_md5_finish(&md5, md5_digest);
+    mbedtls_md5_free(&md5);
+    
+    // 转换为十六进制字符串
+    for (i = 0; i < 16; i++) {
+        sprintf(md5_str + i*2, "%02x", md5_digest[i]);
+    }
+    md5_str[32] = '\0';  // 确保字符串终止
+}
+
+int gnss_tcp_sign_up(void)
+{
+    int ret = 0;
+    char len_str[5] = {0};
+    sprintf(len_str, "%04x", 2);
+
+    if(imei == NULL)
+    {
+        imei = uapi_dev_runtime_get_cat1_imei();
+
+        if(imei == NULL || strlen(imei) == 0)
+        {
+            LOS_Msleep(2000);
+            imei = uapi_dev_runtime_get_cat1_imei();
+        }
+        
+        if (imei == NULL || strlen(imei) == 0) 
+        {
+            printf("IMEI get failed\n");
+            ret = -1;
+            goto FAILED;
+        }
+    }
+    // printf("imei:%s\n", imei);
+
+    // head_str长度:BID + * + IMEI + * + len_str + * + LK + \0
+    int head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("LK") + 1;
+    char *head_str = (char *)malloc(head_len);
+    if(head_str == NULL) 
+    {
+        printf("tcp_sign_up head_str malloc failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    snprintf(head_str, head_len, "%s*%s*%s*LK", BID,imei,len_str);
+    head_len = strlen(head_str);
+
+    char md5_str[33] = {0};  // MD5为32字符+1终止符
+
+    // code_str长度:head_str + KEY + \0
+    int code_len = head_len + strlen(KEY) + 1;
+    char *code_str = (char *)malloc(code_len);
+    if(code_str == NULL) 
+    {
+        printf("code_str malloc failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    code_len = strlen(code_str);
+
+    calculate_md5(code_str,md5_str);
+
+    // if(active_md5_sign(code_str, code_len, md5_str) != 0) 
+    // {
+    //     printf("active_md5_sign failed\n");
+    //     ret = -1;
+    //     goto FAILED;
+    // }
+
+    // 计算send_str长度:[ + md5_str + head_str + ] + \0
+    int send_len = 1 + strlen(md5_str) + strlen(head_str) + 1 + 1;
+    char *send_str = (char *)malloc(send_len);
+    if(send_str == NULL) 
+    {
+        printf("send_str malloc failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    snprintf(send_str, send_len, "[%s%s]", md5_str, head_str);
+    send_len = strlen(send_str);
+
+    // printf("md5_str:%s\n", md5_str);
+    // printf("md5_len:%zu\n", strlen(md5_str));
+    // printf("head_len:%d\n", head_len);
+    // printf("head_str:%s\n", head_str);
+    printf("send_len : %d\n", send_len);
+    printf("send_str : %s\n", send_str);
+
+    // 发送数据
+    while(LK_STATUS != 1)
+    {
+        ret = tcp_send(g_tcp_sock, send_str, send_len);
+        if(ret != 0)
+        {
+            printf("tcp_send failed\n");
+            goto FAILED;
+        }
+        
+        LOS_Msleep(2000);
+    }
+
+
+FAILED:
+    // 释放资源
+    if(head_str != NULL)
+    {
+        free(head_str);
+        head_str = NULL;
+    }
+    if(code_str != NULL)
+    {
+        free(code_str);
+        code_str = NULL;
+    }
+    if(send_str != NULL)
+    {
+        free(send_str);
+        send_str = NULL;
+    }
+
+    return ret;
+}
+
+
+static int calculate_base64_length(int cnt) 
+{
+    if (cnt <= 0)
+        return -1;
+    
+    // 1. 计算int数组转换为字符串的最大可能长度
+    // int的最大字符串长度:11个字符(如"-2147483648")
+    // 每个int后加一个逗号(最后一个int除外)
+    int str_length = cnt * 11 + (cnt - 1);
+    
+    // 2. 计算Base64编码长度
+    // Base64编码规则:每3字节明文→4字节编码,不足3字节用'='填充
+    int base64_length = (str_length * 4 + 2) / 3;
+    
+    // 3. 确保编码长度足够容纳终止符
+    base64_length += 1;  // 预留终止符空间
+    
+    return base64_length;
+}
+
+int gnss_tcp_login(void)
+{
+    int ret = -1;
+    char *data_str = NULL;
+    int data_len = 0;
+    char *encode_str = NULL;
+    int encode_len = 0;
+
+    int head_len = 0;
+    char *code_str = NULL;
+    int code_len = 0;
+    char *send_str = NULL;
+    int send_len = 0;
+    uint32_t output_len = 0;
+    int temp_len = 0;
+    
+    char len_str[5] = {0};
+    char md5_str[33] = {0};
+
+    uint32_t time = 0;
+    uapi_get_timestampe_ss(&time);
+    printf("time:%d \n",time);
+
+    char *sign_str = (char *)malloc(256);
+    if(sign_str == NULL)
+    {
+        printf("sign_str malloc failed\n");
+        goto FAILED;
+    }
+
+    snprintf(sign_str,256, "GET&/higeo/v1/xgnss/agnss&&&appid=%s&timestamp=%lld", APP_ID,(long long)time * 1000);
+    // snprintf(sign_str,256, "GET&/higeo/v1/xgnss/agnss&&appid=%s&timestamp=%lld", APP_ID,(long long)time * 1000);
+    // snprintf(sign_str,256, "GET&/higeo/v1/xgnss/agnss&&appid=%s&timestamp=%d", APP_ID,time*1000);
+    // snprintf(sign_str,256, "GET&/higeo/v1/xgnss/agnss&&&appid=coolwearable&timestamp=1752717734000");
+    
+    printf("sign_str : %s\n",sign_str);
+    char *ret_str = compute_hmac_sha256_base64(sign_str);
+    if(ret_str == NULL)
+    {
+        printf("compute_hmac_sha256_base64 failed\n");
+        goto FAILED;
+    }
+
+    printf("ret_str : %s\n",ret_str);
+
+
+    char *header_json = (char *)malloc(512);
+    if(header_json == NULL)
+        goto FAILED;
+
+    temp_len = 0;
+       // temp_len += snprintf(header_json + temp_len,512 - temp_len, "{\"headers\":[");
+       // temp_len += snprintf(header_json + temp_len,512 - temp_len, "{\"key\":\"Authorization\",");
+       // temp_len += snprintf(header_json + temp_len,512 - temp_len, "\"value\":\"HMAC-SHA256\"},");
+
+    // temp_len += snprintf(header_json + temp_len,512 - temp_len, "{\"key\":\"appid\",");
+    // temp_len += snprintf(header_json + temp_len,512 - temp_len, "\"value\":\"%s\"},", APP_ID);
+
+       // temp_len += snprintf(header_json + temp_len,512 - temp_len, "{\"key\":\"timestamp\",");
+       // temp_len += snprintf(header_json + temp_len,512 - temp_len, "\"value\":\"%lld\"},", (long long)time * 1000);   
+
+       // temp_len += snprintf(header_json + temp_len,512 - temp_len, "{\"key\":\"signature\",");
+       // temp_len += snprintf(header_json + temp_len,512 - temp_len, "\"value\":\"%s\"},", ret_str);  
+
+    // temp_len += snprintf(header_json + temp_len,512 - temp_len, "{\"key\":\"X-Request-ID\",");
+       // temp_len += snprintf(header_json + temp_len,512 - temp_len, "\"value\":\"%s\"}", imei);
+       // temp_len += snprintf(header_json + temp_len,512 - temp_len, "]}");
+
+
+    temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"headers\":[");
+    temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"key\":\"X-Request-ID\",");
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "\"value\":\"%s\"},", imei);
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"key\":\"Authorization\",");
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "\"value\":\"HMAC-SHA256 appid=%s,timestamp=%lld,signature=%s\"}", APP_ID,(long long)time * 1000,ret_str);
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "]}");
+
+    if(temp_len > 512)
+    {
+        printf("temp_len > 512 \n");
+        goto FAILED;
+    }
+    printf("URL : %s\n",URL);
+    printf("header_json : %s\n",header_json);
+
+       int encode_header_len = temp_len * 3 / 2;
+       char *encode_header_str = (char *)malloc(encode_header_len);
+       if(NULL == encode_header_str)
+       {
+               printf("encode_header_str malloc failed\n");
+               goto FAILED;
+       }
+
+       memset(encode_header_str,0, encode_header_len);
+    size_t output_header_len = 0;
+       if(0 != mbedtls_base64_encode((unsigned char*)encode_header_str, encode_header_len, &output_header_len, (const unsigned char*)header_json, temp_len))
+       {
+        printf("encode_header_str base64 encode failed\n");
+               goto FAILED;
+       }       
+
+    data_len = 1 + strlen("GET") + 1 + strlen(URL) + 1 + 1 + output_header_len + 1;
+    data_str = (char *)malloc(data_len);
+    if (data_str == NULL) {
+        printf("data_str malloc failed\n");
+        goto FAILED;
+    }
+    memset(data_str, 0, data_len);
+    snprintf(data_str,data_len, ",GET,%s,%s,", URL,encode_header_str);
+
+    data_len = strlen(data_str);
+    sprintf(len_str, "%04x", data_len + 8);
+
+    head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    // head_len = strlen(BID) + 1 + 15 + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    char *head_str = (char *)malloc(head_len);
+    if (head_str == NULL) {
+        printf("head_str malloc failed\n");
+        goto FAILED;
+    }
+    snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei, len_str);
+    // snprintf(head_str, head_len, "%s*864430010001091*%s*TCP_HTTP", BID, len_str);
+    
+    head_len = strlen(head_str);
+
+    code_len = head_len + strlen(KEY) + 1;
+    code_str = (char *)malloc(code_len);
+    if (code_str == NULL) {
+        printf("code_str malloc failed\n");
+        goto FAILED;
+    }
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    // printf("code_str:%s\n", code_str);
+    // printf("code_len:%d\n", code_len);
+
+    calculate_md5(code_str,md5_str);
+    if(strlen(md5_str) == 0)
+    {
+        printf("MD5 failed\n");
+        goto FAILED;
+    }
+    // if (active_md5_sign(code_str, code_len, md5_str) != 0) {
+    //     printf("MD5签名失败\n");
+    //     goto FAILED;
+    // }
+
+    send_len = 1 + strlen(md5_str) + head_len + data_len + 1 + 1;  // [ + md5 + head + data + ] + \0
+
+    send_str = (char *)malloc(send_len);
+    if (send_str == NULL) {
+        printf("send_str malloc failed\n");
+        goto FAILED;
+    }
+    snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str, data_str);
+    send_len = strlen(send_str);
+
+
+    // printf("md5_str:%s\n", md5_str);
+    // printf("md5_len:%zu\n", strlen(md5_str));
+    // printf("head_len:%d\n", head_len);
+    // printf("head_str:%s\n", head_str);
+    // printf("data_len:%d\n", data_len);
+    // printf("data_str:%s\n", data_str);
+    printf("send_len : %d\n", send_len);
+    printf("send_str : %s\n", send_str);
+
+    // 发送数据
+    ret = tcp_send(g_tcp_sock, send_str, send_len);
+    if(ret != 0)
+    {
+        printf("tcp_send failed\n");
+        goto FAILED;
+    }
+
+FAILED:
+    if (header_json != NULL) {
+        free(header_json);
+        header_json = NULL;
+    }
+    if (sign_str != NULL) {
+        free(sign_str);
+        sign_str = NULL;
+    }
+    if (ret_str != NULL) {
+        free(ret_str);
+        ret_str = NULL;
+    }
+    if (send_str != NULL) {
+        free(send_str);
+        send_str = NULL;
+    }
+    if (code_str != NULL) {
+        free(code_str);
+        code_str = NULL;
+    }
+    if (head_str != NULL) {
+        free(head_str);
+        head_str = NULL;
+    }
+    if (data_str != NULL) {
+        free(data_str);
+        data_str = NULL;
+    }
+    if (encode_str != NULL) {
+        free(encode_str);
+        encode_str = NULL;
+    }
+
+    return ret;
+}
+
+void do_gnss_tcp_server_send_data(int cmd,char *data,uint32_t len)
+{
+    if((data == NULL || len == 0) && cmd == GNSS_TCP_SERVICE_CMD_DATA_UPLOAD)
+        return;
+
+    errcode_t ret;
+    gnss_tcp_data_mail_t send_data = {0};
+    send_data.cmd = cmd;
+    if(len && data)
+    {
+        send_data.len = len;
+        send_data.data = (char *)malloc(len);
+        if(send_data.data == NULL)
+        {
+            PRINT("malloc failed\n");
+            return;
+        }
+        memcpy_s(send_data.data,len,data,len);
+    }
+
+    uint32_t send_len = sizeof(send_data);
+
+    ret = osal_msg_queue_write_copy(g_app_queue, (void *)&send_data,
+                                    send_len, 0);
+    if (ret != OSAL_SUCCESS) {
+        PRINT("Error gnss Check MSG 0x send failed! err=0x%x! \r\n", ret);
+    }
+}
+
+static void gnss_tcp_deinit(void)
+{
+    printf("gnss_tcp_deinit \n");
+        
+    GNSS_TCP_SERVER_STAT = 0;
+
+    LK_STATUS = 0;
+
+    if(rx_buffer != NULL)
+    {
+        printf("free rx_buffer\n");
+        free(rx_buffer);
+        rx_buffer = NULL;
+    }
+    if(g_tcp_sock >= 0)
+    {
+        if(lwip_close(g_tcp_sock) != 0)
+            printf("lwip_close failed\n");
+        else
+            printf("lwip_close succed\n");
+
+        g_tcp_sock = -1;
+    }
+
+}
+
+int gnss_tcp_init(void)
+{ 
+    if(LK_STATUS != 1)
+    {
+        printf("NOT LK\n");
+        return -1; 
+    }
+    gnss_tcp_login();
+    return 0;
+}
+
+static void pgnss_data_save(uint8_t *rx_buffer, uint32_t len)
+{
+    if (rx_buffer == NULL || len == 0) {
+        printf("invalid param\n");
+        return;
+    }
+
+    FILE *fp = fopen(PGNSS_DATA_PATH, "a+b");
+    if (fp == NULL) {
+        printf("open %s failed\n", PGNSS_DATA_PATH);
+        return;
+    }
+
+    size_t written = fwrite(rx_buffer, 1, len, fp);
+    if (written != len) {
+        printf("fwrite failed\n");
+    } else {
+        printf("fwrite succed :%d\n", written);
+    }
+
+    fflush(fp);
+    fclose(fp);
+}
+
+static void tcp_recv_data_handler(const char *input, int input_len) 
+{
+    if(input[0] == '[')
+    {
+        const char *data = input + 1;
+        size_t data_len = input_len - 2;
+        
+        const char *comma1 = memchr(data, ',', data_len);
+        const char *comma2 = comma1 ? memchr(comma1 + 1, ',', data_len - (comma1 - data + 1)) : NULL;
+
+        const char *star1 = memchr(data, '*', data_len);
+        const char *star2 = star1 ? memchr(star1 + 1, '*', data_len - (star1 - data + 1)) : NULL;
+        const char *star3 = star2 ? memchr(star2 + 1, '*', data_len - (star2 - data + 1)) : NULL;
+        
+        if (!star1 || !star2 || !star3) 
+        {
+            printf("解析失败: 头部格式错误(缺少星号分隔符)\n");
+            return;
+        }
+        
+        const char *bid = data;
+        const char *imei = star1 + 1;
+        const char *len_str = star2 + 1;
+        const char *cmd = star3 + 1;
+        
+        size_t bid_len = star1 - data;
+        size_t imei_len = star2 - (star1 + 1);
+        size_t len_str_len = star3 - (star2 + 1);
+        size_t cmd_len = data_len - (star3 - data + 1);
+        
+        // 打印头部解析结果
+        // printf("BID: %.*s\n", (int)bid_len, bid);
+        // printf("IMEI: %.*s\n", (int)imei_len, imei);
+        // printf("内容长度: %.*s\n", (int)len_str_len, len_str);
+        // printf("指令: %.*s\n", (int)cmd_len, cmd);
+        
+        // 验证IMEI长度(假设为15位)
+        if (imei_len != 15) 
+        {
+            printf("解析失败: IMEI长度应为15位,实际: %zu位\n", imei_len);
+            return;
+        }
+        
+        uint32_t content_len = 0;
+        sscanf(len_str, "%x", &content_len);
+        printf("解析后的内容长度: %u\n", content_len);
+
+        if (comma1 && comma2) 
+        {
+            size_t status_len = comma2 - (comma1 + 1);
+            size_t base64_len = data_len - (comma2 - data + 1);
+            
+            printf("状态码: %.*s\n", (int)status_len, comma1 + 1);
+            
+            if (strncmp(comma1 + 1, "200", status_len) != 0) 
+            {
+                printf("解析失败: 状态码必须为200,实际: %.*s\n", (int)status_len, comma1 + 1);
+                return;
+            }
+
+            size_t decoded_len = (base64_len * 3) / 4 + 1;
+            unsigned char *decoded_data = malloc(decoded_len);
+            if (!decoded_data) 
+            {
+                printf("解析失败: 内存分配失败\n");
+                return;
+            }
+            
+            size_t actual_decoded_len = 0;
+            int ret = mbedtls_base64_decode(decoded_data, decoded_len, &actual_decoded_len,(const unsigned char *)(comma2 + 1), base64_len);
+            
+            if (ret != 0)
+            {
+                printf("解析失败: Base64解码失败 (错误码: %d) :%s\n", ret,input);
+                free(decoded_data);
+                return;
+            }
+            decoded_data[actual_decoded_len] = '\0';
+
+            for (uint32_t i = 0; i < actual_decoded_len; i++) 
+            {
+                printf("%02X ", decoded_data[i]);
+            }
+            printf("\n");
+
+            // remove(AGNSS_DATA_PATH);
+            pgnss_data_save(decoded_data,actual_decoded_len);
+        }
+    }
+    else if(input[input_len - 1] == ']')
+    {
+        size_t decoded_len = ((input_len - 1) * 3) / 4 + 1;
+        unsigned char *decoded_data = malloc(decoded_len);
+        if (!decoded_data) 
+        {
+            printf("解析失败: 内存分配失败\n");
+            return;
+        }
+        
+        size_t actual_decoded_len = 0;
+        int ret = mbedtls_base64_decode(decoded_data, decoded_len, &actual_decoded_len,(const unsigned char *)(input), input_len - 1);
+        
+        if (ret != 0)
+        {
+            printf("解析失败: Base64解码失败 (错误码: %d) :%s\n", ret,input);
+            free(decoded_data);
+            return;
+        }
+        decoded_data[actual_decoded_len] = '\0';
+
+        for (uint32_t i = 0; i < actual_decoded_len; i++) 
+        {
+            printf("%02X ", decoded_data[i]);
+        }
+        printf("\n");
+        pgnss_data_save(decoded_data,actual_decoded_len);
+        LOS_Msleep(1000);
+        do_gnss_tcp_server_send_data(GNSS_TCP_SERVICE_CMD_SERVER_DEINIT,NULL,0);
+    }
+    else
+    {
+        size_t decoded_len = (input_len * 3) / 4 + 1;
+        unsigned char *decoded_data = malloc(decoded_len);
+        if (!decoded_data) 
+        {
+            printf("解析失败: 内存分配失败\n");
+            return;
+        }
+        
+        size_t actual_decoded_len = 0;
+        int ret = mbedtls_base64_decode(decoded_data, decoded_len, &actual_decoded_len,(const unsigned char *)(input), input_len);
+        
+        if (ret != 0)
+        {
+            printf("解析失败: Base64解码失败 (错误码: %d) :%s\n", ret,input);
+            free(decoded_data);
+            return;
+        }
+        decoded_data[actual_decoded_len] = '\0';
+
+        for (uint32_t i = 0; i < actual_decoded_len; i++) 
+        {
+            printf("%02X ", decoded_data[i]);
+        }
+        printf("\n");
+        pgnss_data_save(decoded_data,actual_decoded_len);
+    }
+        
+}
+
+static void gnss_tcp_server_send_task(void const *arg)
+{
+    unused(arg);
+    errcode_t ret;
+
+    gnss_tcp_data_mail_t mail = {0};
+    uint32_t msgsize = sizeof(gnss_tcp_data_mail_t);
+
+    while (GNSS_TCP_SERVER_STAT) {
+        ret = osal_msg_queue_read_copy(g_app_queue, (void *)&mail, &msgsize,
+                                       OSAL_MSGQ_WAIT_FOREVER);
+        if (ret != OSAL_SUCCESS) {
+            continue;
+        }
+
+        if(mail.cmd == GNSS_TCP_SERVICE_CMD_DATA_UPLOAD)
+        {
+            // tcp_data_handler((int *)mail.data,mail.len);
+            tcp_recv_data_handler(mail.data,mail.len);
+            if(mail.data != NULL)
+            {
+                printf("free(mail.data)\n");
+                free(mail.data);
+            }
+        }
+        else if(mail.cmd == GNSS_TCP_SERVICE_CMD_SERVER_INIT)
+        {
+            // gnss_tcp_init();
+            uapi_delete_files(PGNSS_DATA_PATH);
+            uapi_create_folder(PGNSS_DATA_PATH);
+    
+            gnss_tcp_sign_up();
+            if(LK_STATUS == 1)
+            {
+                gnss_tcp_login();
+            }
+            else
+            {
+                printf("NOT LK\n");
+            }
+
+        }
+        else if(mail.cmd == GNSS_TCP_SERVICE_CMD_SERVER_DEINIT)
+        {
+            gnss_tcp_deinit();
+        }
+    }
+}
+
+
+static void gnss_tcp_server_recv_task(void *pvParameters)
+{
+    while (GNSS_TCP_SERVER_STAT)
+    {
+        if (!uapi_cat1_get_power_stat())
+        {
+            PRINT("wating cat1 power on\n");
+            LOS_Msleep(2000);
+            continue;
+        }
+
+        if (g_tcp_sock < 0) 
+        {
+            g_tcp_sock = gnss_tcp_socket_init();
+            if (g_tcp_sock < 0)
+            {
+                PRINT("wating tcp socket init\n");
+                LOS_Msleep(1000);
+                continue;
+            }
+            else
+                do_gnss_tcp_server_send_data(GNSS_TCP_SERVICE_CMD_SERVER_INIT,NULL,0);
+        }
+
+        if(rx_buffer == NULL)
+        {
+            rx_buffer = (char *)malloc(2048);
+            if(rx_buffer == NULL)
+            {
+                printf("rx_buffer malloc failed\n");
+                do_gnss_tcp_server_send_data(GNSS_TCP_SERVICE_CMD_SERVER_DEINIT,NULL,0);
+                return;
+            }
+        }
+
+        // if (tcp_socket_init() != 0) 
+        // {
+        //     PRINT("wating tcp socket init\n");
+        //     LOS_Msleep(100);
+        //     continue;
+        // }
+
+        // PRINT("tcp socket init succed\n");
+
+        // get_active_code();
+        // if(tcp_sign_up() != 0)
+        // {
+        //     LOS_Msleep(1000);
+        //     continue;
+        // }
+
+        // printf("tcp_sign_up\n");
+
+        memset(rx_buffer, 0, 2048);
+        int len = recv(g_tcp_sock, rx_buffer, 2048 - 1, 0);
+        if (len > 0) 
+        {
+            rx_buffer[len] = '\0';
+            // printf("Received %d bytes: %s\n", len, rx_buffer);
+            if(strstr(rx_buffer,"LK") != NULL)
+            {
+                printf("LK succed\n");
+                LK_STATUS = 1;
+            }
+            else
+            {
+                do_gnss_tcp_server_send_data(GNSS_TCP_SERVICE_CMD_DATA_UPLOAD,rx_buffer,len);
+            }
+        }
+        else if (len == 0) 
+        {
+            printf("Connection closed by peer\n");
+            do_gnss_tcp_server_send_data(GNSS_TCP_SERVICE_CMD_SERVER_DEINIT,NULL,0);
+        }
+    }
+}
+
+static void create_gnss_tcp_queue(void)
+{
+
+    if (osal_msg_queue_create("gnss_tcp_service_queue", 24, &g_app_queue,
+                              0, sizeof(gnss_tcp_data_mail_t)) != ERRCODE_SUCC) {
+        PRINT("[gnss][service] app create mail fail\n");
+    }
+}
+
+#define GNSS_TCP_BOARD_TASK_SIZE   0x2000
+errcode_t uapi_gnss_tcp_server_init(void)
+{
+    PRINT("uapi_gnss_tcp_server_init !\r\n");
+
+    if(GNSS_TCP_SERVER_STAT == 1)
+    {
+        PRINT("uapi_gnss_tcp_server already init !\r\n");
+        return ERRCODE_SUCC;
+    }
+
+    GNSS_TCP_SERVER_STAT = 1;
+
+    send_taskcfg.create_queue_handle = create_gnss_tcp_queue;
+    send_taskcfg.attr.name="gnss_tcp_server_send_task";
+    send_taskcfg.attr.priority = osPriorityNormal;
+    send_taskcfg.attr.stack_size = GNSS_TCP_BOARD_TASK_SIZE;
+    send_taskcfg.func = gnss_tcp_server_send_task;
+    send_taskcfg.use_mem = USE_EXTEND_MEM;
+    
+    errcode_t ret=uapi_create_osThread_custom(&send_taskcfg);
+    if(ret != ERRCODE_SUCC)
+    {
+        PRINT("create gnss_send_service failed %d!\r\n",ret);
+        return ERRCODE_FAIL;
+    }
+
+    recv_taskcfg.create_queue_handle = NULL;
+    recv_taskcfg.attr.name="gnss_tcp_server_recv_task";
+    recv_taskcfg.attr.priority = osPriorityNormal1;
+    recv_taskcfg.attr.stack_size = GNSS_TCP_BOARD_TASK_SIZE;
+    recv_taskcfg.func = gnss_tcp_server_recv_task;
+    recv_taskcfg.use_mem = USE_EXTEND_MEM;
+    
+    ret=uapi_create_osThread_custom(&recv_taskcfg);
+    if(ret != ERRCODE_SUCC)
+    {
+        PRINT("create gnss_recv_service failed %d!\r\n",ret);
+        return ERRCODE_FAIL;
+    }
+
+    // g_gnss_service_timer = osTimerNew((osTimerFunc_t)gnss_service_check_timer_callback, osTimerPeriodic, NULL, NULL);
+
+    return ERRCODE_SUCC;
+}
+
+// void gnss_tcp_server_suspend(void)
+// {
+//     if(recv_taskcfg.task_handle == NULL || send_taskcfg.task_handle)
+//         return;
+
+    
+//     errcode_t ret = uapi_suspend_thread(recv_taskcfg.task_handle);
+//     if(ret != ERRCODE_SUCC)
+//         PRINT("gnss_recv_thread_suspend failed ret : %d \n",ret);
+//     else
+//         PRINT("gnss_recv_thread_suspend succed\n");
+
+//     ret = uapi_suspend_thread(send_taskcfg.task_handle);
+//     if(ret != ERRCODE_SUCC)
+//         PRINT("gnss_send_thread_suspend failed ret : %d \n",ret);
+//     else
+//         PRINT("gnss_send_thread_suspend succed\n");
+
+// }
+
+// void gnss_tcp_server_resume(void)
+// {
+//     if(recv_taskcfg.task_handle == NULL || send_taskcfg.task_handle)
+//         return;
+
+//     errcode_t ret = uapi_suspend_thread(recv_taskcfg.task_handle);
+//     if(ret != ERRCODE_SUCC)
+//         PRINT("gnss_recv_thread_suspend failed ret : %d \n",ret);
+//     else
+//         PRINT("gnss_recv_thread_suspend succed\n");
+
+//     ret = uapi_suspend_thread(send_taskcfg.task_handle);
+//     if(ret != ERRCODE_SUCC)
+//         PRINT("gnss_send_thread_suspend failed ret : %d \n",ret);
+//     else
+//         PRINT("gnss_send_thread_suspend succed\n");
+
+// }
\ No newline at end of file
index 024893b..506b3b2 100644 (file)
@@ -30,6 +30,7 @@
 #include "uart_gnss.h"
 #include "gnss_ctl.h"
 #include "tiot_board_pin_port.h"
+#include "pgnss_sample.h"
 // errcode_t gnss_get_next_cmd(uint8_t cmd_index,uint8_t** cmdbuf,int *cmdlen);
 // errcode_t gnss_get_current_cmd(uint8_t cmd_index,uint8_t** cmdbuf,int *cmdlen);
 // errcode_t gnss_get_nmea_cfg_cmd(uint8_t** cmdbuf,int *cmdlen);
@@ -181,7 +182,8 @@ static void uart_event_task(void const *arg)
                 break;
                 case GNSS_CMD_START:
                     // gnss_get_start_cmd(&buf,&len);
-                    GnssServerStart();
+                    // GnssServerStart();
+                    PGnssServerStart();
                     last_cfg_cmd_index = 0xFF; //last_cfg_cmd_index=0xFF 代表cfg结束写入,开始检测其他指令
                 break;
                 case GNSS_CMD_STOP:
index b5fc995..cb790bb 100644 (file)
 #include "player/include/PlayersModelC.h"
 #else
 #include "system/include/SystemLogModelC.h"
+
+
+#ifdef SUPPORT_BATTERY_SERVICE
+#include "battery_service.h"
+#endif
+
 #ifdef __cplusplus
 extern "C"
 {
 #endif
-#ifdef FACTORYTEST_SERVICE
+
+#ifdef SUPPORT_FACT_SERVICE
 #include "factorytest_protocol.h"
 #endif
 #ifdef SUPPORT_CYWEE_SERVICE
 #include "cywee_data.h"
+#include "cywee_hal.h"
+#endif
+#ifdef SUPPORT_MAG_SERVICE
+#include "mag_hal.h"
 #endif
 
+#ifdef SUPPORT_FACT_SERVICE
+#include "factorytest_protocol.h"
+#endif
 
 //进行修复开始
 void repair_file_start(void){}
@@ -79,17 +93,6 @@ void custom_save_nap_data(void){}
 #include "bleInstruct.h"
 #endif
 
-#ifdef FACTORYTEST_SERVICE
-#include "factorytest_protocol.h"
-#endif
-#endif
-
-#ifdef FD230_650
-#include "mmc5603_hal.h"
-
-#include "cywee_hal.h"
-#endif
-
 typedef struct
 {
     uint8_t cmd;
@@ -178,22 +181,26 @@ static void custom_fileoperate_service_check_task(void const *arg)
             break;
         case CUSTOM_FILEOPERATE_MSG_TYPE_SLEEPDATA_READ:
 #ifdef SUPPORT_CYWEE_SERVICE
-            // custom_read_sleep_data();
+            cywee_read_sleep_data();
 #endif
             break;
         case CUSTOM_FILEOPERATE_MSG_TYPE_NAPDATA_READ:
 #ifdef SUPPORT_CYWEE_SERVICE
-            // custom_read_nap_data();
+            cywee_read_nap_data();
 #endif
             break;
         case CUSTOM_FILEOPERATE_MSG_TYPE_SLEEPMODLE_UPDATE:
-            // custom_sleep_model_updata();
+            // cywee_read_nap_data();
             break;
         case CUSTOM_FILEOPERATE_MSG_TYPE_MMCDATA_SAVE:
-            // mmc5603_savePara_infile();
+#ifdef SUPPORT_MAG_SERVICE
+            mag_savePara_infile();
+#endif
             break;
         case CUSTOM_FILEOPERATE_MSG_TYPE_MMCDATA_READ:
-            // mmc5603_readPara_infile();
+#ifdef SUPPORT_MAG_SERVICE
+            mag_readPara_infile();
+#endif
             break;
 
         case CUSTOM_FILEOPERATE_MSG_TYPE_MUSICNAME_READ:
@@ -208,13 +215,13 @@ static void custom_fileoperate_service_check_task(void const *arg)
             break;
 
         case CUSTOM_FILEOPERATE_MSG_TYPE_AGING_DATA_READ:
-#ifdef FACTORYTEST_SERVICE
+#ifdef SUPPORT_FACT_SERVICE
             factorytest_read_aging_data();
 #endif
             break;
 
         case CUSTOM_FILEOPERATE_MSG_TYPE_AGING_DATA_SAVE:
-#ifdef FACTORYTEST_SERVICE
+#ifdef SUPPORT_FACT_SERVICE
             factorytest_save_aging_data();
 #endif
             break;
@@ -226,7 +233,7 @@ static void custom_fileoperate_service_check_task(void const *arg)
 
         case CUSTOM_FILEOPERATE_MSG_TYPE_WEAR_DATA_READ:
 #ifdef SUPPORT_CYWEE_SERVICE
-            // custom_read_wear_data();
+            custom_read_wear_data();
 #endif
             break;
 
@@ -235,7 +242,9 @@ static void custom_fileoperate_service_check_task(void const *arg)
             break;
 
         case CUSTOM_FILEOPERATE_MSG_TYPE_BATTERY_DATA_READ:
-            // battery_get_data();
+#ifdef SUPPORT_BATTERY_SERVICE
+            battery_get_data();
+#endif
             break;
 
         case CUSTOM_FILEOPERATE_MSG_TYPE_BATTERY_DATA_SAVE:
index e83c51c..b7aa10a 100644 (file)
@@ -106,6 +106,9 @@ typedef struct
     uint8_t transmitting_status;//是否处于ble传输状态
 
     uint8_t atuoota_status;//是否处于自动ota状态
+    
+    uint8_t bp_status;//血压测量状态
+    uint8_t hrs_ble_status;//心率蓝牙广播
 } runtime_status_t;
 
 
@@ -649,3 +652,25 @@ void uapi_dev_runtime_set_restore_factory_status(uint8_t status) {
 uint8_t uapi_dev_runtime_get_restore_factory_status(void) {
   return g_runtime.is_factory_status;
 }
+
+// 设置是否为血压测量状态
+void uapi_dev_runtime_set_bp_status(uint8_t status)
+{
+    g_runtime.bp_status = status;
+}
+// 获取是否为血压测量状态
+uint8_t uapi_dev_runtime_get_bp_status_flag(void)
+{
+    return g_runtime.bp_status;
+}
+
+// 设置是否为心率蓝牙广播状态
+void uapi_dev_runtime_set_hrs_ble_status(uint8_t status)
+{
+    g_runtime.hrs_ble_status = status;
+}
+// 获取是否为心率蓝牙广播状态
+uint8_t uapi_dev_runtime_get_hrs_ble_status(void)
+{
+    return g_runtime.hrs_ble_status;
+}
index 147df7a..8415445 100644 (file)
@@ -318,6 +318,12 @@ void uapi_dev_runtime_atuoota_status_status(uint8_t data);
 
 uint8_t uapi_dev_runtime_get_atuoota_status(void);
 
+void uapi_dev_runtime_set_bp_status(uint8_t status);
+uint8_t uapi_dev_runtime_get_bp_status_flag(void);
+    
+void uapi_dev_runtime_set_hrs_ble_status(uint8_t status);
+uint8_t uapi_dev_runtime_get_hrs_ble_status(void);
+
 #ifdef __cplusplus
 #if __cplusplus
 }
index 0829d14..a7e8c95 100644 (file)
 #include "tcxo.h"
 #include <stdint.h>
 #include "pm_veto.h"
+#include <sys/stat.h>
 // #include "config/include/ConfigModelC.h"
 #include "upg_porting.h"
-
 #include "soc_lcd_api.h"
-
+#include "flash.h"
 #ifdef SUPPORT_TCPIP
 #include "lwip/tcpip.h"
 #endif
@@ -615,10 +615,7 @@ void startup_post_init_task(void)
     timeinfo = localtime(&rawtime);
     if(day > 0 && day != timeinfo->tm_mday)
     {
-        #ifdef FD230_650
         CustomEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, NULL , 0);
-        #endif
-        //do_cywee_service_check_msg(CYWEE_SERVICE_CMD_RESET_DAILY_DATA,NULL);
     }
 #ifdef A5133_DEMO_SERVER
     uapi_button_register_event_cb(a5133_demo_msg_unbind_callback, BUTTON_PWR_CLICKUP_2);
@@ -1540,6 +1537,34 @@ int32_t uapi_callVolumeGet(void)
     return AudioServiceGetVolume(AUDIO_STREAM_VOICE_CALL_VOLTE);
 }
 
+
+void power_on_cat1(void)
+{
+    #if defined(BOARD_FD230)
+    uapi_cat1_power_on(1);    
+    uapi_cat1_reset(0);
+    #elif (defined(BOARD_W9) || defined(BOARD_N9))
+    uapi_cat1_reset(0);
+    uapi_cat1_power_on(1);  
+    uapi_cat1_bat_on(1);
+    osDelay(900);
+    uapi_cat1_power_on(0);  
+    #endif
+
+}
+
+void power_off_cat1(void)
+{
+    #if defined(BOARD_FD230)
+    uapi_cat1_reset(1);
+    uapi_cat1_power_on(0); 
+    #elif (defined(BOARD_W9) || defined(BOARD_N9))
+    uapi_cat1_bat_on(0);
+    uapi_cat1_reset(1);
+    uapi_cat1_power_on(1); 
+    #endif
+}
+
 //设置4G能力开关是否开启
 void uapi_set4GCapability(bool isopen)
 {
@@ -1956,30 +1981,6 @@ errcode_t uapi_get_fw_version(uint8_t *_major, uint8_t *_mid,uint8_t *_minor)
     return ERRCODE_SUCC;
 }
 
-
-#include "lcd_common.h"
-
-void lcd_getid(uint32_t *id)
-{
-    if(id == NULL)
-        return;
-
-    lcd_drv_common *lcd_drv_comm_api = NULL;
-    lcd_drv_cfg *lcd_cfg = NULL;
-
-    lcd_drv_comm_api = lcd_drv_get_common_api();
-    if (lcd_drv_comm_api == NULL) {
-        PRINT("lcd_drv_comm_api is null.\r\n");
-    }
-    else
-    {
-        lcd_drv_comm_api->get_chip_id(id);
-        PRINT("LCD ID : 0x%x\r\n",*id);   
-    }
-}
-
-#include "flash.h"
-
 void flash_getid(uint32_t *id)
 {
     flash_info_t norflash_id;
@@ -1994,40 +1995,6 @@ void flash_erase(void)
     uapi_flash_chip_erase(1);
 }
 
-
-
-void get_gsensor_single(uint8_t *databuf) {
-    #ifdef SUPORT_CYWEE_SERVICE
-    gsenson_t t;
-    cywee_get_gsensor_data(1,&t);
-    int16_t x, y, z;
-    x = t.x * 2048;
-    y = t.y * 2048;
-    z = t.z * 2048;
-
-    databuf[0] = (uint8_t)((x & 0xFF00) >> 8);
-    databuf[1] = (uint8_t)(x & 0x00FF);
-
-    databuf[2] = (uint8_t)((y & 0xFF00) >> 8);
-    databuf[3] = (uint8_t)(y & 0x00FF);
-    databuf[4] = (uint8_t)((z & 0xFF00) >> 8);
-    databuf[5] = (uint8_t)(z & 0x00FF);
-
-    PRINT("x : %.2f, y : %.2f, z : %.2f \r\n",t.x,t.y,t.z);
-    PRINT("x : %d, y : %d, z : %d \r\n", x, y, z);
-    PRINT("GSENSOR: %02X %02X %02X %02X %02X %02X\r\n", databuf[0], databuf[1], databuf[2], databuf[3], databuf[4], databuf[5]);
-    #endif
-}
-
-#ifdef FD230_650
-void gsensor_get_single_data(gsenson_t *t)
-{
-    cywee_get_gsensor_data(1,&t);
-}
-#endif
-
-#include <sys/stat.h>
-
 int removeFilesInFolder(const char *folderPath) 
 {
     DIR *dir;
@@ -3122,7 +3089,7 @@ void uapi_aging_test(uint32_t test_time)
         for(cmd = 0; cmd < 6 ; cmd++)
         {
             // ui_api_vibrate_once_func(3);
-            ui_api_vibrate_once_func();
+            custom_VibratorFunc_int(0);
             LOS_Msleep(1000);
         }