SC7703 健康管理开发

公司项目最近开发一个健康管理的功能。不能透露过多信息,所以只截取了部分的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吧

发布了22 篇原创文章 · 获赞 9 · 访问量 8836

猜你喜欢

转载自blog.csdn.net/ljm_c_bok/article/details/79940795
sc"
sc