errcode_t charger_plug_event_notify(uint8_t plugged);
errcode_t charger_plug_event_ui_sendmsg_toUI(uint8_t plugged);
+
+static BATTERY_DATA_T *bat_t;
+static uint32_t len = 0;
+
+void battery_get_data_t(BATTERY_DATA_T **data,uint16_t *length)
+{
+ if(!len)
+ return;
+ *length = len;
+ *data = (BATTERY_DATA_T *)malloc(len);
+ memcpy_s(*data,len,bat_t,len);
+ free(bat_t);
+}
+
+void battery_get_data(void)
+{
+ len = uapi_get_file_size("/user/userdata/battery_data.bin");
+ if(!len)
+ return;
+
+ bat_t = (BATTERY_DATA_T *)malloc(len);
+ FILE *fp;
+
+ fp = fopen("/user/userdata/battery_data.bin", "rb");
+ if (fp == NULL)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "battery_data file open failed");
+ free(bat_t);
+ return;
+ }
+
+ if(fread(bat_t, 1, len, fp) != len)
+ {
+ free(bat_t);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "battery_data file read failed");
+ }
+ fclose(fp);
+}
+
+//保存电池信息到文件
+void battery_save_data(void)
+{
+ BATTERY_DATA_T data;
+ float voltage;
+ uint8_t percent = batteryservice_get_voltage(&voltage);
+ data.voltage = voltage;
+ data.percent = percent;
+ uapi_get_timestampe_ss(&data.tm);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "data.voltage : %f , data[i].percent : %d tm : %d",data.voltage,data.percent,data.tm);
+ uapi_save_file_data("user/userdata/battery_data.bin",(uint8_t *)&data,sizeof(BATTERY_DATA_T),"ab");
+}
+
//保存电量到文件
static void battery_save_percent(void)
{
* @Author: penglei 1624952103@qq.com
* @Date: 2024-10-25 14:42:28
* @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-11-01 17:44:34
+ * @LastEditTime: 2024-11-12 11:10:16
* @FilePath: /FD230/code/sdk/application/battery/service/battery_service.h
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include "stdint.h"
#include "errcode.h"
+#pragma pack(1)
+typedef struct
+{
+ uint32_t tm;
+ float voltage; //电压
+ uint8_t percent;// 电量
+}BATTERY_DATA_T;
+#pragma pack()
+
#define BATTERY_CMD_SAVE_PERCENT 0x16
#define BATTERY_CMD_START_AGING_TEST 0x17
//0 停止充电 , 1 低电流充电, 2 正常电流充电
int get_charge_current_status(void);
uint8_t get_02c_value(void);
+void battery_get_data(void);
+void battery_save_data(void);
+void battery_get_data_t(BATTERY_DATA_T **data,uint16_t *length);
+
#ifdef __cplusplus
#if __cplusplus
}
static int drinkremind_expectedTime = 0;\r
static int sleep_notify_time_min = 0;\r
static int sleep_notify_time_hour = 0;\r
+ static int time_sync_flag = 0;\r
\r
// #define SEDENTARY_TIME_RANGE (((curTime.tm_hour > sedentary_start_hour) || (curTime.tm_hour == sedentary_start_hour && curTime.tm_min >= sedentary_start_min)) && \\r
// ((curTime.tm_hour < sedentary_stop_hour) || (curTime.tm_hour == sedentary_stop_hour && curTime.tm_min < sedentary_stop_min)))\r
do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CHECK_ACC,NULL); //一分钟检查一次gsensor是否停止\r
}\r
\r
+ if(curTime.tm_min % 10 == 0 && curTime.tm_sec == 0)\r
+ {\r
+ do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_BATTERY_DATA_SAVE, nullptr, 0); //十分钟存一次电池信息\r
+ }\r
+\r
if (g_alarmCtrA.state == ALARM_STATUS_RUNNING)\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Checking Alarm A");\r
AlarmEventPublish(TOPIC_EVENT_SLEEPNOTE, NULL, 0); \r
}\r
}\r
+ if ((curTime->tm_hour == wake_time_hour && curTime->tm_min == wake_time_min + 1 && curTime->tm_sec == 0) ||\r
+ (curTime->tm_hour == sleep_time_hour && curTime->tm_min == sleep_time_min + 1 && curTime->tm_sec == 0))\r
+ {\r
+ uapi_cywee_time_sync();\r
+ }\r
+ else if(!time_sync_flag && curTime->tm_min)\r
+ {\r
+ time_sync_flag = 1;\r
+ uapi_cywee_time_sync();\r
+ }\r
// 退出睡眠检测模式并进入小睡检测模式\r
if (!is_time_range(*curTime, sleep_time_hour, sleep_time_min, wake_time_hour, wake_time_min) && (uapi_dev_runtime_get_nap_monitoring_status() == 0))\r
{\r
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-10-02 14:12:12
* @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-11-11 15:03:39
+ * @LastEditTime: 2024-11-12 10:27:28
* @FilePath: /FD230/code/sdk/application/wearable/service/msg_center/include/notify/debug_output_notification.h
*/
#ifndef DEBUG_OUTPUT_NOTIFICATION_H
std::string get_shutdown_info(void);
std::string get_sleep_time(void);
std::string get_wear_status(void);
+ std::string get_battery_percent(void);
std::string get_free_memory(void);
std::string get_nextday_log(void);
std::string get_heart_rate(void);
debugOutputItemInfo[index++] = {index, "vote_service_status"};
// 佩戴状态
debugOutputItemInfo[index++] = {index, "wear_status"};
+ // 电量信息
+ debugOutputItemInfo[index++] = {index, "battery_percent"};
usedLen = index;
/* -------------------------------- Add data -------------------------------- */
for (uint8_t i = 0; i < usedLen; i++)
return get_wear_status_str(); // 返回结果字符串
}
+ // 获取佩戴状态
+ std::string DebugOutputViewEventListener::get_battery_percent(void)
+ {
+ std::string result;
+ // 进行文件读取
+ do_custom_fileoperate_service_check_msg(
+ CUSTOM_FILEOPERATE_MSG_TYPE_BATTERY_DATA_READ, nullptr, 0);
+ LOS_Msleep(100); // 等待文件系统准备
+ BATTERY_DATA_T *data = NULL;
+ uint16_t len = 0;
+ battery_get_data_t(&data,&len);
+ if(len == 0)
+ return result;
+
+ for(int i = 0; i < len/sizeof(BATTERY_DATA_T); i++)
+ {
+ std::string timestr;
+ char labelTime[20] = {0};
+
+ if (uapi_get_TIME_STR(data[i].tm, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC)
+ {
+ timestr = "--";
+ }
+ else
+ {
+ timestr = labelTime;
+ }
+
+ std::ostringstream oss;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "data[i].voltage : %f , data[i].percent : %d",data[i].voltage,data[i].percent);
+
+ oss << std::fixed
+ << std::setprecision(3) // 设置为固定小数位,保留两位小数
+ <<"["<<timestr<< "] :\n"
+ << data[i].voltage << " V, "
+ << static_cast<int>(data[i].percent)
+ << "%\n";
+
+ result += oss.str();
+ // result += std::to_string(i*10) + " min , " + std::to_string(data[i].voltage) + "V , "+ std::to_string(data[i].percent) + "%" + "\n";
+ }
+ free(data);
+ return result; // 返回结果字符串
+ }
+
// 获取系统free内存
std::string DebugOutputViewEventListener::get_free_memory()
{
case 15:
str = get_wear_status();
break;
+ case 16:
+ str = get_battery_percent();
+ break;
default:
str = "--";
break;
time(&rawtime);
timeinfo = localtime(&rawtime);
- // CWM_OS_dbgPrintf("cywee_time_sync : year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n",
- // timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,
- // timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
+ CWM_OS_dbgPrintf("cywee_time_sync : year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n",
+ timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,
+ timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
current_year = timeinfo->tm_year+1900;
void cywee_inactivity_mode_change(int mode)
{
- cywee_time_sync();
+ // cywee_time_sync();
switch (mode)
{
//无作用
{\r
if(hrsresult.hr_living == MSG_LIVING_TRUE)\r
{\r
+ cywee_wear_status = 1;\r
if(hrsresult.lastesthrs > 30 && hrsresult.lastesthrs < 220)\r
get_avg_hrs(hrsresult.lastesthrs);\r
- cywee_wear_status = 1;\r
}\r
else\r
{\r
* @Author: penglei 1624952103@qq.com
* @Date: 2024-03-13 15:08:38
* @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-09-06 14:14:16
+ * @LastEditTime: 2024-11-12 18:05:23
* @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c
* @Description:
*
{
#ifdef HRS_ALG_LIB
hx3695_hrs_disable();
+ if(uapi_dev_runtime_get_sleep_monitoring_status() && uapi_dev_runtime_get_hrs_passivity_flag())//处于睡眠监测 且在心率周期检测期间 上报活体佩戴
+ {
+ hx3695_wearstatus_update();
+ uapi_dev_runtime_set_hrs_passivity(0);//清除被动检测runtime
+ }
#endif
}else if(md == HRV_MODE)
{
enable = 0;
wear_mode_state = 0;
}else if (mail == PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST){
- //do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CLOSE_GET_ACC,NULL);
- //PRINT("uapi_dev_runtime_get_sleep_monitoring_status : %d \n",uapi_dev_runtime_get_sleep_monitoring_status());
- //PRINT("uapi_dev_runtime_get_hrs_passivity_flag : %d \n",uapi_dev_runtime_get_hrs_passivity_flag());
- if(uapi_dev_runtime_get_sleep_monitoring_status() && uapi_dev_runtime_get_hrs_passivity_flag())//处于睡眠监测 且在心率周期检测期间 上报活体佩戴
- {
- hx3695_wearstatus_update();
- uapi_dev_runtime_set_hrs_passivity(0);//清除被动检测runtime
- }
cmd = "hrs";
enable = 0;
uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);
cywee_custom_save_wear_data();
break;
- default:
+ case CUSTOM_FILEOPERATE_MSG_TYPE_BATTERY_DATA_READ:
+ battery_get_data();
+ break;
+
+ case CUSTOM_FILEOPERATE_MSG_TYPE_BATTERY_DATA_SAVE:
+ battery_save_data();
+ break;
+
PRINT("Unknown CUSTOM_FILE_OPERATE_MSG cmd 0x%02X \r\n", mail.cmd);
break;
}
#define CUSTOM_FILEOPERATE_MSG_TYPE_AGING_DATA_SAVE 0x10 //存储老化数据
#define CUSTOM_FILEOPERATE_MSG_TYPE_POPUP_WINDOWS_DATA_LIST 0x11 //存储弹窗数据
-#define CUSTOM_FILEOPERATE_MSG_TYPE_WEAR_DATA_READ 0x12 //读取老化数据
-#define CUSTOM_FILEOPERATE_MSG_TYPE_WEAR_DATA_SAVE 0x13 //存储老化数据
+#define CUSTOM_FILEOPERATE_MSG_TYPE_WEAR_DATA_READ 0x12 //读取佩戴数据
+#define CUSTOM_FILEOPERATE_MSG_TYPE_WEAR_DATA_SAVE 0x13 //存储佩戴数据
+
+#define CUSTOM_FILEOPERATE_MSG_TYPE_BATTERY_DATA_READ 0x14 //读取电池数据
+#define CUSTOM_FILEOPERATE_MSG_TYPE_BATTERY_DATA_SAVE 0x15 //存储电池数据
errcode_t uapi_custom_fileoperate_service_init(void);
errcode_t do_custom_fileoperate_service_check_msg(int cmd, void *params, int paramlen);