|
① 當(dāng)是短信息時(shí),就調(diào)用OSSemPost(Sem_Any _SMTask)來(lái)喚醒短消息任務(wù); 、 如果是電話,就響鈴,同時(shí)調(diào)用OSMboxPost(Mbox_Any_UI,Msg_Any_UI)來(lái)喚醒UI任務(wù)。這時(shí)Msg_Any_UI[0]=任務(wù)號(hào)2,從Msg_Any_UI[1]開始存的是來(lái)電時(shí)間和電話號(hào)碼,然后調(diào)用OSSemPend(Sem_Int_Ring,RING_RECV_TIMEOUT,&err),來(lái)延時(shí)響鈴一段時(shí)間。
如果在這段時(shí)間內(nèi)沒有接電話,那么必然會(huì)超時(shí),于是就清除鈴聲中斷,同時(shí)調(diào)用OSMboxPost(Mbox_Any_UI,Msg_Any_UI)來(lái)喚醒UI任務(wù),這時(shí)Msg_Any_UI[0]=任務(wù)號(hào)2,Msg_Any_UI[1]=0xff表示鈴聲結(jié)束。UI任務(wù)把它當(dāng)作未接來(lái)電處理。
如果在這段時(shí)間內(nèi)接電話,就必然喚醒摘/掛機(jī)任務(wù)。如果從響鈴到對(duì)摘/掛機(jī)任務(wù)處理完畢所需要的總時(shí)間還沒有到RING_RECV_TIMEOUT,那么,當(dāng)時(shí)間到了,UI任務(wù)也會(huì)收到鈴聲結(jié)束的消息;但此時(shí),UI任務(wù)不對(duì)它做任何處理。
響鈴任務(wù)如何區(qū)別是正常的電話還是信息中心的來(lái)電信息呢?其實(shí)很簡(jiǎn)單。信息中心也是一個(gè)終端,是由一個(gè)特定的號(hào)碼來(lái)確定的。就像用不同的電話號(hào)碼來(lái)區(qū)別不同的用戶一樣。這樣響鈴任務(wù)就可以根據(jù)電話線上下傳的號(hào)碼,來(lái)確定是哪種情況了。
。3)鍵盤任務(wù) 有按鍵按下時(shí),產(chǎn)生一中斷,在中斷服務(wù)子程序中調(diào)用OSSemPost(Sem_Int_Keyboard)來(lái)喚醒鍵盤任務(wù),同時(shí)清除中斷標(biāo)志。鍵盤任務(wù)調(diào)用OSSemPend(Sem_Int_Keyboard,0,&err)來(lái)獲得信號(hào)量。獲得信號(hào)量后,鍵盤任務(wù)將調(diào)用OSMboxPost(Mbox_Any_UI,Msg_Any_UI)喚醒UI任務(wù)。 Msg_Any_UI[0]為任務(wù)號(hào)3, Msg_Any_UI[1]為鍵值。
。4)短消息任務(wù) 該任務(wù)調(diào)用OSSemPend(Sem_Any_SMTask,0,&err)獲得信號(hào)量。當(dāng)獲得信號(hào)量后,通過標(biāo)志位判別是準(zhǔn)備上傳數(shù)據(jù)還是下傳數(shù)據(jù)。
、 下傳數(shù)據(jù)時(shí),將下傳的數(shù)據(jù)放在recv_buf[]中,然后調(diào)用OSMboxPost(Mbox_Any_UI,Msg_Any_UI)喚醒UI任務(wù)。Msg_Any_UI [0]=任務(wù)號(hào)4,從Msg_Any_UI [1]開始存的是從recv_buf[]中篩選過的數(shù)據(jù)。這是在連上后從信息中心下載信息的情況,其中Msg_Any_UI [1]存的是信息的種類號(hào),種類號(hào)都是大于0x80H小于0xFFH的;沒有連上信息中心或者是連上之后完成任務(wù)。這時(shí)recv_buf[1]存的就是0xff;如果剛剛連上,就在recv_buf[1]存0x01。 ② 如果用戶需要發(fā)送短消息任務(wù),先將信息存在Msg_send_buf[]中,然后UI任務(wù)調(diào)用OSSemPost(Sem_Any_SMTask),將該任務(wù)激活。該任務(wù)提取存在Msg_send_buf[]中的信息后,包裝后保存在send_buf[],然后將其發(fā)出去。
(5)用戶界面任務(wù) UI任務(wù)一直在等待消息。當(dāng)它被激活時(shí),根據(jù)存在Msg_Any_UI[255]中的不同數(shù)據(jù)進(jìn)行不同的處理。詳述見“3.用戶界面任務(wù)詳述”。
。6)時(shí)鐘任務(wù) 單片機(jī)每10ms產(chǎn)生一個(gè)中斷,在這個(gè)中斷服務(wù)子程序中,對(duì)clock_count減1。當(dāng)減為0時(shí),就調(diào)用OSSemPost(Sem_Int_ClockTask)喚醒時(shí)鐘任務(wù);同時(shí),clock_count重新回到100。這樣每1s,就會(huì)調(diào)用一次OSSemPost(Sem_Int_ClockTask)。時(shí)鐘任務(wù)調(diào)用OSSemPend(Sem_Int_ClockTask,0,&err)獲得信號(hào)量。當(dāng)獲得信號(hào)量時(shí),就更新時(shí)間。如果在23:59:59的時(shí)候更新時(shí)間,那就要同時(shí)更新日期和星期。如果此時(shí)UI任務(wù)處于待機(jī)狀態(tài),時(shí)鐘任務(wù)就調(diào)用OSMboxPost(Mbox_Any_UI,Msg_Any_UI)來(lái)喚醒UI任務(wù)。Msg_Any_UI[0]為任務(wù)號(hào)0x06。時(shí)鐘任務(wù)只是負(fù)責(zé)更新時(shí)間,顯示時(shí)間是由UI任務(wù)在待機(jī)的時(shí)候來(lái)完成的。
3 用戶界面任務(wù)詳述
在所有這些任務(wù)中,用戶界面任務(wù)做的工作相對(duì)比較煩瑣。首先,根據(jù)放在Msg_Any_UI[255]中的第一個(gè)字節(jié),判斷是什么任務(wù)激活了本任務(wù)。
、 如果是摘/掛機(jī)任務(wù)激活的,再判斷第二個(gè)字節(jié)的值,根據(jù)值的不同知道是掛機(jī)還是摘機(jī)。如果是掛機(jī),就在液晶上顯示待機(jī)畫面。如果是摘機(jī),就在液晶上顯示打電話圖標(biāo)和有關(guān)的字樣,并等待鍵盤任務(wù)送來(lái)的數(shù)字鍵,將其顯示出來(lái)。(只有主動(dòng)向外打電話才顯示數(shù)字鍵,在接電話按數(shù)字鍵轉(zhuǎn)接時(shí)不顯示數(shù)字鍵。) 、 如果是振鈴任務(wù)激活的,就將Msg_Any_UI[255]中接下來(lái)的來(lái)電號(hào)碼、時(shí)間和來(lái)電圖標(biāo)顯示在液晶上。 、 如果是鍵盤任務(wù)激活的,就根據(jù)3號(hào)任務(wù)放在Msg_Any_UI[255]中的鍵值和當(dāng)前的工作模式做不同的處理。 如果是在摘機(jī)模式下,就只是響應(yīng)數(shù)字鍵和#*鍵,并每按一個(gè)鍵就通過5號(hào)任務(wù)號(hào)碼發(fā)出去。
如果是在掛機(jī)模式下,那么,就可以響應(yīng)數(shù)字鍵和有關(guān)操作菜單的鍵(包括進(jìn)入各個(gè)子菜單的快捷鍵、上下鍵、左右鍵、返回上級(jí)菜單鍵、快速返回待機(jī)畫面的鍵、確定鍵、刪除鍵、拼音輸入法/字母輸入法/數(shù)字輸入法/短語(yǔ)輸入法切換鍵)。各個(gè)菜單是不同的狀態(tài),通過鍵值和原來(lái)的狀態(tài)可以知道現(xiàn)在該進(jìn)入什么狀態(tài)。然后根據(jù)新得到的狀態(tài),進(jìn)行相應(yīng)的液晶刷新和完成相應(yīng)的功能。比如添加、刪除、查找電話簿;添加、刪除、查找通話記錄;編輯短消息并發(fā)送出去,刪除草稿箱里的短消息;寫記事本,設(shè)置鬧鐘、時(shí)間、日期,設(shè)置信箱的密碼,設(shè)置信息中心的號(hào)碼等。 如果是在與信息中心的連接模式下,那么就可以響應(yīng)上下鍵,確定鍵(進(jìn)入下級(jí)菜單),返回上一級(jí)菜單,通過選擇返回這個(gè)選項(xiàng)來(lái)實(shí)現(xiàn)。 、苋绻嵌滔⑷蝿(wù)激活的,就根據(jù)Msg_ Any_UI[255]中的命令碼,來(lái)確定該信息的模塊種類是信息下載管理模塊、信息上傳管理模塊、信息詢問管理模塊,或者是屏幕信息輸出管理模塊,然后,再根據(jù)Msg_Any_UI[255]中接下來(lái)的信息做相應(yīng)的處理。 、 如果是時(shí)鐘任務(wù)激活的,UI任務(wù)就刷新界面上的時(shí)間、日期和星期這些信息。
4 調(diào)試環(huán)境與調(diào)試成果
此程序用EPSON公司的S1C88 C-Compiler編譯器編譯,用EPSON公司的ICE88UR 的E0C88系列在線仿真器進(jìn)行仿真。在仿真器下仿真完畢后,再脫機(jī)運(yùn)行。試驗(yàn)結(jié)果令人滿意,達(dá)到了預(yù)期的效果。
|