T107平台的clock功能制作
T107平台的clock功能制作
目录
一、功能说明
二、 初始化Alarm clock功能界面
1. 新增宏控
2. 判断当前是否存在闹钟
三、新建一个Alarm
1. 新建一个Alarm需要的流程如下
2. 初始化闹钟数据表的所有参数
3. 设置闹钟响铃时间
4. 设置的闹钟是否保存
四、Alarm的options功能
1. Change Time功能
2. Schedule功能
3. Label功能
4. Sound功能
5. Snooze功能
6. Delete Alarm功能
四、闹钟响铃界面
1. 需求响铃界面
2. 最终实现界面
五、最终实现效果
六、 个人总结
一、功能说明
在修改之前,Alarm clock的功能是只存在3个可编辑的闹钟项,无法实现删除和添加新的Alarm clock;所以在实现闹钟界面的时候,先是判断当前是否存在闹钟项,若存在,则按照存在的数量显示其闹钟数量,并且存在左键功能,若不存在,则显示对应的提示语,左键无功能。
功能入口(新手必看):
1.待机窗口 文件 mainapp.c,函数 IdleWin_HandleMsg;
2.菜单窗口 文件 mainmenu_win.c,窗口数据表 MAINMENU_TITLE_ICON_WIN_TAB;
3.工具入口 文件 mainmenu_win.c,窗口数据表 MAINMENU_ICON_TOOLS_WIN_TAB;
4.闹钟时钟入口 文件 mmialarm.c,窗口数据表 CLOCK_MAINWIN_TAB;
5.Alarm初始化窗口入口 文件 mmialarm.c,窗口数据表 HandleClockMainWinMsg;
流程图如下:
st=>start: 开始
op=>operation: 初始化Alarm clock功能界面
op1=>operation: 新建一个alarm
op2=>operation: 进入设置响铃时间界面
op3=>operation: 返回Alarm主界面后选中新建的闹钟,
左键(options)可设置闹钟的响铃频率铃声等
op4=>operation: 闹钟响铃界面
e=>end: 结束框
st->op->op2->op3->op4->e
二、初始化Alarm clock功能界面
在初始化闹钟界面前,需要使用宏控将所修改的代码统一包含进去,防止后续功能不需要,可以快速关闭定制功能。
1. 新增宏控
宏控定义位置在 UI.h 文件中,代码如下
//闹钟功能中的闹钟项(Alarm)
#define HX_MMI_MENU_CLOCK_ALARM
2. 判断当前是否存在闹钟
在结构体MMIACC_SMART_EVENT_CONTENT_T中添加闹钟是否有效标志位,通过该标志位,能够进行增删闹钟

以下代码便是根据标志位is_valid来判断当前是否存在闹钟
MMIAPIALM_FormInteEventInfo(event_id,&s_current_event_info.event);//通过当前的事件id获取完整的事件信息
if(s_current_event_info.event.event_content_info.is_valid)
{
is_exist_list = TRUE;//存在闹钟
AppendTwoLineListItem( current_ctrl_id,
TXT_NULL,
s_alarm_mode_text[s_current_event_info.event.event_fast_info.fre_mode],
event_id,
i,
FALSE );
}
若是不存在闹钟,则显示的添加第一个闹钟的提示语

若是存在闹钟,则显示的第一项改为Add alarm,后面的显示闹钟项

该部分是根据获取的is_exist_list标志位进行判断是否存在闹钟

那么闹钟项的初始化就是使用的list控件进行后去数据然后显示
List风格如下

初始化闹钟代码比较复杂的一部分是函数 AppendTwoLineListItem,该函数是初始化闹钟数据信息,并判断显示当前闹钟的名字频率和是否打开信息等。
三、新建一个Alarm
1. 新建一个Alarm需要的流程如下
① 初始化闹钟数据表的所有参数;
② 设置闹钟响铃时间;
③ 设置的闹钟是否保存。
2. 初始化闹钟数据表的所有参数
初始化闹钟的数据需要新增一个函数,初始化数据前需要获取当前未使用的内存id;
获取未使用的闹钟事件id代码:

使用获取到的闹钟事件id,将新建的闹钟事件初始化:

需要注意的是,初始化闹钟的时候,需要获取当前系统的时间,并将时间显示在新建闹钟窗口的初始化数据上 HandleSetAlarmFiguresWinMsg 在该回调函数中,需要在 MSG_FULL_PAINT 画出获取的初始化时间信息,

