公司项目最近开发一个健康管理的功能。不能透露过多信息,所以只截取了部分的UI界面。在7703上实现这个功能。
一、需求概述
1、吃药提醒:
吃药模式(口服。注射),药物名称,时间,用量、重复、铃声
2、健康数据:
1)血压数据 :高压、低压、心率、时间
2)血糖数据 :浓度、条件(空腹。早餐前。午饭前、、、),时间
3、测量提醒
测量时间设置
二、初步需求分析:
1、吃药提醒:一种定时提醒、类似于闹钟、所以可以向系统注册一个闹钟服务。
2、健康数据:由于用户需要对记录的数据增删改查,所以将数据保存在一条链表里,然后统一写入到文件内。所以用户增删改查之后只要更新这个记录文件就可以了
3、测量提醒:同样类似于闹钟服务,向系统注册一个闹钟服务
三、功能实现
1)吃药提醒:在function:MMIALM_Init,注册alarm服务MMIALMSVC_RegService
一共五提闹钟时间,通过list index来映射对应的闹钟服务ID,编辑后直接ModifyEvent,修改对应的闹钟服务,这里我新增加了闹钟类型SMART_EVENT_DRUG_REMINDER,注意要在代码里增加这个类型,要不然会无法注册这个闹钟。编辑界面的需求可以类似参照Alarm写,具体不做过多的赘述。
这里值得一提的是repeat模式。
LOCAL void MMI_HelathAideSetMode(uint16 cur_index)
{
uint8 s_weeks_selected[ALM_MODE_WEEK_NUM] = {MASK_B0, MASK_B1, MASK_B2, MASK_B3, MASK_B4, MASK_B5, MASK_B6};
if((s_current_event_info.event.event_fast_info.fre >> cur_index) & 0x1)
{
s_current_event_info.event.event_fast_info.fre &= (~(1 << cur_index));
}else
{
s_current_event_info.event.event_fast_info.fre |= (s_weeks_selected[cur_index] & 0xFF);
}
}
用一个uint8数据的7位来保存选中的一个星期的谋几天
2)健康数据
①初始化健康数据file
②读取文件,将读取到的数据保存在链表
s_file_handle = MMIAPIFMM_CreateFile(pressure_full_path_name, SFS_MODE_READ|SFS_MODE_OPEN_EXISTING, NULL, NULL);
if(SFS_INVALID_HANDLE != s_file_handle)
{ //打开文件成功,开始读取文件
while(1)
{
node_data = (MMI_HELATH_AIDE_LOGNNDATA_PRESSURE *)malloc(sizeof(MMI_HELATH_AIDE_LOGNNDATA_PRESSURE));
if(PNULL != node_data)
{
memset(node_data, 0, sizeof(MMI_HELATH_AIDE_LOGNNDATA_PRESSURE));
file_ret = MMIAPIFMM_ReadFile(
s_file_handle,
(void *)node_data,
sizeof(MMI_HELATH_AIDE_LOGNNDATA_PRESSURE),
&read_size,
NULL
);
}
if((SFS_ERROR_NONE != file_ret) || (read_size <= 0)) //读取失败
{
//SCI_Free(node_data);
//MMIPUB_OpenAlertWarningWin(TXT_DRUG_READ_FILE_ERROR);
break;
}
//分批次读取,每次读一个数据块,然后插入到链表中,不过这样的读取速度比较慢,在记录文件庞大的时候会变得缓慢
MMIHEALTH_InsertNode(s_pressure_list, node_data);
pressure_loging_num ++;
}
MMIAPIFMM_CloseFile(file_handle);
}
③修改文件
通过list空间的index来偏移到链表对应的节点,得到当前编辑的数据,然后进行编辑
编辑完成之后在退出时重新写入文件
temp = s_pressure_list->next;
for(; erg < index; erg ++)
{
temp = temp->next;
if((PNULL == temp) && (erg != index))
return PNULL;
}
return temp;
在文件读写时,经常出现两个错误
1、SFS_ERROR_INVALID_PARAM
这个错误的原因是在create file的时候传递了错误的参数,例如,你要打开一个文件用来读,在MMIAPIFMM_CreateFile传入的参数却是SFS_MODE_WRITE。还有SFS_MODE_OPEN_EXISTING这个参数,如果是一个新的文件,请传SFS_MODE_CREATE_NEW,否则在create file时会返回error code:SFS_ERROR_INVALID_PARAM
2、SFS_ERROR_ACCESS
这个错误的原因是因为文件还没有close。切记在文件操作、malloc内存,一定要有始有终。文件open要close,memory malloc后要free。
同一个文件可以open不止一次,每次返回的句柄是不一样的,也就是说加入你open了多次,close一次句柄,接着执行delete操作,会返回error code 6。。。。,文件被占用。还是每次open之前都执行以下close吧