From 719d13af88bd1af1b3c6b83cce6ffdd97d68939e Mon Sep 17 00:00:00 2001 From: penglei <1624952103@qq.com> Date: Thu, 31 Jul 2025 15:39:54 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E6=94=B9=E9=A9=AC=E8=BE=BE=E9=9C=87?= =?utf8?q?=E5=8A=A8=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BC=98=E5=8C=96cywee=20pp?= =?utf8?q?g=E6=8E=A7=E5=88=B6=E6=8E=A5=E5=8F=A3=E5=87=BD=E6=95=B0=E5=91=BD?= =?utf8?q?=E5=90=8D=EF=BC=8C=E5=90=88=E5=85=A5=E8=A1=80=E5=8E=8B=20gnss?= =?utf8?q?=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../brandy/brandy_standard/input_app.c | 8 +- .../nativelauncher/src/NativeLauncher.cpp | 2 +- .../nativeui/applist/src/ApplistView.cpp | 4 +- .../bloodoxygen/src/BloodOxygenModel.cpp | 6 +- .../nativeui/bluetooth/src/BluetoothModel.cpp | 4 +- .../nativeui/callerlog/src/CallerLogModel.cpp | 2 +- .../src/BrightnessControlView.cpp | 2 +- .../nativeui/health/CheckAbnormalView.cpp | 2 +- .../nativeui/health/CheckInvalidView.cpp | 2 +- .../nativeui/heartrate/src/HeartModel.cpp | 9 +- .../main/src/VolumeSettingPresenter.cpp | 2 +- .../src/RebootAndShutdownPresenter.cpp | 2 +- .../src/ShutDownImageAnimatorView.cpp | 2 +- .../nativeui/record/src/RecordingModel.cpp | 2 +- .../src/RespiratoryTrainingView.cpp | 6 +- .../nativeui/saveele/src/SaveElePresenter.cpp | 2 +- .../nativeui/sleep/include/SleepModel.h | 42 +- .../nativeui/sleep/include/SleepModelC.h | 16 +- .../nativeui/sleep/src/SleepModel.cpp | 737 ++---- .../src/SoundAndVibrationPresenter.cpp | 2 +- ...oundAndVibrationVolumeSettingPresenter.cpp | 2 +- .../nativeui/system/src/SystemPresenter.cpp | 2 +- .../nativeui/traing/src/TraingModel.cpp | 8 +- .../training_card/src/TraingCardPresenter.cpp | 14 +- .../src/notify/alarm_notification.cpp | 2 +- .../debug_output_notification.cpp | 41 +- .../src/notify/drinkReminder_notification.cpp | 4 +- .../src/notify/findwatch_notification.cpp | 2 +- .../src/notify/goal_notification.cpp | 2 +- .../src/notify/message_notification.cpp | 2 +- .../motion_recognition_notification.cpp | 6 +- .../src/notify/pairing_notification.cpp | 4 +- .../notify/sedentaryReminder_notification.cpp | 2 +- .../src/notify/sleep_notification.cpp | 4 +- .../msg_center/src/msg_center_customer.cpp | 37 + .../src/notify/pairing_notification.cpp | 4 +- .../drivers/drivers/driver/lcd/lcd_config.c | 9 +- .../drivers/drivers/driver/lcd/lcd_private.c | 10 + .../touch/cst86xx_touch/cst86xx_touch1.h | 2 +- .../zhihui/UI/producttest/src/testcat1.cpp | 10 +- .../UI/producttest/src/testhrsenson.cpp | 3 +- code/sdk/zhihui/config/src/ConfigModel.cpp | 2 +- code/sdk/zhihui/drivers/bp/CMakeLists.txt | 1 + code/sdk/zhihui/drivers/bp/bn02/bn02.c | 180 +- code/sdk/zhihui/drivers/bp/bn02/bn02.h | 15 +- .../drivers/bp/service/bp_ble_service.c | 131 +- .../drivers/bp/service/bp_ble_service.h | 2 +- .../zhihui/drivers/bp/service/bp_tcp_server.c | 2238 +++++++++++++++++ .../zhihui/drivers/bp/service/bp_tcp_server.h | 65 + code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c | 170 +- code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h | 7 +- .../drivers/cywee/service/cywee_service.c | 17 + .../drivers/cywee/service/cywee_service.h | 7 +- code/sdk/zhihui/drivers/mag/CMakeLists.txt | 1 - .../sdk/zhihui/drivers/mag/hal/CMakeLists.txt | 37 - .../zhihui/drivers/mag/mmc5603/mmc5603_hal.h | 5 +- .../zhihui/drivers/mag/mmc5603/mmc5603_main.c | 4 +- .../zhihui/drivers/mag/service/CMakeLists.txt | 1 + .../drivers/mag/{hal => service}/mag_hal.c | 4 +- .../drivers/mag/{hal => service}/mag_hal.h | 3 +- .../zhihui/drivers/mag/service/mag_service.c | 6 +- .../zhihui/drivers/mag/service/mag_service.h | 4 +- code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c | 6 +- code/sdk/zhihui/drivers/ppg/hx3695/hx3695.c | 10 +- code/sdk/zhihui/drivers/ppg/hx3695/hx3695.h | 1 + .../drivers/ppg/hx3695/hx3695_factory_test.c | 2 +- .../drivers/ppg/hx3695/hx3695_factory_test.h | 2 + .../drivers/ppg/pah8009/sensor/pah800x_main.c | 5 +- .../zhihui/drivers/ppg/service/CMakeLists.txt | 1 - .../drivers/ppg/service/ppg_service.cpp | 204 +- .../vibrator/service/vibrator_service.cpp | 73 +- .../vibrator/service/vibrator_service.h | 4 +- .../battery/service/battery_driver.cpp | 31 +- .../battery/service/battery_service.cpp | 25 +- .../blemoder/ble_congfig_adapt.cpp | 2 +- .../blemoder/bleinstruct_sample.cpp | 4 +- .../factorytest_protocol.c | 41 +- code/sdk/zhihui/services/gnss/CMakeLists.txt | 4 +- .../board_porting/tiot_board_pin_port.h | 14 +- code/sdk/zhihui/services/gnss/inc/NMEA0183.h | 1 + .../services/gnss/inc/gnss_tcp_server.h | 45 + .../gnss/sample/gnss_sample/gnss_sample.c | 9 + .../gnss/sample/pgnss_sample/CMakeLists.txt | 42 + .../gnss/sample/pgnss_sample/gnss_datatypes.h | 65 + .../gnss/sample/pgnss_sample/pgnss_encode.c | 603 +++++ .../gnss/sample/pgnss_sample/pgnss_encode.h | 16 + .../gnss/sample/pgnss_sample/pgnss_sample.c | 368 +++ .../gnss/sample/pgnss_sample/pgnss_sample.h | 26 + code/sdk/zhihui/services/gnss/src/gnss_ctl.c | 63 +- .../services/gnss/src/gnss_tcp_server.c | 1216 +++++++++ code/sdk/zhihui/services/gnss/src/uart_gnss.c | 4 +- .../zhihui/utils/custom_fileoperate_service.c | 51 +- code/sdk/zhihui/utils/custom_runtime.c | 25 + code/sdk/zhihui/utils/custom_runtime.h | 6 + code/sdk/zhihui/utils/custom_utils.c | 95 +- 95 files changed, 5799 insertions(+), 1189 deletions(-) create mode 100644 code/sdk/zhihui/drivers/bp/service/bp_tcp_server.c create mode 100644 code/sdk/zhihui/drivers/bp/service/bp_tcp_server.h delete mode 100644 code/sdk/zhihui/drivers/mag/hal/CMakeLists.txt rename code/sdk/zhihui/drivers/mag/{hal => service}/mag_hal.c (94%) rename code/sdk/zhihui/drivers/mag/{hal => service}/mag_hal.h (91%) create mode 100644 code/sdk/zhihui/services/gnss/inc/gnss_tcp_server.h create mode 100644 code/sdk/zhihui/services/gnss/sample/pgnss_sample/CMakeLists.txt create mode 100644 code/sdk/zhihui/services/gnss/sample/pgnss_sample/gnss_datatypes.h create mode 100644 code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_encode.c create mode 100644 code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_encode.h create mode 100644 code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c create mode 100644 code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.h create mode 100644 code/sdk/zhihui/services/gnss/src/gnss_tcp_server.c diff --git a/code/sdk/application/brandy/brandy_standard/input_app.c b/code/sdk/application/brandy/brandy_standard/input_app.c index 45c0214a5..54cb1a710 100644 --- a/code/sdk/application/brandy/brandy_standard/input_app.c +++ b/code/sdk/application/brandy/brandy_standard/input_app.c @@ -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 }, diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/src/NativeLauncher.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/src/NativeLauncher.cpp index 5ac771ab4..77b20bd5b 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/src/NativeLauncher.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/src/NativeLauncher.cpp @@ -166,7 +166,7 @@ void NativeLauncher::InitNativeLauncher(LaunchMode mode) cm_initializeScreenDuration(); // 开机增加震动 页面启动震动一次 - // ui_api_vibrate_once_func(); + // custom_VibratorFunc_int(0); // #endif } // 注册开机时间 diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/applist/src/ApplistView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/applist/src/ApplistView.cpp index 49430530d..c28ab18e0 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/applist/src/ApplistView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/applist/src/ApplistView.cpp @@ -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 diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenModel.cpp index 01df55996..aba239684 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenModel.cpp @@ -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 diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bluetooth/src/BluetoothModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bluetooth/src/BluetoothModel.cpp index 7fe7d4bb6..83dcf6cf6 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bluetooth/src/BluetoothModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bluetooth/src/BluetoothModel.cpp @@ -1018,7 +1018,7 @@ static void ACLConnectionSuss(const bd_addr_t &bdAddr) /* -------------------------------------------------------------------------- */ if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get())) { - ui_api_vibrate_once_func(); + custom_VibratorFunc_int(0); } uapi_set_screen_on_api(); /* -------------------------------------------------------------------------- */ @@ -1063,7 +1063,7 @@ static void ACLConnectionFail(const bd_addr_t &bdAddr) /* -------------------------------------------------------------------------- */ if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get())) { - ui_api_vibrate_once_func(); + custom_VibratorFunc_int(0); } uapi_set_screen_on_api(); /* -------------------------------------------------------------------------- */ diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/callerlog/src/CallerLogModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/callerlog/src/CallerLogModel.cpp index 2774077a4..eb9883552 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/callerlog/src/CallerLogModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/callerlog/src/CallerLogModel.cpp @@ -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); } } diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/displaybrightness/src/BrightnessControlView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/displaybrightness/src/BrightnessControlView.cpp index ba4309526..b81c70187 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/displaybrightness/src/BrightnessControlView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/displaybrightness/src/BrightnessControlView.cpp @@ -313,7 +313,7 @@ namespace OHOS bool BrightnessSliderEventListener::OnRotateEnd(UIView& view, const RotateEvent& event) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnRotateEnd %d", value); - ui_api_vibrate_once_func();//受设置中震动强度控制 + custom_VibratorFunc_int(0);//受设置中震动强度控制 return true; } } diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/health/CheckAbnormalView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/health/CheckAbnormalView.cpp index 497277512..347e2b40c 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/health/CheckAbnormalView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/health/CheckAbnormalView.cpp @@ -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); } diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/health/CheckInvalidView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/health/CheckInvalidView.cpp index 4fc464f3d..3d98a619e 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/health/CheckInvalidView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/health/CheckInvalidView.cpp @@ -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); } // 增加按键监听 diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartModel.cpp index 57447f4d0..5f88e3486 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartModel.cpp @@ -433,11 +433,7 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) { display_counter_ = 0; displayheart = 0; #ifdef SUPPORT_PPG_SERVICE - uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST; - errcode_t ret = send_ppg_cmd_msg(md); - if (ret != ERRCODE_SUCC) { - send_ppg_cmd_msg(md); - } + ppg_hr_stop(); #endif heartstate = false; if (checkstate == HeartCheck::CARDCHECK) { @@ -466,8 +462,7 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) { } WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartState Start"); #ifdef SUPPORT_PPG_SERVICE - uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST; - send_ppg_cmd_msg(md); + ppg_hr_start(); #endif heartstate = true; checkstate = check; diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/src/VolumeSettingPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/src/VolumeSettingPresenter.cpp index 7b684d58a..a49cab77a 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/src/VolumeSettingPresenter.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/src/VolumeSettingPresenter.cpp @@ -197,7 +197,7 @@ bool VolumeSliderEventListener::OnRotateEnd(UIView& view, const RotateEvent& eve if (slider == progress) { ChangeVolume(VOLUMEDRAG); - ui_api_vibrate_once_func();//受设置中震动强度控制 + custom_VibratorFunc_int(0);//受设置中震动强度控制 } } return true; diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/rebootandshutdown/src/RebootAndShutdownPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/rebootandshutdown/src/RebootAndShutdownPresenter.cpp index 89bbe82bd..d41d378b1 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/rebootandshutdown/src/RebootAndShutdownPresenter.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/rebootandshutdown/src/RebootAndShutdownPresenter.cpp @@ -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; diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/rebootandshutdown/src/ShutDownImageAnimatorView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/rebootandshutdown/src/ShutDownImageAnimatorView.cpp index 997c0c32a..5f32cb3cd 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/rebootandshutdown/src/ShutDownImageAnimatorView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/rebootandshutdown/src/ShutDownImageAnimatorView.cpp @@ -110,7 +110,7 @@ namespace OHOS NativeAbility::GetInstance().SetCurSlicePriority(0); // 设置Slice优先级为最高,防止弹窗出现 // 关机增加震动 - ui_api_vibrate_once_func(); + custom_VibratorFunc_int(0); } // 获取开机动画是否已经开始 diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/record/src/RecordingModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/record/src/RecordingModel.cpp index d3fb59fbd..5482c79ee 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/record/src/RecordingModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/record/src/RecordingModel.cpp @@ -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(); // 显示警告 diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp index ab6fbc6b3..da1366d54 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp @@ -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 } diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/saveele/src/SaveElePresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/saveele/src/SaveElePresenter.cpp index d69267416..5064998ef 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/saveele/src/SaveElePresenter.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/saveele/src/SaveElePresenter.cpp @@ -75,7 +75,7 @@ bool SaveElePresenter::OnKeyAct(UIView &view, const KeyEvent &event) { bool SaveElePresenter::OnRotateEnd(UIView &view, const RotateEvent &event) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VolumeSliderEventListener::OnRotateEnd"); -// ui_api_vibrate_once_func(); +// custom_VibratorFunc_int(0); return true; } } // namespace OHOS \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/include/SleepModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/include/SleepModel.h index d7cf716df..292900925 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/include/SleepModel.h +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/include/SleepModel.h @@ -11,6 +11,10 @@ // #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(); diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/include/SleepModelC.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/include/SleepModelC.h index 9a2874675..a59822b5d 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/include/SleepModelC.h +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/include/SleepModelC.h @@ -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 diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/src/SleepModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/src/SleepModel.cpp index a8fe634bb..13a672af3 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/src/SleepModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/sleep/src/SleepModel.cpp @@ -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" @@ -49,47 +49,35 @@ #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" diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp index 6e3dadc19..8a00b12fc 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp @@ -134,7 +134,7 @@ namespace OHOS WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "VibrationMode = %d", VibrationMode); SoundAndVibrationModel::GetInstance()->SetVibrationReminderToggleButtonStaus(VibrationMode); // uapi_vibrationModeSet(VibrationMode); - ui_api_vibrate_once_func(); + custom_VibratorFunc_int(0); view_->ChangeView(VIBRATIONMODEVIEW, SOUNDANDVIBRATIONVIEW); } return true; diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/soundandvibration/src/SoundAndVibrationVolumeSettingPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/soundandvibration/src/SoundAndVibrationVolumeSettingPresenter.cpp index 4f0920280..e22b33309 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/soundandvibration/src/SoundAndVibrationVolumeSettingPresenter.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/soundandvibration/src/SoundAndVibrationVolumeSettingPresenter.cpp @@ -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; } } diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/system/src/SystemPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/system/src/SystemPresenter.cpp index 72a45da85..267607356 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/system/src/SystemPresenter.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/system/src/SystemPresenter.cpp @@ -215,7 +215,7 @@ namespace OHOS } else if (strcmp(view.GetViewId(), FACTORYRESET_CHECKON) == 0) // 恢复出厂设置确认 { - ui_api_vibrate_once_func(); //恢复出厂增加震动 + custom_VibratorFunc_int(0); //恢复出厂增加震动 p_SystemView->ChangeView(FACTORYRESETVIEW, SHUTDOWNANIMATIONVIEW); ShutDownImageAnimatorView::GetInstance()->ShutDownImageAnimator_Start(2); isShutDownImageAnimatorStart = true; diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp index 48eaa0abc..1d79fa414 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp @@ -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); } diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/training_card/src/TraingCardPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/training_card/src/TraingCardPresenter.cpp index b5578722d..dc1cb0d07 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/training_card/src/TraingCardPresenter.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/training_card/src/TraingCardPresenter.cpp @@ -168,25 +168,25 @@ bool TraingCardPresenter::OpenSensor(ExerciseClass type) { } // 根据不同的运动项目进行不同的运动 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingCardPresenter::OpenSensor!!"); -#ifdef SUPPORT_PPG_SERVICE +#ifdef SUPPORT_CYWEE_SERVICE switch (type) { case ExerciseClass::NORMAL: - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NORMAL_MODE, NULL); + cywee_sport_mode_change(CYWEE_SERVICE_CMD_NORMAL_MODE); break; case ExerciseClass::TREADMILL: - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_TREADMILL_MODE, NULL); + cywee_sport_mode_change(CYWEE_SERVICE_CMD_TREADMILL_MODE); break; case ExerciseClass::OUTDOOR: - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OUTDOOR_RUNNING_MODE, NULL); + cywee_sport_mode_change(CYWEE_SERVICE_CMD_OUTDOOR_RUNNING_MODE); break; case ExerciseClass::INDOOR: - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_INDOOR_RUNNING_MODE, NULL); + cywee_sport_mode_change(CYWEE_SERVICE_CMD_INDOOR_RUNNING_MODE); break; case ExerciseClass::FITNESS_PEDOMETER: - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_FITNESS_PEDOMETER_MODE, NULL); + cywee_sport_mode_change(CYWEE_SERVICE_CMD_FITNESS_PEDOMETER_MODE); break; case ExerciseClass::FREE_TRAINING: - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_FREE_TRAINING_MODE, NULL); + cywee_sport_mode_change(CYWEE_SERVICE_CMD_FREE_TRAINING_MODE); break; default: break; diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/alarm_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/alarm_notification.cpp index 20b62a70a..ffdc01b96 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/alarm_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/alarm_notification.cpp @@ -118,7 +118,7 @@ namespace OHOS // } if (g_alarmView) { - ui_api_vibrate_once_func(); + custom_VibratorFunc_int(0); } } } diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp index 59049e77f..2da51f1f7 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp @@ -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") { diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/drinkReminder_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/drinkReminder_notification.cpp index 9ba0d30fb..6545ed202 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/drinkReminder_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/drinkReminder_notification.cpp @@ -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秒关闭 diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/findwatch_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/findwatch_notification.cpp index 7dfe82317..d40dc8970 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/findwatch_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/findwatch_notification.cpp @@ -105,7 +105,7 @@ namespace OHOS { if (nullptr != FindWatchGroupView) { - ui_api_vibrate_once_func(); + custom_VibratorFunc_int(0); } } diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/goal_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/goal_notification.cpp index f56113b04..1f8845c28 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/goal_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/goal_notification.cpp @@ -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) diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/message_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/message_notification.cpp index 21701129f..599146089 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/message_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/message_notification.cpp @@ -273,7 +273,7 @@ namespace OHOS (!uapi_sleep_mode_flag_get())) { // 震动提醒 - ui_api_vibrate_once_func(); + custom_VibratorFunc_int(0); } MessageViewEventListener::GetInstance() diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/motion_recognition_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/motion_recognition_notification.cpp index 9c83eefd8..889f4ee65 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/motion_recognition_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/motion_recognition_notification.cpp @@ -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); diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/pairing_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/pairing_notification.cpp index 5319d241c..6f7638043 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/pairing_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/pairing_notification.cpp @@ -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 diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/sedentaryReminder_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/sedentaryReminder_notification.cpp index 3e0b08773..18b528cf5 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/sedentaryReminder_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/sedentaryReminder_notification.cpp @@ -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); diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/sleep_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/sleep_notification.cpp index d6e43ee15..8fcbf9f77 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/sleep_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/sleep_notification.cpp @@ -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秒关闭 diff --git a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp index 557dec374..f31b14918 100644 --- a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp @@ -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}, diff --git a/code/sdk/application/wearable/service/msg_center/src/notify/pairing_notification.cpp b/code/sdk/application/wearable/service/msg_center/src/notify/pairing_notification.cpp index f01f7f7b7..863284d5e 100644 --- a/code/sdk/application/wearable/service/msg_center/src/notify/pairing_notification.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/notify/pairing_notification.cpp @@ -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 diff --git a/code/sdk/drivers/drivers/driver/lcd/lcd_config.c b/code/sdk/drivers/drivers/driver/lcd/lcd_config.c index 5bc2f3aa7..1d7dad9ff 100644 --- a/code/sdk/drivers/drivers/driver/lcd/lcd_config.c +++ b/code/sdk/drivers/drivers/driver/lcd/lcd_config.c @@ -143,10 +143,17 @@ const lcd_cmd_sequ g_common_cmd_display_off[] = { }; const lcd_cmd_sequ g_common_466x466_cmd_display_off[] = { +#if defined(BOARD_W9) || defined(BOARD_N9) + {1, 2, {0xfe, 0x00}, 0}, /* select default cmd page */ + {1, 1, {0x28}, 10}, /* display off */ + {1, 1, {0x10}, 120}, /* sleep in */ + {1, 2, {0x4f, 0x01}, 100}, /* sleep in */ +#else {1, 2, {0xfe, 0x00}, 0}, /* select default cmd page */ {1, 1, {0x28}, 0}, /* display off */ {1, 1, {0x10}, 120}, /* sleep in */ - {1, 2, {0x4f, 0x01}, 0}, /* 进deepstandby 状态 */ + {1, 2, {0x4f, 0x01}, 0}, /* ��deepstandby ״̬ */ +#endif }; /* sleep in sequence for common lcd */ const lcd_cmd_sequ g_common_cmd_sleep_in[] = { diff --git a/code/sdk/drivers/drivers/driver/lcd/lcd_private.c b/code/sdk/drivers/drivers/driver/lcd/lcd_private.c index 315c09011..23e8c4737 100644 --- a/code/sdk/drivers/drivers/driver/lcd/lcd_private.c +++ b/code/sdk/drivers/drivers/driver/lcd/lcd_private.c @@ -1,3 +1,11 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2025-07-29 09:33:56 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-07-30 11:37:00 + * @FilePath: /FD230/code/sdk/drivers/drivers/driver/lcd/lcd_private.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ /* * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. * Description: Lcd private interface. @@ -53,7 +61,9 @@ static void lcd_drv_power_off(void) uapi_gpio_set_dir(VCI_LCD_GPIO, GPIO_DIRECTION_OUTPUT); uapi_gpio_set_val(VCI_LCD_GPIO, GPIO_LEVEL_LOW); #endif +#if defined(BOARD_FD230) uapi_tcxo_delay_ms(10); /* delay 10 ms */ +#endif int resetvalue = uapi_gpio_get_output_val(RESET_LCD_GPIO); int lcd_envalue = uapi_gpio_get_output_val(VCI_LCD_GPIO); printf("Output RESET_LCD_GPIO %d , VCI_LCD_GPIO %d\r\n",resetvalue,lcd_envalue); diff --git a/code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.h b/code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.h index e2f5c200b..5250e76d0 100644 --- a/code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.h +++ b/code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.h @@ -135,7 +135,7 @@ extern "C" { #define CST86XX_REPORT_REG 0x0186 /* 设置中断上报频率 */ #define CST86XX_PIXEL_THRESHOLD_REG 0x00C3 /* Register Map */ -#define CST86XX_SLEEP_CMD 0xA5 +#define CST86XX_SLEEP_CMD 0xE5 #define CST86XX_FIRMWARE_VERSION 0xA9 #define CST86XX_FACTORY_ID 0xAA #define CST86XX_HW_ID 0xA7 diff --git a/code/sdk/zhihui/UI/producttest/src/testcat1.cpp b/code/sdk/zhihui/UI/producttest/src/testcat1.cpp index 824499b72..75f57b66c 100644 --- a/code/sdk/zhihui/UI/producttest/src/testcat1.cpp +++ b/code/sdk/zhihui/UI/producttest/src/testcat1.cpp @@ -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(); diff --git a/code/sdk/zhihui/UI/producttest/src/testhrsenson.cpp b/code/sdk/zhihui/UI/producttest/src/testhrsenson.cpp index 80f411c8b..7e82ccfa2 100644 --- a/code/sdk/zhihui/UI/producttest/src/testhrsenson.cpp +++ b/code/sdk/zhihui/UI/producttest/src/testhrsenson.cpp @@ -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); diff --git a/code/sdk/zhihui/config/src/ConfigModel.cpp b/code/sdk/zhihui/config/src/ConfigModel.cpp index 86d869db4..730f171dc 100644 --- a/code/sdk/zhihui/config/src/ConfigModel.cpp +++ b/code/sdk/zhihui/config/src/ConfigModel.cpp @@ -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) diff --git a/code/sdk/zhihui/drivers/bp/CMakeLists.txt b/code/sdk/zhihui/drivers/bp/CMakeLists.txt index 15776c1fc..99dcb821b 100644 --- a/code/sdk/zhihui/drivers/bp/CMakeLists.txt +++ b/code/sdk/zhihui/drivers/bp/CMakeLists.txt @@ -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 diff --git a/code/sdk/zhihui/drivers/bp/bn02/bn02.c b/code/sdk/zhihui/drivers/bp/bn02/bn02.c index 6159755b6..8a5af3ec9 100644 --- a/code/sdk/zhihui/drivers/bp/bn02/bn02.c +++ b/code/sdk/zhihui/drivers/bp/bn02/bn02.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2025-01-16 12:35:15 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-02-14 11:37:22 + * @LastEditTime: 2025-07-30 11:50:19 * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -14,23 +14,49 @@ #include "i2c.h" #include "pm_definition.h" #include "bp_ble_service.h" +#include "bp_tcp_server.h" + #define BN02_I2C_ADDR 0x05 #define BN02_I2C_BUS I2C_BUS_0 #define I2C_ADDR_BN02_W 0x0a #define I2C_ADDR_BN02_R 0x0b -#define P_EN S_AGPIO_L24 -#define P_INT S_AGPIO_R3 +#define BP_EN S_AGPIO_L19 +#define BP_INT S_AGPIO_R3 #define POWER_EN S_AGPIO_R0 -bool Bn02_write_reg(uint8_t data) +#define BN02_FILE "user/userdata/bn02.bin" + +#define MAX_CNT 48 * 5 * 60 + +static int DATA_HANDLE = 1 << 24; + +static FILE *fp = NULL; + +static int data_cnt = 0; + +static uint8_t *bn02_data = NULL; + +static uint8_t bn02_ui_data[48] = {0}; + +void bn02_get_ui_data(uint8_t *data,uint8_t len) { - uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP); - if (cnt == 0) - { - uapi_pm_add_sleep_veto(PM_ID_BP); - } + if(data == NULL || len == 0 || len > 48) + { + printf("bn02_get_ui_data valid param \n"); + return; + } + memcpy_s(data,len,bn02_ui_data,len); +} + +bool Bn02_write_reg(uint8_t data) +{ + // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP); + // if (cnt == 0) + // { + // uapi_pm_add_sleep_veto(PM_ID_BP); + // } i2c_data_t i2c_data; i2c_data.send_buf = &data; @@ -42,11 +68,12 @@ bool Bn02_write_reg(uint8_t data) if (ret != ERRCODE_SUCC) printf("i2c Write data write fail! ret=0x%x\n", ret); - cnt = pm_veto_get_id_cnt(PM_ID_BP); - if (cnt == 1) - { - uapi_pm_remove_sleep_veto(PM_ID_BP); - } + + // cnt = pm_veto_get_id_cnt(PM_ID_BP); + // if (cnt == 1) + // { + // uapi_pm_remove_sleep_veto(PM_ID_BP); + // } return 1; } @@ -54,11 +81,11 @@ bool Bn02_write_reg(uint8_t data) bool Bn02_reads(uint8_t *data,int len) { - uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP); - if (cnt == 0) - { - uapi_pm_add_sleep_veto(PM_ID_BP); - } + // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP); + // if (cnt == 0) + // { + // uapi_pm_add_sleep_veto(PM_ID_BP); + // } i2c_data_t i2c_data; i2c_data.send_buf = NULL; @@ -70,11 +97,11 @@ bool Bn02_reads(uint8_t *data,int len) if (ret != ERRCODE_SUCC) printf("i2c read data fail! ret=0x%x\n", ret); - cnt = pm_veto_get_id_cnt(PM_ID_BP); - if (cnt == 1) - { - uapi_pm_remove_sleep_veto(PM_ID_BP); - } + // cnt = pm_veto_get_id_cnt(PM_ID_BP); + // if (cnt == 1) + // { + // uapi_pm_remove_sleep_veto(PM_ID_BP); + // } return 1; } @@ -92,32 +119,33 @@ void Bn02_Power_Ctrl(int onoff) uapi_gpio_set_dir(POWER_EN, GPIO_DIRECTION_OUTPUT); uapi_gpio_set_val(POWER_EN, GPIO_LEVEL_HIGH); LOS_Mdelay(1); - uapi_pin_set_mode(P_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO); - uapi_gpio_set_dir(P_EN, GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(P_EN, GPIO_LEVEL_HIGH); + uapi_pin_set_mode(BP_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO); + uapi_gpio_set_dir(BP_EN, GPIO_DIRECTION_OUTPUT); + uapi_gpio_set_val(BP_EN, GPIO_LEVEL_HIGH); // delay_ms(20); LOS_Mdelay(50); } else { - uapi_pin_set_mode(P_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO); - uapi_gpio_set_dir(P_EN, GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(P_EN, GPIO_LEVEL_LOW); - + uapi_pin_set_mode(BP_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO); + uapi_gpio_set_dir(BP_EN, GPIO_DIRECTION_OUTPUT); + uapi_gpio_set_val(BP_EN, GPIO_LEVEL_LOW); + LOS_Mdelay(1); uapi_pin_set_mode(POWER_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO); uapi_gpio_set_dir(POWER_EN, GPIO_DIRECTION_OUTPUT); uapi_gpio_set_val(POWER_EN, GPIO_LEVEL_LOW); + LOS_Mdelay(10); } } void bn02_int_init(void) { - uapi_pin_set_ie(P_INT,HAL_PIO_IE_ENBALE); + uapi_pin_set_ie(BP_INT,HAL_PIO_IE_ENBALE); } void bn02_int_deinit(void) { - uapi_pin_set_ie(P_INT,HAL_PIO_IE_DISABLE); + uapi_pin_set_ie(BP_INT,HAL_PIO_IE_DISABLE); } void bn02_int_handle(void) @@ -126,17 +154,54 @@ void bn02_int_handle(void) int i; memset(bn02_buf,0,sizeof(bn02_buf)); Bn02_reads(bn02_buf,48); + int reply_data[16] = {0}; + int cnt = 0; + for(i = 0;i<48;i+=3,cnt++) + { + reply_data[cnt] = ((bn02_buf[i] & 0xff) << 16) + + ((bn02_buf[i + 1] & 0xff) << 8) + + (bn02_buf[i + 2] & 0xff); + + if (reply_data[cnt] >= DATA_HANDLE / 2) + reply_data[cnt] -= DATA_HANDLE; - if(bn02_get_ble_status()) - { - bn02_replymsg(bn02_buf,sizeof(bn02_buf),1); - } + // printf("data[%d]:%d\n",cnt,reply_data[cnt]); + // 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]); + } + if(uapi_cat1_get_power_stat()) + do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SEND_DATA,(void *)reply_data,cnt); - for(i = 0;i<48;i++) + if(bn02_data && fp) { - printf("[%d]= 0x%x\n",i,bn02_buf[i]); + if(data_cnt >= MAX_CNT) + { + if(fwrite(bn02_data,1,data_cnt,fp) != cnt) + printf("bn02 fwrite failed\n"); + else + { + printf("bn02 fwrite succed data_cnt:%d\n",cnt); + data_cnt = 0; + memset(bn02_data,0,MAX_CNT); + } + } + else + { + printf("data_cnt:%d\n",data_cnt); + memcpy_s(bn02_data + data_cnt,MAX_CNT - data_cnt,bn02_buf,48); + // memset(bn02_ui_data,0,48); + memcpy_s(bn02_ui_data,48,bn02_buf,48); + // for(int i = tcp_data_cnt; i < tcp_data_cnt+len; i ++) + // { + // printf("222data[%d]:%d\n",i,tcp_data[i]); + // } + data_cnt += 48; + } } + + if(bn02_get_ble_status()) + bn02_replymsg(bn02_buf,48,1); + } void bn02_start(void) @@ -144,6 +209,22 @@ void bn02_start(void) Bn02_Power_Ctrl(1); bn02_int_init(); Bn02_write_reg(BN02_START_CMD); +#if 0 + if(bn02_data == NULL) + { + bn02_data = malloc(MAX_CNT); + if(bn02_data == NULL) + printf("bn02_data malloc failed\n"); + } + + data_cnt = 0; + + fp = fopen(BN02_FILE, "ab+"); + if(fp == NULL) + printf("open %s failed\n",BN02_FILE); + else + printf("open %s succed\n",BN02_FILE); +#endif } void bn02_stop(void) @@ -151,4 +232,25 @@ void bn02_stop(void) bn02_int_deinit(); Bn02_write_reg(BN02_STOP_CMD); Bn02_Power_Ctrl(0); + + // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP); + // if (cnt == 1) + // { + // uapi_pm_remove_sleep_veto(PM_ID_BP); + // } + + // do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SERVER_DEINIT,NULL,0); + +#if 0 + if(fp != NULL) + { + fclose(fp); + fp = NULL; + } + if(bn02_data != NULL) + { + free(bn02_data); + bn02_data = NULL; + } +#endif } diff --git a/code/sdk/zhihui/drivers/bp/bn02/bn02.h b/code/sdk/zhihui/drivers/bp/bn02/bn02.h index c4216a982..19de496f4 100644 --- a/code/sdk/zhihui/drivers/bp/bn02/bn02.h +++ b/code/sdk/zhihui/drivers/bp/bn02/bn02.h @@ -2,31 +2,20 @@ * @Author: penglei 1624952103@qq.com * @Date: 2025-01-16 12:35:15 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-01-16 14:55:48 + * @LastEditTime: 2025-07-30 11:50:25 * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.h * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #ifndef _BN02_H_ #define _BN02_H_ -enum -{ - - BN02_INT_HANDLE, - BN02_INIT_ENABLE, - BN02_START, - BN02_POWER_DISABLE, - BN02_STOP, -}; - #define BN02_START_CMD 0x04 #define BN02_STOP_CMD 0x08 void bn02_int_handle(void); - void bn02_start(void); - void bn02_stop(void); +void bn02_get_ui_data(uint8_t *data,uint8_t len); #endif // _HRS3300_H_ diff --git a/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c b/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c index 9a5c697f6..1ea0519b7 100644 --- a/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c +++ b/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c @@ -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> 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; } diff --git a/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h b/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h index ace1004f6..382779e2e 100644 --- a/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h +++ b/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h @@ -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 index 000000000..3935495c1 --- /dev/null +++ b/code/sdk/zhihui/drivers/bp/service/bp_tcp_server.c @@ -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 +#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 +// #include +#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 index 000000000..42c9450f3 --- /dev/null +++ b/code/sdk/zhihui/drivers/bp/service/bp_tcp_server.h @@ -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 diff --git a/code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c b/code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c index 121c6ffb8..7cd7be5b7 100644 --- a/code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c +++ b/code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c @@ -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){ diff --git a/code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h b/code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h index 2072b2aa3..59d9c74db 100644 --- a/code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h +++ b/code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h @@ -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 diff --git a/code/sdk/zhihui/drivers/cywee/service/cywee_service.c b/code/sdk/zhihui/drivers/cywee/service/cywee_service.c index 227684ab8..4c13f5730 100644 --- a/code/sdk/zhihui/drivers/cywee/service/cywee_service.c +++ b/code/sdk/zhihui/drivers/cywee/service/cywee_service.c @@ -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"); diff --git a/code/sdk/zhihui/drivers/cywee/service/cywee_service.h b/code/sdk/zhihui/drivers/cywee/service/cywee_service.h index 2e19c493f..663277294 100644 --- a/code/sdk/zhihui/drivers/cywee/service/cywee_service.h +++ b/code/sdk/zhihui/drivers/cywee/service/cywee_service.h @@ -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 */ diff --git a/code/sdk/zhihui/drivers/mag/CMakeLists.txt b/code/sdk/zhihui/drivers/mag/CMakeLists.txt index 19b960dfa..a37147b2f 100644 --- a/code/sdk/zhihui/drivers/mag/CMakeLists.txt +++ b/code/sdk/zhihui/drivers/mag/CMakeLists.txt @@ -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 index 7f82aa03d..000000000 --- a/code/sdk/zhihui/drivers/mag/hal/CMakeLists.txt +++ /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() diff --git a/code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_hal.h b/code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_hal.h index 5b95cb823..4968ca215 100644 --- a/code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_hal.h +++ b/code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_hal.h @@ -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); diff --git a/code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_main.c b/code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_main.c index a131c35d1..d88f6e933 100644 --- a/code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_main.c +++ b/code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_main.c @@ -304,7 +304,7 @@ int SavePara(float *p) #define MMC_DATA_PATH "/user/userdata/mmc_para.bin" -int mmc5603_savePara_infile(void) +int mag_savePara_infile(void) { FILE * fp = fopen(MMC_DATA_PATH,"wb"); size_t ret = 0; @@ -326,7 +326,7 @@ int mmc5603_savePara_infile(void) return 1; } -int mmc5603_readPara_infile(void) +int mag_readPara_infile(void) { FILE * fp = fopen(MMC_DATA_PATH,"rb"); if(fp==NULL) diff --git a/code/sdk/zhihui/drivers/mag/service/CMakeLists.txt b/code/sdk/zhihui/drivers/mag/service/CMakeLists.txt index 9a135efb5..b51ee110a 100644 --- a/code/sdk/zhihui/drivers/mag/service/CMakeLists.txt +++ b/code/sdk/zhihui/drivers/mag/service/CMakeLists.txt @@ -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 diff --git a/code/sdk/zhihui/drivers/mag/hal/mag_hal.c b/code/sdk/zhihui/drivers/mag/service/mag_hal.c 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 124b501d9..87ee4af34 100644 --- a/code/sdk/zhihui/drivers/mag/hal/mag_hal.c +++ b/code/sdk/zhihui/drivers/mag/service/mag_hal.c @@ -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(); diff --git a/code/sdk/zhihui/drivers/mag/hal/mag_hal.h b/code/sdk/zhihui/drivers/mag/service/mag_hal.h 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 591ec7163..1833818bf 100644 --- a/code/sdk/zhihui/drivers/mag/hal/mag_hal.h +++ b/code/sdk/zhihui/drivers/mag/service/mag_hal.h @@ -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); diff --git a/code/sdk/zhihui/drivers/mag/service/mag_service.c b/code/sdk/zhihui/drivers/mag/service/mag_service.c index 97a439fb4..e261154d9 100644 --- a/code/sdk/zhihui/drivers/mag/service/mag_service.c +++ b/code/sdk/zhihui/drivers/mag/service/mag_service.c @@ -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); diff --git a/code/sdk/zhihui/drivers/mag/service/mag_service.h b/code/sdk/zhihui/drivers/mag/service/mag_service.h index 47682f43b..d568ec21f 100644 --- a/code/sdk/zhihui/drivers/mag/service/mag_service.h +++ b/code/sdk/zhihui/drivers/mag/service/mag_service.h @@ -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 diff --git a/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c b/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c index 7ad63534a..ed35c71a2 100644 --- a/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c +++ b/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c @@ -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; } diff --git a/code/sdk/zhihui/drivers/ppg/hx3695/hx3695.c b/code/sdk/zhihui/drivers/ppg/hx3695/hx3695.c index 94b0de845..de1745418 100644 --- a/code/sdk/zhihui/drivers/ppg/hx3695/hx3695.c +++ b/code/sdk/zhihui/drivers/ppg/hx3695/hx3695.c @@ -2757,7 +2757,8 @@ void hx3695_wearstatus_update(void) { history_wear_status = wear_status; #ifdef SUPPORT_CYWEE_SERVICE - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,&wear_status); + // do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,&wear_status); + cywee_wear_status_update(&wear_status); #endif } } @@ -3907,5 +3908,12 @@ void hx3695_control(char *mode,uint8_t enable) } } +int32_t hx3695_get_factory_data(void) +{ + int32_t data = factory_data; + factory_data = 0; + return data; +} + #endif //CHIP_HX3695 diff --git a/code/sdk/zhihui/drivers/ppg/hx3695/hx3695.h b/code/sdk/zhihui/drivers/ppg/hx3695/hx3695.h index 6ceb1a220..f976cb8b9 100644 --- a/code/sdk/zhihui/drivers/ppg/hx3695/hx3695.h +++ b/code/sdk/zhihui/drivers/ppg/hx3695/hx3695.h @@ -304,5 +304,6 @@ uint8_t hx3695_get_hrs_ble_swtich(void); uint8_t hx3695_get_hrs(void); uint8_t hx3695_get_spo2(void); uint8_t hx3695_get_wear_status(void); +int32_t hx3695_get_factory_data(void); #endif diff --git a/code/sdk/zhihui/drivers/ppg/hx3695/hx3695_factory_test.c b/code/sdk/zhihui/drivers/ppg/hx3695/hx3695_factory_test.c index 37992c20f..9a94ffa7e 100644 --- a/code/sdk/zhihui/drivers/ppg/hx3695/hx3695_factory_test.c +++ b/code/sdk/zhihui/drivers/ppg/hx3695/hx3695_factory_test.c @@ -2919,7 +2919,7 @@ FT_RESULTS_t hx3695_factroy_test(TEST_MODE_t test_mode) return ft_result; } -void hx3695_get_factory_data(uint32_t *green,uint32_t *red,uint32_t *ir) +void hx3695_get_leaklight_data(uint32_t *green,uint32_t *red,uint32_t *ir) { *green = factory_green; *red = factory_red; diff --git a/code/sdk/zhihui/drivers/ppg/hx3695/hx3695_factory_test.h b/code/sdk/zhihui/drivers/ppg/hx3695/hx3695_factory_test.h index 397a97176..4def261ad 100644 --- a/code/sdk/zhihui/drivers/ppg/hx3695/hx3695_factory_test.h +++ b/code/sdk/zhihui/drivers/ppg/hx3695/hx3695_factory_test.h @@ -48,6 +48,8 @@ void hx3695_lab_test_read(void); void hx3695_get_factory_data(uint32_t *green,uint32_t *red,uint32_t *ir); +void hx3695_get_leaklight_data(uint32_t *green,uint32_t *red,uint32_t *ir); + #endif // _HX3695_FACTORY_TEST_H_ diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.c b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.c index d03000b3a..960bb7bf5 100644 --- a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.c +++ b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.c @@ -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()); if(uapi_dev_runtime_get_train_status()) { -#ifdef SUPPORT_CYWEE_SERVICE - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_HRS_CHANGE,&data); -#endif } else { @@ -153,7 +150,7 @@ static void pah8009_wearstatus_update(int wear_status) { history_wear_status = wear_status; #ifdef SUPPORT_CYWEE_SERVICE - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,(uint8_t *)&history_wear_status); + cywee_wear_status_update((uint8_t *)&history_wear_status); #endif // if(wear_status != 1) // { diff --git a/code/sdk/zhihui/drivers/ppg/service/CMakeLists.txt b/code/sdk/zhihui/drivers/ppg/service/CMakeLists.txt index 8315e769d..ab98aa385 100644 --- a/code/sdk/zhihui/drivers/ppg/service/CMakeLists.txt +++ b/code/sdk/zhihui/drivers/ppg/service/CMakeLists.txt @@ -49,7 +49,6 @@ set(MAIN_COMPONENT ) set(PUBLIC_DEFINES -SUPPORT_PPG_SERVICE SUPPORT_AT_PPG ) diff --git a/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp b/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp index 6cdc1dc75..506db1698 100644 --- a/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp +++ b/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp @@ -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 */ diff --git a/code/sdk/zhihui/drivers/vibrator/service/vibrator_service.cpp b/code/sdk/zhihui/drivers/vibrator/service/vibrator_service.cpp index 9cb5d98df..8d8d826e0 100644 --- a/code/sdk/zhihui/drivers/vibrator/service/vibrator_service.cpp +++ b/code/sdk/zhihui/drivers/vibrator/service/vibrator_service.cpp @@ -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 diff --git a/code/sdk/zhihui/drivers/vibrator/service/vibrator_service.h b/code/sdk/zhihui/drivers/vibrator/service/vibrator_service.h index c9dcbe412..9bf9ccac0 100644 --- a/code/sdk/zhihui/drivers/vibrator/service/vibrator_service.h +++ b/code/sdk/zhihui/drivers/vibrator/service/vibrator_service.h @@ -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); diff --git a/code/sdk/zhihui/services/battery/service/battery_driver.cpp b/code/sdk/zhihui/services/battery/service/battery_driver.cpp index 9baeccaa9..165b31aa3 100644 --- a/code/sdk/zhihui/services/battery/service/battery_driver.cpp +++ b/code/sdk/zhihui/services/battery/service/battery_driver.cpp @@ -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; diff --git a/code/sdk/zhihui/services/battery/service/battery_service.cpp b/code/sdk/zhihui/services/battery/service/battery_service.cpp index 46731f32a..d94b05e3d 100644 --- a/code/sdk/zhihui/services/battery/service/battery_service.cpp +++ b/code/sdk/zhihui/services/battery/service/battery_service.cpp @@ -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; } diff --git a/code/sdk/zhihui/services/ble_service/blemoder/ble_congfig_adapt.cpp b/code/sdk/zhihui/services/ble_service/blemoder/ble_congfig_adapt.cpp index e7518122f..788b91165 100644 --- a/code/sdk/zhihui/services/ble_service/blemoder/ble_congfig_adapt.cpp +++ b/code/sdk/zhihui/services/ble_service/blemoder/ble_congfig_adapt.cpp @@ -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 ; diff --git a/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp b/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp index 82cffc228..991564211 100644 --- a/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp +++ b/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp @@ -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 ; } diff --git a/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c b/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c index f1b5a4131..2c051f723 100644 --- a/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c +++ b/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2024-06-17 14:31:08 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-07-28 16:50:17 + * @LastEditTime: 2025-07-29 14:46:36 * @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c * @Description: * @@ -175,13 +175,30 @@ static void func_button_callback_long_press_2s(void) void ble_vibrator_check_timer_callback(void) { // uapi_vibrationModeSet(3); - ui_api_vibrate_once_func(); + custom_VibratorFunc_int(0); } void ble_acc_check_timer_callback(void) { uint8_t databuf[6]; - get_gsensor_single(databuf); + +#ifdef SUPPORT_CYWEE_SERVICE + gsenson_t t; + cywee_get_gsensor_data(1,&t); + uint16_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); +#endif factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_ACC, @@ -1369,7 +1386,23 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint { //单次获得acc uint8_t databuf[6]; - get_gsensor_single(databuf); +#ifdef SUPPORT_CYWEE_SERVICE + gsenson_t t; + cywee_get_gsensor_data(1,&t); + uint16_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); +#endif factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_ACC, diff --git a/code/sdk/zhihui/services/gnss/CMakeLists.txt b/code/sdk/zhihui/services/gnss/CMakeLists.txt index 85161725c..637cfa92a 100644 --- a/code/sdk/zhihui/services/gnss/CMakeLists.txt +++ b/code/sdk/zhihui/services/gnss/CMakeLists.txt @@ -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 diff --git a/code/sdk/zhihui/services/gnss/driver/common/interface/board_interface/board_porting/tiot_board_pin_port.h b/code/sdk/zhihui/services/gnss/driver/common/interface/board_interface/board_porting/tiot_board_pin_port.h index 4d849083e..51810a89a 100644 --- a/code/sdk/zhihui/services/gnss/driver/common/interface/board_interface/board_porting/tiot_board_pin_port.h +++ b/code/sdk/zhihui/services/gnss/driver/common/interface/board_interface/board_porting/tiot_board_pin_port.h @@ -29,19 +29,7 @@ extern "C" { */ #define TIOT_PIN_NONE 0xFFFFFFFFU -#ifdef BOARD_U8 -#define TIOT_UART_PORT UART_BUS_0 -#define TIOT_PIN_WAKEUP_HOST_NUM S_AGPIO_L31 /* 用于唤醒HOST. */ -#define TIOT_PIN_WAKEUP_GNSS_NUM TIOT_PIN_NONE /* 用于 唤醒GNSS. */ -#define TIOT_PIN_POWER S_AGPIO_L30 /* 用于开启GNSS. */ - -#define TIOT_PIN_UART_TX S_MGPIO19 -#define TIOT_PIN_UART_RX S_MGPIO20 -#define TIOT_PIN_UART_CTS S_MGPIO22 -#define TIOT_PIN_UART_RTS S_MGPIO21 -#define TIOT_PINMUX HAL_PIO_FUNC_UART1 - -#elif defined(BOARD_L22) || defined(BOARD_W9) || defined(BOARD_N9) +#if defined(BOARD_W9) || defined(BOARD_N9) #define TIOT_UART_PORT UART_BUS_1 #define TIOT_PIN_WAKEUP_HOST_NUM S_AGPIO_L15 /* 用于唤醒HOST. */ #define TIOT_PIN_WAKEUP_GNSS_NUM S_HGPIO0 /* 用于 唤醒GNSS. */ diff --git a/code/sdk/zhihui/services/gnss/inc/NMEA0183.h b/code/sdk/zhihui/services/gnss/inc/NMEA0183.h index ba7690ca7..831baecc9 100644 --- a/code/sdk/zhihui/services/gnss/inc/NMEA0183.h +++ b/code/sdk/zhihui/services/gnss/inc/NMEA0183.h @@ -258,6 +258,7 @@ char* get_gps_sentence_type_str(sentence_types sentencetype); void dump_location_data(gps_data_t *locationdata); void dump_location_data_to_buf(gps_data_t *locationdata,char* buf,int max_buflen); gps_data_t * getGPSGlobaldata(void); +gps_data_t * getPGPSGlobaldata(void); void dump_location_data_to_factory(gps_data_t *locationdata,char* buf,int max_buflen); 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 index 000000000..e67dfcd71 --- /dev/null +++ b/code/sdk/zhihui/services/gnss/inc/gnss_tcp_server.h @@ -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 diff --git a/code/sdk/zhihui/services/gnss/sample/gnss_sample/gnss_sample.c b/code/sdk/zhihui/services/gnss/sample/gnss_sample/gnss_sample.c index e59debb8d..a4984ce2c 100644 --- a/code/sdk/zhihui/services/gnss/sample/gnss_sample/gnss_sample.c +++ b/code/sdk/zhihui/services/gnss/sample/gnss_sample/gnss_sample.c @@ -11,6 +11,11 @@ #include "pm_definition.h" #include "gnss_ctl.h" +#ifdef SUPPORT_CYWEE_SERVICE +#include "cywee_hal.h" +#include "cywee_service.h" +#endif + #define COLDSTART_FIXMODEGPS_NMEAALL_SAMPLE 0 #define AUTOSTART_FIXMODEALL_NMEADEF_SAMPLE 1 @@ -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)); ret = 1; memset(&g_nmeadata,0,sizeof(g_nmeadata)); +#ifdef SUPPORT_CYWEE_SERVICE + if(uapi_dev_runtime_get_train_status()) + do_cywee_service_check_msg(CYWEE_SERVICE_CMD_GNSS_UPDATE,NULL); +#endif } } 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 index 000000000..2e4b6034d --- /dev/null +++ b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/CMakeLists.txt @@ -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 index 000000000..4d4a9a3b1 --- /dev/null +++ b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/gnss_datatypes.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. + * Description: gnss datatypes + * Author: + * Create: + */ +#ifndef GNSS_DATATYPES_H +#define GNSS_DATATYPES_H + +#include + +#define MSG_CONTENT_IDX 2 +#define LISTEN_TIME_THR 1000 +#define REPORT_MAX_BYTES 10000 + +// 消息类型 +typedef enum { + CMD_INJECT_HIS_INFO = 0x0101, // 历史信息注入 + CMD_PGNSS_INJECT_REF_GPS_TIME = 0x0201, // GPS时间注入 + CMD_PGNSS_INJECT_REF_LOC = 0x0202, // 参考位置注入 + CMD_PGNSS_INJECT_EPH_GPS = 0x0203, // GPS星历注入 + CMD_PGNSS_INJECT_EPH_GANSS = 0x0204, // 非GPS星历注入 + CMD_PGNSS_INJECT_UTC_GPS = 0x0205, // GPS UTC注入 + CMD_PGNSS_INJECT_RTI_GPS = 0x0206, // GPS完好性信息注入 + CMD_PGNSS_INJECT_RTI_GANSS = 0x0207, // 非GPS完好性信息注入 + CMD_PGNSS_INJECT_ION_GPS = 0x0208, // GPS电离层参数注入 + CMD_PGNSS_INJECT_AUX_GANSS = 0x0209, // 非GPS频点转换关系信息注入 + CMD_XGNSS_INJECT_UTC_TIME = 0x0404, // 最开始注入的UTC时间 + CMD_BUTT, +} GnssCmdType; + +#pragma pack(1) +typedef struct { + uint16_t cmd; // 消息类型 + uint16_t checkSum; // 校验和,只计算实际数据部分,不包含头 + uint16_t sequence; // 序列号,host下发 + uint16_t dataLength; // 数据长度,实际数据的长度,不包含头 + uint8_t data[0]; +} GnssMsg; + +typedef struct { + uint16_t year; // YYYY + uint8_t month; // MM, 1~12 + uint8_t day; // DD, 1~31 + uint8_t hour; // hh, 0~23 + uint8_t minute; // mm, 0~59 + uint8_t second; // ss, 0~59 + uint16_t ms; // ms, 0~999 + uint8_t valid; // 0: invalid, 1: valid +} GnssUtcTime; + +typedef struct { + uint32_t time; // eph reference time + uint16_t cmd; // cmd type to injected eph + uint32_t len; // actual length of injected eph +} EphHeadInfo; + +typedef struct { + uint16_t cmd; // cmd type to injected other assist info + uint32_t len; // actual length of injected other assist info +} OtherAssistHeadInfo; + +#pragma pack() + +#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 index 000000000..5d677d42a --- /dev/null +++ b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_encode.c @@ -0,0 +1,603 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. + * Description: pgnss encode + * Author: + * Create: + */ +#include "pgnss_encode.h" +#include +#include +#include +#include "securec.h" +#include "tiot_service_interface.h" +#include "gnss_datatypes.h" + + +#define GNSS_ENCODE_BUFF_MAX_LEN 9300 +#define FILE_PATH_LEN 1024 +#define GLO_EPH_VALID_TIME 900 +#define OTHER_EPH_VALID_TIME 7200 +#define ONE_CENTURY_YEARS 100 +#define FOUR_CENTURY_YEARS 400 +#define LEAP_YEAR_LENGTH 4 +#define UNIX_TIME_START_YEAR 1970 // start year of unix time +#define TIME_UNIT 1000 +#define SECONDS_PER_MIN (60) +#define SECONDS_PER_HOUR (60 * SECONDS_PER_MIN) +#define SECONDS_PER_DAY (24 * SECONDS_PER_HOUR) +#define SECONDS_PER_NORMAL_YEAR (365 * SECONDS_PER_DAY) +#define NON_GLO_GNSS_TYPES 4 +#define GLO_EPH_NUM_ONE_FILE 8 +#define OTHER_ASSIST_TYPES 7 +#define INJECT_SLEEP_MS_TIME 500 +#define PGNSS_FILE_MAX_SIZE 1024000 + +/** days per month on normal and leap year */ +int32_t g_normMonthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; +int32_t g_leapMonthDays[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; +// 监听消息 +static uint8_t g_ackBuff[REPORT_MAX_BYTES] = { 0 }; + +/* 获取begin和end年份之间的闰年数 */ +int32_t GetLeapYearNum(uint16_t begin, uint16_t end) +{ + if (end <= begin || end < 1) { + return 0; + } + int32_t numPer400Year = (end - 1) / FOUR_CENTURY_YEARS - begin / FOUR_CENTURY_YEARS; + int32_t numPer100Year = (end - 1) / ONE_CENTURY_YEARS - begin / ONE_CENTURY_YEARS; + int32_t numPer4Year = (end - 1) / LEAP_YEAR_LENGTH - begin / LEAP_YEAR_LENGTH; + return (numPer400Year + numPer4Year - numPer100Year); +} + +/* 闰年判断 */ +int32_t CheckIfLeapYear(uint16_t year) +{ + if ((year % ONE_CENTURY_YEARS) == 0) { + if ((year % FOUR_CENTURY_YEARS) == 0) { + return 1; + } + } else { + if ((year % LEAP_YEAR_LENGTH) == 0) { + return 1; + } + } + return 0; +} + +/* 将日历时(年月日时分秒) 转换为 unix时间(1970å¹´1月1日起的时间秒数) */ +int32_t Utc2UnixTime(GnssUtcTime utcTime, uint32_t *unixTime) +{ + if (unixTime == NULL) { + printf("\nerror: [Utc2UnixTime] null pointer!\n"); + return 0; + } + + if (utcTime.month > 12 || utcTime.valid == 0) { + printf("\nerror: [Utc2UnixTime] utcTime invalid!\n"); + return 0; + } + + // 判断是否为闰年 + int32_t *monthDays = (CheckIfLeapYear(utcTime.year) == 1) ? g_leapMonthDays : g_normMonthDays; + + // 计算从1970.01.01开始的unix 秒数 + uint32_t timestamp = 0; + timestamp += (uint32_t)(utcTime.year - UNIX_TIME_START_YEAR) * SECONDS_PER_NORMAL_YEAR; + timestamp += (uint32_t)GetLeapYearNum(UNIX_TIME_START_YEAR, utcTime.year) * SECONDS_PER_DAY; + + for (int32_t i = 1; i < utcTime.month; i++) { + timestamp += (uint32_t)monthDays[i - 1] * SECONDS_PER_DAY; + } + + timestamp += (uint32_t)(utcTime.day - 1) * SECONDS_PER_DAY; + timestamp += (uint32_t)utcTime.hour * SECONDS_PER_HOUR; + timestamp += (uint32_t)utcTime.minute * SECONDS_PER_MIN; + uint32_t timestampSec = (uint32_t)(utcTime.second + utcTime.ms / TIME_UNIT); + + *unixTime = timestamp + timestampSec; + return 1; +} + +/* 计算命令内容校准和 */ +static uint16_t CalcChecksum(uint8_t *buff, uint16_t len) +{ + uint16_t checksum = 0; + uint16_t i = 0; + while (i++ < len) { + checksum += *buff; + buff++; + } + return checksum; +} + +int32_t PgnssInjectUtcTime(tiot_handle handle, GnssUtcTime *utcTime, uint32_t* ts) +{ + uint8_t *buff = (uint8_t *)malloc(GNSS_ENCODE_BUFF_MAX_LEN); + if (buff == NULL) { + printf("\nerror: malloc failed in PgnssINjectUtcTime\r\n"); + return 0; + } + memset_s(buff, GNSS_ENCODE_BUFF_MAX_LEN, 0, GNSS_ENCODE_BUFF_MAX_LEN); + + GnssMsg *hdr = (GnssMsg *)buff; + hdr->cmd = 0x0404; + hdr->sequence = 0; + errno_t copyRet = memcpy_s(hdr->data, (GNSS_ENCODE_BUFF_MAX_LEN - sizeof(GnssMsg)), utcTime, sizeof(GnssUtcTime)); + if (copyRet != EOK) { + printf("\nmemcpy UtcTime failed! Errno is %d\r\n", copyRet); + free(buff); + return 0; + } + hdr->dataLength = sizeof(GnssUtcTime); + hdr->checkSum = CalcChecksum(hdr->data, hdr->dataLength); + int32_t ret = tiot_service_write(handle, buff, (sizeof(GnssMsg) + hdr->dataLength)); + if (ret < 0) { + printf("\nerror: PgnssInjectUtcTime error: %d\r\n", ret); + free(buff); + return 0; + } + if (Utc2UnixTime((*utcTime), ts) == 0) { + printf("\nerror: Utc2UnixTime error\r\n"); + free(buff); + return 0; + } + + free(buff); + return 1; +} + +static uint16_t FillGnssMessageData(uint8_t *inBuff, uint32_t inLen, uint8_t *outBuff, uint32_t outLen) +{ + errno_t ret = memcpy_s(outBuff, outLen, inBuff, inLen); + if (ret != EOK) { + printf("memcpy XgnssData failed! Errno is %d \r\n", ret); + return 0; + } + + return inLen; +} + +static int32_t EncodeGnssMsg(uint8_t *inBuff, uint32_t inLen, uint8_t *outBuff, uint32_t outLen) +{ + uint16_t len = FillGnssMessageData(inBuff, inLen, outBuff, outLen); + if (len > 0) { + return 1; + } + return 0; +} + +static void ListenAck(tiot_handle handle) +{ + int32_t i = 0; + for (;;) { + // 监听 + int32_t ret = tiot_service_read(handle, g_ackBuff, REPORT_MAX_BYTES, LISTEN_TIME_THR); + if (ret > 0) { + uint16_t *type = (uint16_t *)g_ackBuff; + // 二进制消息类型 + if (type[0] == 0) { + g_ackBuff[ret] = '\0'; + printf("%s\r\n", (char *)&g_ackBuff[MSG_CONTENT_IDX]); + } + i++; + } + if (i >= 1) { + printf("\r\ncnt enough\r\n"); + break; + } + } +} + +static int32_t EncodeAndInjectCmd(tiot_handle handle, GnssCmdType cmdType, uint8_t* inBuff, uint32_t inLen) +{ + // 获取GNSS业务消息头 + int32_t len = 0; + uint8_t *buff = (uint8_t *)malloc(GNSS_ENCODE_BUFF_MAX_LEN); + if (buff == NULL) { + printf("\r\nerror: malloc failed in EncodeAndInjectCmd\r\n"); + return 0; + } + memset_s(buff, GNSS_ENCODE_BUFF_MAX_LEN, 0, GNSS_ENCODE_BUFF_MAX_LEN); + + GnssMsg *gnssHdr = (GnssMsg *)buff; + len += sizeof(GnssMsg); + + gnssHdr->sequence = 0; + + int32_t retLen = EncodeGnssMsg(inBuff, inLen, buff + len, (GNSS_ENCODE_BUFF_MAX_LEN - len)); + if (retLen != 1) { + printf("\nerror: Encode Cmd failed: %d\r\n", cmdType); + free(buff); + return retLen; + } + gnssHdr->cmd = cmdType; + gnssHdr->dataLength = inLen; + gnssHdr->checkSum = CalcChecksum(gnssHdr->data, gnssHdr->dataLength); + int32_t ret = tiot_service_write(handle, buff, (sizeof(GnssMsg) + gnssHdr->dataLength)); + if (ret < 0) { + printf("\r\nerror: Inject Cmd failed: %d\r\n", cmdType); + free(buff); + return 0; + } + ListenAck(handle); + printf("\r\nInject Cmd SUCCESS: %x\r\n", cmdType); + free(buff); + return 1; +} + +void PgnssSendFileContent(tiot_handle handle, const char *fileName, GnssCmdType cmdType) +{ + FILE *fp = fopen(fileName, "rb"); + if (fp == NULL) { + printf("\r\nerror: open file failed: %s\r\n", fileName); + return; + } + fseek(fp, 0, SEEK_END); + int32_t len = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (len < 0 || len > PGNSS_FILE_MAX_SIZE) { + fclose(fp); + printf("\r\nerror: get file len failed: %s\r\n", fileName); + return; + } + uint8_t *buff = (uint8_t *)malloc(len); + if (buff == NULL) { + fclose(fp); + printf("\r\nerror: malloc file len failed: %s\r\n", fileName); + return; + } + int32_t dataSize = fread(buff, len, 1, fp); + if (dataSize < 0) { + fclose(fp); + printf("\r\nerror: read file failed: %s\r\n", fileName); + free(buff); + return; + } + fclose(fp); + EncodeAndInjectCmd(handle, cmdType, buff, len); + free(buff); +} + +int32_t FormatFileName(char *fileName, char *dName) +{ + int32_t ret = snprintf_s(fileName, FILE_PATH_LEN, (FILE_PATH_LEN - 1), "%s%s", "/user/userdata/gnss/", dName); + if (ret <= 0) { + return 0; + } + return 1; +} + +int32_t GetEphFileName(int32_t ts, const char *prefix, char *fileName) +{ + int32_t interval = (strcmp(prefix, "GLO") == 0) ? GLO_EPH_VALID_TIME : OTHER_EPH_VALID_TIME; + DIR *dir = opendir("/user/userdata/gnss/"); + if (dir == NULL) { + printf("Failed to open /user/xgnss directory.\r\n"); + return 0; + } + int32_t time, ret; + struct dirent *entry; + for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) { + // 检查文件名 + if (strstr(entry->d_name, ".eph") != NULL) { + char *p = strrchr(entry->d_name, '_'); + if (p != NULL) { + char *q = strstr(entry->d_name, prefix); + if (q != NULL) { + time = atoi(p + 1); + if (abs(time - ts) <= interval) { + ret = FormatFileName(fileName, entry->d_name); + closedir(dir); + return ret; + } + else + { + printf("time:%d,ts:%d,interval:%d\r\n",time,ts,interval); + } + } + } + } + } + closedir(dir); + printf("closedir(dir);\r\n"); + return 0; +} + +void PgnssSendEphFile(tiot_handle handle, const char *prefix, GnssCmdType cmdType, uint32_t ts) +{ + char fileName[FILE_PATH_LEN] = {0}; + int32_t ret = GetEphFileName(ts, prefix, fileName); + if (ret == 0) { + printf("\r\nerror: GetEphFileName failed\r\n"); + return; + } + printf("\nGetEphFileName success\r\n"); + PgnssSendFileContent(handle, fileName, cmdType); +} + +void PgnssInjectAllEph(tiot_handle handle, uint32_t ts) +{ + PgnssSendEphFile(handle, "GPS", CMD_PGNSS_INJECT_EPH_GPS, ts); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send GPS eph success\r\n"); + PgnssSendEphFile(handle, "GLO", CMD_PGNSS_INJECT_EPH_GANSS, ts); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send GLO eph success\r\n"); + PgnssSendEphFile(handle, "BDS", CMD_PGNSS_INJECT_EPH_GANSS, ts); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send BDS eph success\r\n"); + PgnssSendEphFile(handle, "GAL", CMD_PGNSS_INJECT_EPH_GANSS, ts); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send GAL eph success\r\n"); + PgnssSendEphFile(handle, "QZS", CMD_PGNSS_INJECT_EPH_GANSS, ts); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send QZS eph success\r\n"); +} + +void PgnssInjectOtherAssist(tiot_handle handle) +{ + PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_UTC.dat", CMD_PGNSS_INJECT_UTC_GPS); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send GPS_UTC success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_RTI.dat", CMD_PGNSS_INJECT_RTI_GPS); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send GPS_RTI success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_ION.dat", CMD_PGNSS_INJECT_ION_GPS); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send GPS_ION success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/GLO_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send GLO_RTI success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/GLO_AUX.dat", CMD_PGNSS_INJECT_AUX_GANSS); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send GLO_AUX success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/BDS_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send BDS_RTI success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/GAL_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS); + osal_msleep(INJECT_SLEEP_MS_TIME); + printf("send GAL_RTI success\r\n"); +} + +void PgnssInject(tiot_handle handle, uint32_t ts) +{ + // 注入Pgnss辅助数据 + PgnssInjectAllEph(handle, ts); + PgnssInjectOtherAssist(handle); +} + + +// 以下为使用PGNSS解析数据合并输出接口生成的星历文件进行注入的代码 +int32_t GetNonGloEphFileName(int32_t ts, char *fileName) +{ + const char prefix[] = "NonGlo"; + DIR *dir = opendir("/user/userdata/gnss/"); + if (dir == NULL) { + printf("Failed to open /user/xgnss directory.\r\n"); + return 0; + } + int32_t time, ret; + int32_t minDist = OTHER_EPH_VALID_TIME; + int32_t closestTime = 0; + struct dirent *entry; + for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) { + // 检查文件名 + if (strstr(entry->d_name, ".eph") != NULL) { + char *p = strrchr(entry->d_name, '_'); + if (p != NULL) { + char *q = strstr(entry->d_name, prefix); + if (q != NULL) { + time = atoi(p + 1); + // 查找星历文件时间戳与当前时间相差2小时以内且距离最近的 + if (abs(time - ts) < minDist) { + minDist = abs(time - ts); + closestTime = time; + } + else + { + printf("time:%d,ts:%d,minDist:%d\r\n",time,ts,minDist); + } + } + } + } + } + if (closestTime != 0) { + ret = snprintf_s(fileName, FILE_PATH_LEN, (FILE_PATH_LEN - 1), "%s%d%s", "/user/userdata/gnss/NonGlo_", closestTime, + ".eph"); + printf("closest eph fileName:%s\r\n", fileName); + closedir(dir); + return ((ret <= 0) ? 0 : 1); + } + else + { + printf("closestTime == 0\r\n"); + } + closedir(dir); + return 0; +} + +int32_t GetGloEphFileName(int32_t ts, char *fileName) +{ + const char prefix[] = "GLO"; + DIR *dir = opendir("/user/userdata/gnss/"); + if (dir == NULL) { + printf("Failed to open /user/xgnss directory.\r\n"); + return 0; + } + int32_t ephTime, ret; + struct dirent *entry; + for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) { + // 检查文件名 + if (strstr(entry->d_name, ".eph") != NULL) { + char *p = strrchr(entry->d_name, '_'); + if (p != NULL) { + char *q = strstr(entry->d_name, prefix); + if (q != NULL) { + ephTime = atoi(p + 1); + printf("ephTime:%ld, ts:%ld\n", ephTime, ts); + // 当前时间大于GLO星历文件时间戳,则需要选取相差2小时以内的星历 + // 当前时间小于GLO星历文件时间戳,则需要选取相差小于15分钟的星历 + if (((ts - ephTime) >= 0 && abs(ephTime - ts) < OTHER_EPH_VALID_TIME) || + ((ts - ephTime) <= 0 && abs(ephTime - ts) < GLO_EPH_VALID_TIME)) { + ret = FormatFileName(fileName, entry->d_name); + printf("glo eph fileName:%s\n", fileName); + closedir(dir); + return ret; + } + } + } + } + } + closedir(dir); + return 0; +} + +void PgnssSendNonGloEph(tiot_handle handle, const char *fileName) +{ + FILE *fp = fopen(fileName, "rb"); + if (fp == NULL) { + printf("\nerror: open file failed: %s\r\n", fileName); + return; + } + fseek(fp, 0, SEEK_END); + int32_t len = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (len < 0 || len > PGNSS_FILE_MAX_SIZE) { + fclose(fp); + printf("\nerror: get file len failed: %s\r\n", fileName); + return; + } + uint8_t *buff = (uint8_t *)malloc(len); + if (buff == NULL) { + fclose(fp); + printf("\nerror: malloc file len failed: %s\r\n", fileName); + return; + } + int32_t dataSize = fread(buff, len, 1, fp); + if (dataSize < 0) { + fclose(fp); + printf("\nerror: read file failed: %s\r\n", fileName); + free(buff); + return; + } + fclose(fp); + int32_t fileLen = 0; + for (int32_t i = 0; i < NON_GLO_GNSS_TYPES && fileLen <= len; i++) { + EphHeadInfo *ephHdr = (EphHeadInfo *)(buff + fileLen); + EncodeAndInjectCmd(handle, ephHdr->cmd, (buff + fileLen + sizeof(EphHeadInfo)), ephHdr->len); + fileLen += (ephHdr->len + sizeof(EphHeadInfo)); + osal_msleep(INJECT_SLEEP_MS_TIME); + } + free(buff); +} + +void PgnssSendGloEph(tiot_handle handle, const char *fileName, int32_t ts) +{ + FILE *fp = fopen(fileName, "rb"); + if (fp == NULL) { + printf("\nerror: open file failed: %s\r\n", fileName); + return; + } + fseek(fp, 0, SEEK_END); + int32_t len = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (len < 0 || len > PGNSS_FILE_MAX_SIZE) { + fclose(fp); + printf("\nerror: get file len failed: %s\r\n", fileName); + return; + } + uint8_t *buff = (uint8_t *)malloc(len); + if (buff == NULL) { + fclose(fp); + printf("\nerror: malloc file len failed: %s\r\n", fileName); + return; + } + int32_t dataSize = fread(buff, len, 1, fp); + if (dataSize < 0) { + fclose(fp); + printf("\nerror: read file failed: %s\r\n", fileName); + free(buff); + return; + } + fclose(fp); + int32_t fileLen = 0; + for (int32_t i = 0; i < GLO_EPH_NUM_ONE_FILE && fileLen <= len; i++) { + EphHeadInfo *ephHdr = (EphHeadInfo *)(buff + fileLen); + printf("glo eph, time:%u, ts:%d\r\n", ephHdr->time, ts); + if (abs((int32_t)ephHdr->time - ts) < GLO_EPH_VALID_TIME) { + EncodeAndInjectCmd(handle, ephHdr->cmd, (buff + fileLen + sizeof(EphHeadInfo)), ephHdr->len); + osal_msleep(INJECT_SLEEP_MS_TIME); + break; + } + fileLen += (ephHdr->len + sizeof(EphHeadInfo)); + } + free(buff); +} + +void PgnssInjectAllEphLessFiles(tiot_handle handle, uint32_t ts) +{ + char fileName[FILE_PATH_LEN] = {0}; + if (GetNonGloEphFileName(ts, fileName) == 0) { + printf("\nerror: GetNonGloEphFileName failed\r\n"); + return; + } + PgnssSendNonGloEph(handle, fileName); + if (GetGloEphFileName(ts, fileName) == 0) { + printf("\nerror: GetGloEphFileName failed\r\n"); + return; + } + PgnssSendGloEph(handle, fileName, ts); +} + +void PgnssSendOtherAssistInfo(tiot_handle handle, const char *fileName) +{ + FILE *fp = fopen(fileName, "rb"); + if (fp == NULL) { + printf("\nerror: open file failed: %s\r\n", fileName); + return; + } + fseek(fp, 0, SEEK_END); + int32_t len = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (len < 0 || len > PGNSS_FILE_MAX_SIZE) { + fclose(fp); + printf("\nerror: get file len failed: %s\r\n", fileName); + return; + } + uint8_t *buff = (uint8_t *)malloc(len); + if (buff == NULL) { + fclose(fp); + printf("\nerror: malloc file len failed: %s\r\n", fileName); + return; + } + int32_t dataSize = fread(buff, len, 1, fp); + if (dataSize < 0) { + fclose(fp); + printf("\nerror: read file failed: %s\r\n", fileName); + free(buff); + return; + } + fclose(fp); + int32_t fileLen = 0; + for (int32_t i = 0; i < OTHER_ASSIST_TYPES && fileLen <= len; i++) { + OtherAssistHeadInfo *otherHdr = (OtherAssistHeadInfo *)(buff + fileLen); + EncodeAndInjectCmd(handle, otherHdr->cmd, (buff + fileLen + sizeof(OtherAssistHeadInfo)), otherHdr->len); + fileLen += (otherHdr->len + sizeof(OtherAssistHeadInfo)); + osal_msleep(INJECT_SLEEP_MS_TIME); + } + free(buff); +} + +void PgnssInjectOtherAssistLessFiles(tiot_handle handle) +{ + PgnssSendOtherAssistInfo(handle, "/user/userdata/gnss/AssistInfo.dat"); +} + +// 注入PGNSS解析数据合并输出接口生成的星历文件 +void PgnssInjectLessFiles(tiot_handle handle, uint32_t ts) +{ + // 注入Pgnss辅助数据 + PgnssInjectAllEphLessFiles(handle, ts); + PgnssInjectOtherAssistLessFiles(handle); +} \ 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 index 000000000..a666edc91 --- /dev/null +++ b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_encode.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. + * Description: pgnss encode + * Author: + * Create: + */ +#ifndef PGNSS_ENCODE_H +#define PGNSS_ENCODE_H + +#include "gnss_datatypes.h" +#include "tiot_service_interface.h" + +int32_t PgnssInjectUtcTime(tiot_handle handle, GnssUtcTime *utcTime, uint32_t* ts); +void PgnssInject(tiot_handle handle, uint32_t ts); +void PgnssInjectLessFiles(tiot_handle handle, uint32_t ts); +#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 index 000000000..aaba6b549 --- /dev/null +++ b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c @@ -0,0 +1,368 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. + * Description: pgnss sample + * Author: + * Create: + */ +#include "pgnss_sample.h" +#include +#include "securec.h" +#include "tiot_service_interface.h" +#include "pm_definition.h" +#include "gnss_datatypes.h" +#include "pgnss_encode.h" +#include "NMEA0183.h" +#include "sys/time.h" +#include "time.h" +#include "gnss_ctl.h" + + +#define PGNSS_FIXMODEALL_NMEADEF_SAMPLE 0 +#define PGNSS_LESS_FILES_FIXMODEALL_NMEADEF_SAMPLE 0 + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif +#define MSG_TYPE_BINRY 0 +#define MSG_TYPE_ASCII 1 +#define LISTEN_DATA_MAX_LINES 1000 + +static FILE* g_gnssLogFp = NULL; +static uint8_t g_gnssServiceBuff[REPORT_MAX_BYTES] = { 0 }; + +typedef int32_t (*GnssCfgFunc)(tiot_handle handle); + +typedef struct { + uint16_t sampleId; + GnssCfgFunc cfgHandle; +} GnssSamplesCfgTable; + +static NMEA0183 g_nmeadata={0}; +static gps_data_t g_global_gpsData={0}; + +/**GPS状态位*/ +static int g_is_pgnss_poweron=0; +static int g_is_pgnss_logon=0; +static int g_pgnss_stopflag=0; + +static int32_t QryVersion(tiot_handle handle) +{ + const uint8_t qryVersion[] = {0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}; + // 查询版本号 + int32_t ret = tiot_service_write(handle, qryVersion, sizeof(qryVersion)); + if (ret < 0) { + printf("\nerror: QryVersion error: %d\r\n", ret); + return 0; + } + return 1; +} + +static int decode_nmea(char c) +{ + int ret=0; + ret=0; + if(nmea_decode(&g_nmeadata,c) ==1 ) ///调用解析函数 + { + dump_nmea_str(&(g_nmeadata.gpsParse)); + if (g_nmeadata.gpsParse.sentence_type == GPS_SENTENCE_TH002 ) + { + //一组数据最后一条 + memcpy_s(&g_global_gpsData,sizeof(gps_data_t),&(g_nmeadata.gpsData),sizeof(gps_data_t)); + ret = 1; + memset(&g_nmeadata,0,sizeof(g_nmeadata)); + } + } + + return ret; +} + +gps_data_t * getPGPSGlobaldata(void) +{ + return &g_global_gpsData; +} + + +// 注入PGNSS,使用默认配置启动 +int32_t InjectPgnssCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle) +{ + const uint8_t cfgLogLevelInfo[] = {0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x10, 0x01, 0x00, 0x03}; + + // 配置log级别:info级别。 + int32_t ret = tiot_service_write(handle, cfgLogLevelInfo, sizeof(cfgLogLevelInfo)); + if (ret < 0) { + printf("\nerror: cfgLogLevelInfo error: %d\r\n", ret); + return 0; + } + + // 注入UTC时间, 注入Pgnss辅助数据前必须先注入参考时间 + GnssUtcTime utcTime = {2024, 2, 26, 6, 0, 0, 0, 1}; // 需要用当前的UTC时间替换 + + time_t rawtime; + struct tm* timeinfo; + + time(&rawtime); // 获取UTC时间戳 + timeinfo = gmtime(&rawtime); // 转换为UTC时间(无时区偏移) + + utcTime.year = timeinfo->tm_year + 1900; + utcTime.month = timeinfo->tm_mon + 1; + utcTime.day = timeinfo->tm_mday; + utcTime.hour = timeinfo->tm_hour; + utcTime.minute = timeinfo->tm_min; + utcTime.second = timeinfo->tm_sec; + + printf("year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n", + utcTime.year,utcTime.month,utcTime.day, + utcTime.hour,utcTime.minute,utcTime.second); + + uint32_t ts = 0; + ret = PgnssInjectUtcTime(handle, &utcTime, &ts); + if (ret == 0) { + printf("\nerror: PgnssInjectUtcTime failed!\r\n"); + return 0; + } + printf("\nPgnssInjectUtcTime success!\r\n"); + + // PGNSS注入 + // 注意,默认PGNSS星历文件存放在/user/xgnss/目录中,如修改目录,请全局搜索替换 + PgnssInject(handle, ts); + + return 1; +} + +// 注入PGNSS,使用默认配置启动 +int32_t InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle) +{ + const uint8_t cfgLogLevelInfo[] = {0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x10, 0x01, 0x00, 0x03}; + + // 配置log级别:info级别。 + int32_t ret = tiot_service_write(handle, cfgLogLevelInfo, sizeof(cfgLogLevelInfo)); + if (ret < 0) { + printf("\nerror: cfgLogLevelInfo error: %d\r\n", ret); + return 0; + } + + // 注入UTC时间, 注入Pgnss辅助数据前必须先注入参考时间 + GnssUtcTime utcTime = {2024, 3, 14, 12, 0, 0, 0, 1}; // 需要用当前的UTC时间替换 + + time_t rawtime; + struct tm* timeinfo; + + time(&rawtime); // 获取UTC时间戳 + timeinfo = gmtime(&rawtime); // 转换为UTC时间(无时区偏移) + + utcTime.year = timeinfo->tm_year + 1900; + utcTime.month = timeinfo->tm_mon + 1; + utcTime.day = timeinfo->tm_mday; + utcTime.hour = timeinfo->tm_hour; + utcTime.minute = timeinfo->tm_min; + utcTime.second = timeinfo->tm_sec; + + printf("year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n", + utcTime.year,utcTime.month,utcTime.day, + utcTime.hour,utcTime.minute,utcTime.second); + + + uint32_t ts = 0; + ret = PgnssInjectUtcTime(handle, &utcTime, &ts); + if (ret == 0) { + printf("\nerror: PgnssInjectUtcTime failed!\r\n"); + return 0; + } + printf("\nPgnssInjectUtcTime success!\r\n"); + + // PGNSS注入 + // 注意,默认PGNSS星历文件存放在/user/xgnss/目录中,如修改目录,请全局搜索替换 + PgnssInjectLessFiles(handle, ts); + + return 1; +} + +static const GnssSamplesCfgTable g_gnssSamplesCfg[] = { + // {PGNSS_FIXMODEALL_NMEADEF_SAMPLE, InjectPgnssCfgAutoStartFixModeAndNmeaDefault}, + {PGNSS_LESS_FILES_FIXMODEALL_NMEADEF_SAMPLE, InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault} +}; + +static int32_t StartGnss(tiot_handle handle) +{ + const uint8_t startCmd[] = {0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}; + // 启动GNSS + int32_t ret = tiot_service_write(handle, startCmd, sizeof(startCmd)); + if (ret < 0) { + printf("\nerror: start gnss error: %d\r\n", ret); + return 0; + } + printf("\nstart gnss\r\n"); + return 1; +} + +static int32_t StopGnss(tiot_handle handle) +{ + const uint8_t stopCmd[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + // 停止GNSS + int32_t ret = tiot_service_write(handle, stopCmd, sizeof(stopCmd)); + if (ret < 0) { + printf("\nerror: stop gnss error: %d\r\n", ret); + return 0; + } + printf("\nstop gnss\r\n"); + return 1; +} + + +static void ListenGnssData(tiot_handle handle) +{ + int32_t i = 0; + // 写日志 + for (;;) { // 写日志条件 + + if (i >= LISTEN_DATA_MAX_LINES) { + printf("\r\ncnt enough\r\n"); + break; + } + if (g_pgnss_stopflag == 1) + { + break; + } + // 监听 + int32_t ret = tiot_service_read(handle, g_gnssServiceBuff, REPORT_MAX_BYTES, LISTEN_TIME_THR); + if (ret > 0) { + uint16_t *type = (uint16_t *)g_gnssServiceBuff; + if (type[0] == MSG_TYPE_ASCII) { + g_gnssServiceBuff[ret] = '\0'; + char* pbuf=(char *)&g_gnssServiceBuff[MSG_CONTENT_IDX]; + printf("%s\r\n", pbuf); + if (g_is_pgnss_logon) + fprintf(g_gnssLogFp, "%s\n", pbuf); + for (int index=0;index < ret ;index++) + { + if (decode_nmea(pbuf[index])==1) + { + // dump_location_data(&g_global_gpsData); + printf("decode_nmea done\r\n"); + } + } + } + i++; + } + + } +} + +void PGnssServerStop(void) +{ + g_pgnss_stopflag=1; +} + +int getPGnssServerStat(void) +{ + return g_is_pgnss_poweron; +} + +int is_PGnssLogEnabled(void) +{ + return g_is_pgnss_logon; +} + +int PGnssLogEnable(bool enable) +{ + if (enable) + g_is_pgnss_logon = 1; + else + g_is_pgnss_logon = 0; + + return g_is_pgnss_logon; +} + + +void PGnssServerStart(void) +{ + printf("\nenter gnss samples\r\n"); + if(g_is_pgnss_poweron == 1) + { + printf("gnss already on\r\n"); + return ; + } + uapi_pm_add_sleep_veto(PM_ID_SYS); + + #ifdef DOWNLOAD_GNSS_SWITCH + download_gnss_switch(SWITCH_TO_GNSS); + #endif + g_is_pgnss_poweron = 1; + g_pgnss_stopflag = 0; + + // Step1: init + int32_t ret = tiot_service_init(); + if (ret != 0) { + printf("tiot service init fail\r\n"); + g_is_pgnss_poweron = 0; + g_pgnss_stopflag = 1; + } + + // 打开日志文件 + if (g_is_pgnss_logon) + { + g_gnssLogFp = fopen("/user/log/gnss.log", "w"); + if (g_gnssLogFp == NULL) { + printf("error: open log file error\n"); + return; + } + } + printf("before open tiot service\n"); + + // Step2: power on gnss + tiot_handle handle = tiot_service_open("gn71", NULL); + if (handle == 0) { + printf("open tiot service fail\r\n"); + g_is_pgnss_poweron = 0; + g_pgnss_stopflag = 1; + return; + } + printf("open tiot service success\r\n"); + + int32_t cfgRet; + // ---- loop ---------- + for (uint16_t i = 0; i < ARRAY_SIZE(g_gnssSamplesCfg); i++) { + cfgRet = 0; + if (g_gnssSamplesCfg[i].sampleId == i) { + // Step3: config gnss + if (g_gnssSamplesCfg[i].cfgHandle != NULL) { + cfgRet = g_gnssSamplesCfg[i].cfgHandle(handle); + } + if (cfgRet == 0) { + continue; + } + printf("cfg sample id:%u\r\n", g_gnssSamplesCfg[i].sampleId); + QryVersion(handle); + + // Step4: start gnss + if (StartGnss(handle) == 0) { + continue; + } + // Step5: listening gnss data + ListenGnssData(handle); + // Step6: stop gnss + if (StopGnss(handle) == 0) { + continue; + } + } + } + // --------------------- + // Step7: power off gnss + tiot_service_close(handle); + // 关日志文件 + if (g_is_pgnss_logon) + { + fclose(g_gnssLogFp); + g_gnssLogFp = NULL; + } + // Step8: deinit + tiot_service_deinit(); + + #ifdef DOWNLOAD_GNSS_SWITCH + download_gnss_switch(SWITCH_TO_DOWNLOAD); + #endif + uapi_pm_remove_sleep_veto(PM_ID_SYS); + g_is_pgnss_poweron=0; + printf("finish gnss samples\r\n"); +} 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 index 000000000..37d7d51dd --- /dev/null +++ b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.h @@ -0,0 +1,26 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2025-07-11 16:41:59 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-07-18 17:39:28 + * @FilePath: /FD230/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. + * Description: pgnss sample + * Author: + * Create: + */ +#ifndef PGNSS_SAMPLE_H +#define PGNSS_SAMPLE_H +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +void PGnssServerStart(void); +void PGnssServerStop(void); +int getPGnssServerStat(void); +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif \ No newline at end of file diff --git a/code/sdk/zhihui/services/gnss/src/gnss_ctl.c b/code/sdk/zhihui/services/gnss/src/gnss_ctl.c index b0fe28fd8..57eca614d 100644 --- a/code/sdk/zhihui/services/gnss/src/gnss_ctl.c +++ b/code/sdk/zhihui/services/gnss/src/gnss_ctl.c @@ -30,39 +30,15 @@ #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 index 000000000..21c9f01b7 --- /dev/null +++ b/code/sdk/zhihui/services/gnss/src/gnss_tcp_server.c @@ -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 +#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 +// #include +#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×tamp=%lld", APP_ID,(long long)time * 1000); + // snprintf(sign_str,256, "GET&/higeo/v1/xgnss/agnss&&appid=%s×tamp=%lld", APP_ID,(long long)time * 1000); + // snprintf(sign_str,256, "GET&/higeo/v1/xgnss/agnss&&appid=%s×tamp=%d", APP_ID,time*1000); + // snprintf(sign_str,256, "GET&/higeo/v1/xgnss/agnss&&&appid=coolwearable×tamp=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 diff --git a/code/sdk/zhihui/services/gnss/src/uart_gnss.c b/code/sdk/zhihui/services/gnss/src/uart_gnss.c index 024893b5a..506b3b2ec 100644 --- a/code/sdk/zhihui/services/gnss/src/uart_gnss.c +++ b/code/sdk/zhihui/services/gnss/src/uart_gnss.c @@ -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: diff --git a/code/sdk/zhihui/utils/custom_fileoperate_service.c b/code/sdk/zhihui/utils/custom_fileoperate_service.c index b5fc9956a..cb790bb5f 100644 --- a/code/sdk/zhihui/utils/custom_fileoperate_service.c +++ b/code/sdk/zhihui/utils/custom_fileoperate_service.c @@ -41,17 +41,31 @@ #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: diff --git a/code/sdk/zhihui/utils/custom_runtime.c b/code/sdk/zhihui/utils/custom_runtime.c index e83c51ced..b7aa10a14 100644 --- a/code/sdk/zhihui/utils/custom_runtime.c +++ b/code/sdk/zhihui/utils/custom_runtime.c @@ -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; +} diff --git a/code/sdk/zhihui/utils/custom_runtime.h b/code/sdk/zhihui/utils/custom_runtime.h index 147df7a06..841544509 100644 --- a/code/sdk/zhihui/utils/custom_runtime.h +++ b/code/sdk/zhihui/utils/custom_runtime.h @@ -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 } diff --git a/code/sdk/zhihui/utils/custom_utils.c b/code/sdk/zhihui/utils/custom_utils.c index 0829d14d9..a7e8c95e9 100644 --- a/code/sdk/zhihui/utils/custom_utils.c +++ b/code/sdk/zhihui/utils/custom_utils.c @@ -26,11 +26,11 @@ #include "tcxo.h" #include #include "pm_veto.h" +#include // #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 - 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); } -- 2.17.1