3.设置闹钟响铃时间
该回调函数的数字调节是根据case MSG_APP_UP 和case MSG_APP_DOWN ;
并且数字的调节是根据人们使用的舒适度,实现了长按数字循环滚动的效果。
此处有两种思路:
第一种是平台自带的case MSG_KEYREPEAT_UP 和case MSG_KEYREPEAT_DOWN ;
第二种是设置一个触发长按的定时器,能够在长按的时候实现数字的快速修改,实现是通过case MSG_KEYLONG_UP 和case MSG_KEYUP_UP 外加定时器触发 case MSG_TIMER 来调节数字,但是可能会使按键松开时未识别到。
代码如下:

按键按下后执行的函数为:

4.设置的闹钟是否保存
设置好响铃的时间后,按下确定键保存该闹钟,就完成了新建一个闹钟的功能。
若是按下的按键是右键(退出),那么刚刚设置的闹钟就被取消新建。
四、Alarm的options功能
关于options功能,需求的功能如下:

实际做出的效果如下(不同的地方已经过客户同意后修改):

该页面实现方式是使用LISTBOX 控件,首先就是创建一个list风格

根据创建的list风格,新增函数增加初始化options列表选项AlarmOptionsListItem
此函数功能是生成Alarm的options选项,代码如下:

该页面的回调函数为 HandleAlarmOptonsWinMsg,在打开窗口和刷新窗口的case中,对选项进行生成和刷新,代码如下:

每个选项都要有对应的功能,该部分代码如下:

1. Change Time功能

该部分代码的实现思路,是在回调函数中,画出其对应的数字和文字,并且在回调函输中能够根据上下左右键进行修改当前的响铃时间信息,实现方式与新建闹钟功能类似,是通过画背景和控件的方式输出相应的需求页面,与新建闹钟的区别是,需要修改时间后才能够保存。
2. Schedule功能

在Schedule功能的页面,选项的功能是属于响铃的时间表,若是选中Daily,那么所有选项将全部选中,表示为每天响铃,若是全部未选中,且闹钟处于开启状态,那么该页面的无实际功能,闹钟的响铃为距离下一次最近的时间。
3. Label功能

Label 意思是标签,就是Alarm的一个标识,是闹钟的名字,该功能是使用EDIT_TEXT控件来获取键盘输入的信息,按下保存后能够保存输入的字符信息,并将闹钟名字改为当前保存的字符信息。
4. Sound功能

Sound的意思是声音,那么就是Alarm响铃时的声音信息,在此功能中默认存在的铃声信息数量是10个,实现的方式是通过list控件生成列表项。
5.Snooze功能

此功能是对闹钟时间是否打开进行显示的标志位,若是处于打开的状态在该项的右方将显示On,反之显示Off,按键的功能是当闹钟处于On状态时,按键的功能为关闭闹钟,反之,则打开闹钟。
6.Delete Alarm功能
该功能是获取当前闹钟项列表项,再通过对闹钟事件的信息进行清空,最后将修改后的信息写入nv中,实现对闹钟的删除。

四、闹钟响铃界面
1. 需求响铃界面

闹钟响铃界面的原代码实现方式,是在事件到达其设置值的时候,通过弹窗的方式实现进入闹钟页面并响铃;新代码的实现方式是新建窗口,通过画红色背景、画图片和画字的操作,实现该页面需求。
该部分代码是将闹钟弹窗改为窗口

2.最终实现界面

该窗口,通过画红色背景、画图片和画字的操作,实现此页面需求
实现代码如下:
第一部分代码是画背景并将页面的softkey修改为SNOOZE和Stop;
第二部分代码是将闹钟的图片画上去;
第三部分代码是显示此闹钟的响铃时间和闹钟名字。



五、最终实现效果
闹钟界面初始化
![]() |
![]() |
|---|---|
| 不存在闹钟时 | 存在闹钟时 |
闹钟的新建和菜单
![]() |
![]() |
|---|---|
| 新建闹钟效果 | 菜单效果 |
闹钟的options功能
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|
| 改变闹钟时间 | 闹钟重复时间 | 闹钟名字 | 闹钟铃声 |
闹钟响铃界面
- SNOOZE功能是等待五分钟后再次提醒
![img]()
演示效果视频路径:
\\192.168.70.20\Project\RTOS团队\考核\朱景\2023.1\闹钟.mp4
原代码闹钟功能
![]() |
![]() |
|---|---|
| 闹钟界面 | 闹钟编辑界面 |
六、个人总结
我是对原闹钟部分代码的解析后,将闹钟的框架保留,修改其显示在功能机屏幕上的显示效果,大部分需求的代码都需要进行改动,该功能最终实现效果与客户需求类似;闹钟的响铃部分实现的步骤是套用原代码的触发响铃方式,将弹窗修改窗口后,实现对应的页面效果。
这次的功能开发,使我对展讯的很多控件更加熟悉,对代码的整理和功能的实现有了更多的想法,使我受益匪浅。












浙公网安备 33010602011771号