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 },
cm_initializeScreenDuration();
// 开机增加震动 页面启动震动一次
- // ui_api_vibrate_once_func();
+ // custom_VibratorFunc_int(0);
// #endif
}
// 注册开机时间
{
CircleListAdapter::angleIncrement = 10;//还原为drag的角度
isEncoderEvent = false;
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
}
isEncoderEvent = false;
if(preRotateAngle != angle)
{
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
}
else
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
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
/* -------------------------------------------------------------------------- */\r
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))\r
{\r
- ui_api_vibrate_once_func();\r
+ custom_VibratorFunc_int(0);\r
}\r
uapi_set_screen_on_api();\r
/* -------------------------------------------------------------------------- */\r
/* -------------------------------------------------------------------------- */\r
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))\r
{\r
- ui_api_vibrate_once_func();\r
+ custom_VibratorFunc_int(0);\r
}\r
uapi_set_screen_on_api();\r
/* -------------------------------------------------------------------------- */\r
{
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
}
bool BrightnessSliderEventListener::OnRotateEnd(UIView& view, const RotateEvent& event)\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnRotateEnd %d", value);\r
- ui_api_vibrate_once_func();//受设置中震动强度控制\r
+ custom_VibratorFunc_int(0);//受设置中震动强度控制\r
return true;\r
}\r
}\r
if(true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
if(true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
// 震动提醒
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
// 增加按键监听
display_counter_ = 0;\r
displayheart = 0;\r
#ifdef SUPPORT_PPG_SERVICE\r
- uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;\r
- errcode_t ret = send_ppg_cmd_msg(md);\r
- if (ret != ERRCODE_SUCC) {\r
- send_ppg_cmd_msg(md);\r
- }\r
+ ppg_hr_stop();\r
#endif\r
heartstate = false;\r
if (checkstate == HeartCheck::CARDCHECK) {\r
}\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartState Start");\r
#ifdef SUPPORT_PPG_SERVICE\r
- uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST;\r
- send_ppg_cmd_msg(md);\r
+ ppg_hr_start();\r
#endif\r
heartstate = true;\r
checkstate = check;\r
if (slider == progress)\r
{\r
ChangeVolume(VOLUMEDRAG);\r
- ui_api_vibrate_once_func();//受设置中震动强度控制\r
+ custom_VibratorFunc_int(0);//受设置中震动强度控制\r
}\r
}\r
return true;\r
}
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;
NativeAbility::GetInstance().SetCurSlicePriority(0); // 设置Slice优先级为最高,防止弹窗出现
// 关机增加震动
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
// 获取开机动画是否已经开始
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(); // 显示警告
breath->SetTextId(STR_EXHALE_NOW);
}
// 震动提醒
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
breath->ForceResetText();
}
}
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)
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
}
bool SaveElePresenter::OnRotateEnd(UIView &view, const RotateEvent &event) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
"VolumeSliderEventListener::OnRotateEnd");\r
-// ui_api_vibrate_once_func(); \r
+// custom_VibratorFunc_int(0); \r
return true;\r
}\r
} // namespace OHOS
\ No newline at end of file
// #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"
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);
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();
* @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
*/
{
#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
* @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:
#include "broadcast_service.h"
#include "cmsis_os.h"
#include "custom_runtime.h"
-//#include "cywee_service.h"
+
#include "power_display_service.h"
#include "sleep/include/SleepModelC.h"
#include "thread_adapter.h"
#ifdef SUPPORT_CYWEE_SERVICE
#include "cywee_service.h"
+#include "cywee_hal.h"
#endif
+#define SLEPPNOTIFY 20
+
extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time,
char date_separator, char time_separator,
date_format_t format);
extern "C" int get_sleep_time_from_config_model(void);
extern "C" int get_wake_up_time_from_config_model();
+#ifdef SUPPORT_CYWEE_SERVICE
+extern "C" void cywee_get_sleep_time_data(uint32_t *fall_sleep_time,uint32_t *wake_up_time,uint16_t *total_time,uint8_t data_type);
+#endif
static uint32_t len = 0;
-static OHOS::SLEEP_STAT_T *wear_stat;
+
namespace OHOS
{
-#define SLEPPNOTIFY 20
- static NAP_T nap_data = {0};
- static SLEEP_T sleep_data = {0};
- static uint32_t sleep_update_timestamp = 0;
- static uint32_t nap_update_timestamp = 0;
+ OHOS::WEAR_STAT_T *wear_stat = NULL;
void SleepModel::clean_sleep_data(void)
{
- sleep_update_timestamp = 0;
- nap_update_timestamp = 0;
- memset(&sleep_data,0,sizeof(SLEEP_T));
- memset(&nap_data, 0, sizeof(NAP_T));
- }
-
- /*获取最新睡眠时间戳*/
- uint32_t get_sleep_update_timestamp(void)
- {
- if (nap_update_timestamp <= sleep_update_timestamp)
- return sleep_update_timestamp;
- else
- return nap_update_timestamp;
+ sleep_total_time = 0;
+ nap_total_time = 0;
}
- static char nap_file_path[64] = {0};
-
-
bool is_regular_file(const std::string &file_name)
{
struct stat file_stat;
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()
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();
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;
}
// 清空睡眠数据
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; }
#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"
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "VibrationMode = %d", VibrationMode);\r
SoundAndVibrationModel::GetInstance()->SetVibrationReminderToggleButtonStaus(VibrationMode);\r
// uapi_vibrationModeSet(VibrationMode);\r
- ui_api_vibrate_once_func();\r
+ custom_VibratorFunc_int(0);\r
view_->ChangeView(VIBRATIONMODEVIEW, SOUNDANDVIBRATIONVIEW);\r
}\r
return true;\r
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;
}
}
}\r
else if (strcmp(view.GetViewId(), FACTORYRESET_CHECKON) == 0) // 恢复出厂设置确认\r
{\r
- ui_api_vibrate_once_func(); //恢复出厂增加震动\r
+ custom_VibratorFunc_int(0); //恢复出厂增加震动\r
p_SystemView->ChangeView(FACTORYRESETVIEW, SHUTDOWNANIMATIONVIEW);\r
ShutDownImageAnimatorView::GetInstance()->ShutDownImageAnimator_Start(2);\r
isShutDownImageAnimatorStart = true;\r
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(
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(
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(
// 振动反馈
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);
}
}\r
// 根据不同的运动项目进行不同的运动\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingCardPresenter::OpenSensor!!");\r
-#ifdef SUPPORT_PPG_SERVICE\r
+#ifdef SUPPORT_CYWEE_SERVICE\r
switch (type) {\r
case ExerciseClass::NORMAL:\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NORMAL_MODE, NULL);\r
+ cywee_sport_mode_change(CYWEE_SERVICE_CMD_NORMAL_MODE);\r
break;\r
case ExerciseClass::TREADMILL:\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_TREADMILL_MODE, NULL);\r
+ cywee_sport_mode_change(CYWEE_SERVICE_CMD_TREADMILL_MODE);\r
break;\r
case ExerciseClass::OUTDOOR:\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OUTDOOR_RUNNING_MODE, NULL);\r
+ cywee_sport_mode_change(CYWEE_SERVICE_CMD_OUTDOOR_RUNNING_MODE);\r
break;\r
case ExerciseClass::INDOOR:\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_INDOOR_RUNNING_MODE, NULL);\r
+ cywee_sport_mode_change(CYWEE_SERVICE_CMD_INDOOR_RUNNING_MODE);\r
break;\r
case ExerciseClass::FITNESS_PEDOMETER:\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_FITNESS_PEDOMETER_MODE, NULL);\r
+ cywee_sport_mode_change(CYWEE_SERVICE_CMD_FITNESS_PEDOMETER_MODE);\r
break;\r
case ExerciseClass::FREE_TRAINING:\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_FREE_TRAINING_MODE, NULL);\r
+ cywee_sport_mode_change(CYWEE_SERVICE_CMD_FREE_TRAINING_MODE);\r
break;\r
default:\r
break;\r
// }\r
if (g_alarmView)\r
{\r
- ui_api_vibrate_once_func();\r
+ custom_VibratorFunc_int(0);\r
}\r
}\r
}\r
// 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")
{
if (true != ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
// uapi_vibrationModeSet(ConfigModel::GetInstance()->GetVibrationReminder());
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
}
/* -------------------------------------------------------------------------- */
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
- ui_api_vibrate_once_func(); // 震动一次
+ custom_VibratorFunc_int(0); // 震动一次
}
ScreenTurnOn(10 * 1000); // 亮屏操作 10秒关闭
{
if (nullptr != FindWatchGroupView)
{
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
}
{
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
}
if (GoalviewShowCallBack_FALG == 0)
(!uapi_sleep_mode_flag_get()))
{
// 震动提醒
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
MessageViewEventListener::GetInstance()
/*
* @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"
// 震动一次
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
/* -------------------------------------------------------------------------- */
NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeMotionRecognitionView);
// 震动一次
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
- // ui_api_vibrate_once_func();
+ // custom_VibratorFunc_int(0);
}
// ScreenTurnOn(40 * 1000); // 亮屏操作 40秒关闭
/* -------------------------------------------------------------------------- */
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
- // ui_api_vibrate_once_func(); // 震动一次
+ // custom_VibratorFunc_int(0); // 震动一次
}
// ScreenTurnOff(); //先设置为0
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);
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
ScreenTurnOn(100000); // 亮屏操作 100000ms 10秒关闭
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秒关闭
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;
}
}
+
+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},
// 震动一次
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
}
ScreenTurnOn(40 * 1000); // 亮屏操作 40秒关闭
/* -------------------------------------------------------------------------- */
if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
{
- ui_api_vibrate_once_func(); // 震动一次
+ custom_VibratorFunc_int(0); // 震动一次
}
// ScreenTurnOff(); //先设置为0
};\r
\r
const lcd_cmd_sequ g_common_466x466_cmd_display_off[] = {\r
+#if defined(BOARD_W9) || defined(BOARD_N9)\r
+ {1, 2, {0xfe, 0x00}, 0}, /* select default cmd page */\r
+ {1, 1, {0x28}, 10}, /* display off */\r
+ {1, 1, {0x10}, 120}, /* sleep in */\r
+ {1, 2, {0x4f, 0x01}, 100}, /* sleep in */\r
+#else\r
{1, 2, {0xfe, 0x00}, 0}, /* select default cmd page */\r
{1, 1, {0x28}, 0}, /* display off */\r
{1, 1, {0x10}, 120}, /* sleep in */\r
- {1, 2, {0x4f, 0x01}, 0}, /* 进deepstandby 状态 */\r
+ {1, 2, {0x4f, 0x01}, 0}, /* ��deepstandby ״̬ */\r
+#endif\r
};\r
/* sleep in sequence for common lcd */\r
const lcd_cmd_sequ g_common_cmd_sleep_in[] = {\r
+/*\r
+ * @Author: penglei 1624952103@qq.com\r
+ * @Date: 2025-07-29 09:33:56\r
+ * @LastEditors: penglei 1624952103@qq.com\r
+ * @LastEditTime: 2025-07-30 11:37:00\r
+ * @FilePath: /FD230/code/sdk/drivers/drivers/driver/lcd/lcd_private.c\r
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
+ */\r
/*\r
* Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved.\r
* Description: Lcd private interface.\r
uapi_gpio_set_dir(VCI_LCD_GPIO, GPIO_DIRECTION_OUTPUT);\r
uapi_gpio_set_val(VCI_LCD_GPIO, GPIO_LEVEL_LOW);\r
#endif\r
+#if defined(BOARD_FD230)\r
uapi_tcxo_delay_ms(10); /* delay 10 ms */\r
+#endif\r
int resetvalue = uapi_gpio_get_output_val(RESET_LCD_GPIO);\r
int lcd_envalue = uapi_gpio_get_output_val(VCI_LCD_GPIO);\r
printf("Output RESET_LCD_GPIO %d , VCI_LCD_GPIO %d\r\n",resetvalue,lcd_envalue);\r
#define CST86XX_REPORT_REG 0x0186 /* 设置中断上报频率 */\r
#define CST86XX_PIXEL_THRESHOLD_REG 0x00C3\r
/* Register Map */\r
-#define CST86XX_SLEEP_CMD 0xA5\r
+#define CST86XX_SLEEP_CMD 0xE5\r
#define CST86XX_FIRMWARE_VERSION 0xA9\r
#define CST86XX_FACTORY_ID 0xAA\r
#define CST86XX_HW_ID 0xA7\r
static osTimerId_t Gsenson_TEST_timer=NULL;
void testcat1View::ClearAll()
{
+ uapi_set4GCapability(false);
+
if(testcat1ScrollView)
{
testcat1ScrollView->RemoveAll();
{
if(button!=NULL)
{
- #ifdef FD230_650
- calldial_event_sendmsg_toUI(phone);
- #endif
+ // calldial_event_sendmsg_toUI(phone);
RootView::GetInstance()->Invalidate();
}
}
testcat1ScrollView->Add(label_1_cat1vison_1);
-
-
- power_on_cat1();
+ uapi_set4GCapability(true);
cat1_getsignal();
cat1_getver();
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);
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)
${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
* @Author: penglei 1624952103@qq.com\r
* @Date: 2025-01-16 12:35:15\r
* @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-02-14 11:37:22\r
+ * @LastEditTime: 2025-07-30 11:50:19\r
* @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.c\r
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
*/\r
#include "i2c.h"\r
#include "pm_definition.h"\r
#include "bp_ble_service.h"\r
+#include "bp_tcp_server.h"\r
+\r
\r
#define BN02_I2C_ADDR 0x05\r
#define BN02_I2C_BUS I2C_BUS_0\r
#define I2C_ADDR_BN02_W 0x0a\r
#define I2C_ADDR_BN02_R 0x0b\r
-#define P_EN S_AGPIO_L24\r
-#define P_INT S_AGPIO_R3\r
+#define BP_EN S_AGPIO_L19\r
+#define BP_INT S_AGPIO_R3\r
\r
#define POWER_EN S_AGPIO_R0\r
\r
-bool Bn02_write_reg(uint8_t data)\r
+#define BN02_FILE "user/userdata/bn02.bin"\r
+\r
+#define MAX_CNT 48 * 5 * 60\r
+\r
+static int DATA_HANDLE = 1 << 24;\r
+\r
+static FILE *fp = NULL;\r
+\r
+static int data_cnt = 0;\r
+\r
+static uint8_t *bn02_data = NULL;\r
+\r
+static uint8_t bn02_ui_data[48] = {0};\r
+\r
+void bn02_get_ui_data(uint8_t *data,uint8_t len)\r
{\r
- uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
- if (cnt == 0) \r
- {\r
- uapi_pm_add_sleep_veto(PM_ID_BP);\r
- }\r
+ if(data == NULL || len == 0 || len > 48)\r
+ {\r
+ printf("bn02_get_ui_data valid param \n");\r
+ return;\r
+ }\r
+ memcpy_s(data,len,bn02_ui_data,len);\r
+}\r
+\r
+bool Bn02_write_reg(uint8_t data)\r
+{ \r
+ // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+ // if (cnt == 0) \r
+ // {\r
+ // uapi_pm_add_sleep_veto(PM_ID_BP);\r
+ // }\r
\r
i2c_data_t i2c_data;\r
i2c_data.send_buf = &data;\r
if (ret != ERRCODE_SUCC)\r
printf("i2c Write data write fail! ret=0x%x\n", ret);\r
\r
- cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
- if (cnt == 1) \r
- {\r
- uapi_pm_remove_sleep_veto(PM_ID_BP);\r
- }\r
+\r
+ // cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+ // if (cnt == 1) \r
+ // {\r
+ // uapi_pm_remove_sleep_veto(PM_ID_BP);\r
+ // }\r
\r
return 1;\r
}\r
bool Bn02_reads(uint8_t *data,int len)\r
{\r
\r
- uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
- if (cnt == 0) \r
- {\r
- uapi_pm_add_sleep_veto(PM_ID_BP);\r
- }\r
+ // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+ // if (cnt == 0) \r
+ // {\r
+ // uapi_pm_add_sleep_veto(PM_ID_BP);\r
+ // }\r
\r
i2c_data_t i2c_data;\r
i2c_data.send_buf = NULL;\r
if (ret != ERRCODE_SUCC) \r
printf("i2c read data fail! ret=0x%x\n", ret);\r
\r
- cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
- if (cnt == 1) \r
- {\r
- uapi_pm_remove_sleep_veto(PM_ID_BP);\r
- }\r
+ // cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+ // if (cnt == 1) \r
+ // {\r
+ // uapi_pm_remove_sleep_veto(PM_ID_BP);\r
+ // }\r
\r
return 1;\r
}\r
uapi_gpio_set_dir(POWER_EN, GPIO_DIRECTION_OUTPUT);\r
uapi_gpio_set_val(POWER_EN, GPIO_LEVEL_HIGH);\r
LOS_Mdelay(1);\r
- uapi_pin_set_mode(P_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
- uapi_gpio_set_dir(P_EN, GPIO_DIRECTION_OUTPUT);\r
- uapi_gpio_set_val(P_EN, GPIO_LEVEL_HIGH);\r
+ uapi_pin_set_mode(BP_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
+ uapi_gpio_set_dir(BP_EN, GPIO_DIRECTION_OUTPUT);\r
+ uapi_gpio_set_val(BP_EN, GPIO_LEVEL_HIGH);\r
// delay_ms(20);\r
LOS_Mdelay(50);\r
}\r
else\r
{\r
- uapi_pin_set_mode(P_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
- uapi_gpio_set_dir(P_EN, GPIO_DIRECTION_OUTPUT);\r
- uapi_gpio_set_val(P_EN, GPIO_LEVEL_LOW);\r
-\r
+ uapi_pin_set_mode(BP_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
+ uapi_gpio_set_dir(BP_EN, GPIO_DIRECTION_OUTPUT);\r
+ uapi_gpio_set_val(BP_EN, GPIO_LEVEL_LOW);\r
+ LOS_Mdelay(1);\r
uapi_pin_set_mode(POWER_EN, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
uapi_gpio_set_dir(POWER_EN, GPIO_DIRECTION_OUTPUT);\r
uapi_gpio_set_val(POWER_EN, GPIO_LEVEL_LOW);\r
+ LOS_Mdelay(10);\r
}\r
}\r
\r
void bn02_int_init(void)\r
{\r
- uapi_pin_set_ie(P_INT,HAL_PIO_IE_ENBALE);\r
+ uapi_pin_set_ie(BP_INT,HAL_PIO_IE_ENBALE);\r
}\r
\r
void bn02_int_deinit(void)\r
{\r
- uapi_pin_set_ie(P_INT,HAL_PIO_IE_DISABLE);\r
+ uapi_pin_set_ie(BP_INT,HAL_PIO_IE_DISABLE);\r
}\r
\r
void bn02_int_handle(void)\r
int i;\r
memset(bn02_buf,0,sizeof(bn02_buf));\r
Bn02_reads(bn02_buf,48);\r
+ int reply_data[16] = {0}; \r
+ int cnt = 0;\r
+ for(i = 0;i<48;i+=3,cnt++)\r
+ {\r
+ reply_data[cnt] = ((bn02_buf[i] & 0xff) << 16)\r
+ + ((bn02_buf[i + 1] & 0xff) << 8)\r
+ + (bn02_buf[i + 2] & 0xff);\r
+\r
+ if (reply_data[cnt] >= DATA_HANDLE / 2)\r
+ reply_data[cnt] -= DATA_HANDLE;\r
\r
- if(bn02_get_ble_status())\r
- {\r
- bn02_replymsg(bn02_buf,sizeof(bn02_buf),1);\r
- }\r
+ // printf("data[%d]:%d\n",cnt,reply_data[cnt]);\r
+ // printf("0x%x 0x%x 0x%x 0x%x\n",i,bn02_buf[i],bn02_buf[i+1],bn02_buf[i+2],reply_data[cnt]);\r
+ }\r
\r
+ if(uapi_cat1_get_power_stat())\r
+ do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SEND_DATA,(void *)reply_data,cnt);\r
\r
- for(i = 0;i<48;i++)\r
+ if(bn02_data && fp)\r
{\r
- printf("[%d]= 0x%x\n",i,bn02_buf[i]);\r
+ if(data_cnt >= MAX_CNT)\r
+ {\r
+ if(fwrite(bn02_data,1,data_cnt,fp) != cnt)\r
+ printf("bn02 fwrite failed\n");\r
+ else\r
+ {\r
+ printf("bn02 fwrite succed data_cnt:%d\n",cnt);\r
+ data_cnt = 0;\r
+ memset(bn02_data,0,MAX_CNT);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ printf("data_cnt:%d\n",data_cnt);\r
+ memcpy_s(bn02_data + data_cnt,MAX_CNT - data_cnt,bn02_buf,48);\r
+ // memset(bn02_ui_data,0,48);\r
+ memcpy_s(bn02_ui_data,48,bn02_buf,48);\r
+ // for(int i = tcp_data_cnt; i < tcp_data_cnt+len; i ++)\r
+ // {\r
+ // printf("222data[%d]:%d\n",i,tcp_data[i]);\r
+ // }\r
+ data_cnt += 48;\r
+ }\r
}\r
+\r
+ if(bn02_get_ble_status())\r
+ bn02_replymsg(bn02_buf,48,1);\r
+\r
}\r
\r
void bn02_start(void)\r
Bn02_Power_Ctrl(1);\r
bn02_int_init();\r
Bn02_write_reg(BN02_START_CMD);\r
+#if 0\r
+ if(bn02_data == NULL)\r
+ {\r
+ bn02_data = malloc(MAX_CNT);\r
+ if(bn02_data == NULL)\r
+ printf("bn02_data malloc failed\n");\r
+ }\r
+\r
+ data_cnt = 0;\r
+ \r
+ fp = fopen(BN02_FILE, "ab+");\r
+ if(fp == NULL)\r
+ printf("open %s failed\n",BN02_FILE);\r
+ else\r
+ printf("open %s succed\n",BN02_FILE);\r
+#endif\r
}\r
\r
void bn02_stop(void)\r
bn02_int_deinit();\r
Bn02_write_reg(BN02_STOP_CMD);\r
Bn02_Power_Ctrl(0);\r
+\r
+ // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+ // if (cnt == 1) \r
+ // {\r
+ // uapi_pm_remove_sleep_veto(PM_ID_BP);\r
+ // }\r
+\r
+ // do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SERVER_DEINIT,NULL,0);\r
+\r
+#if 0\r
+ if(fp != NULL)\r
+ {\r
+ fclose(fp);\r
+ fp = NULL;\r
+ }\r
+ if(bn02_data != NULL)\r
+ {\r
+ free(bn02_data);\r
+ bn02_data = NULL;\r
+ }\r
+#endif\r
}\r
* @Author: penglei 1624952103@qq.com\r
* @Date: 2025-01-16 12:35:15\r
* @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-01-16 14:55:48\r
+ * @LastEditTime: 2025-07-30 11:50:25\r
* @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.h\r
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
*/\r
#ifndef _BN02_H_\r
#define _BN02_H_\r
\r
-enum\r
-{\r
-\r
- BN02_INT_HANDLE,\r
- BN02_INIT_ENABLE,\r
- BN02_START,\r
- BN02_POWER_DISABLE,\r
- BN02_STOP,\r
-};\r
-\r
#define BN02_START_CMD 0x04\r
#define BN02_STOP_CMD 0x08\r
\r
void bn02_int_handle(void);\r
-\r
void bn02_start(void);\r
-\r
void bn02_stop(void);\r
+void bn02_get_ui_data(uint8_t *data,uint8_t len);\r
\r
#endif // _HRS3300_H_\r
\r
* @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
*/
#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
static uint8_t ble_status = 0;
+#pragma pack(1)
typedef struct ble_bp_data_t
{
uint8_t start_code; //0x55
uint8_t* data;
uint8_t checksum; //验内容包括起始符、功能码、数据长度、标识、数据5个部分,取其和的最后8位作为校验和
}ble_bp_data_t;
-
+#pragma pack()
static ble_bp_data_t ble_bp_data = {0};
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);
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;
}
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)
{
ble_bp_data.checksum = bn02_calculate_checksum(ble_bp_data);
- ret = ble_factorytest_server_send_input_report((uint8_t *)&ble_bp_data,sizeof(ble_bp_data));
-
+ // printf("start_code : 0x%x, main_func_code : 0x%x, sub_func_code : 0x%x, data_length : 0x%x, flags : 0x%x\n",
+ // ble_bp_data.start_code,ble_bp_data.main_func_code,ble_bp_data.sub_func_code,ble_bp_data.data_length,ble_bp_data.flags);
+
+ // ble_bp_data.data = (int *)malloc(input_len * sizeof(int));
+ // if(ble_bp_data.data == NULL)
+ // return -1;
+
+ // memcpy_s(ble_bp_data.data,input_len * sizeof(int),input_data,input_len * sizeof(int));
+
+ // for(int i = 0;i<input_len;i++)
+ // {
+ // if(i == input_len - 1)
+ // printf("%d",ble_bp_data.data[i]);
+ // else
+ // printf("%d,",ble_bp_data.data[i]);
+ // }
+ // printf("\n");
+ // printf("check_sum : 0x%x\n",ble_bp_data.checksum);
+ // printf("ble_bp_data:%d\n",sizeof(ble_bp_data));
+
+
+ // 分配缓冲区并按协议顺序组装数据
+ uint8_t* buffer = (uint8_t*)malloc(8 + input_len);
+ if (!buffer) return -1;
+
+ uint8_t* p = buffer;
+ *p++ = ble_bp_data.start_code;
+ *p++ = ble_bp_data.main_func_code;
+ *p++ = ble_bp_data.sub_func_code;
+
+ // 按大端序写入多字节字段
+ *p++ = (ble_bp_data.data_length >> 8) & 0xFF;
+ *p++ = ble_bp_data.data_length & 0xFF;
+ *p++ = (ble_bp_data.flags >> 8) & 0xFF;
+ *p++ = ble_bp_data.flags & 0xFF;
+
+ // 复制数据部分
+ memcpy(p, ble_bp_data.data, ble_bp_data.data_length - 2);
+ p += ble_bp_data.data_length - 2;
+
+ *p = ble_bp_data.checksum; // 添加校验和
+ // printf("input_len:%d\n",input_len);
+ ret = ble_factorytest_server_send_input_report(buffer,8 + input_len);
+ // if(ble_bp_data.data == NULL)
+ // {
+ // free(ble_bp_data.data);
+ // ble_bp_data.data = NULL;
+ // }
+
+ free(buffer);
+
+ // printf("ret : 0x%x \n",ret);
return ret;
}
* @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
*/
--- /dev/null
+#include "pinctrl.h"
+#include "debug_print.h"
+#include "rtc.h"
+#include "timer.h"
+#include "systick.h"
+
+#include "tcxo.h"
+
+#include "cmsis_os2.h"
+#include "input_app.h"
+#include "bp_service.h"
+#include "custom_utils.h"
+#include "bp_tcp_server.h"
+#include "custom_runtime.h"
+#include <dirent.h>
+#include "lwip/ip.h"
+#include "lwip/netif.h"
+#include "lwip/init.h"
+#include "lwip/inet_chksum.h"
+
+#include "lwip/err.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+#include <lwip/netdb.h>
+// #include <netinet/in.h>
+#include "lwip/inet.h"
+#include "lwip/ip_addr.h"
+#include "pm_definition.h"
+#include "mbedtls/md5.h"
+#include "mbedtls/base64.h"
+#include "cJSON.h"
+
+#define BID "hu4kZYyYMGO"
+#define KEY "tcUpJpeGpsIBXvjG"
+
+#define SERVER_HOST "iot.socket.thisiot.com"
+#define SERVER_PORT 9999
+// 6a0f3a4f7a5f1d9a4b7b8e5c6d7a8f9b
+// 89b67780ac2e2d554f25df8acfabae4f
+#define APP_KEY "d8d960b748738c2f29c676baa3f5be64"
+#define NAME "海思鸿蒙血压手表"
+#define URL_HEADER "https://test.aicaring.com/api/v0"
+
+#define LOGIN_URL "/entrance/user/login"
+#define ACTIVE_URL "/sinklib/activation"
+#define CREATE_URL "/health/synthesis/create"
+
+// #define MAX_CNT 16 * 5 * 60
+#define MAX_CNT 16 * 5 * 50
+
+
+static unsigned long g_app_queue= 0xFFFFFFFF;
+
+static int *tcp_data = NULL;
+static int tcp_data_cnt = 0;
+
+static int g_listen_sock = -1;
+
+static uint8_t LK_STATUS = 0;
+static uint8_t BP_GET_STATUS = 0;
+
+static bp_data_t bp_data = {0};
+
+static char *imei = NULL;
+
+static uint8_t bp_measure_type = 0;
+
+//激活码 zzzm3K72zxRRLPX2utu5vMZcM269/8/7ZGOHVvONFt7WPAlQT++RJjzzrHj5v5DdlnmeELWI1FUPVJb96/5mOA==
+
+#define BP_ACTIVE_CODE_FILE "/user/system/bp_active_code.bin"
+#define BP_REQUEST_CODE_FILE "/user/system/bp_request_code.bin"
+#define BP_TOKEN_FILE "/user/system/bp_token.bin"
+
+
+
+struct bp_ipaddr_t
+{
+ osSemaphoreId_t dns_done_sem;
+ ip_addr_t ip;
+};
+
+void bp_set_adjust_data(int sbp,int dbp)
+{
+ bp_data.sbp = sbp;
+ bp_data.dbp = dbp;
+}
+
+void bp_set_measure_type(uint8_t type)
+{
+ bp_measure_type = type;
+}
+
+void bp_get_data(bp_data_t *data)
+{
+ if(data == NULL)
+ return;
+
+ memcpy_s(data,sizeof(bp_data_t),&bp_data,sizeof(bp_data_t));
+}
+
+static void bp_save_request_code(char *reqeust_code,int len)
+{
+ if(reqeust_code == NULL || len == 0)
+ return;
+
+ FILE *file = fopen(BP_REQUEST_CODE_FILE, "w");
+ if (!file)
+ {
+ printf("%s open failed\n",BP_REQUEST_CODE_FILE);
+ return;
+ }
+
+ size_t bytes_written = fwrite(reqeust_code, 1, len, file);
+ if (bytes_written != len)
+ printf(" %s fwrite failed\n",BP_REQUEST_CODE_FILE);
+ else
+ printf("reqeust_code: %s fwrite succed\n",reqeust_code);
+
+ fclose(file);
+}
+
+static void bp_save_active_code(char *active_code,int len)
+{
+ if(active_code == NULL || len == 0)
+ return;
+
+ FILE *file = fopen(BP_ACTIVE_CODE_FILE, "w");
+ if (!file)
+ {
+ printf("%s open failed\n",BP_ACTIVE_CODE_FILE);
+ return;
+ }
+
+ size_t bytes_written = fwrite(active_code, 1, len, file);
+ if (bytes_written != len)
+ printf(" %s fwrite failed\n",BP_ACTIVE_CODE_FILE);
+ else
+ printf("active_code: %s fwrite succed\n",active_code);
+
+ fclose(file);
+}
+
+static void bp_get_active_code(char *active_code,int len)
+{
+ if (active_code == NULL || len == 0)
+ {
+ printf("active_code is NULL or len == 0\n");
+ return;
+ }
+
+ char *buffer = (char *)malloc(len);
+ if(buffer == NULL)
+ return;
+
+ FILE *file = fopen(BP_ACTIVE_CODE_FILE, "r");
+ if (!file)
+ {
+ printf("open failed: %s\n", BP_ACTIVE_CODE_FILE);
+ return;
+ }
+
+ memset(buffer, 0, len);
+
+ size_t bytes_read = fread(buffer, 1, len - 1, file);
+ if (bytes_read > 0)
+ {
+ buffer[bytes_read] = '\0';
+ printf("active code: %s\n", buffer);
+ } else
+ printf("read active code failed\n");
+
+ memcpy_s(active_code,bytes_read,buffer,bytes_read);
+
+ free(buffer);
+ fclose(file);
+}
+
+static void bp_get_request_code(char *request_code,int len)
+{
+ if (request_code == NULL || len == 0)
+ {
+ printf("request_code is NULL or len == 0\n");
+ return;
+ }
+
+ char *buffer = (char *)malloc(len);
+ if(buffer == NULL)
+ return;
+
+ FILE *file = fopen(BP_REQUEST_CODE_FILE, "r");
+ if (!file)
+ {
+ printf("open failed: %s\n", BP_REQUEST_CODE_FILE);
+ return;
+ }
+
+ // 初始化缓冲区
+ memset(buffer, 0, len);
+
+ // 安全读取文件内容(最多len-1字节,留一个位置给\0)
+ size_t bytes_read = fread(buffer, 1, len - 1, file);
+ if (bytes_read > 0)
+ {
+ buffer[bytes_read] = '\0';
+ printf("active code: %s\n", buffer);
+ } else
+ printf("read active code failed\n");
+
+ memcpy_s(request_code,bytes_read,buffer,bytes_read);
+
+ free(buffer);
+ fclose(file);
+}
+
+static void bp_get_token(char *token,int len)
+{
+ if (token == NULL || len == 0)
+ {
+ printf("token is NULL or len == 0\n");
+ return;
+ }
+
+ char *buffer = (char *)malloc(len);
+ if(buffer == NULL)
+ return;
+
+ FILE *file = fopen(BP_TOKEN_FILE, "r");
+ if (!file)
+ {
+ printf("open failed: %s\n", BP_TOKEN_FILE);
+ return;
+ }
+
+ // 初始化缓冲区
+ memset(buffer, 0, len);
+
+ // 安全读取文件内容(最多len-1字节,留一个位置给\0)
+ size_t bytes_read = fread(buffer, 1, len - 1, file);
+ if (bytes_read > 0)
+ {
+ buffer[bytes_read] = '\0';
+ printf("bp_get_token: %s\n", buffer);
+ } else
+ printf("read token failed\n");
+
+ memcpy_s(token,bytes_read,buffer,bytes_read);
+
+ free(buffer);
+ fclose(file);
+}
+
+static void bp_save_token(char *token,int len)
+{
+ if(token == NULL || len == 0)
+ return;
+
+ FILE *file = fopen(BP_TOKEN_FILE, "w");
+ if (!file)
+ {
+ printf("%s open failed\n",BP_TOKEN_FILE);
+ return;
+ }
+
+ size_t bytes_written = fwrite(token, 1, len, file);
+ if (bytes_written != len)
+ printf(" %s fwrite failed\n",BP_TOKEN_FILE);
+ else
+ printf("token: %s fwrite succed\n",token);
+
+ fclose(file);
+}
+
+static void dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg)
+{
+ struct bp_ipaddr_t *ip_sem = (struct bp_ipaddr_t *)arg;
+ char ip_str[20] = {0};
+
+ // if (ipaddr == NULL) {
+ // printf("DNS解析失败,IP地址为空\n");
+ // (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+ // return;
+ // }
+
+ printf("hostname: %s, ", hostname);
+
+ // 处理IPv4地址(现在ip4是包含addr成员的结构体)
+ if (IP_IS_V4(ipaddr)) {
+ u32_t ip_num = ipaddr->u_addr.ip4.addr; // 直接获取32位地址
+
+ // 分解为4字节打印
+ u8_t byte0 = (ip_num >> 24) & 0xFF;
+ u8_t byte1 = (ip_num >> 16) & 0xFF;
+ u8_t byte2 = (ip_num >> 8) & 0xFF;
+ u8_t byte3 = ip_num & 0xFF;
+ // printf("IPv4: %d.%d.%d.%d\n", byte0, byte1, byte2, byte3);
+
+ // 转换为struct in_addr(已为网络字节序)
+ struct in_addr ipv4_addr;
+ ipv4_addr.s_addr = ip_num;
+ inet_ntop(AF_INET, &ipv4_addr, ip_str, sizeof(ip_str));
+ printf("ip: %s\n", ip_str);
+ }
+
+ // 复制IP地址到上下文
+ if(ipaddr->u_addr.ip4.addr != 0)
+ memcpy(&(ip_sem->ip), ipaddr, sizeof(ip_addr_t));
+ (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+}
+
+int bp_tcp_socket_init(void)
+{
+ uint8_t cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (cnt == 0) {
+ uapi_pm_add_sleep_veto(PM_ID_CAT1);
+ }
+
+ struct sockaddr_in server_addr;
+ struct bp_ipaddr_t ip_sem = {0}; // 定义信号量结构
+ int listen_socket = -1;
+
+ // 创建信号量
+ ip_sem.dns_done_sem = osSemaphoreNew(1, 0, NULL);
+
+ // 解析域名
+ dns_gethostbyname(SERVER_HOST, &(ip_sem.ip), dns_found, &ip_sem);
+
+ osSemaphoreAcquire(ip_sem.dns_done_sem, 1000 * 5); // 等待 DNS 解析完成
+
+ memcpy(&server_addr.sin_addr.s_addr, &ip_sem.ip.u_addr.ip4, 4);
+
+ // 创建套接字
+ listen_socket = lwip_socket(AF_INET, SOCK_STREAM, 0);
+ if(listen_socket < 0)
+ {
+ int err = errno;
+ printf("socket create errno: %d, reason: %s\n", err, strerror(err));
+ goto FAILED;
+ }
+
+ int opt = 1;
+
+ lwip_setsockopt(listen_socket, SOL_SOCKET, SO_KEEPALIVE, (const void*)&opt, sizeof(opt));
+ lwip_setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR,(const void*)&opt, sizeof(opt));
+
+ // 设置服务器地址
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(SERVER_PORT);
+
+ // 连接服务器
+ if (connect(listen_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
+ {
+ printf("server_addr.sin_addr.s_addr:%d\n",server_addr.sin_addr.s_addr);
+ int err = errno;
+ printf("connect failed, errno: %d, reason: %s\n", err, strerror(err));
+
+ goto FAILED;
+ }
+
+
+ cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (cnt == 1) {
+ uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+ }
+
+ printf("socket init succed\n");
+ osSemaphoreDelete(ip_sem.dns_done_sem); // 释放信号量
+
+ return listen_socket;
+
+FAILED:
+ if (listen_socket >= 0)
+ {
+ lwip_close(listen_socket);
+ }
+ if (ip_sem.dns_done_sem != NULL)
+ {
+ osSemaphoreDelete(ip_sem.dns_done_sem);
+ }
+ cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (cnt == 1)
+ {
+ uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+ }
+ return -1;
+}
+
+void tcp_recv_data_handler(const char *input, int input_len)
+{
+ if(input == NULL || input_len == 0)
+ {
+ return;
+ }
+
+ if (input_len < 2 || input[0] != '[' || input[input_len-1] != ']')
+ {
+ printf("解析失败: 格式错误(缺少方括号)\n");
+ return;
+ }
+
+ const char *data = input + 1;
+ size_t data_len = input_len - 2;
+
+ const char *comma1 = memchr(data, ',', data_len);
+ const char *comma2 = comma1 ? memchr(comma1 + 1, ',', data_len - (comma1 - data + 1)) : NULL;
+
+ const char *star1 = memchr(data, '*', data_len);
+ const char *star2 = star1 ? memchr(star1 + 1, '*', data_len - (star1 - data + 1)) : NULL;
+ const char *star3 = star2 ? memchr(star2 + 1, '*', data_len - (star2 - data + 1)) : NULL;
+
+ if (!star1 || !star2 || !star3)
+ {
+ printf("解析失败: 头部格式错误(缺少星号分隔符)\n");
+ return;
+ }
+
+ const char *bid = data;
+ const char *imei = star1 + 1;
+ const char *len_str = star2 + 1;
+ const char *cmd = star3 + 1;
+
+ size_t bid_len = star1 - data;
+ size_t imei_len = star2 - (star1 + 1);
+ size_t len_str_len = star3 - (star2 + 1);
+ size_t cmd_len = data_len - (star3 - data + 1);
+
+ // 打印头部解析结果
+ // printf("BID: %.*s\n", (int)bid_len, bid);
+ // printf("IMEI: %.*s\n", (int)imei_len, imei);
+ // printf("内容长度: %.*s\n", (int)len_str_len, len_str);
+ // printf("指令: %.*s\n", (int)cmd_len, cmd);
+
+ // 验证IMEI长度(假设为15位)
+ if (imei_len != 15)
+ {
+ printf("解析失败: IMEI长度应为15位,实际: %zu位\n", imei_len);
+ return;
+ }
+
+ uint32_t content_len = 0;
+ sscanf(len_str, "%x", &content_len);
+ printf("解析后的内容长度: %u\n", content_len);
+
+ if (comma1 && comma2)
+ {
+ size_t status_len = comma2 - (comma1 + 1);
+ size_t base64_len = data_len - (comma2 - data + 1);
+
+ printf("状态码: %.*s\n", (int)status_len, comma1 + 1);
+
+ if (strncmp(comma1 + 1, "200", status_len) != 0)
+ {
+ printf("解析失败: 状态码必须为200,实际: %.*s\n", (int)status_len, comma1 + 1);
+ return;
+ }
+
+ size_t decoded_len = (base64_len * 3) / 4 + 1;
+ unsigned char *decoded_data = malloc(decoded_len);
+ if (!decoded_data)
+ {
+ printf("解析失败: 内存分配失败\n");
+ return;
+ }
+
+ size_t actual_decoded_len = 0;
+ int ret = mbedtls_base64_decode(decoded_data, decoded_len, &actual_decoded_len,(const unsigned char *)(comma2 + 1), base64_len);
+
+ if (ret != 0)
+ {
+ printf("解析失败: Base64解码失败 (错误码: %d)\n", ret);
+ free(decoded_data);
+ return;
+ }
+ decoded_data[actual_decoded_len] = '\0';
+
+ cJSON *json_data = cJSON_Parse((const char *)decoded_data);
+ free(decoded_data);
+
+ if (!json_data)
+ {
+ printf("解析失败: JSON解析失败,原始数据: %s\n", decoded_data);
+ return;
+ }
+
+ printf("JSON数据: %s\n", cJSON_Print(json_data));
+
+ cJSON *status = cJSON_GetObjectItem(json_data, "status");
+ cJSON *data_obj = cJSON_GetObjectItem(json_data, "data");
+ cJSON *activation_code = cJSON_GetObjectItem(data_obj, "activation_code");
+ cJSON *token = cJSON_GetObjectItem(data_obj, "token");
+ cJSON *sbp = cJSON_GetObjectItem(data_obj, "sbp");
+ cJSON *dbp = cJSON_GetObjectItem(data_obj, "dbp");
+ cJSON *pressure = cJSON_GetObjectItem(data_obj, "pressure");
+ cJSON *fatigue = cJSON_GetObjectItem(data_obj, "fatigue");
+ cJSON *emo = cJSON_GetObjectItem(data_obj, "emo");
+
+ if (status && cJSON_IsTrue(status) && data_obj)
+ {
+ if (activation_code)
+ {
+ printf("激活状态: 成功\n");
+ printf("激活码: %s\n", activation_code->valuestring);
+ bp_save_active_code(activation_code->valuestring, strlen(activation_code->valuestring));
+ }
+ if (token)
+ {
+ printf("token: %s\n", token->valuestring);
+ bp_save_token(token->valuestring, strlen(token->valuestring));
+ }
+
+ if (sbp && dbp && emo && pressure && fatigue)
+ {
+ printf("sbp: %d\n", sbp->valueint);
+ bp_data.sbp = sbp->valueint;
+
+ printf("dbp: %d\n", dbp->valueint);
+ bp_data.dbp = dbp->valueint;
+
+ printf("emo: %s\n", emo->valuestring);
+ memcpy_s(bp_data.emo,sizeof(bp_data.emo),emo->valuestring,strlen(emo->valuestring));
+
+ printf("pressure: %d\n", pressure->valueint);
+ bp_data.pressure = pressure->valueint;
+
+ printf("fatigue: %d\n", fatigue->valueint);
+ bp_data.fatigue = fatigue->valueint;
+
+ BP_GET_STATUS = 1;
+
+ }
+ }
+ else
+ {
+ cJSON *error_code = cJSON_GetObjectItem(json_data, "error_code");
+ cJSON *error_msg = cJSON_GetObjectItem(json_data, "error_message");
+ printf("激活状态: 失败\n");
+ printf("错误码: %s\n", error_code ? error_code->valuestring : "未知");
+ printf("错误信息: %s\n", error_msg ? error_msg->valuestring : "未知");
+ }
+
+ cJSON_Delete(json_data);
+ }
+ else
+ {
+ // 无逗号或只有一个逗号,仅处理指令
+ // printf("格式: 仅指令,无状态码和Base64内容\n");
+ printf("指令处理: %.*s\n", (int)cmd_len, cmd);
+
+ // 这里可以添加仅处理指令的逻辑
+ // bp_handle_command(cmd, cmd_len); // 假设存在指令处理函数
+ if(strstr(cmd,"LK") != NULL)
+ {
+ printf("LK succed\n");
+ LK_STATUS = 1;
+ }
+
+ }
+}
+
+
+static int tcp_send(int listen_socket, const char *data, size_t size)
+{
+ if (data == NULL || size == 0)
+ return -1;
+
+ uint8_t retry = 0;
+ while(listen_socket < 0 && retry < 5)
+ {
+ retry++;
+ LOS_Msleep(2000);
+ }
+
+ if(listen_socket < 0)
+ {
+ printf("listen_socket < 0 \n");
+ return -1;
+ }
+
+ int ret = 0;
+
+ // const char *buffer = (const char *)data;
+ const char *buffer = (const char *)malloc(size);
+ if(buffer == NULL)
+ return -1;
+
+ memcpy_s(buffer,size,(const char *)data,size);
+ // printf("size : %d\n",size);
+ // printf("strlen(buffer) : %d\n",strlen(buffer));
+ // printf("buffer : %s\n",buffer);
+
+ size_t total_sent = 0;
+
+ while (total_sent < size)
+ {
+ ssize_t sent = lwip_send(listen_socket, buffer + total_sent, size - total_sent, 0);
+ if (sent < 0) {
+ printf("errno : %d\n",errno);
+ // 处理错误情况
+ if (errno == EINTR) {
+ PRINT("被信号中断,继续尝试\n");
+ ret = -1;
+ continue;
+ } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
+ PRINT("非阻塞模式下暂时无法发送,可选择等待或返回\n");
+ ret = -1;
+ goto FAILED;
+ } else if (errno == ENETUNREACH) {
+ PRINT("网络不可达,检查路由或远程主机状态\n");
+ ret = -1;
+ goto FAILED;
+ }
+ else {
+ PRINT("其他错误(如连接断开)\n");
+ ret = -1;
+ goto FAILED;
+ }
+ }
+
+ total_sent += sent;
+ }
+ printf("tcp send succed size : %d\n",total_sent);
+ ret = 0;
+FAILED:
+
+ if(buffer != NULL)
+ {
+ free(buffer);
+ buffer = NULL;
+ }
+ return ret;
+}
+
+static int active_md5_sign(const char *data,int data_len,char*md5_str)
+{
+ char md5_buf[16]={0};
+
+ char *code_str = (const char*)malloc(data_len);
+ if(md5_str == NULL)
+ return -1;
+
+ memcpy_s(code_str,data_len,data,data_len);
+ mbedtls_md5_context ctx;
+
+ // 初始化MD5上下文
+ mbedtls_md5_init(&ctx);
+
+ // 开始计算MD5哈希
+ mbedtls_md5_starts(&ctx);
+ // 更新要计算哈希的数据
+ mbedtls_md5_update(&ctx, (const unsigned char *)code_str, data_len);
+
+ // 完成哈希计算
+ mbedtls_md5_finish(&ctx, (unsigned char *)md5_buf);
+
+ // printf("md5_buf\r\n");
+ // for (int i = 0; i < 16; i++) {
+ // printf("%02X\n", (uint8_t)md5_buf[i]);
+ // }
+ // printf("md5_buf end\r\n");
+
+ // 清理MD5上下文
+ mbedtls_md5_free(&ctx);
+ for (int i = 0; i < 16; i++)
+ sprintf(&md5_str[i * 2], "%02x", (uint8_t)md5_buf[i]);
+
+ md5_str[32] = '\0';
+
+ free(code_str);
+
+ return 0;
+}
+
+static void calculate_md5(const char* input, char* md5_str)
+{
+ mbedtls_md5_context md5;
+ unsigned char md5_digest[16] = {0};
+ int i;
+
+ // printf("input:%s\n",input);
+
+ mbedtls_md5_init(&md5);
+ mbedtls_md5_starts(&md5);
+ mbedtls_md5_update(&md5, (const unsigned char*)input, strlen(input));
+ mbedtls_md5_finish(&md5, md5_digest);
+ mbedtls_md5_free(&md5);
+
+ // 转换为十六进制字符串
+ for (i = 0; i < 16; i++) {
+ sprintf(md5_str + i*2, "%02x", md5_digest[i]);
+ }
+ md5_str[32] = '\0'; // 确保字符串终止
+}
+
+int tcp_sign_up(void)
+{
+ int ret = 0;
+ char len_str[5] = {0};
+ sprintf(len_str, "%04x", 2);
+
+ // 获取IMEI
+ if(imei == NULL)
+ {
+
+ imei = uapi_dev_runtime_get_cat1_imei();
+
+ if(imei == NULL || strlen(imei) == 0)
+ {
+ LOS_Msleep(2000);
+ imei = uapi_dev_runtime_get_cat1_imei();
+ }
+
+ if (imei == NULL || strlen(imei) == 0)
+ {
+ printf("IMEI get failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+ }
+ // printf("imei:%s\n", imei);
+
+ // 精确计算head_str长度:BID + * + IMEI + * + len_str + * + LK + \0
+ int head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("LK") + 1;
+ char *head_str = (char *)malloc(head_len);
+ if(head_str == NULL)
+ {
+ printf("tcp_sign_up head_str malloc failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ snprintf(head_str, head_len, "%s*%s*%s*LK", BID,imei,len_str);
+ head_len = strlen(head_str); // 重新计算实际长度
+
+ char md5_str[33] = {0}; // MD5为32字符+1终止符
+
+ // 计算code_str长度:head_str + KEY + \0
+ int code_len = head_len + strlen(KEY) + 1;
+ char *code_str = (char *)malloc(code_len);
+ if(code_str == NULL)
+ {
+ printf("code_str malloc failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ code_len = strlen(code_str);
+
+ if(active_md5_sign(code_str, code_len, md5_str) != 0)
+ {
+ printf("active_md5_sign failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ // 计算send_str长度:[ + md5_str + head_str + ] + \0
+ int send_len = 1 + strlen(md5_str) + strlen(head_str) + 1 + 1;
+ char *send_str = (char *)malloc(send_len);
+ if(send_str == NULL)
+ {
+ printf("send_str malloc failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ snprintf(send_str, send_len, "[%s%s]", md5_str, head_str);
+ send_len = strlen(send_str);
+
+ // 打印调试信息
+ // printf("md5_str:%s\n", md5_str);
+ // printf("md5_len:%zu\n", strlen(md5_str));
+ // printf("head_len:%d\n", head_len);
+ // printf("head_str:%s\n", head_str);
+ // printf("send_len : %d\n", send_len);
+ // printf("send_str : %s\n", send_str);
+
+ // 发送数据
+ ret = tcp_send(g_listen_sock, send_str, send_len);
+ if(ret != 0)
+ {
+ printf("tcp_send failed\n");
+ goto FAILED;
+ }
+
+
+FAILED:
+ // 释放资源
+ if(head_str != NULL)
+ {
+ free(head_str);
+ head_str = NULL;
+ }
+ if(code_str != NULL)
+ {
+ free(code_str);
+ code_str = NULL;
+ }
+ if(send_str != NULL)
+ {
+ free(send_str);
+ send_str = NULL;
+ }
+
+ return ret;
+}
+
+void get_request_code(char *req_code)
+{
+ uint32_t req_code_len = 0;
+ char* fact = "hunandongni"; // 获取厂商名字(不超过32个字节的字符串)
+ const unsigned int fact_len = strlen(fact);
+
+ if(imei == NULL)
+ {
+ uint8_t retry = 0;
+ while((imei == NULL || strlen(imei) == 0) && retry < 10)
+ {
+ retry++;
+ LOS_Msleep(2000);
+ imei = uapi_dev_runtime_get_cat1_imei();
+ }
+
+ if (imei == NULL || strlen(imei) == 0)
+ {
+ printf("IMEI get failed\n");
+ return;
+ }
+ }
+
+ const unsigned int imei_len = strlen(imei);
+ request_validation((unsigned char*)fact, fact_len, (unsigned char*)imei, imei_len, (unsigned char*)req_code, &req_code_len);
+ printf("req_code:%s\n",req_code);
+ printf("req_code_len:%d\n",req_code_len);
+}
+
+/**
+ * 计算cnt个int数据转换为字符串并添加逗号后的Base64编码长度
+ * @param cnt int数据个数
+ * @return Base64编码后的长度,失败返回-1
+ */
+static int calculate_base64_length(int cnt)
+{
+ if (cnt <= 0)
+ return -1;
+
+ // 1. 计算int数组转换为字符串的最大可能长度
+ // int的最大字符串长度:11个字符(如"-2147483648")
+ // 每个int后加一个逗号(最后一个int除外)
+ int str_length = cnt * 11 + (cnt - 1);
+
+ // 2. 计算Base64编码长度
+ // Base64编码规则:每3字节明文→4字节编码,不足3字节用'='填充
+ int base64_length = (str_length * 4 + 2) / 3;
+
+ // 3. 确保编码长度足够容纳终止符
+ base64_length += 1; // 预留终止符空间
+
+ return base64_length;
+}
+
+static void upload_bp_data(void)
+{
+#if 0
+ if (data == NULL || cnt == 0)
+ return;
+
+ int ret = -1;
+ char *data_str = NULL;
+ int data_len = 0;
+ char *encode_str = NULL;
+ int encode_len = 0;
+ char *head_str = NULL;
+ int head_len = 0;
+ char *code_str = NULL;
+ int code_len = 0;
+ char *send_str = NULL;
+ int send_len = 0;
+ char *tail_encode_str = NULL;
+ uint32_t output_len = 0;
+ int temp_len = 0;
+ char len_str[5] = {0};
+ char md5_str[33] = {0};
+ uint32_t begin_time = 0;
+ uint32_t end_time = 0;
+
+ char *encode_header_str = NULL;
+ char *header_json = NULL;
+ int encode_header_len = 0;
+
+
+ // 获取测量时间
+ bp_get_measure_time(&begin_time, &end_time);
+ char *begin_time_str = (char *)malloc(64);
+ char *end_time_str = (char *)malloc(64);
+ if (begin_time_str == NULL || end_time_str == NULL)
+ goto FAILED;
+ uapi_get_TIME_STR(begin_time, begin_time_str, '-', ':', DATE_TIME_DEFULL);
+ uapi_get_TIME_STR(end_time, end_time_str, '-', ':', DATE_TIME_DEFULL);
+ printf("begin_time_str:%s\n", begin_time_str);
+ printf("end_time_str:%s\n", end_time_str);
+
+ // 构建JSON数据前缀部分
+ header_json = (char *)malloc(256);
+ if(header_json == NULL)
+ goto FAILED;
+
+ char token[64] = {0};
+ bp_get_token(token, 64);
+ printf("bp_get_token:%s\n", token);
+ uint8_t retry = 0;
+ while(strlen(token) == 0 && retry < 10)
+ {
+ bp_tcp_login();
+ LOS_Msleep(500);
+ bp_get_token(token, 64);
+ }
+
+ temp_len = 0;
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"headers\":[");
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"key\":\"token\",");
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "\"value\":\"%s\"}", token);
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "]}");
+
+ if(temp_len > 256)
+ {
+ goto FAILED;
+ }
+
+ encode_header_len = temp_len * 3 / 2;
+ encode_header_str = (char *)malloc(encode_header_len);
+ if(NULL == encode_header_str)
+ {
+ printf("encode_header_str malloc failed\n");
+ goto FAILED;
+ }
+
+ memset(encode_header_str,0, encode_header_len);
+ size_t output_header_len = 0;
+ if(0 != mbedtls_base64_encode((unsigned char*)encode_header_str, encode_header_len, &output_header_len, (const unsigned char*)header_json, temp_len))
+ {
+ printf("encode_header_str base64 encode failed\n");
+ goto FAILED;
+ }
+
+ // 分配JSON缓冲区
+ int json_len = 512 + calculate_base64_length(cnt);
+ char *json_data = (char *)malloc(json_len);
+ if (json_data == NULL)
+ {
+ printf("json_data malloc failed\n");
+ goto FAILED;
+ }
+ printf("json_data malloc succed\n");
+
+ temp_len = 0;
+ memset(json_data, 0, json_len);
+
+
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+ // temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"device_code\":\"%s\",", "864430010001091");
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"device_code\":\"%s\",", imei);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"measure_mode\":\"%d\",", 1);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"measure_type\":\"%d\",", 7);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"begin_time\":\"%s\",", begin_time_str);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"end_time\":\"%s\",", end_time_str);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"ppg_data\":[");
+
+ if(temp_len > 512)
+ goto FAILED;
+
+ // // 后续Base64编码和数据发送逻辑...
+ // encode_len = 512 * 2;
+ // printf("encode_len : %d\n", encode_len);
+ // encode_str = (char *)malloc(encode_len);
+ // if (encode_str == NULL) {
+ // printf("encode_str 分配失败\n");
+ // goto FAILED;
+ // }
+ // printf("encode_str 分配成功\n");
+
+ // memset(encode_str, 0, encode_len);
+
+ // mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len,
+ // (const unsigned char*)json_data, strlen(json_data));
+
+ // printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+ // encode_str[output_len] = '\0';
+ // printf("encode_str : %s\n",encode_str);
+
+
+ // 构建content部分
+ data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(CREATE_URL) + strlen(token) + 1 + 1 + output_len + 1 + calculate_base64_length(cnt) + 1 + strlen(tail_encode_str);
+ data_str = (char *)malloc(data_len);
+ if (data_str == NULL) {
+ printf("data_str 分配失败\n");
+ goto FAILED;
+ }
+ memset(data_str, 0, data_len);
+
+ // 后续Base64编码和数据发送逻辑...
+ encode_len = data_len * 3 / 2;
+ printf("encode_len : %d\n", encode_len);
+ encode_str = (char *)malloc(encode_len);
+ if (encode_str == NULL) {
+ printf("encode_str 分配失败\n");
+ goto FAILED;
+ }
+ printf("encode_str 分配成功\n");
+
+ memset(encode_str, 0, encode_len);
+
+ mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len,
+ (const unsigned char*)json_data, strlen(json_data));
+
+ printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+ encode_str[output_len] = '\0';
+ printf("encode_str : %s\n",encode_str);
+
+
+ snprintf(data_str, data_len, ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, token, encode_str);
+
+ // 完成JSON数据,添加ppg_fs字段
+ temp_len = 0;
+ memset(json_data, 0, 512);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"ppg_fs\":\"%d\"}", 81);
+ tail_encode_str = (char *)malloc(32);
+ memset(tail_encode_str, 0, 32);
+ mbedtls_base64_encode((unsigned char*)tail_encode_str, 32, &output_len,
+ (const unsigned char*)json_data, strlen(json_data));
+
+ if(output_len > 32)
+ goto FAILED;
+ tail_encode_str[output_len] = '\0';
+
+ // 计算数据长度并格式化为16进制
+ // data_len = strlen(data_str);
+ sprintf(len_str, "%04x", data_len + 8 + calculate_base64_length(cnt) + 1 + strlen(tail_encode_str));
+ printf("data_len : %d\n",data_len);
+ // 计算head_str长度
+ // head_len = strlen(BID) + 1 + strlen("864430010001091") + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ head_str = (char *)malloc(head_len);
+ if (head_str == NULL) {
+ printf("head_str 分配失败\n");
+ goto FAILED;
+ }
+
+ // snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, "864430010001091", len_str);
+ snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei,len_str);
+ head_len = strlen(head_str);
+
+ // 计算MD5
+ code_len = head_len + strlen(KEY) + 1;
+ code_str = (char *)malloc(code_len);
+ if (code_str == NULL) {
+ printf("code_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ printf("code_len:%d\n", code_len);
+
+ calculate_md5(code_str, md5_str);
+ if (strlen(md5_str) == 0) {
+ printf("MD5签名失败\n");
+ goto FAILED;
+ }
+
+ send_len = 1 + strlen(md5_str) + head_len + data_len + 1;
+ send_str = (char *)malloc(send_len);
+ if (send_str == NULL) {
+ printf("send_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(send_str, send_len, "[%s%s%s", md5_str, head_str,data_str);
+ send_len = strlen(send_str);
+ printf("send_len : %d\n", send_len);
+ printf("send_str : %s\n", send_str);
+
+ tcp_send(g_listen_sock, send_str, send_len);
+
+/*########################################################################################################*/
+
+ // 分块发送ppg_data
+ int ppg_block = 0;
+ int ppg_offset = 0; // 已处理的int数量
+ int total_ints = cnt; // 总int数量
+
+ while (ppg_offset < total_ints) {
+ LOS_Msleep(100);
+ temp_len = 0; // 当前块的字符串长度
+ int ints_in_block = 0; // 当前块包含的int数量
+
+ memset(json_data, 0, 512);
+
+ // 计算当前块最多能容纳多少个int
+ while (temp_len < 512 - 12 && ppg_offset < total_ints) {
+ int num = data[ppg_offset];
+ int written = 0;
+
+ // 如果不是最后一个int,添加数字和逗号
+ if (ppg_offset < total_ints - 1) {
+ written = snprintf(
+ json_data + temp_len,
+ 512 - temp_len,
+ "%d,", num
+ );
+ }
+ // 最后一个int,添加数字但不添加逗号
+ else {
+ written = snprintf(
+ json_data + temp_len,
+ 512 - temp_len,
+ "%d", num
+ );
+ }
+
+ if (written < 0 || written >= 512 - temp_len) {
+ break; // 空间不足,结束当前块
+ }
+
+ temp_len += written;
+ ppg_offset++;
+ ints_in_block++;
+ }
+
+ // 最后一个块需要添加JSON数组结束符号
+ if (ppg_offset == total_ints && temp_len > 0) {
+ json_data[temp_len++] = ']';
+ }
+
+ // 发送当前块
+ if (temp_len > 0) {
+ memset(encode_str, 0, encode_len);
+ mbedtls_base64_encode(
+ (unsigned char*)encode_str,
+ encode_len,
+ &output_len,
+ (const unsigned char*)json_data,
+ temp_len
+ );
+
+ tcp_send(g_listen_sock, encode_str, output_len);
+ printf("已发送ppg数据块 %d,包含 %d 个int,字符串长度: %d encode_str:%s\n",
+ ppg_block, ints_in_block, temp_len,encode_str);
+ }
+
+ ppg_block++;
+ }
+ memset(send_str,0,send_len);
+ send_len = strlen(tail_encode_str) + 1;
+ snprintf(send_str, send_len, "%s]", tail_encode_str);
+ printf("send_len : %d\n", send_len);
+ printf("tail_encode_str : %s\n", tail_encode_str);
+ //发送最终数据
+ tcp_send(g_listen_sock, send_str, send_len);
+
+ ret = 0; // 成功
+
+FAILED:
+
+ if (tail_encode_str != NULL) {
+ free(tail_encode_str);
+ tail_encode_str = NULL;
+ }
+ if (begin_time_str != NULL) {
+ free(begin_time_str);
+ begin_time_str = NULL;
+ }
+ if (end_time_str != NULL) {
+ free(end_time_str);
+ end_time_str = NULL;
+ }
+ if (json_data != NULL) {
+ free(json_data);
+ json_data = NULL;
+ }
+ if (send_str != NULL) {
+ free(send_str);
+ send_str = NULL;
+ }
+ if (code_str != NULL) {
+ free(code_str);
+ code_str = NULL;
+ }
+ if (head_str != NULL) {
+ free(head_str);
+ head_str = NULL;
+ }
+ if (data_str != NULL) {
+ free(data_str);
+ data_str = NULL;
+ }
+ if (encode_str != NULL) {
+ free(encode_str);
+ encode_str = NULL;
+ }
+
+ printf("free\n");
+
+#else
+ if (tcp_data == NULL || tcp_data_cnt == 0)
+ return;
+
+ if(LK_STATUS != 1)
+ {
+ printf("NOT LK\n");
+ return;
+ }
+
+ int ret = -1;
+ char *data_str = NULL;
+ int data_len = 0;
+ char *encode_str = NULL;
+ int encode_len = 0;
+ char *head_str = NULL;
+ int head_len = 0;
+ char *code_str = NULL;
+ int code_len = 0;
+ char *send_str = NULL;
+ int send_len = 0;
+ uint32_t output_len = 0;
+ int temp_len = 0;
+ char len_str[5] = {0};
+ char md5_str[33] = {0};
+ uint32_t begin_time = 0;
+ uint32_t end_time = 0;
+
+ char *encode_header_str = NULL;
+ char *header_json = NULL;
+ int encode_header_len = 0;
+
+
+ // 获取测量时间
+ bp_get_measure_time(&begin_time, &end_time);
+ char *begin_time_str = (char *)malloc(64);
+ char *end_time_str = (char *)malloc(64);
+ if (begin_time_str == NULL || end_time_str == NULL)
+ goto FAILED;
+ uapi_get_TIME_STR(begin_time, begin_time_str, '-', ':', DATE_TIME_DEFULL);
+ uapi_get_TIME_STR(end_time, end_time_str, '-', ':', DATE_TIME_DEFULL);
+ printf("begin_time_str:%s\n", begin_time_str);
+ printf("end_time_str:%s\n", end_time_str);
+
+ // 构建JSON数据前缀部分
+ header_json = (char *)malloc(256);
+ if(header_json == NULL)
+ goto FAILED;
+
+ char token[64] = {0};
+ bp_get_token(token, 64);
+
+ if (strlen(token) == 0)
+ {
+ printf("token get failed\n");
+ goto FAILED;
+ }
+
+ temp_len = 0;
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"headers\":[");
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"key\":\"token\",");
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "\"value\":\"%s\"}", token);
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "]}");
+
+ if(temp_len > 256)
+ {
+ goto FAILED;
+ }
+
+ encode_header_len = temp_len * 3 / 2;
+ encode_header_str = (char *)malloc(encode_header_len);
+ if(NULL == encode_header_str)
+ {
+ printf("encode_header_str malloc failed\n");
+ goto FAILED;
+ }
+
+ memset(encode_header_str,0, encode_header_len);
+ size_t output_header_len = 0;
+ if(0 != mbedtls_base64_encode((unsigned char*)encode_header_str, encode_header_len, &output_header_len, (const unsigned char*)header_json, temp_len))
+ {
+ printf("encode_header_str base64 encode failed\n");
+ goto FAILED;
+ }
+
+ // 分配JSON缓冲区
+ int json_len = 512 + calculate_base64_length(tcp_data_cnt);
+ char *json_data = (char *)malloc(json_len);
+ if (json_data == NULL)
+ {
+ printf("json_data malloc failed\n");
+ goto FAILED;
+ }
+ printf("json_data malloc succed\n");
+
+ temp_len = 0;
+ memset(json_data, 0, json_len);
+
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+ // temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"device_code\":\"%s\",", "864430010001091");
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"device_code\":\"%s\",", imei);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"measure_mode\":\"%d\",", 1);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"measure_type\":\"%d\",", bp_measure_type);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"begin_time\":\"%s\",", begin_time_str);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"end_time\":\"%s\",", end_time_str);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"ppg_data\":[");
+
+ // printf("bp_measure_type : %d\n",bp_measure_type);
+
+ for(int i = 0; i < tcp_data_cnt; i++)
+ {
+ if(i == (tcp_data_cnt - 1))
+ {
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "%d],", tcp_data[i]);
+ }
+ else
+ {
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "%d,", tcp_data[i]);
+ }
+ }
+
+ // temp_len += snprintf(json_data + temp_len, json_len - temp_len,"\"ppg_fs\":\"%d\"}", 81);
+
+
+ // if(bp_measure_type == BP_ADJUST)
+ // {
+ //
+ if(bp_measure_type == BP_ADJUST)
+ {
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len,"\"ppg_fs\":\"%d\",", 81);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"cal_value\":[%d,%d]\"}",120,80);
+ }
+ else
+ {
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len,"\"ppg_fs\":\"%d\"}", 81);
+ }
+ // }
+
+
+ if(temp_len > json_len)
+ goto FAILED;
+
+ encode_len = temp_len * 3 / 2;
+ printf("encode_len : %d\n", encode_len);
+ encode_str = (char *)malloc(encode_len);
+ if (encode_str == NULL)
+ {
+ printf("encode_str malloc failed\n");
+ goto FAILED;
+ }
+
+ memset(encode_str, 0, encode_len);
+
+ mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len,
+ (const unsigned char*)json_data, strlen(json_data));
+
+ printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+ encode_str[output_len] = '\0';
+ // printf("encode_str : %s\n",encode_str);
+
+ // 构建content部分
+ // ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, token, encode_str
+ data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(CREATE_URL) + 1 + output_header_len + 1 + output_len + 1;
+ data_str = (char *)malloc(data_len);
+ if (data_str == NULL)
+ {
+ printf("data_str malloc failed\n");
+ goto FAILED;
+ }
+ memset(data_str, 0, data_len);
+
+ snprintf(data_str, data_len, ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, encode_header_str, encode_str);
+
+ sprintf(len_str, "%04x", strlen(data_str) + 8);
+ printf("data_len : %d\n",data_len);
+
+ head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ head_str = (char *)malloc(head_len);
+ if (head_str == NULL)
+ {
+ printf("head_str malloc failed\n");
+ goto FAILED;
+ }
+
+ // snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, "864430010001091", len_str);
+ snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei,len_str);
+ head_len = strlen(head_str);
+
+ // 计算MD5
+ code_len = head_len + strlen(KEY) + 1;
+ code_str = (char *)malloc(code_len);
+ if (code_str == NULL)
+ {
+ printf("code_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ printf("code_len:%d\n", code_len);
+
+ calculate_md5(code_str, md5_str);
+ if (strlen(md5_str) == 0)
+ {
+ printf("MD5 sign failed\n");
+ goto FAILED;
+ }
+
+ send_len = 1 + strlen(md5_str) + head_len + data_len + 1;
+ send_str = (char *)malloc(send_len);
+ if (send_str == NULL)
+ {
+ printf("send_str malloc failed\n");
+ goto FAILED;
+ }
+ snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str,data_str);
+ send_len = strlen(send_str);
+ printf("send_len : %d\n", send_len);
+ // printf("send_str : %s\n", send_str);
+
+ // ret = tcp_send(g_listen_sock, send_str, send_len);
+ // if(ret != 0)
+ // {
+ // printf("tcp_send failed\n");
+ // goto FAILED;
+ // }
+
+ for(int i = 0; i < send_len; i += 1024)
+ {
+ int chunk_size = (send_len - i > 1024) ? 1024 : send_len - i;
+
+ ret = tcp_send(g_listen_sock, send_str + i, chunk_size);
+ if(ret != 0)
+ {
+ printf("tcp_send failed at offset %d\n", i);
+ goto FAILED;
+ }
+
+ LOS_Msleep(100);
+ }
+
+ // int offset = 0;
+ // while (offset < send_len)
+ // {
+ // size_t chunk_len = (send_len - offset > 1024) ? 1024 : send_len - offset;
+ // // printf("send_str %zu: %.1024s\n", offset / 1024 + 1, send_str + offset);
+ // printf("%.1024s\n",send_str + offset);
+ // offset += chunk_len;
+ // }
+
+FAILED:
+
+ if (encode_header_str != NULL)
+ {
+ free(encode_header_str);
+ encode_header_str = NULL;
+ }
+
+ if (header_json != NULL)
+ {
+ free(header_json);
+ header_json = NULL;
+ }
+
+ if (begin_time_str != NULL)
+ {
+ free(begin_time_str);
+ begin_time_str = NULL;
+ }
+
+ if (end_time_str != NULL)
+ {
+ free(end_time_str);
+ end_time_str = NULL;
+ }
+
+ if (json_data != NULL)
+ {
+ free(json_data);
+ json_data = NULL;
+ }
+
+ if (send_str != NULL)
+ {
+ free(send_str);
+ send_str = NULL;
+ }
+
+ if (code_str != NULL)
+ {
+ free(code_str);
+ code_str = NULL;
+ }
+
+ if (head_str != NULL)
+ {
+ free(head_str);
+ head_str = NULL;
+ }
+
+ if (data_str != NULL)
+ {
+ free(data_str);
+ data_str = NULL;
+ }
+
+ if (encode_str != NULL)
+ {
+ free(encode_str);
+ encode_str = NULL;
+ }
+
+ // printf("free\n");
+#endif
+}
+
+int bp_tcp_login(void)
+{
+ int ret = -1;
+ char *data_str = NULL;
+ int data_len = 0;
+ char *encode_str = NULL;
+ int encode_len = 0;
+ char *head_str = NULL;
+ int head_len = 0;
+ char *code_str = NULL;
+ int code_len = 0;
+ char *send_str = NULL;
+ int send_len = 0;
+ uint32_t output_len = 0;
+ int temp_len = 0;
+
+ char len_str[5] = {0};
+ char md5_str[33] = {0};
+ // char json_data[1024] = {0};
+
+ char *json_data = (char *)malloc(512);
+ if(json_data == NULL)
+ goto FAILED;
+
+ memset(json_data,0,512);
+
+ char birthday[32] = {0};
+ snprintf(birthday,32,"%d-%d-%d",2002,1,10);
+
+ // 构建JSON数据
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"account_type\":\"%d\",", 1);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"account\":\"%s\",", "1624952103@qq.com");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"name\":\"%s\",", "penglei");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"password\":\"%s\",", "12345678");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"gender\":\"%d\",", 1); //性别['1': 男, '2': 女, '3':未知]
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"birthday\":\"%s\",", birthday);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"height\":\"%d\",", 173);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"weight\":\"%d\"}", 100);
+
+ if(temp_len > 512)
+ goto FAILED;
+
+ printf("temp_len:%d\n",temp_len);
+ printf("json_data : %s\n", json_data);
+ printf("json_data_len : %d\n", strlen(json_data));
+
+ // encode_len = (temp_len * 4 + 2) / 3 + 1;
+ encode_len = temp_len * 2;
+ encode_str = (char *)malloc(encode_len);
+ if (encode_str == NULL) {
+ printf("encode_str 分配失败\n");
+ goto FAILED;
+ }
+ memset(encode_str, 0, encode_len);
+
+ // 执行Base64编码
+ mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len,
+ (const unsigned char*)json_data, strlen(json_data));
+
+ printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+ // 确保Base64编码字符串以NULL结尾
+ encode_str[output_len] = '\0';
+ printf("encode_str: %s\n", encode_str);
+
+ // 构建content部分
+ data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(LOGIN_URL) + 1 + 1 + output_len + 1;
+ data_str = (char *)malloc(data_len);
+ if (data_str == NULL) {
+ printf("data_str 分配失败\n");
+ goto FAILED;
+ }
+ memset(data_str, 0, data_len);
+ snprintf(data_str,data_len, ",POST,%s%s,,%s", URL_HEADER, LOGIN_URL, encode_str);
+
+ // 计算数据长度并格式化为16进制
+ data_len = strlen(data_str);
+ sprintf(len_str, "%04x", data_len + 8);
+
+ // 计算head_str长度
+ head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ // head_len = strlen(BID) + 1 + 15 + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ head_str = (char *)malloc(head_len);
+ if (head_str == NULL) {
+ printf("head_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei, len_str);
+ // snprintf(head_str, head_len, "%s*864430010001091*%s*TCP_HTTP", BID, len_str);
+
+ head_len = strlen(head_str);
+
+ // 计算MD5
+ code_len = head_len + strlen(KEY) + 1;
+ code_str = (char *)malloc(code_len);
+ if (code_str == NULL) {
+ printf("code_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ printf("code_str:%s\n", code_str);
+ printf("code_len:%d\n", code_len);
+
+ calculate_md5(code_str,md5_str);
+ if(strlen(md5_str) == 0)
+ {
+ printf("MD5签名失败\n");
+ goto FAILED;
+ }
+ // if (active_md5_sign(code_str, code_len, md5_str) != 0) {
+ // printf("MD5签名失败\n");
+ // goto FAILED;
+ // }
+
+ // 构建发送字符串
+ send_len = 1 + strlen(md5_str) + head_len + data_len + 1 + 1; // [ + md5 + head + data + ] + \0
+ printf("计算的send_len : %d\n", send_len);
+ send_str = (char *)malloc(send_len);
+ if (send_str == NULL) {
+ printf("send_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str, data_str);
+ send_len = strlen(send_str);
+ printf("实际send_len : %d\n", send_len);
+
+ // printf("md5_str:%s\n", md5_str);
+ // printf("md5_len:%zu\n", strlen(md5_str));
+ // printf("head_len:%d\n", head_len);
+ // printf("head_str:%s\n", head_str);
+ // printf("data_len:%d\n", data_len);
+ // printf("data_str:%s\n", data_str);
+ // printf("send_len : %d\n", send_len);
+ // printf("send_str : %s\n", send_str);
+
+ // 发送数据
+ tcp_send(g_listen_sock, send_str, send_len);
+
+ ret = 0; // 成功
+
+FAILED:
+ if (json_data != NULL) {
+ free(json_data);
+ json_data = NULL;
+ }
+ if (send_str != NULL) {
+ free(send_str);
+ send_str = NULL;
+ }
+ if (code_str != NULL) {
+ free(code_str);
+ code_str = NULL;
+ }
+ if (head_str != NULL) {
+ free(head_str);
+ head_str = NULL;
+ }
+ if (data_str != NULL) {
+ free(data_str);
+ data_str = NULL;
+ }
+ if (encode_str != NULL) {
+ free(encode_str);
+ encode_str = NULL;
+ }
+
+ return ret;
+}
+
+int get_active_code(void)
+{
+ int ret = -1;
+ char *data_str = NULL;
+ int data_len = 0;
+ char *encode_str = NULL;
+ int encode_len = 0;
+ char *head_str = NULL;
+ int head_len = 0;
+ char *code_str = NULL;
+ int code_len = 0;
+ char *send_str = NULL;
+ int send_len = 0;
+ uint32_t output_len = 0;
+ int temp_len = 0;
+
+ char len_str[5] = {0};
+ char btaddr_str[64] = {0};
+ char req_code[128] = {0};
+ char md5_str[33] = {0};
+ // char json_data[1024] = {0};
+
+ if(imei == NULL)
+ {
+ uint8_t retry = 0;
+ while((imei == NULL || strlen(imei) == 0) && retry < 10)
+ {
+ retry++;
+ LOS_Msleep(2000);
+ imei = uapi_dev_runtime_get_cat1_imei();
+ }
+
+ if (imei == NULL || strlen(imei) == 0)
+ {
+ printf("IMEI get failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+ }
+
+ printf("imei:%s\n", imei);
+
+ char *json_data = (char *)malloc(512);
+ if(json_data == NULL)
+ goto FAILED;
+
+ memset(json_data,0,512);
+
+ bp_get_request_code(req_code,128);
+ printf("bp_get_request_code:%s\n",req_code);
+ if(strlen(req_code) == 0)
+ {
+ get_request_code(req_code);
+ bp_save_request_code(req_code,strlen(req_code));
+ }
+
+ // get_request_code(req_code);
+ // 构建JSON数据
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"name\":\"%s\",", NAME);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"firm\":\"%s\",", "湖南懂你");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"device_code\":\"%s\",", imei);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"model\":\"%s\",", "WATCH C2-C3-C5");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"sensor\":{\"model\":\"DN06\",\"fs\":%d},", 81);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"sinklib_version\":\"%s\",", "v0.5.3.060325");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"request_code\":\"%s\"}", req_code);
+
+ if(temp_len > 512)
+ goto FAILED;
+
+ printf("temp_len:%d\n",temp_len);
+ printf("json_data : %s\n", json_data);
+ printf("json_data_len : %d\n", strlen(json_data));
+
+ // encode_len = (temp_len * 4 + 2) / 3 + 1;
+ encode_len = temp_len * 2;
+ encode_str = (char *)malloc(encode_len);
+ if (encode_str == NULL) {
+ printf("encode_str 分配失败\n");
+ goto FAILED;
+ }
+ memset(encode_str, 0, encode_len);
+
+ // 执行Base64编码
+ mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len,
+ (const unsigned char*)json_data, strlen(json_data));
+
+ printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+ // 确保Base64编码字符串以NULL结尾
+ encode_str[output_len] = '\0';
+ printf("encode_str: %s\n", encode_str);
+
+ // 构建content部分
+ data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(ACTIVE_URL) + 1 + 1 + output_len + 1;
+ data_str = (char *)malloc(data_len);
+ if (data_str == NULL) {
+ printf("data_str 分配失败\n");
+ goto FAILED;
+ }
+ memset(data_str, 0, data_len);
+ snprintf(data_str,data_len, ",POST,%s%s,,%s", URL_HEADER,ACTIVE_URL, encode_str);
+
+ // 计算数据长度并格式化为16进制
+ data_len = strlen(data_str);
+ sprintf(len_str, "%04x", data_len + 8);
+
+ // 计算head_str长度
+ head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ // head_len = strlen(BID) + 1 + 15 + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ head_str = (char *)malloc(head_len);
+ if (head_str == NULL) {
+ printf("head_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei, len_str);
+ // snprintf(head_str, head_len, "%s*864430010001091*%s*TCP_HTTP", BID, len_str);
+
+ head_len = strlen(head_str);
+
+ // 计算MD5
+ code_len = head_len + strlen(KEY) + 1;
+ code_str = (char *)malloc(code_len);
+ if (code_str == NULL) {
+ printf("code_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ printf("code_str:%s\n", code_str);
+ printf("code_len:%d\n", code_len);
+
+ calculate_md5(code_str,md5_str);
+ if(strlen(md5_str) == 0)
+ {
+ printf("MD5签名失败\n");
+ goto FAILED;
+ }
+ // if (active_md5_sign(code_str, code_len, md5_str) != 0) {
+ // printf("MD5签名失败\n");
+ // goto FAILED;
+ // }
+
+ // 构建发送字符串
+ send_len = 1 + strlen(md5_str) + head_len + data_len + 1 + 1; // [ + md5 + head + data + ] + \0
+ printf("计算的send_len : %d\n", send_len);
+ send_str = (char *)malloc(send_len);
+ if (send_str == NULL) {
+ printf("send_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str, data_str);
+ send_len = strlen(send_str);
+ // printf("实际send_len : %d\n", send_len);
+
+ // printf("md5_str:%s\n", md5_str);
+ // printf("md5_len:%zu\n", strlen(md5_str));
+ // printf("head_len:%d\n", head_len);
+ // printf("head_str:%s\n", head_str);
+ // printf("data_len:%d\n", data_len);
+ // printf("data_str:%s\n", data_str);
+ // printf("send_len : %d\n", send_len);
+ // printf("send_str : %s\n", send_str);
+
+ // 发送数据
+ tcp_send(g_listen_sock, send_str, send_len);
+
+ ret = 0; // 成功
+
+FAILED:
+ if (json_data != NULL) {
+ free(json_data);
+ json_data = NULL;
+ }
+ if (send_str != NULL) {
+ free(send_str);
+ send_str = NULL;
+ }
+ if (code_str != NULL) {
+ free(code_str);
+ code_str = NULL;
+ }
+ if (head_str != NULL) {
+ free(head_str);
+ head_str = NULL;
+ }
+ if (data_str != NULL) {
+ free(data_str);
+ data_str = NULL;
+ }
+ if (encode_str != NULL) {
+ free(encode_str);
+ encode_str = NULL;
+ }
+
+ return ret;
+}
+
+void bp_check_active_code(char *active_code)
+{
+ char buffer[128] = {0};
+ int buffer_size = 128;
+ FILE *file = fopen(BP_ACTIVE_CODE_FILE, "r");
+ if (file)
+ {
+ memset(buffer, 0, buffer_size);
+ size_t bytes_read = fread(buffer, 1, buffer_size - 1, file);
+ if (bytes_read > 0)
+ {
+ buffer[bytes_read] = '\0';
+ fclose(file);
+ printf("成功读取文件内容\n");
+ memcpy_s(active_code,bytes_read,buffer,bytes_read);
+ return ;
+ } else {
+ printf("文件为空\n");
+ fclose(file);
+ }
+ } else {
+ printf("无法打开文件读取(可能不存在): %s\n", BP_ACTIVE_CODE_FILE);
+ }
+
+ fclose(file);
+}
+
+void bp_tcp_data_clean(void)
+{
+ memset(&bp_data,0,sizeof(bp_data));
+ if(tcp_data != NULL)
+ {
+ free(tcp_data);
+ tcp_data = NULL;
+ tcp_data_cnt = 0;
+ }
+ // if (g_listen_sock >= 0)
+ // {
+ // lwip_close(g_listen_sock);
+ // g_listen_sock = -1;
+ // }
+ BP_GET_STATUS = 0;
+}
+
+void do_bp_tcp_server_send_data(int cmd,int *data,uint32_t len)
+{
+ if((data == NULL || len == 0) && cmd == BP_TCP_SERVICE_CMD_SEND_DATA)
+ return;
+
+ errcode_t ret;
+ bp_tcp_data_mail_t send_data = {0};
+ send_data.cmd = cmd;
+ if(len && data)
+ {
+ send_data.len = len;
+ send_data.data = (int *)malloc(len * sizeof(int));
+ if(send_data.data == NULL)
+ {
+ PRINT("malloc failed\n");
+ return;
+ }
+ memcpy_s(send_data.data,len * sizeof(int),data,len * sizeof(int));
+ }
+
+ uint32_t send_len = sizeof(send_data);
+
+ ret = osal_msg_queue_write_copy(g_app_queue, (void *)&send_data,
+ send_len, 0);
+ if (ret != OSAL_SUCCESS) {
+ PRINT("Error bp Check MSG 0x send failed! err=0x%x! \r\n", ret);
+ }
+
+ // if(send_data.data != NULL)
+ // free(send_data.data);
+}
+
+// unsigned char buf[14100] = {0}; // 算法库计算过程中所需要的缓存
+
+//int activate_algorithm(const unsigned char req_code[], const unsigned int req_code_len,const unsigned char key_code[], const unsigned int key_code_len);
+void bp_activate_algorithm(void)
+{
+#if 0
+ char req_code[128] = {0};
+ char active_code[128] = {0};
+ bp_get_request_code(req_code,128);
+ bp_get_active_code(active_code,128);
+ if(strlen(req_code) == 0 || strlen(active_code) == 0)
+ {
+ printf("read req_code or active_code failed\n");
+ return;
+ }
+ int ret = activate_algorithm((const unsigned char*)req_code,strlen(req_code),(const unsigned char*)active_code,strlen(active_code));
+ printf("activate_algorithm ret : %d\n",ret);
+ if(ret == 1)
+ {
+ printf("activate_algorithm succed\n");
+ }
+ ret = init_algorithm(buf, 8000);
+ printf("init_algorithm ret:%d\n",ret);
+ if(ret == 0)
+ {
+ printf("init_algorithm succed\n");
+ }
+#endif
+}
+
+static void bp_tcp_deinit(void)
+{
+ if (g_listen_sock >= 0)
+ {
+ lwip_close(g_listen_sock);
+ g_listen_sock = -1;
+ }
+}
+
+int bp_tcp_init(void)
+{
+
+ if(tcp_sign_up() != 0)
+ {
+ printf("tcp_sign_up failed\n");
+ return -1;
+ }
+
+ // if(LK_STATUS == 0 )
+ // {
+ // printf("LK failed\n");
+ // return -1;
+ // }
+
+ char token[64] = {0};
+ bp_get_token(token, 64);
+
+ if(strlen(token) == 0)
+ {
+ bp_tcp_login();
+ LOS_Msleep(2000);
+ bp_get_token(token, 64);
+ }
+
+ if (strlen(token) == 0)
+ {
+ printf("token get failed\n");
+ return -1;
+ }
+ return 0;
+}
+
+static void tcp_data_handler(int *data,int len)
+{
+ if(tcp_data == NULL)
+ {
+ tcp_data = (int *)malloc(MAX_CNT * sizeof(int));
+ if(tcp_data == NULL)
+ {
+ PRINT("malloc failed\n");
+ return;
+ }
+ }
+
+ if(LK_STATUS != 1 && g_listen_sock > 0)
+ {
+ bp_tcp_init();
+ }
+
+ if(tcp_data_cnt >= MAX_CNT)
+ {
+ return;
+ // printf("tcp_data_cnt : %d\n",tcp_data_cnt);
+ // bp_stop();
+ // for(int i = 0; i < tcp_data_cnt; i ++)
+ // {
+ // printf("data[%d]:%d\n",i,tcp_data[i]);
+ // }
+ // memset((void*)tcp_data,0,MAX_CNT * sizeof(int));
+ // LOS_Msleep(1000);
+
+ // if(LK_STATUS == 1)
+ // {
+ // upload_bp_data(tcp_data,tcp_data_cnt);
+ // // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BP_TEST, NULL, 0);
+ // }
+
+ // else
+ // printf("NOT LK\n");
+
+ // LOS_Msleep(2000);
+ // bp_tcp_data_clean();
+ }
+ else
+ {
+ printf("tcp_data_cnt:%d\n",tcp_data_cnt);
+ memcpy_s(tcp_data + tcp_data_cnt,(MAX_CNT - tcp_data_cnt) * sizeof(int),data,len * sizeof(int));
+
+ // for(int i = tcp_data_cnt; i < tcp_data_cnt+len; i ++)
+ // {
+ // printf("222data[%d]:%d\n",i,tcp_data[i]);
+ // }
+
+ tcp_data_cnt += len;
+ }
+}
+
+static void bp_tcp_server_send_task(void const *arg)
+{
+ unused(arg);
+ errcode_t ret;
+
+ bp_tcp_data_mail_t mail = {0};
+ uint32_t msgsize = sizeof(bp_tcp_data_mail_t);
+
+ while (1) {
+ ret = osal_msg_queue_read_copy(g_app_queue, (void *)&mail, &msgsize,
+ OSAL_MSGQ_WAIT_FOREVER);
+ if (ret != OSAL_SUCCESS) {
+ continue;
+ }
+
+ if(mail.cmd == BP_TCP_SERVICE_CMD_SEND_DATA)
+ {
+ tcp_data_handler((int *)mail.data,mail.len);
+ if(mail.data != NULL)
+ {
+ free(mail.data);
+ }
+ }
+ else if(mail.cmd == BP_TCP_SERVICE_CMD_SERVER_INIT)
+ {
+ bp_tcp_init();
+ }
+ else if(mail.cmd == BP_TCP_SERVICE_CMD_SERVER_DEINIT)
+ {
+ bp_tcp_deinit();
+ }
+ else if(mail.cmd == BP_TCP_SERVICE_CMD_DATA_UPLOAD)
+ {
+ upload_bp_data();
+ bp_tcp_data_clean();
+ }
+ }
+}
+
+
+void bp_tcp_server_recv_task(void *pvParameters)
+{
+ char rx_buffer[2048] = {0};
+
+ while (1)
+ {
+ if(!uapi_dev_runtime_get_bp_status_flag())
+ {
+ LOS_Msleep(1000);
+ continue;
+ }
+ if (!uapi_cat1_get_power_stat())
+ {
+ PRINT("wating cat1 power on\n");
+ LOS_Msleep(2000);
+ continue;
+ }
+ if (g_listen_sock < 0)
+ {
+ g_listen_sock = bp_tcp_socket_init();
+ if (g_listen_sock < 0)
+ {
+ PRINT("wating tcp socket init\n");
+ LOS_Msleep(1000);
+ continue;
+ }
+ else
+ do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SERVER_INIT,NULL,0);
+ }
+
+ // if (tcp_socket_init() != 0)
+ // {
+ // PRINT("wating tcp socket init\n");
+ // LOS_Msleep(100);
+ // continue;
+ // }
+
+ // PRINT("tcp socket init succed\n");
+
+ // get_active_code();
+ // if(tcp_sign_up() != 0)
+ // {
+ // LOS_Msleep(1000);
+ // continue;
+ // }
+
+ // printf("tcp_sign_up\n");
+
+ // 接收数据
+ memset(rx_buffer, 0, 2048);
+ int len = recv(g_listen_sock, rx_buffer, 2048 - 1, 0);
+ if (len > 0)
+ {
+ rx_buffer[len] = '\0';
+ printf("Received %d bytes: %s\n", len, rx_buffer);
+ tcp_recv_data_handler(rx_buffer,len);
+ // 解析数据
+
+ // tcp_data_parse(rx_buffer, len);
+ }
+
+ // 关闭客户端连接
+ // close(g_listen_sock);
+ }
+
+ // 关闭监听套接字
+ // close(g_listen_sock);
+}
+
+void create_bp_tcp_queue(void)
+{
+
+ if (osal_msg_queue_create("bp_tcp_service_queue", 24, &g_app_queue,
+ 0, sizeof(bp_tcp_data_mail_t)) != ERRCODE_SUCC) {
+ PRINT("[bp][service] app create mail fail\n");
+ }
+}
+
+#define BP_TCP_BOARD_TASK_SIZE 0x2000
+errcode_t uapi_bp_tcp_server_init(void)
+{
+ PRINT("uapi_bp_tcp_server_init !\r\n");
+
+ app_task_definition_t taskcfg={0};
+ taskcfg.create_queue_handle = create_bp_tcp_queue;
+ taskcfg.attr.name="bp_tcp_server_send_task";
+ taskcfg.attr.priority = osPriorityNormal;
+ taskcfg.attr.stack_size = BP_TCP_BOARD_TASK_SIZE;
+ taskcfg.func = bp_tcp_server_send_task;
+ taskcfg.use_mem = USE_EXTEND_MEM;
+
+ errcode_t ret=uapi_create_osThread_custom(&taskcfg);
+ if(ret != ERRCODE_SUCC)
+ {
+ PRINT("create bp_send_service failed %d!\r\n",ret);
+ return ERRCODE_FAIL;
+ }
+
+ memset(&taskcfg,0,sizeof(taskcfg));
+
+ taskcfg.create_queue_handle = NULL;
+ taskcfg.attr.name="bp_tcp_server_recv_task";
+ taskcfg.attr.priority = osPriorityNormal1;
+ taskcfg.attr.stack_size = BP_TCP_BOARD_TASK_SIZE;
+ taskcfg.func = bp_tcp_server_recv_task;
+ taskcfg.use_mem = USE_EXTEND_MEM;
+
+ ret=uapi_create_osThread_custom(&taskcfg);
+ if(ret != ERRCODE_SUCC)
+ {
+ PRINT("create bp_recv_service failed %d!\r\n",ret);
+ return ERRCODE_FAIL;
+ }
+
+ // g_bp_service_timer = osTimerNew((osTimerFunc_t)bp_service_check_timer_callback, osTimerPeriodic, NULL, NULL);
+
+ return ERRCODE_SUCC;
+}
--- /dev/null
+/*
+ * @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
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;
#define SPORT_CHECK_MS 1000
-
#ifdef CYWEE_MAC_ACTIVE
int cm__hs1__mac_c1_init(void);
int cm__hs1__deinit(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)
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');
if (fp == NULL)
{
CWM_OS_dbgPrintf("read_sleep_data fopen fail %s \n",file_path);
- return false;
+ return;
}
// 读取睡眠类型
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)
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);
}
sleep_stat[stat_num].timestamp = timestamp;
}
wake_up_timestamp = sleep_stat[stat_num].timestamp;
- sleep_update_timestamp = wake_up_timestamp;
}
stat_num ++;
}
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);
}
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);
}
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;//运动开始,清零心率
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);
}
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){
#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;
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);
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
// 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;
}
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");
* @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:
*
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 */
add_subdirectory_if_exist(service)
-add_subdirectory_if_exist(hal)
add_subdirectory_if_exist(mmc5603)
\ No newline at end of file
+++ /dev/null
-#===============================================================================
-# @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()
* @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
*/
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);
\r
#define MMC_DATA_PATH "/user/userdata/mmc_para.bin"\r
\r
-int mmc5603_savePara_infile(void)\r
+int mag_savePara_infile(void)\r
{ \r
FILE * fp = fopen(MMC_DATA_PATH,"wb");\r
size_t ret = 0;\r
return 1;\r
}\r
\r
-int mmc5603_readPara_infile(void)\r
+int mag_readPara_infile(void)\r
{\r
FILE * fp = fopen(MMC_DATA_PATH,"rb");\r
if(fp==NULL)\r
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
* @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
*/
#endif
-void mag_sensor_check(void)
+void mag_timer_handler(void)
{
#ifdef MAG_MMC5603
mmc5603_check();
* @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:
*
#define MAG_SENSOR_CHIP_ID 0
#endif
+void mag_timer_handler(void);
void mag_sensonr_start(void);
void mag_sensonr_stop(void);
// 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);
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);
* @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
*/
void mag_start(void);
void mag_stop(void);
+int mag_savePara_infile(void);
+int mag_readPara_infile(void);
#ifdef __cplusplus
#if __cplusplus
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
#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;
}
{\r
history_wear_status = wear_status;\r
#ifdef SUPPORT_CYWEE_SERVICE\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,&wear_status);\r
+ // do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,&wear_status);\r
+ cywee_wear_status_update(&wear_status);\r
#endif\r
}\r
}\r
}\r
}\r
\r
+int32_t hx3695_get_factory_data(void)\r
+{\r
+ int32_t data = factory_data;\r
+ factory_data = 0;\r
+ return data;\r
+}\r
+\r
#endif //CHIP_HX3695\r
\r
uint8_t hx3695_get_hrs(void);\r
uint8_t hx3695_get_spo2(void);\r
uint8_t hx3695_get_wear_status(void);\r
+int32_t hx3695_get_factory_data(void);\r
\r
#endif\r
return ft_result;\r
}\r
\r
-void hx3695_get_factory_data(uint32_t *green,uint32_t *red,uint32_t *ir)\r
+void hx3695_get_leaklight_data(uint32_t *green,uint32_t *red,uint32_t *ir)\r
{\r
*green = factory_green;\r
*red = factory_red;\r
\r
void hx3695_get_factory_data(uint32_t *green,uint32_t *red,uint32_t *ir);\r
\r
+void hx3695_get_leaklight_data(uint32_t *green,uint32_t *red,uint32_t *ir);\r
+\r
\r
#endif // _HX3695_FACTORY_TEST_H_\r
\r
printf("uapi_dev_runtime_get_train_status() : %d\n",uapi_dev_runtime_get_train_status()); \r
if(uapi_dev_runtime_get_train_status())\r
{\r
-#ifdef SUPPORT_CYWEE_SERVICE\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_HRS_CHANGE,&data);\r
-#endif\r
}\r
else\r
{\r
{\r
history_wear_status = wear_status;\r
#ifdef SUPPORT_CYWEE_SERVICE\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,(uint8_t *)&history_wear_status);\r
+ cywee_wear_status_update((uint8_t *)&history_wear_status);\r
#endif\r
// if(wear_status != 1)\r
// {\r
)
set(PUBLIC_DEFINES
-SUPPORT_PPG_SERVICE
SUPPORT_AT_PPG
)
-/**
- * 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"
#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里定义,对外开放
*/
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;
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;
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;
}
}
}
}
+
void create_ppg_queue(void)
{
if (osal_msg_queue_create("ppg_service_queue", PPG_SERVICE_MSG_COUNT, &g_app_queue,
PRINT_ERR("[ppg][service] app create mail fail\n");
}
}
+
errcode_t uapi_ppg_service_init(void)
{
PRINT("uapi_ppg_service_init !\r\n");
}
}
- // 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;
return ERRCODE_FAIL;
}
+ send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_WEAR_MODE_TEST);
+
return ERRCODE_SUCC;
}
// 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");
// {
// DEBUG_PRINTF("ppg_service_service suspend!\r\n");
// }
-
-
-#ifdef __cplusplus
-#if __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* __cplusplus */
/*
* @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:
*
#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"
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;
}
}
-// 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;
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,
PRINT("[mag][service] app create mail fail\n");
}
}
+
errcode_t uapi_vibrator_service_init(void)
{
PRINT("uapi_vibrator_service_init !\r\n");
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
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);
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},
{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;
#include "battery_service.h"
#include "custom_utils.h"
+#ifdef SUPPORT_CYWEE_SERVICE
+#include "cywee_service.h"
+#endif
/**
* 临时性去除充电禁止能力,待海思更新 充电线静态检测能力再回复。
}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
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;
}
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);
{
ChargerEventPublish(TOPIC_EVENT_LOWPOWER_ALARM,alarm_level);
}
-
-
return 0;
}
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 ;
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 ;
}
OHOS::ConfigModel *p_ConfigModel = OHOS::ConfigModel::GetInstance();
p_ConfigModel->SetVibrationReminder(falg);
// uapi_vibrationModeSet(falg);
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
return ;
}
* @Author: penglei 1624952103@qq.com\r
* @Date: 2024-06-17 14:31:08\r
* @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-07-28 16:50:17\r
+ * @LastEditTime: 2025-07-29 14:46:36\r
* @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c\r
* @Description: \r
* \r
void ble_vibrator_check_timer_callback(void)\r
{\r
// uapi_vibrationModeSet(3);\r
- ui_api_vibrate_once_func();\r
+ custom_VibratorFunc_int(0);\r
}\r
\r
void ble_acc_check_timer_callback(void)\r
{\r
uint8_t databuf[6];\r
- get_gsensor_single(databuf);\r
+\r
+#ifdef SUPPORT_CYWEE_SERVICE \r
+ gsenson_t t;\r
+ cywee_get_gsensor_data(1,&t);\r
+ uint16_t x,y,z; \r
+ x = t.x*2048;\r
+ y = t.y*2048;\r
+ z = t.z*2048;\r
+\r
+ databuf[0] = (uint8_t)((x & 0xFF00) >> 8);\r
+ databuf[1] = (uint8_t)(x & 0x00FF);\r
+\r
+ databuf[2] = (uint8_t)((y & 0xFF00) >> 8);\r
+ databuf[3] = (uint8_t)(y & 0x00FF);\r
+\r
+ databuf[4] = (uint8_t)((z & 0xFF00) >> 8);\r
+ databuf[5] = (uint8_t)(z & 0x00FF);\r
+#endif\r
\r
factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
BLE_TEST_CMD_SOFT_TEST_SUB_MODE_ACC,\r
{\r
//单次获得acc\r
uint8_t databuf[6];\r
- get_gsensor_single(databuf);\r
+#ifdef SUPPORT_CYWEE_SERVICE \r
+ gsenson_t t;\r
+ cywee_get_gsensor_data(1,&t);\r
+ uint16_t x,y,z; \r
+ x = t.x*2048;\r
+ y = t.y*2048;\r
+ z = t.z*2048;\r
+\r
+ databuf[0] = (uint8_t)((x & 0xFF00) >> 8);\r
+ databuf[1] = (uint8_t)(x & 0x00FF);\r
+\r
+ databuf[2] = (uint8_t)((y & 0xFF00) >> 8);\r
+ databuf[3] = (uint8_t)(y & 0x00FF);\r
+\r
+ databuf[4] = (uint8_t)((z & 0xFF00) >> 8);\r
+ databuf[5] = (uint8_t)(z & 0x00FF);\r
+#endif\r
\r
factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
BLE_TEST_CMD_SOFT_TEST_SUB_MODE_ACC,\r
${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
-add_subdirectory(sample/gnss_sample)
+# add_subdirectory(sample/gnss_sample)
+add_subdirectory(sample/pgnss_sample)
\ No newline at end of file
*/\r
#define TIOT_PIN_NONE 0xFFFFFFFFU\r
\r
-#ifdef BOARD_U8\r
-#define TIOT_UART_PORT UART_BUS_0\r
-#define TIOT_PIN_WAKEUP_HOST_NUM S_AGPIO_L31 /* 用于唤醒HOST. */\r
-#define TIOT_PIN_WAKEUP_GNSS_NUM TIOT_PIN_NONE /* 用于 唤醒GNSS. */\r
-#define TIOT_PIN_POWER S_AGPIO_L30 /* 用于开启GNSS. */\r
-\r
-#define TIOT_PIN_UART_TX S_MGPIO19\r
-#define TIOT_PIN_UART_RX S_MGPIO20\r
-#define TIOT_PIN_UART_CTS S_MGPIO22\r
-#define TIOT_PIN_UART_RTS S_MGPIO21\r
-#define TIOT_PINMUX HAL_PIO_FUNC_UART1\r
-\r
-#elif defined(BOARD_L22) || defined(BOARD_W9) || defined(BOARD_N9) \r
+#if defined(BOARD_W9) || defined(BOARD_N9)\r
#define TIOT_UART_PORT UART_BUS_1\r
#define TIOT_PIN_WAKEUP_HOST_NUM S_AGPIO_L15 /* 用于唤醒HOST. */\r
#define TIOT_PIN_WAKEUP_GNSS_NUM S_HGPIO0 /* 用于 唤醒GNSS. */\r
void dump_location_data(gps_data_t *locationdata);\r
void dump_location_data_to_buf(gps_data_t *locationdata,char* buf,int max_buflen);\r
gps_data_t * getGPSGlobaldata(void);\r
+gps_data_t * getPGPSGlobaldata(void);\r
\r
void dump_location_data_to_factory(gps_data_t *locationdata,char* buf,int max_buflen);\r
\r
--- /dev/null
+/*
+ * @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
#include "pm_definition.h"\r
#include "gnss_ctl.h"\r
\r
+#ifdef SUPPORT_CYWEE_SERVICE\r
+#include "cywee_hal.h"\r
+#include "cywee_service.h"\r
+#endif\r
+\r
#define COLDSTART_FIXMODEGPS_NMEAALL_SAMPLE 0\r
#define AUTOSTART_FIXMODEALL_NMEADEF_SAMPLE 1\r
\r
memcpy_s(&g_global_gpsData,sizeof(gps_data_t),&(g_nmeadata.gpsData),sizeof(gps_data_t));\r
ret = 1;\r
memset(&g_nmeadata,0,sizeof(g_nmeadata));\r
+#ifdef SUPPORT_CYWEE_SERVICE\r
+ if(uapi_dev_runtime_get_train_status())\r
+ do_cywee_service_check_msg(CYWEE_SERVICE_CMD_GNSS_UPDATE,NULL);\r
+#endif\r
}\r
} \r
\r
--- /dev/null
+#===============================================================================
+# @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()
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+ * Description: gnss datatypes\r
+ * Author:\r
+ * Create:\r
+ */\r
+#ifndef GNSS_DATATYPES_H\r
+#define GNSS_DATATYPES_H\r
+\r
+#include <stdint.h>\r
+\r
+#define MSG_CONTENT_IDX 2\r
+#define LISTEN_TIME_THR 1000\r
+#define REPORT_MAX_BYTES 10000\r
+\r
+// 消息类型\r
+typedef enum {\r
+ CMD_INJECT_HIS_INFO = 0x0101, // 历史信息注入\r
+ CMD_PGNSS_INJECT_REF_GPS_TIME = 0x0201, // GPS时间注入\r
+ CMD_PGNSS_INJECT_REF_LOC = 0x0202, // 参考位置注入\r
+ CMD_PGNSS_INJECT_EPH_GPS = 0x0203, // GPS星历注入\r
+ CMD_PGNSS_INJECT_EPH_GANSS = 0x0204, // 非GPS星历注入\r
+ CMD_PGNSS_INJECT_UTC_GPS = 0x0205, // GPS UTC注入\r
+ CMD_PGNSS_INJECT_RTI_GPS = 0x0206, // GPS完好性信息注入\r
+ CMD_PGNSS_INJECT_RTI_GANSS = 0x0207, // 非GPS完好性信息注入\r
+ CMD_PGNSS_INJECT_ION_GPS = 0x0208, // GPS电离层参数注入\r
+ CMD_PGNSS_INJECT_AUX_GANSS = 0x0209, // 非GPS频点转换关系信息注入\r
+ CMD_XGNSS_INJECT_UTC_TIME = 0x0404, // 最开始注入的UTC时间\r
+ CMD_BUTT,\r
+} GnssCmdType;\r
+\r
+#pragma pack(1)\r
+typedef struct {\r
+ uint16_t cmd; // 消息类型\r
+ uint16_t checkSum; // 校验和,只计算实际数据部分,不包含头\r
+ uint16_t sequence; // 序列号,host下发\r
+ uint16_t dataLength; // 数据长度,实际数据的长度,不包含头\r
+ uint8_t data[0];\r
+} GnssMsg;\r
+\r
+typedef struct {\r
+ uint16_t year; // YYYY\r
+ uint8_t month; // MM, 1~12\r
+ uint8_t day; // DD, 1~31\r
+ uint8_t hour; // hh, 0~23\r
+ uint8_t minute; // mm, 0~59\r
+ uint8_t second; // ss, 0~59\r
+ uint16_t ms; // ms, 0~999\r
+ uint8_t valid; // 0: invalid, 1: valid\r
+} GnssUtcTime;\r
+\r
+typedef struct {\r
+ uint32_t time; // eph reference time\r
+ uint16_t cmd; // cmd type to injected eph\r
+ uint32_t len; // actual length of injected eph\r
+} EphHeadInfo;\r
+\r
+typedef struct {\r
+ uint16_t cmd; // cmd type to injected other assist info\r
+ uint32_t len; // actual length of injected other assist info\r
+} OtherAssistHeadInfo;\r
+\r
+#pragma pack()\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+ * Description: pgnss encode\r
+ * Author:\r
+ * Create:\r
+ */\r
+#include "pgnss_encode.h"\r
+#include <stdio.h>\r
+#include <dirent.h>\r
+#include <string.h>\r
+#include "securec.h"\r
+#include "tiot_service_interface.h"\r
+#include "gnss_datatypes.h"\r
+\r
+\r
+#define GNSS_ENCODE_BUFF_MAX_LEN 9300\r
+#define FILE_PATH_LEN 1024\r
+#define GLO_EPH_VALID_TIME 900\r
+#define OTHER_EPH_VALID_TIME 7200\r
+#define ONE_CENTURY_YEARS 100\r
+#define FOUR_CENTURY_YEARS 400\r
+#define LEAP_YEAR_LENGTH 4\r
+#define UNIX_TIME_START_YEAR 1970 // start year of unix time\r
+#define TIME_UNIT 1000\r
+#define SECONDS_PER_MIN (60)\r
+#define SECONDS_PER_HOUR (60 * SECONDS_PER_MIN)\r
+#define SECONDS_PER_DAY (24 * SECONDS_PER_HOUR)\r
+#define SECONDS_PER_NORMAL_YEAR (365 * SECONDS_PER_DAY)\r
+#define NON_GLO_GNSS_TYPES 4\r
+#define GLO_EPH_NUM_ONE_FILE 8\r
+#define OTHER_ASSIST_TYPES 7\r
+#define INJECT_SLEEP_MS_TIME 500\r
+#define PGNSS_FILE_MAX_SIZE 1024000\r
+\r
+/** days per month on normal and leap year */\r
+int32_t g_normMonthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\r
+int32_t g_leapMonthDays[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\r
+// 监听消息\r
+static uint8_t g_ackBuff[REPORT_MAX_BYTES] = { 0 };\r
+\r
+/* 获取begin和end年份之间的闰年数 */\r
+int32_t GetLeapYearNum(uint16_t begin, uint16_t end)\r
+{\r
+ if (end <= begin || end < 1) {\r
+ return 0;\r
+ }\r
+ int32_t numPer400Year = (end - 1) / FOUR_CENTURY_YEARS - begin / FOUR_CENTURY_YEARS;\r
+ int32_t numPer100Year = (end - 1) / ONE_CENTURY_YEARS - begin / ONE_CENTURY_YEARS;\r
+ int32_t numPer4Year = (end - 1) / LEAP_YEAR_LENGTH - begin / LEAP_YEAR_LENGTH;\r
+ return (numPer400Year + numPer4Year - numPer100Year);\r
+}\r
+\r
+/* 闰年判断 */\r
+int32_t CheckIfLeapYear(uint16_t year)\r
+{\r
+ if ((year % ONE_CENTURY_YEARS) == 0) {\r
+ if ((year % FOUR_CENTURY_YEARS) == 0) {\r
+ return 1;\r
+ }\r
+ } else {\r
+ if ((year % LEAP_YEAR_LENGTH) == 0) {\r
+ return 1;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+/* 将日历时(年月日时分秒) 转换为 unix时间(1970年1月1日起的时间秒数) */\r
+int32_t Utc2UnixTime(GnssUtcTime utcTime, uint32_t *unixTime)\r
+{\r
+ if (unixTime == NULL) {\r
+ printf("\nerror: [Utc2UnixTime] null pointer!\n");\r
+ return 0;\r
+ }\r
+\r
+ if (utcTime.month > 12 || utcTime.valid == 0) {\r
+ printf("\nerror: [Utc2UnixTime] utcTime invalid!\n");\r
+ return 0;\r
+ }\r
+\r
+ // 判断是否为闰年\r
+ int32_t *monthDays = (CheckIfLeapYear(utcTime.year) == 1) ? g_leapMonthDays : g_normMonthDays;\r
+\r
+ // 计算从1970.01.01开始的unix 秒数\r
+ uint32_t timestamp = 0;\r
+ timestamp += (uint32_t)(utcTime.year - UNIX_TIME_START_YEAR) * SECONDS_PER_NORMAL_YEAR;\r
+ timestamp += (uint32_t)GetLeapYearNum(UNIX_TIME_START_YEAR, utcTime.year) * SECONDS_PER_DAY;\r
+\r
+ for (int32_t i = 1; i < utcTime.month; i++) {\r
+ timestamp += (uint32_t)monthDays[i - 1] * SECONDS_PER_DAY;\r
+ }\r
+\r
+ timestamp += (uint32_t)(utcTime.day - 1) * SECONDS_PER_DAY;\r
+ timestamp += (uint32_t)utcTime.hour * SECONDS_PER_HOUR;\r
+ timestamp += (uint32_t)utcTime.minute * SECONDS_PER_MIN;\r
+ uint32_t timestampSec = (uint32_t)(utcTime.second + utcTime.ms / TIME_UNIT);\r
+\r
+ *unixTime = timestamp + timestampSec;\r
+ return 1;\r
+}\r
+\r
+/* 计算命令内容校准和 */\r
+static uint16_t CalcChecksum(uint8_t *buff, uint16_t len)\r
+{\r
+ uint16_t checksum = 0;\r
+ uint16_t i = 0;\r
+ while (i++ < len) {\r
+ checksum += *buff;\r
+ buff++;\r
+ }\r
+ return checksum;\r
+}\r
+\r
+int32_t PgnssInjectUtcTime(tiot_handle handle, GnssUtcTime *utcTime, uint32_t* ts)\r
+{\r
+ uint8_t *buff = (uint8_t *)malloc(GNSS_ENCODE_BUFF_MAX_LEN);\r
+ if (buff == NULL) {\r
+ printf("\nerror: malloc failed in PgnssINjectUtcTime\r\n");\r
+ return 0;\r
+ }\r
+ memset_s(buff, GNSS_ENCODE_BUFF_MAX_LEN, 0, GNSS_ENCODE_BUFF_MAX_LEN);\r
+\r
+ GnssMsg *hdr = (GnssMsg *)buff;\r
+ hdr->cmd = 0x0404;\r
+ hdr->sequence = 0;\r
+ errno_t copyRet = memcpy_s(hdr->data, (GNSS_ENCODE_BUFF_MAX_LEN - sizeof(GnssMsg)), utcTime, sizeof(GnssUtcTime));\r
+ if (copyRet != EOK) {\r
+ printf("\nmemcpy UtcTime failed! Errno is %d\r\n", copyRet);\r
+ free(buff);\r
+ return 0;\r
+ }\r
+ hdr->dataLength = sizeof(GnssUtcTime);\r
+ hdr->checkSum = CalcChecksum(hdr->data, hdr->dataLength);\r
+ int32_t ret = tiot_service_write(handle, buff, (sizeof(GnssMsg) + hdr->dataLength));\r
+ if (ret < 0) {\r
+ printf("\nerror: PgnssInjectUtcTime error: %d\r\n", ret);\r
+ free(buff);\r
+ return 0;\r
+ }\r
+ if (Utc2UnixTime((*utcTime), ts) == 0) {\r
+ printf("\nerror: Utc2UnixTime error\r\n");\r
+ free(buff);\r
+ return 0;\r
+ }\r
+\r
+ free(buff);\r
+ return 1;\r
+}\r
+\r
+static uint16_t FillGnssMessageData(uint8_t *inBuff, uint32_t inLen, uint8_t *outBuff, uint32_t outLen)\r
+{\r
+ errno_t ret = memcpy_s(outBuff, outLen, inBuff, inLen);\r
+ if (ret != EOK) {\r
+ printf("memcpy XgnssData failed! Errno is %d \r\n", ret);\r
+ return 0;\r
+ }\r
+\r
+ return inLen;\r
+}\r
+\r
+static int32_t EncodeGnssMsg(uint8_t *inBuff, uint32_t inLen, uint8_t *outBuff, uint32_t outLen)\r
+{\r
+ uint16_t len = FillGnssMessageData(inBuff, inLen, outBuff, outLen);\r
+ if (len > 0) {\r
+ return 1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static void ListenAck(tiot_handle handle)\r
+{\r
+ int32_t i = 0;\r
+ for (;;) {\r
+ // 监听\r
+ int32_t ret = tiot_service_read(handle, g_ackBuff, REPORT_MAX_BYTES, LISTEN_TIME_THR);\r
+ if (ret > 0) {\r
+ uint16_t *type = (uint16_t *)g_ackBuff;\r
+ // 二进制消息类型\r
+ if (type[0] == 0) {\r
+ g_ackBuff[ret] = '\0';\r
+ printf("%s\r\n", (char *)&g_ackBuff[MSG_CONTENT_IDX]);\r
+ }\r
+ i++;\r
+ }\r
+ if (i >= 1) {\r
+ printf("\r\ncnt enough\r\n");\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+static int32_t EncodeAndInjectCmd(tiot_handle handle, GnssCmdType cmdType, uint8_t* inBuff, uint32_t inLen)\r
+{\r
+ // 获取GNSS业务消息头\r
+ int32_t len = 0;\r
+ uint8_t *buff = (uint8_t *)malloc(GNSS_ENCODE_BUFF_MAX_LEN);\r
+ if (buff == NULL) {\r
+ printf("\r\nerror: malloc failed in EncodeAndInjectCmd\r\n");\r
+ return 0;\r
+ }\r
+ memset_s(buff, GNSS_ENCODE_BUFF_MAX_LEN, 0, GNSS_ENCODE_BUFF_MAX_LEN);\r
+\r
+ GnssMsg *gnssHdr = (GnssMsg *)buff;\r
+ len += sizeof(GnssMsg);\r
+\r
+ gnssHdr->sequence = 0;\r
+\r
+ int32_t retLen = EncodeGnssMsg(inBuff, inLen, buff + len, (GNSS_ENCODE_BUFF_MAX_LEN - len));\r
+ if (retLen != 1) {\r
+ printf("\nerror: Encode Cmd failed: %d\r\n", cmdType);\r
+ free(buff);\r
+ return retLen;\r
+ }\r
+ gnssHdr->cmd = cmdType;\r
+ gnssHdr->dataLength = inLen;\r
+ gnssHdr->checkSum = CalcChecksum(gnssHdr->data, gnssHdr->dataLength);\r
+ int32_t ret = tiot_service_write(handle, buff, (sizeof(GnssMsg) + gnssHdr->dataLength));\r
+ if (ret < 0) {\r
+ printf("\r\nerror: Inject Cmd failed: %d\r\n", cmdType);\r
+ free(buff);\r
+ return 0;\r
+ }\r
+ ListenAck(handle);\r
+ printf("\r\nInject Cmd SUCCESS: %x\r\n", cmdType);\r
+ free(buff);\r
+ return 1;\r
+}\r
+\r
+void PgnssSendFileContent(tiot_handle handle, const char *fileName, GnssCmdType cmdType)\r
+{\r
+ FILE *fp = fopen(fileName, "rb");\r
+ if (fp == NULL) {\r
+ printf("\r\nerror: open file failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ fseek(fp, 0, SEEK_END);\r
+ int32_t len = ftell(fp);\r
+ fseek(fp, 0, SEEK_SET);\r
+ if (len < 0 || len > PGNSS_FILE_MAX_SIZE) {\r
+ fclose(fp);\r
+ printf("\r\nerror: get file len failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ uint8_t *buff = (uint8_t *)malloc(len);\r
+ if (buff == NULL) {\r
+ fclose(fp);\r
+ printf("\r\nerror: malloc file len failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ int32_t dataSize = fread(buff, len, 1, fp);\r
+ if (dataSize < 0) {\r
+ fclose(fp);\r
+ printf("\r\nerror: read file failed: %s\r\n", fileName);\r
+ free(buff);\r
+ return;\r
+ }\r
+ fclose(fp);\r
+ EncodeAndInjectCmd(handle, cmdType, buff, len);\r
+ free(buff);\r
+}\r
+\r
+int32_t FormatFileName(char *fileName, char *dName)\r
+{\r
+ int32_t ret = snprintf_s(fileName, FILE_PATH_LEN, (FILE_PATH_LEN - 1), "%s%s", "/user/userdata/gnss/", dName);\r
+ if (ret <= 0) {\r
+ return 0;\r
+ }\r
+ return 1;\r
+}\r
+\r
+int32_t GetEphFileName(int32_t ts, const char *prefix, char *fileName)\r
+{\r
+ int32_t interval = (strcmp(prefix, "GLO") == 0) ? GLO_EPH_VALID_TIME : OTHER_EPH_VALID_TIME;\r
+ DIR *dir = opendir("/user/userdata/gnss/");\r
+ if (dir == NULL) {\r
+ printf("Failed to open /user/xgnss directory.\r\n");\r
+ return 0;\r
+ }\r
+ int32_t time, ret;\r
+ struct dirent *entry;\r
+ for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) {\r
+ // 检查文件名\r
+ if (strstr(entry->d_name, ".eph") != NULL) {\r
+ char *p = strrchr(entry->d_name, '_');\r
+ if (p != NULL) {\r
+ char *q = strstr(entry->d_name, prefix);\r
+ if (q != NULL) {\r
+ time = atoi(p + 1);\r
+ if (abs(time - ts) <= interval) {\r
+ ret = FormatFileName(fileName, entry->d_name);\r
+ closedir(dir);\r
+ return ret;\r
+ }\r
+ else\r
+ {\r
+ printf("time:%d,ts:%d,interval:%d\r\n",time,ts,interval);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ closedir(dir);\r
+ printf("closedir(dir);\r\n");\r
+ return 0;\r
+}\r
+\r
+void PgnssSendEphFile(tiot_handle handle, const char *prefix, GnssCmdType cmdType, uint32_t ts)\r
+{\r
+ char fileName[FILE_PATH_LEN] = {0};\r
+ int32_t ret = GetEphFileName(ts, prefix, fileName);\r
+ if (ret == 0) {\r
+ printf("\r\nerror: GetEphFileName failed\r\n");\r
+ return;\r
+ }\r
+ printf("\nGetEphFileName success\r\n");\r
+ PgnssSendFileContent(handle, fileName, cmdType);\r
+}\r
+\r
+void PgnssInjectAllEph(tiot_handle handle, uint32_t ts)\r
+{\r
+ PgnssSendEphFile(handle, "GPS", CMD_PGNSS_INJECT_EPH_GPS, ts);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send GPS eph success\r\n");\r
+ PgnssSendEphFile(handle, "GLO", CMD_PGNSS_INJECT_EPH_GANSS, ts);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send GLO eph success\r\n");\r
+ PgnssSendEphFile(handle, "BDS", CMD_PGNSS_INJECT_EPH_GANSS, ts);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send BDS eph success\r\n");\r
+ PgnssSendEphFile(handle, "GAL", CMD_PGNSS_INJECT_EPH_GANSS, ts);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send GAL eph success\r\n");\r
+ PgnssSendEphFile(handle, "QZS", CMD_PGNSS_INJECT_EPH_GANSS, ts);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send QZS eph success\r\n");\r
+}\r
+\r
+void PgnssInjectOtherAssist(tiot_handle handle)\r
+{\r
+ PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_UTC.dat", CMD_PGNSS_INJECT_UTC_GPS);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send GPS_UTC success\r\n");\r
+ PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_RTI.dat", CMD_PGNSS_INJECT_RTI_GPS);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send GPS_RTI success\r\n");\r
+ PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_ION.dat", CMD_PGNSS_INJECT_ION_GPS);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send GPS_ION success\r\n");\r
+ PgnssSendFileContent(handle, "/user/userdata/gnss/GLO_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send GLO_RTI success\r\n");\r
+ PgnssSendFileContent(handle, "/user/userdata/gnss/GLO_AUX.dat", CMD_PGNSS_INJECT_AUX_GANSS);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send GLO_AUX success\r\n");\r
+ PgnssSendFileContent(handle, "/user/userdata/gnss/BDS_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send BDS_RTI success\r\n");\r
+ PgnssSendFileContent(handle, "/user/userdata/gnss/GAL_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ printf("send GAL_RTI success\r\n");\r
+}\r
+\r
+void PgnssInject(tiot_handle handle, uint32_t ts)\r
+{\r
+ // 注入Pgnss辅助数据\r
+ PgnssInjectAllEph(handle, ts);\r
+ PgnssInjectOtherAssist(handle);\r
+}\r
+\r
+\r
+// 以下为使用PGNSS解析数据合并输出接口生成的星历文件进行注入的代码\r
+int32_t GetNonGloEphFileName(int32_t ts, char *fileName)\r
+{\r
+ const char prefix[] = "NonGlo";\r
+ DIR *dir = opendir("/user/userdata/gnss/");\r
+ if (dir == NULL) {\r
+ printf("Failed to open /user/xgnss directory.\r\n");\r
+ return 0;\r
+ }\r
+ int32_t time, ret;\r
+ int32_t minDist = OTHER_EPH_VALID_TIME;\r
+ int32_t closestTime = 0;\r
+ struct dirent *entry;\r
+ for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) {\r
+ // 检查文件名\r
+ if (strstr(entry->d_name, ".eph") != NULL) {\r
+ char *p = strrchr(entry->d_name, '_');\r
+ if (p != NULL) {\r
+ char *q = strstr(entry->d_name, prefix);\r
+ if (q != NULL) {\r
+ time = atoi(p + 1);\r
+ // 查找星历文件时间戳与当前时间相差2小时以内且距离最近的\r
+ if (abs(time - ts) < minDist) {\r
+ minDist = abs(time - ts);\r
+ closestTime = time;\r
+ }\r
+ else\r
+ {\r
+ printf("time:%d,ts:%d,minDist:%d\r\n",time,ts,minDist);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ if (closestTime != 0) {\r
+ ret = snprintf_s(fileName, FILE_PATH_LEN, (FILE_PATH_LEN - 1), "%s%d%s", "/user/userdata/gnss/NonGlo_", closestTime,\r
+ ".eph");\r
+ printf("closest eph fileName:%s\r\n", fileName);\r
+ closedir(dir);\r
+ return ((ret <= 0) ? 0 : 1);\r
+ }\r
+ else\r
+ {\r
+ printf("closestTime == 0\r\n");\r
+ }\r
+ closedir(dir);\r
+ return 0;\r
+}\r
+\r
+int32_t GetGloEphFileName(int32_t ts, char *fileName)\r
+{\r
+ const char prefix[] = "GLO";\r
+ DIR *dir = opendir("/user/userdata/gnss/");\r
+ if (dir == NULL) {\r
+ printf("Failed to open /user/xgnss directory.\r\n");\r
+ return 0;\r
+ }\r
+ int32_t ephTime, ret;\r
+ struct dirent *entry;\r
+ for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) {\r
+ // 检查文件名\r
+ if (strstr(entry->d_name, ".eph") != NULL) {\r
+ char *p = strrchr(entry->d_name, '_');\r
+ if (p != NULL) {\r
+ char *q = strstr(entry->d_name, prefix);\r
+ if (q != NULL) {\r
+ ephTime = atoi(p + 1);\r
+ printf("ephTime:%ld, ts:%ld\n", ephTime, ts);\r
+ // 当前时间大于GLO星历文件时间戳,则需要选取相差2小时以内的星历\r
+ // 当前时间小于GLO星历文件时间戳,则需要选取相差小于15分钟的星历\r
+ if (((ts - ephTime) >= 0 && abs(ephTime - ts) < OTHER_EPH_VALID_TIME) ||\r
+ ((ts - ephTime) <= 0 && abs(ephTime - ts) < GLO_EPH_VALID_TIME)) {\r
+ ret = FormatFileName(fileName, entry->d_name);\r
+ printf("glo eph fileName:%s\n", fileName);\r
+ closedir(dir);\r
+ return ret;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ closedir(dir);\r
+ return 0;\r
+}\r
+\r
+void PgnssSendNonGloEph(tiot_handle handle, const char *fileName)\r
+{\r
+ FILE *fp = fopen(fileName, "rb");\r
+ if (fp == NULL) {\r
+ printf("\nerror: open file failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ fseek(fp, 0, SEEK_END);\r
+ int32_t len = ftell(fp);\r
+ fseek(fp, 0, SEEK_SET);\r
+ if (len < 0 || len > PGNSS_FILE_MAX_SIZE) {\r
+ fclose(fp);\r
+ printf("\nerror: get file len failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ uint8_t *buff = (uint8_t *)malloc(len);\r
+ if (buff == NULL) {\r
+ fclose(fp);\r
+ printf("\nerror: malloc file len failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ int32_t dataSize = fread(buff, len, 1, fp);\r
+ if (dataSize < 0) {\r
+ fclose(fp);\r
+ printf("\nerror: read file failed: %s\r\n", fileName);\r
+ free(buff);\r
+ return;\r
+ }\r
+ fclose(fp);\r
+ int32_t fileLen = 0;\r
+ for (int32_t i = 0; i < NON_GLO_GNSS_TYPES && fileLen <= len; i++) {\r
+ EphHeadInfo *ephHdr = (EphHeadInfo *)(buff + fileLen);\r
+ EncodeAndInjectCmd(handle, ephHdr->cmd, (buff + fileLen + sizeof(EphHeadInfo)), ephHdr->len);\r
+ fileLen += (ephHdr->len + sizeof(EphHeadInfo));\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ }\r
+ free(buff);\r
+}\r
+\r
+void PgnssSendGloEph(tiot_handle handle, const char *fileName, int32_t ts)\r
+{\r
+ FILE *fp = fopen(fileName, "rb");\r
+ if (fp == NULL) {\r
+ printf("\nerror: open file failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ fseek(fp, 0, SEEK_END);\r
+ int32_t len = ftell(fp);\r
+ fseek(fp, 0, SEEK_SET);\r
+ if (len < 0 || len > PGNSS_FILE_MAX_SIZE) {\r
+ fclose(fp);\r
+ printf("\nerror: get file len failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ uint8_t *buff = (uint8_t *)malloc(len);\r
+ if (buff == NULL) {\r
+ fclose(fp);\r
+ printf("\nerror: malloc file len failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ int32_t dataSize = fread(buff, len, 1, fp);\r
+ if (dataSize < 0) {\r
+ fclose(fp);\r
+ printf("\nerror: read file failed: %s\r\n", fileName);\r
+ free(buff);\r
+ return;\r
+ }\r
+ fclose(fp);\r
+ int32_t fileLen = 0;\r
+ for (int32_t i = 0; i < GLO_EPH_NUM_ONE_FILE && fileLen <= len; i++) {\r
+ EphHeadInfo *ephHdr = (EphHeadInfo *)(buff + fileLen);\r
+ printf("glo eph, time:%u, ts:%d\r\n", ephHdr->time, ts);\r
+ if (abs((int32_t)ephHdr->time - ts) < GLO_EPH_VALID_TIME) {\r
+ EncodeAndInjectCmd(handle, ephHdr->cmd, (buff + fileLen + sizeof(EphHeadInfo)), ephHdr->len);\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ break;\r
+ }\r
+ fileLen += (ephHdr->len + sizeof(EphHeadInfo));\r
+ }\r
+ free(buff);\r
+}\r
+\r
+void PgnssInjectAllEphLessFiles(tiot_handle handle, uint32_t ts)\r
+{\r
+ char fileName[FILE_PATH_LEN] = {0};\r
+ if (GetNonGloEphFileName(ts, fileName) == 0) {\r
+ printf("\nerror: GetNonGloEphFileName failed\r\n");\r
+ return;\r
+ }\r
+ PgnssSendNonGloEph(handle, fileName);\r
+ if (GetGloEphFileName(ts, fileName) == 0) {\r
+ printf("\nerror: GetGloEphFileName failed\r\n");\r
+ return;\r
+ }\r
+ PgnssSendGloEph(handle, fileName, ts);\r
+}\r
+\r
+void PgnssSendOtherAssistInfo(tiot_handle handle, const char *fileName)\r
+{\r
+ FILE *fp = fopen(fileName, "rb");\r
+ if (fp == NULL) {\r
+ printf("\nerror: open file failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ fseek(fp, 0, SEEK_END);\r
+ int32_t len = ftell(fp);\r
+ fseek(fp, 0, SEEK_SET);\r
+ if (len < 0 || len > PGNSS_FILE_MAX_SIZE) {\r
+ fclose(fp);\r
+ printf("\nerror: get file len failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ uint8_t *buff = (uint8_t *)malloc(len);\r
+ if (buff == NULL) {\r
+ fclose(fp);\r
+ printf("\nerror: malloc file len failed: %s\r\n", fileName);\r
+ return;\r
+ }\r
+ int32_t dataSize = fread(buff, len, 1, fp);\r
+ if (dataSize < 0) {\r
+ fclose(fp);\r
+ printf("\nerror: read file failed: %s\r\n", fileName);\r
+ free(buff);\r
+ return;\r
+ }\r
+ fclose(fp);\r
+ int32_t fileLen = 0;\r
+ for (int32_t i = 0; i < OTHER_ASSIST_TYPES && fileLen <= len; i++) {\r
+ OtherAssistHeadInfo *otherHdr = (OtherAssistHeadInfo *)(buff + fileLen);\r
+ EncodeAndInjectCmd(handle, otherHdr->cmd, (buff + fileLen + sizeof(OtherAssistHeadInfo)), otherHdr->len);\r
+ fileLen += (otherHdr->len + sizeof(OtherAssistHeadInfo));\r
+ osal_msleep(INJECT_SLEEP_MS_TIME);\r
+ }\r
+ free(buff);\r
+}\r
+\r
+void PgnssInjectOtherAssistLessFiles(tiot_handle handle)\r
+{\r
+ PgnssSendOtherAssistInfo(handle, "/user/userdata/gnss/AssistInfo.dat");\r
+}\r
+\r
+// 注入PGNSS解析数据合并输出接口生成的星历文件\r
+void PgnssInjectLessFiles(tiot_handle handle, uint32_t ts)\r
+{\r
+ // 注入Pgnss辅助数据\r
+ PgnssInjectAllEphLessFiles(handle, ts);\r
+ PgnssInjectOtherAssistLessFiles(handle);\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+ * Description: pgnss encode\r
+ * Author:\r
+ * Create:\r
+ */\r
+#ifndef PGNSS_ENCODE_H\r
+#define PGNSS_ENCODE_H\r
+\r
+#include "gnss_datatypes.h"\r
+#include "tiot_service_interface.h"\r
+\r
+int32_t PgnssInjectUtcTime(tiot_handle handle, GnssUtcTime *utcTime, uint32_t* ts);\r
+void PgnssInject(tiot_handle handle, uint32_t ts);\r
+void PgnssInjectLessFiles(tiot_handle handle, uint32_t ts);\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+ * Description: pgnss sample\r
+ * Author:\r
+ * Create:\r
+ */\r
+#include "pgnss_sample.h"\r
+#include <stdio.h>\r
+#include "securec.h"\r
+#include "tiot_service_interface.h"\r
+#include "pm_definition.h"\r
+#include "gnss_datatypes.h"\r
+#include "pgnss_encode.h"\r
+#include "NMEA0183.h"\r
+#include "sys/time.h"\r
+#include "time.h"\r
+#include "gnss_ctl.h"\r
+\r
+\r
+#define PGNSS_FIXMODEALL_NMEADEF_SAMPLE 0\r
+#define PGNSS_LESS_FILES_FIXMODEALL_NMEADEF_SAMPLE 0\r
+\r
+#ifndef ARRAY_SIZE\r
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))\r
+#endif\r
+#define MSG_TYPE_BINRY 0\r
+#define MSG_TYPE_ASCII 1\r
+#define LISTEN_DATA_MAX_LINES 1000\r
+\r
+static FILE* g_gnssLogFp = NULL;\r
+static uint8_t g_gnssServiceBuff[REPORT_MAX_BYTES] = { 0 };\r
+\r
+typedef int32_t (*GnssCfgFunc)(tiot_handle handle);\r
+\r
+typedef struct {\r
+ uint16_t sampleId;\r
+ GnssCfgFunc cfgHandle;\r
+} GnssSamplesCfgTable;\r
+\r
+static NMEA0183 g_nmeadata={0};\r
+static gps_data_t g_global_gpsData={0};\r
+\r
+/**GPS状态位*/\r
+static int g_is_pgnss_poweron=0;\r
+static int g_is_pgnss_logon=0;\r
+static int g_pgnss_stopflag=0;\r
+\r
+static int32_t QryVersion(tiot_handle handle)\r
+{\r
+ const uint8_t qryVersion[] = {0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00};\r
+ // 查询版本号\r
+ int32_t ret = tiot_service_write(handle, qryVersion, sizeof(qryVersion));\r
+ if (ret < 0) {\r
+ printf("\nerror: QryVersion error: %d\r\n", ret);\r
+ return 0;\r
+ }\r
+ return 1;\r
+}\r
+\r
+static int decode_nmea(char c)\r
+{\r
+ int ret=0;\r
+ ret=0;\r
+ if(nmea_decode(&g_nmeadata,c) ==1 ) ///调用解析函数\r
+ {\r
+ dump_nmea_str(&(g_nmeadata.gpsParse));\r
+ if (g_nmeadata.gpsParse.sentence_type == GPS_SENTENCE_TH002 )\r
+ {\r
+ //一组数据最后一条\r
+ memcpy_s(&g_global_gpsData,sizeof(gps_data_t),&(g_nmeadata.gpsData),sizeof(gps_data_t));\r
+ ret = 1;\r
+ memset(&g_nmeadata,0,sizeof(g_nmeadata));\r
+ }\r
+ } \r
+\r
+ return ret;\r
+}\r
+\r
+gps_data_t * getPGPSGlobaldata(void)\r
+{\r
+ return &g_global_gpsData;\r
+}\r
+\r
+\r
+// 注入PGNSS,使用默认配置启动\r
+int32_t InjectPgnssCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle)\r
+{\r
+ const uint8_t cfgLogLevelInfo[] = {0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x10, 0x01, 0x00, 0x03};\r
+\r
+ // 配置log级别:info级别。\r
+ int32_t ret = tiot_service_write(handle, cfgLogLevelInfo, sizeof(cfgLogLevelInfo));\r
+ if (ret < 0) {\r
+ printf("\nerror: cfgLogLevelInfo error: %d\r\n", ret);\r
+ return 0;\r
+ }\r
+\r
+ // 注入UTC时间, 注入Pgnss辅助数据前必须先注入参考时间\r
+ GnssUtcTime utcTime = {2024, 2, 26, 6, 0, 0, 0, 1}; // 需要用当前的UTC时间替换\r
+\r
+ time_t rawtime;\r
+ struct tm* timeinfo;\r
+\r
+ time(&rawtime); // 获取UTC时间戳\r
+ timeinfo = gmtime(&rawtime); // 转换为UTC时间(无时区偏移)\r
+\r
+ utcTime.year = timeinfo->tm_year + 1900;\r
+ utcTime.month = timeinfo->tm_mon + 1;\r
+ utcTime.day = timeinfo->tm_mday;\r
+ utcTime.hour = timeinfo->tm_hour;\r
+ utcTime.minute = timeinfo->tm_min;\r
+ utcTime.second = timeinfo->tm_sec;\r
+\r
+ printf("year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n",\r
+ utcTime.year,utcTime.month,utcTime.day,\r
+ utcTime.hour,utcTime.minute,utcTime.second);\r
+\r
+ uint32_t ts = 0;\r
+ ret = PgnssInjectUtcTime(handle, &utcTime, &ts);\r
+ if (ret == 0) {\r
+ printf("\nerror: PgnssInjectUtcTime failed!\r\n");\r
+ return 0;\r
+ }\r
+ printf("\nPgnssInjectUtcTime success!\r\n");\r
+\r
+ // PGNSS注入\r
+ // 注意,默认PGNSS星历文件存放在/user/xgnss/目录中,如修改目录,请全局搜索替换\r
+ PgnssInject(handle, ts);\r
+\r
+ return 1;\r
+}\r
+\r
+// 注入PGNSS,使用默认配置启动\r
+int32_t InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle)\r
+{\r
+ const uint8_t cfgLogLevelInfo[] = {0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x10, 0x01, 0x00, 0x03};\r
+\r
+ // 配置log级别:info级别。\r
+ int32_t ret = tiot_service_write(handle, cfgLogLevelInfo, sizeof(cfgLogLevelInfo));\r
+ if (ret < 0) {\r
+ printf("\nerror: cfgLogLevelInfo error: %d\r\n", ret);\r
+ return 0;\r
+ }\r
+\r
+ // 注入UTC时间, 注入Pgnss辅助数据前必须先注入参考时间\r
+ GnssUtcTime utcTime = {2024, 3, 14, 12, 0, 0, 0, 1}; // 需要用当前的UTC时间替换\r
+\r
+ time_t rawtime;\r
+ struct tm* timeinfo;\r
+\r
+ time(&rawtime); // 获取UTC时间戳\r
+ timeinfo = gmtime(&rawtime); // 转换为UTC时间(无时区偏移)\r
+\r
+ utcTime.year = timeinfo->tm_year + 1900;\r
+ utcTime.month = timeinfo->tm_mon + 1;\r
+ utcTime.day = timeinfo->tm_mday;\r
+ utcTime.hour = timeinfo->tm_hour;\r
+ utcTime.minute = timeinfo->tm_min;\r
+ utcTime.second = timeinfo->tm_sec;\r
+\r
+ printf("year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n",\r
+ utcTime.year,utcTime.month,utcTime.day,\r
+ utcTime.hour,utcTime.minute,utcTime.second);\r
+\r
+\r
+ uint32_t ts = 0;\r
+ ret = PgnssInjectUtcTime(handle, &utcTime, &ts);\r
+ if (ret == 0) {\r
+ printf("\nerror: PgnssInjectUtcTime failed!\r\n");\r
+ return 0;\r
+ }\r
+ printf("\nPgnssInjectUtcTime success!\r\n");\r
+\r
+ // PGNSS注入\r
+ // 注意,默认PGNSS星历文件存放在/user/xgnss/目录中,如修改目录,请全局搜索替换\r
+ PgnssInjectLessFiles(handle, ts);\r
+\r
+ return 1;\r
+}\r
+\r
+static const GnssSamplesCfgTable g_gnssSamplesCfg[] = {\r
+ // {PGNSS_FIXMODEALL_NMEADEF_SAMPLE, InjectPgnssCfgAutoStartFixModeAndNmeaDefault},\r
+ {PGNSS_LESS_FILES_FIXMODEALL_NMEADEF_SAMPLE, InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault}\r
+};\r
+\r
+static int32_t StartGnss(tiot_handle handle)\r
+{\r
+ const uint8_t startCmd[] = {0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,\r
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};\r
+ // 启动GNSS\r
+ int32_t ret = tiot_service_write(handle, startCmd, sizeof(startCmd));\r
+ if (ret < 0) {\r
+ printf("\nerror: start gnss error: %d\r\n", ret);\r
+ return 0;\r
+ }\r
+ printf("\nstart gnss\r\n");\r
+ return 1;\r
+}\r
+\r
+static int32_t StopGnss(tiot_handle handle)\r
+{\r
+ const uint8_t stopCmd[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r
+ // 停止GNSS\r
+ int32_t ret = tiot_service_write(handle, stopCmd, sizeof(stopCmd));\r
+ if (ret < 0) {\r
+ printf("\nerror: stop gnss error: %d\r\n", ret);\r
+ return 0;\r
+ }\r
+ printf("\nstop gnss\r\n");\r
+ return 1;\r
+}\r
+\r
+\r
+static void ListenGnssData(tiot_handle handle)\r
+{\r
+ int32_t i = 0;\r
+ // 写日志\r
+ for (;;) { // 写日志条件\r
+\r
+ if (i >= LISTEN_DATA_MAX_LINES) {\r
+ printf("\r\ncnt enough\r\n");\r
+ break;\r
+ }\r
+ if (g_pgnss_stopflag == 1)\r
+ {\r
+ break;\r
+ }\r
+ // 监听\r
+ int32_t ret = tiot_service_read(handle, g_gnssServiceBuff, REPORT_MAX_BYTES, LISTEN_TIME_THR);\r
+ if (ret > 0) {\r
+ uint16_t *type = (uint16_t *)g_gnssServiceBuff;\r
+ if (type[0] == MSG_TYPE_ASCII) {\r
+ g_gnssServiceBuff[ret] = '\0';\r
+ char* pbuf=(char *)&g_gnssServiceBuff[MSG_CONTENT_IDX];\r
+ printf("%s\r\n", pbuf);\r
+ if (g_is_pgnss_logon)\r
+ fprintf(g_gnssLogFp, "%s\n", pbuf);\r
+ for (int index=0;index < ret ;index++)\r
+ {\r
+ if (decode_nmea(pbuf[index])==1)\r
+ {\r
+ // dump_location_data(&g_global_gpsData);\r
+ printf("decode_nmea done\r\n");\r
+ }\r
+ }\r
+ }\r
+ i++;\r
+ }\r
+\r
+ }\r
+}\r
+\r
+void PGnssServerStop(void)\r
+{\r
+ g_pgnss_stopflag=1;\r
+}\r
+\r
+int getPGnssServerStat(void)\r
+{\r
+ return g_is_pgnss_poweron;\r
+}\r
+\r
+int is_PGnssLogEnabled(void)\r
+{\r
+ return g_is_pgnss_logon;\r
+}\r
+\r
+int PGnssLogEnable(bool enable)\r
+{\r
+ if (enable)\r
+ g_is_pgnss_logon = 1;\r
+ else\r
+ g_is_pgnss_logon = 0;\r
+\r
+ return g_is_pgnss_logon;\r
+}\r
+\r
+\r
+void PGnssServerStart(void)\r
+{\r
+ printf("\nenter gnss samples\r\n");\r
+ if(g_is_pgnss_poweron == 1)\r
+ {\r
+ printf("gnss already on\r\n");\r
+ return ;\r
+ }\r
+ uapi_pm_add_sleep_veto(PM_ID_SYS);\r
+\r
+ #ifdef DOWNLOAD_GNSS_SWITCH\r
+ download_gnss_switch(SWITCH_TO_GNSS);\r
+ #endif\r
+ g_is_pgnss_poweron = 1;\r
+ g_pgnss_stopflag = 0;\r
+\r
+ // Step1: init\r
+ int32_t ret = tiot_service_init();\r
+ if (ret != 0) {\r
+ printf("tiot service init fail\r\n");\r
+ g_is_pgnss_poweron = 0;\r
+ g_pgnss_stopflag = 1;\r
+ }\r
+\r
+ // 打开日志文件\r
+ if (g_is_pgnss_logon)\r
+ {\r
+ g_gnssLogFp = fopen("/user/log/gnss.log", "w");\r
+ if (g_gnssLogFp == NULL) {\r
+ printf("error: open log file error\n");\r
+ return;\r
+ }\r
+ }\r
+ printf("before open tiot service\n");\r
+\r
+ // Step2: power on gnss\r
+ tiot_handle handle = tiot_service_open("gn71", NULL);\r
+ if (handle == 0) {\r
+ printf("open tiot service fail\r\n");\r
+ g_is_pgnss_poweron = 0;\r
+ g_pgnss_stopflag = 1;\r
+ return;\r
+ }\r
+ printf("open tiot service success\r\n");\r
+\r
+ int32_t cfgRet;\r
+ // ---- loop ----------\r
+ for (uint16_t i = 0; i < ARRAY_SIZE(g_gnssSamplesCfg); i++) {\r
+ cfgRet = 0;\r
+ if (g_gnssSamplesCfg[i].sampleId == i) {\r
+ // Step3: config gnss\r
+ if (g_gnssSamplesCfg[i].cfgHandle != NULL) {\r
+ cfgRet = g_gnssSamplesCfg[i].cfgHandle(handle);\r
+ }\r
+ if (cfgRet == 0) {\r
+ continue;\r
+ }\r
+ printf("cfg sample id:%u\r\n", g_gnssSamplesCfg[i].sampleId);\r
+ QryVersion(handle);\r
+\r
+ // Step4: start gnss\r
+ if (StartGnss(handle) == 0) {\r
+ continue;\r
+ }\r
+ // Step5: listening gnss data\r
+ ListenGnssData(handle);\r
+ // Step6: stop gnss\r
+ if (StopGnss(handle) == 0) {\r
+ continue;\r
+ }\r
+ }\r
+ }\r
+ // ---------------------\r
+ // Step7: power off gnss\r
+ tiot_service_close(handle);\r
+ // 关日志文件\r
+ if (g_is_pgnss_logon)\r
+ {\r
+ fclose(g_gnssLogFp);\r
+ g_gnssLogFp = NULL;\r
+ }\r
+ // Step8: deinit\r
+ tiot_service_deinit();\r
+\r
+ #ifdef DOWNLOAD_GNSS_SWITCH\r
+ download_gnss_switch(SWITCH_TO_DOWNLOAD);\r
+ #endif\r
+ uapi_pm_remove_sleep_veto(PM_ID_SYS);\r
+ g_is_pgnss_poweron=0;\r
+ printf("finish gnss samples\r\n");\r
+}\r
--- /dev/null
+/*\r
+ * @Author: penglei 1624952103@qq.com\r
+ * @Date: 2025-07-11 16:41:59\r
+ * @LastEditors: penglei 1624952103@qq.com\r
+ * @LastEditTime: 2025-07-18 17:39:28\r
+ * @FilePath: /FD230/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.h\r
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
+ */\r
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+ * Description: pgnss sample\r
+ * Author:\r
+ * Create:\r
+ */\r
+#ifndef PGNSS_SAMPLE_H\r
+#define PGNSS_SAMPLE_H\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif /* __cplusplus */\r
+void PGnssServerStart(void);\r
+void PGnssServerStop(void);\r
+int getPGnssServerStat(void);\r
+#ifdef __cplusplus\r
+}\r
+#endif /* __cplusplus */\r
+#endif
\ No newline at end of file
#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);
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);
// uint8_t cmd = GNSS_CMD_STOP;
// do_gnss_cmd(GNSS_CMD_WRITEDATA, &cmd,1);
// g_gnss_status = 0;
- GnssServerStop();
+ // GnssServerStop();
+ PGnssServerStop();
return 0;
}
--- /dev/null
+#include "pinctrl.h"
+#include "debug_print.h"
+#include "rtc.h"
+#include "timer.h"
+#include "systick.h"
+
+#include "tcxo.h"
+
+#include "cmsis_os2.h"
+#include "input_app.h"
+#include "gnss_service.h"
+#include "custom_utils.h"
+#include "gnss_tcp_server.h"
+#include "custom_runtime.h"
+#include <dirent.h>
+#include "lwip/ip.h"
+#include "lwip/netif.h"
+#include "lwip/init.h"
+#include "lwip/inet_chksum.h"
+
+#include "lwip/err.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+#include <lwip/netdb.h>
+// #include <netinet/in.h>
+#include "lwip/inet.h"
+#include "lwip/ip_addr.h"
+#include "pm_definition.h"
+#include "mbedtls/md5.h"
+#include "mbedtls/base64.h"
+#include "cJSON.h"
+#include "mbedtls/hmac_drbg.h"
+
+#define BID "hu4kZYyYMGO"
+#define KEY "tcUpJpeGpsIBXvjG"
+
+#define HOST "iot.socket.thisiot.com"
+#define PORT 9999
+
+#define URL "https://geo-drcn.platform.dbankcloud.cn/higeo/v1/xgnss/agnss"
+#define APP_ID "coolwearable"
+#define APP_SECRET "a0e0852c9fd25fad56b6e281b542020d7d01c975907c0b9585ed7f9462447a59"
+
+#define PGNSS_DATA_PATH "/user/userdata/gnss"
+
+static unsigned long g_app_queue= 0xFFFFFFFF;
+
+static int g_tcp_sock = -1;
+
+static uint8_t LK_STATUS = 0;
+
+static char *imei = NULL;
+
+static char *rx_buffer = NULL;
+
+static uint8_t GNSS_TCP_SERVER_STAT = 0;
+
+static app_task_definition_t send_taskcfg={0};
+static app_task_definition_t recv_taskcfg={0};
+
+struct gnss_ipaddr_t
+{
+ osSemaphoreId_t dns_done_sem;
+ ip_addr_t ip;
+};
+
+
+// Base64 编码函数
+static char *base64_encode(const unsigned char *input, size_t length)
+{
+ // 计算 Base64 编码后的最大长度
+ size_t encoded_len = 4 * ((length + 2) / 3) + 1;
+ char *encoded = (char *)malloc(encoded_len);
+ if (encoded == NULL) {
+ return NULL;
+ }
+
+ size_t output_len;
+ int ret = mbedtls_base64_encode((unsigned char *)encoded, encoded_len, &output_len, input, length);
+ if (ret != 0) {
+ free(encoded);
+ return NULL;
+ }
+
+ return encoded;
+}
+
+static char *compute_hmac_sha256_base64(const char *str_to_sign)
+{
+ if (str_to_sign == NULL) {
+ fprintf(stderr, "Error: str_to_sign is NULL\n");
+ return NULL;
+ }
+
+ // 输出缓冲区
+ unsigned char hmac_result[32];
+ size_t hmac_len = sizeof(hmac_result);
+
+ // Base64 编码结果缓冲区
+ size_t b64_len = 4 * ((hmac_len + 2) / 3) + 1;
+ char *base64_result = (char *)malloc(b64_len);
+ if (base64_result == NULL) {
+ fprintf(stderr, "Memory allocation failed\n");
+ return NULL;
+ }
+
+ // 获取 SHA-256 算法信息
+ const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
+ if (md_info == NULL) {
+ fprintf(stderr, "Failed to get SHA-256 algorithm\n");
+ goto cleanup;
+ }
+
+ // 使用标准 HMAC 计算 API
+ int ret = mbedtls_md_hmac(
+ md_info, // 算法信息
+ (const unsigned char *)APP_SECRET, // 密钥
+ strlen(APP_SECRET), // 密钥长度
+ (const unsigned char *)str_to_sign, // 待签名数据
+ strlen(str_to_sign), // 数据长度
+ hmac_result // 输出结果
+ );
+
+ if (ret != 0) {
+ fprintf(stderr, "HMAC calculation failed: %d\n", ret);
+ goto cleanup;
+ }
+
+ // 调试输出
+ printf("HMAC-SHA256 result (hex): ");
+ for (int i = 0; i < hmac_len; i++) {
+ printf("%02x", hmac_result[i]);
+ }
+ printf("\n");
+
+ // Base64 编码
+ size_t olen;
+ ret = mbedtls_base64_encode(
+ (unsigned char *)base64_result,
+ b64_len,
+ &olen,
+ hmac_result,
+ hmac_len
+ );
+
+ if (ret != 0) {
+ fprintf(stderr, "Base64 encoding failed: %d\n", ret);
+ free(base64_result);
+ base64_result = NULL;
+ goto cleanup;
+ }
+
+ printf("Base64 result: %s\n", base64_result);
+
+cleanup:
+ return base64_result;
+}
+
+static void dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg)
+{
+ struct gnss_ipaddr_t *ip_sem = (struct gnss_ipaddr_t *)arg;
+ char ip_str[20] = {0};
+
+ // if (ipaddr == NULL) {
+ // printf("DNS解析失败,IP地址为空\n");
+ // (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+ // return;
+ // }
+
+ printf("hostname: %s, ", hostname);
+
+ // 处理IPv4地址(现在ip4是包含addr成员的结构体)
+ if (IP_IS_V4(ipaddr)) {
+ u32_t ip_num = ipaddr->u_addr.ip4.addr; // 直接获取32位地址
+
+ // 分解为4字节打印
+ u8_t byte0 = (ip_num >> 24) & 0xFF;
+ u8_t byte1 = (ip_num >> 16) & 0xFF;
+ u8_t byte2 = (ip_num >> 8) & 0xFF;
+ u8_t byte3 = ip_num & 0xFF;
+ // printf("IPv4: %d.%d.%d.%d\n", byte0, byte1, byte2, byte3);
+
+ // 转换为struct in_addr(已为网络字节序)
+ struct in_addr ipv4_addr;
+ ipv4_addr.s_addr = ip_num;
+ inet_ntop(AF_INET, &ipv4_addr, ip_str, sizeof(ip_str));
+ printf("ip: %s\n", ip_str);
+ }
+
+ // 复制IP地址到上下文
+ if(ipaddr->u_addr.ip4.addr != 0)
+ memcpy(&(ip_sem->ip), ipaddr, sizeof(ip_addr_t));
+ (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+}
+
+int gnss_tcp_socket_init(void)
+{
+ uint8_t cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (cnt == 0) {
+ uapi_pm_add_sleep_veto(PM_ID_CAT1);
+ }
+
+ struct sockaddr_in server_addr;
+ struct gnss_ipaddr_t ip_sem = {0}; // 定义信号量结构
+ int listen_socket = -1;
+
+ // 创建信号量
+ ip_sem.dns_done_sem = osSemaphoreNew(1, 0, NULL);
+
+ // 解析域名
+ dns_gethostbyname(HOST, &(ip_sem.ip), dns_found, &ip_sem);
+
+ osSemaphoreAcquire(ip_sem.dns_done_sem, 1000); // 等待 DNS 解析完成
+
+ memcpy(&server_addr.sin_addr.s_addr, &ip_sem.ip.u_addr.ip4, 4);
+
+ // 创建套接字
+
+ if(listen_socket < 0)
+ {
+ listen_socket = lwip_socket(AF_INET, SOCK_STREAM, 0);
+ if(listen_socket < 0)
+ {
+ int err = errno;
+ printf("socket create errno: %d, reason: %s\n", err, strerror(err));
+ goto FAILED;
+ }
+ }
+
+ int opt = 1;
+
+ lwip_setsockopt(listen_socket, SOL_SOCKET, SO_KEEPALIVE, (const void*)&opt, sizeof(opt));
+ lwip_setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR,(const void*)&opt, sizeof(opt));
+
+ // 设置服务器地址
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(PORT);
+
+ // 连接服务器
+ if (lwip_connect(listen_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
+ {
+ printf("server_addr.sin_addr.s_addr:%d\n",server_addr.sin_addr.s_addr);
+ int err = errno;
+ printf("connect failed, errno: %d, reason: %s\n", err, strerror(err));
+
+ goto FAILED;
+ }
+
+ printf("socket init succed\n");
+ osSemaphoreDelete(ip_sem.dns_done_sem); // 释放信号量
+
+ cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (cnt == 1) {
+ uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+ }
+
+ return listen_socket;
+
+FAILED:
+ if (listen_socket >= 0)
+ {
+ lwip_close(listen_socket);
+ }
+ if (ip_sem.dns_done_sem != NULL)
+ {
+ osSemaphoreDelete(ip_sem.dns_done_sem);
+ }
+ cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (cnt == 1)
+ {
+ uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+ }
+ return -1;
+}
+
+static int tcp_send(int listen_socket, const char *data, size_t size)
+{
+ if (data == NULL || size == 0)
+ return -1;
+
+ uint8_t retry = 0;
+ while(listen_socket < 0 && retry < 5)
+ {
+ retry++;
+ LOS_Msleep(2000);
+ }
+
+ if(listen_socket < 0)
+ {
+ printf("listen_socket < 0 \n");
+ return -1;
+ }
+
+ int ret = 0;
+
+ // const char *buffer = (const char *)data;
+ const char *buffer = (const char *)malloc(size);
+ if(buffer == NULL)
+ return -1;
+
+ memcpy_s(buffer,size,(const char *)data,size);
+ // printf("size : %d\n",size);
+ // printf("strlen(buffer) : %d\n",strlen(buffer));
+ // printf("buffer : %s\n",buffer);
+
+ size_t total_sent = 0;
+
+ while (total_sent < size)
+ {
+ ssize_t sent = lwip_send(listen_socket, buffer + total_sent, size - total_sent, 0);
+ if (sent < 0) {
+ printf("errno : %d\n",errno);
+ // 处理错误情况
+ if (errno == EINTR) {
+ PRINT("被信号中断,继续尝试\n");
+ ret = -1;
+ continue;
+ } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
+ PRINT("非阻塞模式下暂时无法发送,可选择等待或返回\n");
+ ret = -1;
+ goto FAILED;
+ } else if (errno == ENETUNREACH) {
+ PRINT("网络不可达,检查路由或远程主机状态\n");
+ ret = -1;
+ goto FAILED;
+ }
+ else {
+ PRINT("其他错误(如连接断开)\n");
+ ret = -1;
+ goto FAILED;
+ }
+ }
+
+ total_sent += sent;
+ }
+ printf("tcp send succed size : %d\n",total_sent);
+ ret = 0;
+FAILED:
+
+ if(buffer != NULL)
+ {
+ free(buffer);
+ buffer = NULL;
+ }
+ return ret;
+}
+
+static int active_md5_sign(const char *data,int data_len,char*md5_str)
+{
+ char md5_buf[16]={0};
+
+ char *code_str = (const char*)malloc(data_len);
+ if(md5_str == NULL)
+ return -1;
+
+ memcpy_s(code_str,data_len,data,data_len);
+ mbedtls_md5_context ctx;
+
+ // 初始化MD5上下文
+ mbedtls_md5_init(&ctx);
+
+ // 开始计算MD5哈希
+ mbedtls_md5_starts(&ctx);
+ // 更新要计算哈希的数据
+ mbedtls_md5_update(&ctx, (const unsigned char *)code_str, data_len);
+
+ // 完成哈希计算
+ mbedtls_md5_finish(&ctx, (unsigned char *)md5_buf);
+
+ // printf("md5_buf\r\n");
+ // for (int i = 0; i < 16; i++) {
+ // printf("%02X\n", (uint8_t)md5_buf[i]);
+ // }
+ // printf("md5_buf end\r\n");
+
+ // 清理MD5上下文
+ mbedtls_md5_free(&ctx);
+ for (int i = 0; i < 16; i++)
+ sprintf(&md5_str[i * 2], "%02x", (uint8_t)md5_buf[i]);
+
+ md5_str[32] = '\0';
+
+ free(code_str);
+
+ return 0;
+}
+
+static void calculate_md5(const char* input, char* md5_str)
+{
+ mbedtls_md5_context md5;
+ unsigned char md5_digest[16] = {0};
+ int i;
+
+ // printf("input:%s\n",input);
+
+ mbedtls_md5_init(&md5);
+ mbedtls_md5_starts(&md5);
+ mbedtls_md5_update(&md5, (const unsigned char*)input, strlen(input));
+ mbedtls_md5_finish(&md5, md5_digest);
+ mbedtls_md5_free(&md5);
+
+ // 转换为十六进制字符串
+ for (i = 0; i < 16; i++) {
+ sprintf(md5_str + i*2, "%02x", md5_digest[i]);
+ }
+ md5_str[32] = '\0'; // 确保字符串终止
+}
+
+int gnss_tcp_sign_up(void)
+{
+ int ret = 0;
+ char len_str[5] = {0};
+ sprintf(len_str, "%04x", 2);
+
+ if(imei == NULL)
+ {
+ imei = uapi_dev_runtime_get_cat1_imei();
+
+ if(imei == NULL || strlen(imei) == 0)
+ {
+ LOS_Msleep(2000);
+ imei = uapi_dev_runtime_get_cat1_imei();
+ }
+
+ if (imei == NULL || strlen(imei) == 0)
+ {
+ printf("IMEI get failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+ }
+ // printf("imei:%s\n", imei);
+
+ // head_str长度:BID + * + IMEI + * + len_str + * + LK + \0
+ int head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("LK") + 1;
+ char *head_str = (char *)malloc(head_len);
+ if(head_str == NULL)
+ {
+ printf("tcp_sign_up head_str malloc failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ snprintf(head_str, head_len, "%s*%s*%s*LK", BID,imei,len_str);
+ head_len = strlen(head_str);
+
+ char md5_str[33] = {0}; // MD5为32字符+1终止符
+
+ // code_str长度:head_str + KEY + \0
+ int code_len = head_len + strlen(KEY) + 1;
+ char *code_str = (char *)malloc(code_len);
+ if(code_str == NULL)
+ {
+ printf("code_str malloc failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ code_len = strlen(code_str);
+
+ calculate_md5(code_str,md5_str);
+
+ // if(active_md5_sign(code_str, code_len, md5_str) != 0)
+ // {
+ // printf("active_md5_sign failed\n");
+ // ret = -1;
+ // goto FAILED;
+ // }
+
+ // 计算send_str长度:[ + md5_str + head_str + ] + \0
+ int send_len = 1 + strlen(md5_str) + strlen(head_str) + 1 + 1;
+ char *send_str = (char *)malloc(send_len);
+ if(send_str == NULL)
+ {
+ printf("send_str malloc failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ snprintf(send_str, send_len, "[%s%s]", md5_str, head_str);
+ send_len = strlen(send_str);
+
+ // printf("md5_str:%s\n", md5_str);
+ // printf("md5_len:%zu\n", strlen(md5_str));
+ // printf("head_len:%d\n", head_len);
+ // printf("head_str:%s\n", head_str);
+ printf("send_len : %d\n", send_len);
+ printf("send_str : %s\n", send_str);
+
+ // 发送数据
+ while(LK_STATUS != 1)
+ {
+ ret = tcp_send(g_tcp_sock, send_str, send_len);
+ if(ret != 0)
+ {
+ printf("tcp_send failed\n");
+ goto FAILED;
+ }
+
+ LOS_Msleep(2000);
+ }
+
+
+FAILED:
+ // 释放资源
+ if(head_str != NULL)
+ {
+ free(head_str);
+ head_str = NULL;
+ }
+ if(code_str != NULL)
+ {
+ free(code_str);
+ code_str = NULL;
+ }
+ if(send_str != NULL)
+ {
+ free(send_str);
+ send_str = NULL;
+ }
+
+ return ret;
+}
+
+
+static int calculate_base64_length(int cnt)
+{
+ if (cnt <= 0)
+ return -1;
+
+ // 1. 计算int数组转换为字符串的最大可能长度
+ // int的最大字符串长度:11个字符(如"-2147483648")
+ // 每个int后加一个逗号(最后一个int除外)
+ int str_length = cnt * 11 + (cnt - 1);
+
+ // 2. 计算Base64编码长度
+ // Base64编码规则:每3字节明文→4字节编码,不足3字节用'='填充
+ int base64_length = (str_length * 4 + 2) / 3;
+
+ // 3. 确保编码长度足够容纳终止符
+ base64_length += 1; // 预留终止符空间
+
+ return base64_length;
+}
+
+int gnss_tcp_login(void)
+{
+ int ret = -1;
+ char *data_str = NULL;
+ int data_len = 0;
+ char *encode_str = NULL;
+ int encode_len = 0;
+
+ int head_len = 0;
+ char *code_str = NULL;
+ int code_len = 0;
+ char *send_str = NULL;
+ int send_len = 0;
+ uint32_t output_len = 0;
+ int temp_len = 0;
+
+ char len_str[5] = {0};
+ char md5_str[33] = {0};
+
+ uint32_t time = 0;
+ uapi_get_timestampe_ss(&time);
+ printf("time:%d \n",time);
+
+ char *sign_str = (char *)malloc(256);
+ if(sign_str == NULL)
+ {
+ printf("sign_str malloc failed\n");
+ goto FAILED;
+ }
+
+ snprintf(sign_str,256, "GET&/higeo/v1/xgnss/agnss&&&appid=%s×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
#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);
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:
#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){}
#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;
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:
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;
case CUSTOM_FILEOPERATE_MSG_TYPE_WEAR_DATA_READ:
#ifdef SUPPORT_CYWEE_SERVICE
- // custom_read_wear_data();
+ custom_read_wear_data();
#endif
break;
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:
uint8_t transmitting_status;//是否处于ble传输状态
uint8_t atuoota_status;//是否处于自动ota状态
+
+ uint8_t bp_status;//血压测量状态
+ uint8_t hrs_ble_status;//心率蓝牙广播
} runtime_status_t;
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;
+}
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
}
#include "tcxo.h"
#include <stdint.h>
#include "pm_veto.h"
+#include <sys/stat.h>
// #include "config/include/ConfigModelC.h"
#include "upg_porting.h"
-
#include "soc_lcd_api.h"
-
+#include "flash.h"
#ifdef SUPPORT_TCPIP
#include "lwip/tcpip.h"
#endif
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);
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)
{
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;
uapi_flash_chip_erase(1);
}
-
-
-void get_gsensor_single(uint8_t *databuf) {
- #ifdef SUPORT_CYWEE_SERVICE
- gsenson_t t;
- cywee_get_gsensor_data(1,&t);
- int16_t x, y, z;
- x = t.x * 2048;
- y = t.y * 2048;
- z = t.z * 2048;
-
- databuf[0] = (uint8_t)((x & 0xFF00) >> 8);
- databuf[1] = (uint8_t)(x & 0x00FF);
-
- databuf[2] = (uint8_t)((y & 0xFF00) >> 8);
- databuf[3] = (uint8_t)(y & 0x00FF);
- databuf[4] = (uint8_t)((z & 0xFF00) >> 8);
- databuf[5] = (uint8_t)(z & 0x00FF);
-
- PRINT("x : %.2f, y : %.2f, z : %.2f \r\n",t.x,t.y,t.z);
- PRINT("x : %d, y : %d, z : %d \r\n", x, y, z);
- PRINT("GSENSOR: %02X %02X %02X %02X %02X %02X\r\n", databuf[0], databuf[1], databuf[2], databuf[3], databuf[4], databuf[5]);
- #endif
-}
-
-#ifdef FD230_650
-void gsensor_get_single_data(gsenson_t *t)
-{
- cywee_get_gsensor_data(1,&t);
-}
-#endif
-
-#include <sys/stat.h>
-
int removeFilesInFolder(const char *folderPath)
{
DIR *dir;
for(cmd = 0; cmd < 6 ; cmd++)
{
// ui_api_vibrate_once_func(3);
- ui_api_vibrate_once_func();
+ custom_VibratorFunc_int(0);
LOS_Msleep(1000);
}