};
struct LAST_CHECK_DATA {
- int16_t last_check_sbp_value; // 上次检测收缩压值
- int16_t last_check_dbp_value; // 上次检测舒张压值
- std::string timestamp; // 时间戳 单位s
+ uint64_t timestamp; // 时间戳 单位s
+ uint8_t last_check_sbp_value; // 上次检测收缩压值
+ uint8_t last_check_dbp_value; // 上次检测舒张压值
+
};
-#define BP_CHECK_TIME_MAX_TEST 120 //测量所需时间
+#define BP_CHECK_TIME_MAX_TEST 90 //测量所需时间
#define BP_CHECK_TIME_MAX 30 //测量所需时间
#define BP_ANLYSISI_TIME_MAX 5 //分析所需时间
#define BP_REMIND_TIME_MAX 5 //提醒所需时间
void SetCalibrationFlag(int value);
// 获取当前时间年月日时分字符串
std::string GetCurrentTimeStr();
+ std::string GetCurrentTimeStr(uint64_t timeStamp);
+ //获取当前时间戳
+ uint32_t GetCurrentTime();
+ std::string GetLastCalibrationTime();
// 当前状态管理
void BP_SetState(BPState state);
BPState GetCurrentState();
int GetBPValueCnt(void);
int mapValue(int value);
void mapDataArray(int value);
+ bool IsSameDay(const std::string &timeStr1, const std::string &timeStr2);
+
/* --------------------------------- 最近检测数据 --------------------------------- */
#define BP_LAST_CHECK_FILE_PATH "/user/userdata/bp/bp_last_check.txt"
+ static constexpr const char *BP_JSON_PATH = "/user/userdata/bp/";
bool save_last_check_bp_data(LAST_CHECK_DATA data);
bool load_last_check_bp_data(void);
bool get_last_check_bp_data(LAST_CHECK_DATA &data);
int get_last_check_data_num(void);
const uint8_t max_checkout_num = 30;
std::deque<LAST_CHECK_DATA> lastCheckData; // 存储最近检测数据
+ bool CreateBPFolder();
+ // 存储bin文件
+ bool save_bin_BP(const LAST_CHECK_DATA &data);
+ bool UpdateHealthData(const LAST_CHECK_DATA &data);
/* -------------------------------------------------------------------------- */
std::map<int, std::pair<int, int>> bp_check_value_map; //记录获取的sbp和dbp值
int bp_check_cnt = 0; //记录获取的次数
std::vector<int> bp_check_value_vector; //测量值
+ std::string LastCalibrationTime;
};
} // namespace OHOS
#include "wearable_log.h"
#include <cmsis_os.h>
#include <cmsis_os2.h>
+#include <sys/stat.h>
#include <service/graphic_service.h>
#include "AppViewIDs.h"
return std::string(buffer);
}
+ std::string BPModel::GetCurrentTimeStr(uint64_t timeStamp)
+ {
+
+ if (timeStamp < 0)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to GetCurrentTimeStr");
+ return "----/--/-- \n --/--";
+ }
+
+ // 将时间戳转换为 time_t 类型
+ time_t rawtime = static_cast<time_t>(timeStamp);
+ struct tm *timeinfo = localtime(&rawtime);
+
+ if (timeinfo == NULL)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to convert time");
+ return "----/--/-- \n --/--";
+ }
+
+ // 格式化时间为字符串
+ char buffer[20]; // 格式: YYYY-MM-DD HH:MM
+ std::strftime(buffer, sizeof(buffer), "%Y-%m-%d \n %H:%M", timeinfo);
+
+ return std::string(buffer);
+ }
+ // 获取当前时间戳
+ uint32_t BPModel::GetCurrentTime()
+ {
+ uint32_t time;
+ if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");
+ return 0;
+ }
+ return time;
+ }
+
+ std::string BPModel::GetLastCalibrationTime()
+ {
+ if (LastCalibrationTime.empty())
+ {
+ return " ";
+ }
+ return LastCalibrationTime;
+ }
/////////////////////////状态管理//////////////////////////////////////////
int16_t BPModel::GetCalibrationFlag() { return CalibrationFlag; }
void BPModel::SetCalibrationFlag(int value) { CalibrationFlag = value; }
*/
bp_check_value_map.clear();
bp_check_value_vector.clear();
+ if (bp_check_cnt != 0)
+ bp_check_cnt = 0; // 重置计数
+ if (Time != BP_CHECK_TIME_MAX_TEST)
+ Time = BP_CHECK_TIME_MAX_TEST; // 重置时间120秒
+ load_last_check_bp_data();
BP_StartTimer();
ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 后期 周期被动状态 需要做区别
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
"开启测量");
- // BP_START(); // 底层接口开启血压
+ BP_START(); // 底层接口开启血压
+ custom_dbp = 0;
+ custom_sbp = 0;
- if (bp_check_cnt != 0)
- bp_check_cnt = 0; // 重置计数
- if (Time != BP_CHECK_TIME_MAX_TEST)
- Time = BP_CHECK_TIME_MAX_TEST; // 重置时间120秒
break;
}
: BPSECUNDERCALIBRATIONVIEW,
BPCALIBRATIONMINDVIEW);
}
- // BP_STOP();//停止测量---会关机
+ LastCalibrationTime = BPModel::GetCurrentTimeStr(); // 获取校准完成时的时间
+ BP_STOP();
BP_SetState(BPState::BP_NORMAL);
CalibrationFlag++;
return;
view->UpdateTimeText(data, bp_check_value_vector);
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Time: %d", Time);
- if (Time > 0 && Time < 60) // 一分钟后获取数据
+ if (Time > 0 && Time < 30) // 一分钟后获取数据
{
- LAST_CHECK_DATA newData;
- // BP_GetData(&custom_sbp, &custom_dbp);
- newData.last_check_sbp_value = rand() % (210 - 60) + 60; // 测试数据
- newData.last_check_dbp_value = rand() % (210 - 60) + 60;
- newData.timestamp = BPModel::GetCurrentTimeStr();
- SetBPValueMap(newData.last_check_sbp_value, newData.last_check_dbp_value, bp_check_cnt); // 传入map
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bp_check_cnt: %d ,SBP: %d, DBP: %d", bp_check_cnt, custom_sbp, custom_dbp);
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BPValueMap SBP: %d, DBP: %d", bp_check_value_map[bp_check_cnt].first, bp_check_value_map[bp_check_cnt].second);
- bp_check_cnt++;
+
+ BP_GetData(&custom_sbp, &custom_dbp);
+ if (custom_sbp > 0 && custom_dbp > 0) // 检测到数据
+ {
+ LAST_CHECK_DATA newData;
+ newData.last_check_sbp_value = custom_sbp; // 测试数据
+ newData.last_check_dbp_value = custom_dbp;
+ newData.timestamp = BPModel::GetCurrentTime();
+ save_last_check_bp_data(newData); // 保存数据
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SBP: %d, DBP: %d", custom_sbp, custom_dbp);
+ }
}
break;
}
view->UpdateTimeText(data, bp_check_value_vector);
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Time: %d", Time);
- if (Time > 0 && Time < 60) // 一分钟后获取数据
+ if (Time > 0 && Time < 30) // 一分钟后获取数据
{
- // BP_GetData(&custom_sbp, &custom_dbp);
- // SetBPValueMap(custom_sbp, custom_dbp, bp_check_cnt); // 传入map
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bp_check_cnt: %d ,SBP: %d, DBP: %d", bp_check_cnt, custom_sbp, custom_dbp);
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BPValueMap SBP: %d, DBP: %d", bp_check_value_map[bp_check_cnt].first, bp_check_value_map[bp_check_cnt].second);
- bp_check_cnt++;
+
+ BP_GetData(&custom_sbp, &custom_dbp);
+ if (custom_sbp > 0 && custom_dbp > 0) // 检测到数据
+ {
+ LAST_CHECK_DATA newData;
+ newData.last_check_sbp_value = custom_sbp; // 测试数据
+ newData.last_check_dbp_value = custom_dbp;
+ newData.timestamp = BPModel::GetCurrentTime();
+ save_last_check_bp_data(newData); // 保存数据
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SBP: %d, DBP: %d", custom_sbp, custom_dbp);
+ }
}
break;
view->UpdateTimeText(data, bp_check_value_vector);
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Time: %d", Time);
- if (Time > 0 && Time < 60) // 一分钟后获取数据
+ if (Time > 0 && Time < 30) // 一分钟后获取数据
{
- // BP_GetData(&custom_sbp, &custom_dbp);
- // SetBPValueMap(custom_sbp, custom_dbp, bp_check_cnt); // 传入map
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bp_check_cnt: %d ,SBP: %d, DBP: %d", bp_check_cnt, custom_sbp, custom_dbp);
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BPValueMap SBP: %d, DBP: %d", bp_check_value_map[bp_check_cnt].first, bp_check_value_map[bp_check_cnt].second);
- bp_check_cnt++;
+ BP_GetData(&custom_sbp, &custom_dbp);
+ if (custom_sbp > 0 && custom_dbp > 0) // 检测到数据
+ {
+ LAST_CHECK_DATA newData;
+ newData.last_check_sbp_value = custom_sbp; // 测试数据
+ newData.last_check_dbp_value = custom_dbp;
+ newData.timestamp = BPModel::GetCurrentTime();
+ save_last_check_bp_data(newData); // 保存数据
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SBP: %d, DBP: %d", custom_sbp, custom_dbp);
+ }
}
-
break;
}
case BPState::ECG_MEASURE:
/* ----------------------------- 3.将毫秒转换为系统时钟节拍数
* ---------------------------- */
- int tick = osMs2Tick(interval);
-
/* --------------------------------- 4.启动定时器
* -------------------------------- */
- osStatus_t ret = osTimerStart(g_timer, tick);
+ osStatus_t ret = osTimerStart(g_timer, 1000);
/* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为
* nullptr -------------------- */
if (ret != osOK)
void BPModel::BP_STOP(void)
{
#ifdef ENABLE_BN02
-// bp_stop();
+ bp_stop();
#endif
}
void BPModel::BP_GetData(int *sbp, int *dbp)
bp_check_value_vector.push_back(mappedValue);
}
+
+ /*
+ 1.存储到BP.bin,存储前先判断文件夹是否存在
+ 2.每次测量成功存储一次data,追加ab+
+ 3.开机初始化读取文件,赋值到DBP,SBP
+ 4.每次更新,更新数组
+ 5.更新完毕,存储到文件
+
+ */
// 保存上次检测数据
bool BPModel::save_last_check_bp_data(LAST_CHECK_DATA data)
{
std::ofstream outFile(BP_LAST_CHECK_FILE_PATH, std::ios::trunc);
if (!outFile)
{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Open file failed! Path: %s, Error: %s",
+ BP_LAST_CHECK_FILE_PATH,
+ strerror(errno));
return false; // 文件打开失败
}
return lastCheckData.size();
}
+ bool BPModel::UpdateHealthData(const LAST_CHECK_DATA &data)
+ {
+
+ return true;
+ }
+ // 存储bin文件
+ bool BPModel::save_bin_BP(const LAST_CHECK_DATA &data)
+ {
+ return true;
+ }
+ /*创建文件夹*/
+ bool BPModel::CreateBPFolder()
+ {
+ return true;
+ }
+
+
+
} // namespace OHOS