MTK G/P雙模通話開發概要
暮鼓集 行走集
原作於2010年01月14日, 軟體部培訓稿
1.原始檔
\plutommi\mmi\CallManagement\CommonFiles 資料管理及公共介面 \plutommi\mmi\CallManagement\IncomingCallManagement Incoming Call處理 \plutommi\mmi\CallManagement\OutgoingCallManagement Outgoing Call處理 \plutommi\mmi\CallManagement\PhsCallManagement PHS Call處理 plutommi\Customer\CustResource\PLUTO_MMI\Res_MMI\Res_CallManagement.c 資原始檔
2.參考文件
- MMI_DD_CALLMANAGEMENT.pdf
- Design-Call Management.pdf
3.軟體架構
MTK平臺仍然是一種訊息驅動的架構,在多工的Nulceaus系統之上使用一個Task(MMI)實現UI應用,另一個Task(L4)在MMI與底層服務之間提供統一的訊息介面介面。
GSM通話管理的實現就是MMI通過與L4的訊息互動來完成的。
MMI --- REQUEST_MSG -->L4C MMI <-- RESPONSE_MSG --- L4C MMI <-- INDICATION_MSG ---L4C
在此架構下,我們建立一個名為PHSM的Task,它與MMI之間通過系統內訊息通訊,與PHS模組之間則是通過基於串列埠的AT命令通訊。
PHS
MMI --- REQUEST_MSG --> PHSM
MMI <-- RESPONSE_MSG --- PHSM
MMI <-- INDICATION_MSG --- PHSM
PHSM在PHS應用程式和PHS模組之間架設起一道橋樑。它與XL4處於同一層次,XL4為我們提供了GSM服務的訊息介面,而PHSM提共了PHS服務的訊息介面。
PHS通話管理正是通過MMI與PHSM的訊息互動來實現。
對於UI開發者,你不需要知道PHSM的內部實現,但是必須瞭解PHSM和MMI之間的訊息介面定義,引數及其功能。
4.訊息定義
部分重要的訊息附我的簡略說明,詳細參考MTK文件
1) GSM訊息 (MMI<->L4C)
Outgoing Call相關訊息
MSG_ID_MMI_SS_PARSING_STRING_REQ //撥號請求
MSG_ID_MMI_SS_PARSING_STRING_RSP
MSG_ID_MMI_CC_DIAL_IND // 撥號中指示
MSG_ID_MMI_CC_CALL_CONNECT_IND // 對方接通指示
MSG_ID_MMI_CC_NOTIFY_SS_IND // 補充業務指示
Incoming Call相關訊息
MSG_ID_MMI_CC_CALL_RING_IND // 來電指示
MSG_ID_MMI_CC_CALL_WAIT_IND // 來電指示(呼叫等待)
MSG_ID_MMI_CC_ATA_REQ // 接聽請求
MSG_ID_MMI_CC_ATA_RSP
MSG_ID_MMI_CC_ATH_REQ //拒接請求
MSG_ID_MMI_CC_ATH_RSP
其他訊息
MSG_ID_MMI_CC_CHLD_REQ // 通話中多用途請求 用於Hold, Retrieve, Swap, Hangup
MSG_ID_MMI_CC_CHLD_RSP
MSG_ID_MMI_CC_CALL_RELEASE_IND // 結束通話指示
MSG_ID_MMI_CC_SPEECH_IND
MSG_ID_MMI_CC_INTERNAL_ALERT_IND
MSG_ID_MMI_CC_GET_CALL_LIST_REQ
MSG_ID_MMI_CC_GET_CALL_LIST_RSP
DTMF訊息
MSG_ID_MMI_CC_START_AUTO_DTMF_IND //確認自動傳送DTMF指示
MSG_ID_MMI_CC_START_AUTO_DTMF_REQ
MSG_ID_MMI_CC_START_DTMF_REQ // 傳送DTMF Tone請求
MSG_ID_MMI_CC_START_DTMF_RSP
MSG_ID_MMI_CC_STOP_DTMF_REQ // 停止DTMF Tone
MSG_ID_MMI_CC_STOP_DTMF_RSP
USSD訊息
MSG_ID_MMI_SS_USSD_RSP // 收到USSD回應
MSG_ID_MMI_SS_USSN_IND // 收到USSN指示
MSG_ID_MMI_SS_USSR_IND //收到USSR指示
2) PHS訊息 (MMI<->PHSM)
Outgoing Call相關訊息
MSG_ID_MMI_PHS_PARSING_STRING_REQ //PHS撥號請求
MSG_ID_PHS_MMI_PARSING_STRING_RSP
MSG_ID_PHS_MMI_CALL_CONNECT_IND //PHS接通指示
Incoming Call相關訊息
MSG_ID_MMI_PHS_CALL_RING_IND // PHS來電指示
MSG_ID_MMI_PHS_ATA_REQ // 接聽來電
MSG_ID_MMI_PHS_ATA_RSP
MSG_ID_MMI_PHS_ATH_REQ // 拒接來電
MSG_ID_MMI_PHS_ATH_RSP
Homebox訊息
MSG_ID_PHS_MMI_CLIP_UNSOLICITED_IND // 號碼指示
MSG_ID_PHS_MMI_PINFO_UNSOLICITED_IND
MSG_ID_PHS_MMI_PROUTE_UNSOLICITED_IND
MSG_ID_PHS_MMI_STOP_RING_IND //停止來電提示
其他訊息
MSG_ID_MMI_PHS_CHLD_REQ // 結束通話請求
MSG_ID_MMI_PHS_CHLD_RSP
MSG_ID_PHS_MMI_CALL_RELEASE_IND // 結束通話指示
MSG_ID_PHS_MMI_CALL_DISCONNECT_IND // 通話終止指示
DTMF訊息
MSG_ID_MMI_PHS_START_DTMF_REQ // 傳送DTMF Tone請求
MSG_ID_PHS_MMI_START_DTMF_RSP
MSG_ID_PHS_MMI_START_AUTO_DTMF_IND // 確認自動傳送DTMF指示
MSG_ID_MMI_PHS_START_AUTO_DTMF_REQ
5.狀態
通話管理定義了五種狀態
IDLE OUTGOING INCOMING ACTIVE HOLD
(MTK6217新版本中增加了DISCONNECT狀態的定義)
這些狀態用於兩種實體
1) 系統狀態
系統狀態反映了當前UI狀態,g_CallManagement_cntxt.state_info.CurrentMode記錄了這個狀態。我們通過函式SetCurrentState來設定這個狀態,其他應用程式可以通過GetCurrentState來取得當前的狀態。
2) 某路通話狀態
每一路通話也有自己的狀態,這個狀態記錄在state_info.AllCalls[xx].curr_state。這個狀態主要在通話管理的內部邏輯使用。
PHS和GSM對於狀態的定義是一樣的。
關於系統狀態的遷移請參考MTK文件MMI_DD_CALLMANAGEMENT.pdf中的狀態圖。
6.核心資料結構
typedef struct {
cm_state_struct state_info;
cm_redial_struct redial_info;
cm_alert_struct alert_info;
cm_history_struct history_info;
} cm_context_struct;
static cm_context_struct g_CallManagement_cntxt;
cm_context_struct *cm_p = &g_CallManagement_cntxt;
7.GSM通話UI處理過程
請參考文件MMI_DD_CALLMANAGEMENT.pdf
8.PHS通話UI處理過程
對PHS通話的處理我們參考了GSM的方法,並與GSM使用共同的資料管理與公共介面。
要了解的是為了區分GSM Call ID(值1~7),我們定義PHS Call ID為0x80。
對於諸如ATA,ATH等等的訊息,處理過程與GSM類似,這裡不贅述。