在挂机的时候,如果先前是在响铃的时候摘机的,那么UI任务把它当做已接来电处理;如果不是在响铃的时候摘机的,那么在挂机的时候把它当做已拨电话处理。
(2)振铃任务
当铃声来到时,就产生中断。在这个中断中,调用OSSEMPOST(SEM_INT_RING)来唤醒振铃任务。
响铃任务调用OSSEMPEND(SEM_INT_RING,0,&ERR)来获得信号量。获得信号量后,就把下传的号码接收下来;根据号码就可以知道是短信息,还是普通电话。
① 当是短信息时,就调用OSSEMPOST(SEM_ANY _SMTASK)来唤醒短消息任务;
② 如果是电话,就响铃,同时调用OSMBOXPOST(MBOX_ANY_UI,MSG_ANY_UI)来唤醒UI任务。这时MSG_ANY_UI[0]=任务号2,从MSG_ANY_UI[1]开始存的是来电时间和电话号码,然后调用OSSEMPEND(SEM_INT_RING,RING_RECV_TIMEOUT,&ERR),来延时响铃一段时间。
如果在这段时间内没有接电话,那么必然会超时,于是就清除铃声中断,同时调用OSMBOXPOST(MBOX_ANY_UI,MSG_ANY_UI)来唤醒UI任务,这时MSG_ANY_UI[0]=任务号2,MSG_ANY_UI[1]=0XFF表示铃声结束。UI任务把它当作未接来电处理。
如果在这段时间内接电话,就必然唤醒摘/挂机任务。如果从响铃到对摘/挂机任务处理完毕所需要的总时间还没有到RING_RECV_TIMEOUT,那么,当时间到了,UI任务也会收到铃声结束的消息;但此时,UI任务不对它做任何处理。
响铃任务如何区别是正常的电话还是信息中心的来电信息呢?其实很简单。信息中心也是一个终端,是由一个特定的号码来确定的。就像用不同的电话号码来区别不同的用户一样。这样响铃任务就可以根据电话线上下传的号码,来确定是哪种情况了。
(3)键盘任务
有按键按下时,产生一中断,在中断服务子程序中调用OSSEMPOST(SEM_INT_KEYBOARD)来唤醒键盘任务,同时清除中断标志。键盘任务调用OSSEMPEND(SEM_INT_KEYBOARD,0,&ERR)来获得信号量。获得信号量后,键盘任务将调用OSMBOXPOST(MBOX_ANY_UI,MSG_ANY_UI)唤醒UI任务。
MSG_ANY_UI[0]为任务号3, MSG_ANY_UI[1]为键值。
(4)短消息任务
该任务调用OSSEMPEND(SEM_ANY_SMTASK,0,&ERR)获得信号量。当获得信号量后,通过标志位判别是准备上传数据还是下传数据。
① 下传数据时,将下传的数据放在RECV_BUF[]中,然后调用OSMBOXPOST(MBOX_ANY_UI,MSG_ANY_UI)唤醒UI任务。MSG_ANY_UI [0]=任务号4,从MSG_ANY_UI [1]开始存的是从RECV_BUF[]中筛选过的数据。这是在连上后从信息中心下载信息的情况,其中MSG_ANY_UI [1]存的是信息的种类号,种类号都是大于0X80H小于0XFFH的;没有连上信息中心或者是连上之后完成任务。这时RECV_BUF[1]存的就是0XFF;如果刚刚连上,就在RECV_BUF[1]存0X01。
② 如果用户需要发送短消息任务,先将信息存在MSG_SEND_BUF[]中,然后UI任务调用OSSEMPOST(SEM_ANY_SMTASK),将该任务激活。该任务提取存在MSG_SEND_BUF[]中的信息后,包装后保存在SEND_BUF[],然后将其发出去。
(5)用户界面任务
UI任务一直在等待消息。当它被激活时,根据存在MSG_ANY_UI[255]中的不同数据进行不同的处理。详述见“3.用户界面任务详述”。
