📄 tskdvs.c
字号:
#include <p18cxxx.h>
#include "includes.h"
#include "device.h"
#include "file.h"
#include "f_callrecord.h"
#include "funcfontlib.h"
#include "funclcd.h"
#include "event.h"
#include "hardware.h"
#define MAX_NUMBER_LENGTH 24
#define DVS_10_S_ID 03
#define DVS_7_S_ID 04
#define DVS_20_S_ID 05
#define DVS_ONHOOK 0x20
#define DVS_DIALOUT 0x21
#define DVS_CONNECT 0x22
#define DVS_BUSY 0x23
#define DVS_REJECT 0x24
#define CALL_IN 0
#define CALL_OUT 1
#define SC_IDLE 0
#define SC_WAITCROSS 1
#define SC_RECEIVE 2
#define DVS_CALL_DURATION 0x01 //timer ID
extern OS_MEM *pMemSml;
extern OS_MEM *pMemLge;
extern rom INT8U fixword4[][8];
extern INT8U rom PIC_DEBUG;
extern INT8U rom PIC_NETWORK;
extern void Func_EnableChargeDisplay(void);
extern void Func_DisableChargeDisplay(void);
extern INT8U Func_DisplaySysTime(INT8U oddeven);
INT16U rom * PB_SearchMatchItem(INT8U rom *pnum, INT8U len);
extern void Func_GetSysTime(NM_TIME * ptrTime);
void Func_EnterOffHookStt(void);
void Func_ExitOffHookStt(void);
INT8U Func_OffHookProc(void);
INT8U Func_DialingProc(void);
void Func_Talking(void);
void Func_CallFinish(void);
void Func_Busy(void);
INT8U Func_EnterCallInStt(void);
void Func_ExitCallInStt(void);
void Monitor_Super_Command(INT8U key);
INT8U get_inputnum(void);
void call_process(INT8U mode);
#pragma romdata EXTRAM
INT8U rom NumBuf[MAX_NUMBER_LENGTH]; //to store current call number key input
INT8U rom ptrNumBuf;
INT8U rom LastNumBuf[MAX_NUMBER_LENGTH]; //to store last time call number key input
INT8U rom ptrLastNumBuf;
INT8U rom CallInNum[MAX_NUMBER_LENGTH]; //to store current call in number
INT8U rom ptrCallInNum;
INT8U rom VoiceCh; //to store corrent channel, may be HANDSET or HANDFREE
INT8U rom MainWndType; //
NM_TIME CurCallStartTime; //for incomming call, it's the time begin ring, for a dial out call, it's the time
//to dial out
INT8U rom IdleNumBuf[24];
INT8U rom IdleNumBufPTR;
INT8U rom UnreadUnacceptCall;
#pragma romdata CCODE
INT8U rom SuperCmd[][6]={"#","06#","07*","08*","0001*","0002#","0003#","1113*",0xff};
INT16U rom NoUim[] = {0x8bf7,0x63d2,0x5165,0x0055,0x0049,0x004d,0x5361,0x0000};
#pragma code MYCODE
void tskDVS(void * data){
void rom * pMsg;
INT8U err,i;
INT8U oddeven;
INT8U rom * ptrTemp;
ptrLastNumBuf = 0;
MainWndType = WND_CALL;
VoiceCh = HANDSET;
//Display LOGO picture for 2 seconds and open handfree channel for CDMA module startup tone
Func_SetVoiceCh(VOX_HANDFREE);
OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_LOGO);
UnreadUnacceptCall = 0;
IdleNumBufPTR = 0;
//add for network function
pMsg = OSMemGet(pMemSml, &err);
if(err == OS_NO_ERR){
((MSG_HEAD *)pMsg)->Msg_ID = MSG_PPP_SETNUMBER;
((MSG_HEAD *)pMsg)->Attached = FALSE;
((MSG_HEAD *)pMsg)->pmemME = pMemSml;
((MSG_HEAD *)pMsg)->LenOfBody = 4;
((MSG_DCONREQ *)pMsg)->Num[0] = '#';
((MSG_DCONREQ *)pMsg)->Num[1] = '7';
((MSG_DCONREQ *)pMsg)->Num[2] = '7';
((MSG_DCONREQ *)pMsg)->Num[3] = '7';
OSQPost(peventPPPHandler, pMsg);
}
//end of added code
for(;;){
pMsg = OSQPend(peventDVS, 0, &err);
if(err == OS_NO_ERR){
if((INT24U)pMsg >= PTR_MAX){
switch ((INT24U)pMsg){
case MSG_WIC_INITOK:
Do_Clear_Screen(2,0,7,127);
MainWndType = WND_IDLE;
sysdev_open(DEV_ID_KBD);
OSQPost(peventMenu, (OS_EVENT *)MSG_MENU_CANCEL);
Func_SetVoiceCh(VOX_IDLE);
break;
case MSG_WIC_NOUIM:
Do_Clear_Screen(0,0,7,127);
MainWndType = WND_CALL;
OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_NOUIM);//app_printf(NoUim,7,3,16);
Func_SetVoiceCh(VOX_IDLE);
break;
case MSG_HOOK_OFF:
VoiceCh = HANDSET;
IdleNumBufPTR = 0;
if(get_inputnum() != DVS_ONHOOK){
call_process(CALL_OUT);
}
break;
case MSG_WICRESP_RING:
if(IdleNumBufPTR != 0){
IdleNumBufPTR = 0;
}
call_process(CALL_IN);
break;
case MSG_MENU_EXIT:
MainWndType = WND_IDLE;
IdleNumBufPTR = 0;
//NO "break" here
case MSG_SECOND_TICK:
if(MainWndType != WND_IDLE) break;
if(oddeven & 0x01){
if(UnreadUnacceptCall != 0){
Do_Clear_Screen(2,32,5,96);
app_printf((INT16U rom*)(&fixword4[4][0]), 4, 3, 16);
Disp_Word(3, 96, 0x30+(UnreadUnacceptCall/10), PIX8);
Disp_Word(3, 104, 0x30+(UnreadUnacceptCall%10), PIX8);
oddeven = 0;
}
else oddeven=Func_DisplaySysTime(oddeven);
}
else{
if(UnreadUnacceptCall != 0){
Do_Clear_Screen(3,16,4,128-16);
}
oddeven=Func_DisplaySysTime(oddeven);
}
break;
}
}
else{
switch (((MSG_HEAD *)pMsg)->Msg_ID){
case MSG_TIMER_EXPIRE:
if(((TIMER_MESSAGE *)pMsg)->TID==DVS_20_S_ID){
if(IdleNumBufPTR != 0){
//if(InMenu == FALSE){
if(MainWndType == WND_IDLE){
Do_Clear_Screen(2,0,5,127);
Func_DisplaySysTime(0);
}
IdleNumBufPTR = 0;
}
}
break;
case MSG_KEY_PRESS:
if(((MSG_KEYPRESS *)pMsg)->Key != KEY_HANDFREE){
if((((MSG_KEYPRESS *)pMsg)->Key == KEY_FUNC1) || (((MSG_KEYPRESS *)pMsg)->Key == KEY_FUNC2)){
MainWndType = WND_MENU;
ptrTemp = OSMemGet(pMemSml,&err);
if(err == OS_NO_ERR){
((MSG_HEAD *)ptrTemp)-> Msg_ID = MSG_MENU_KEY;
((MSG_HEAD *)ptrTemp)-> Origin = peventDVS;
((MSG_HEAD *)ptrTemp)-> pmemME = pMemSml;
((MSG_HEAD *)ptrTemp)-> Attached = FALSE;
((MSG_KEYPRESS *)ptrTemp)-> Key = ((MSG_KEYPRESS *)pMsg)->Key;
OSQPost(peventMenu, (OS_EVENT *)ptrTemp);
}
break;
}
else if(MainWndType == WND_MENU){ //if(InMenu == TRUE){
ptrTemp = OSMemGet(pMemSml,&err);
if(err == OS_NO_ERR){
((MSG_HEAD *)ptrTemp)-> Msg_ID = MSG_MENU_KEY;
((MSG_HEAD *)ptrTemp)-> Origin = peventDVS;
((MSG_HEAD *)ptrTemp)-> pmemME = pMemSml;
((MSG_HEAD *)ptrTemp)-> Attached = FALSE;
((MSG_KEYPRESS *)ptrTemp) -> Key = ((MSG_KEYPRESS *)pMsg)->Key;
OSQPost(peventMenu, (OS_EVENT *)ptrTemp);
}
break;
}
else if(((MSG_KEYPRESS *)pMsg)->Key == KEY_F0){//entern network operation
OSQPost(peventPPPHandler, (OS_EVENT *)MSG_UPPER_OPEN);
}
else if(((MSG_KEYPRESS *)pMsg)->Key == KEY_F1){
OSQPost(peventTone, (OS_EVENT *)MSG_PLAY_MUS);
}
else {
Monitor_Super_Command(((MSG_KEYPRESS *)pMsg)->Key);
}
break;
}
//for Handfree key
VoiceCh = HANDFREE;
if(get_inputnum() != DVS_ONHOOK){
call_process(CALL_OUT);
}
break;
case MSG_VOICE_DIRECTCALL:
VoiceCh = HANDFREE;
IdleNumBufPTR = 0;
Func_SetVoiceCh(VOX_HANDFREE);
MainWndType = WND_CALL;
OSQPost(peventMenu, (OS_EVENT *)MSG_MENU_CANCEL);
ptrNumBuf = app_c2a(((MSG_DIRECTCALL *)pMsg)->Num, ((MSG_HEAD *)pMsg)->LenOfBody, NumBuf);
OSTimeDly(10);
Do_Clear_Screen(2,0,5,127); //add by ZWM
if(ptrNumBuf < 21) Display_Num(NumBuf, ptrNumBuf);
else Display_Num(&NumBuf[ptrNumBuf - 21], 21);
if(ptrNumBuf != 0){
for(i=0; i< ptrNumBuf; i++){
LastNumBuf[i] = NumBuf[i];
}
ptrLastNumBuf = ptrNumBuf;
Func_GetSysTime(&CurCallStartTime);
CallRecord_Save(NumBuf, ptrNumBuf, &CurCallStartTime, RECENTTXCALL);//&SystemFile.RecentTxCall);
}
call_process(CALL_OUT);
break;
}
Func_Clear_Msg(pMsg);
}
}
}
}
void Func_EnterOffHookStt(void){
INT8U err;
MainWndType = WND_CALL;
OSQPost(peventMenu, (OS_EVENT *)MSG_MENU_CANCEL);
Do_Clear_Screen(2,0,5,127); //add by ZWM
Display_OffHook(); //Display "Dial please"
OSQPost(peventWICCmd,(OS_EVENT *)MSG_RING_STOP); //when just exit from ring type select due to incomming call
//the ring have to be stop here
OSQPost(peventWICCmd, (OS_EVENT *) MSG_VOICE_OFFHOOK); //Told WIC to send dialing tone
if(VoiceCh == HANDFREE) Func_SetVoiceCh(VOX_HANDFREE);
else Func_SetVoiceCh(VOX_HANDSET);
}
void Func_ExitOffHookStt(void){
INT8U err;
OSQPost(peventWICCmd, (OS_EVENT *) MSG_VOICE_ONHOOK);
OSQPost(peventMenu, (OS_EVENT *)MSG_MENU_CANCEL);
Do_Clear_Screen(2,0,5,127);
Func_DisplaySysTime(0);
Func_SetVoiceCh(VOX_IDLE);
MainWndType = WND_IDLE;
}
INT8U Func_OffHookProc(void){
void rom * pMsg;
INT8U rom * pSml;
INT8U err,i,S_10sTimerStarted, tmp,retval;
ptrNumBuf = 0;
retval = 0;
//start to wait 10s, if no number dialed, exit dial proc
pSml=OSMemGet(pMemSml,&err);
if(err == OS_NO_ERR){
((MSG_HEAD *)pSml)->Msg_ID=MSG_TIMER_START;
((MSG_HEAD *)pSml)->Origin=peventDVS;
((MSG_HEAD *)pSml)->pmemME=pMemSml;
((MSG_HEAD *)pSml)->Attached=FALSE;
((MSG_HEAD *)pSml)->LenOfBody=4;
((TIMER_MESSAGE *)pSml)->TID=DVS_10_S_ID;
((TIMER_MESSAGE *)pSml)->Val=1000;
OSQPost(peventTimer,pSml);
S_10sTimerStarted = TRUE;
}
for(;;){
pMsg = OSQPend(peventDVS, 0, &err);
if(err == OS_NO_ERR){
if((INT24U)pMsg >= PTR_MAX){ //If is a direct message--just a value
switch ((INT24U)pMsg){
case MSG_HOOK_ON:
retval = DVS_ONHOOK;
break;
case MSG_WICRESP_RING:
OSQPost(peventWICCmd, (OS_EVENT *) MSG_VOICE_REJECT); //reject incoming call
break;
case MSG_HOOK_OFF:
Func_SetVoiceCh(VOX_HANDSET);
VoiceCh = HANDSET;
break;
case MSG_MENU_EXIT:
if(VoiceCh == HANDFREE) Func_SetVoiceCh(VOX_HANDFREE);
else Func_SetVoiceCh(VOX_HANDSET);
//in some menu state, such as ring select menu, the 4890 may be disabled when exit, so
//re-do the process
break;
}
}
else{ //If it's a undirect message--a pointer
switch (((MSG_HEAD *)pMsg)->Msg_ID){
case MSG_KEY_PRESS:
tmp = ((MSG_KEYPRESS *)pMsg)->Key;
//begin to input number
if(tmp == KEY_HANDFREE){
if(VoiceCh == HANDFREE){
retval = DVS_ONHOOK;
}
}
else if(tmp == KEY_STAR ||
tmp == KEY_CROSS ||
(tmp <= '9' && tmp >= '0')){
//if any acceptable Key pressed, stop the 10s timer
if( S_10sTimerStarted == TRUE){
pSml=OSMemGet(pMemSml,&err);
if(err == OS_NO_ERR){
((MSG_HEAD *)pSml)->Msg_ID=MSG_TIMER_STOP;
((MSG_HEAD *)pSml)->Origin=peventDVS;
((MSG_HEAD *)pSml)->pmemME=pMemSml;
((MSG_HEAD *)pSml)->Attached=FALSE;
((MSG_HEAD *)pSml)->LenOfBody=4;
((TIMER_MESSAGE *)pSml)->TID=DVS_10_S_ID;
((TIMER_MESSAGE *)pSml)->Val=1000;
OSQPost(peventTimer,pSml);
S_10sTimerStarted = FALSE;
}
}
//
pSml=OSMemGet(pMemSml,&err);
if(err == OS_NO_ERR){
((MSG_HEAD *)pSml)->Msg_ID=MSG_TIMER_START;
((MSG_HEAD *)pSml)->Origin=peventDVS;
((MSG_HEAD *)pSml)->pmemME=pMemSml;
((MSG_HEAD *)pSml)->Attached=FALSE;
((MSG_HEAD *)pSml)->LenOfBody=4;
((TIMER_MESSAGE *)pSml)->TID=DVS_7_S_ID;
((TIMER_MESSAGE *)pSml)->Val=700;
OSQPost(peventTimer,pSml);
}
//
NumBuf[ptrNumBuf] = tmp;
if (ptrNumBuf < MAX_NUMBER_LENGTH) ptrNumBuf++;
Do_Clear_Screen(2,0,5,127); //add by ZWM
if(ptrNumBuf < 21) Display_Num(NumBuf, ptrNumBuf);
else Display_Num(&NumBuf[ptrNumBuf - 21], 21);
}
if(tmp == KEY_C){
if(ptrNumBuf != 0) ptrNumBuf--;
Do_Clear_Screen(2,0,5,127); //add by ZWM
if(ptrNumBuf < 21) Display_Num(NumBuf, ptrNumBuf);
else Display_Num(&NumBuf[ptrNumBuf - 21], 21);
}
else if(tmp == KEY_SEND){
if(ptrNumBuf != 0){
for(i=0; i< ptrNumBuf; i++){
LastNumBuf[i] = NumBuf[i];
}
ptrLastNumBuf = ptrNumBuf;
Func_GetSysTime(&CurCallStartTime);
CallRecord_Save(NumBuf, ptrNumBuf, &CurCallStartTime, RECENTTXCALL);//&SystemFile.RecentTxCall);
retval = DVS_DIALOUT;
}
}
else if(tmp == KEY_REDIAL){
if(ptrLastNumBuf != 0){
for(i=0; i< ptrLastNumBuf; i++){
NumBuf[i] = LastNumBuf[i];
}
ptrNumBuf = ptrLastNumBuf;
Do_Clear_Screen(2,0,5,127); //add by ZWM
if(ptrNumBuf < 21) Display_Num(NumBuf, ptrNumBuf);
else Display_Num(&NumBuf[ptrNumBuf - 21], 21);
Func_GetSysTime(&CurCallStartTime);
CallRecord_Save(NumBuf, ptrNumBuf, &CurCallStartTime, RECENTTXCALL);//&SystemFile.RecentTxCall);
retval = DVS_DIALOUT;
}
}
break;
case MSG_TIMER_EXPIRE:
if(((TIMER_MESSAGE *)pSml)->TID==DVS_10_S_ID){
OSQPost(peventCharge, (OS_EVENT *)MSG_CHARGE_STOP);
Func_DisableChargeDisplay();
Func_Busy();
retval = DVS_ONHOOK;
}
else if(((TIMER_MESSAGE *)pSml)->TID=DVS_7_S_ID){
if(ptrNumBuf != 0){
for(i=0; i< ptrNumBuf; i++){
LastNumBuf[i] = NumBuf[i];
}
ptrLastNumBuf = ptrNumBuf;
retval = DVS_DIALOUT;
}
}
else if(((TIMER_MESSAGE *)pSml)->TID=DVS_20_S_ID){
IdleNumBufPTR = 0;
}
break;
}
Func_Clear_Msg(pMsg);
}
}
if(retval != 0) return(retval);
}
}
INT8U Func_DialingProc(void){
INT8U rom * pMsg;
INT8U err,i, retval;
INT8U rom *ptrT1;
INT8U rom *ptrT2;
retval = 0;
if(ptrNumBuf != 0){
ptrT1 = OSMemGet(pMemSml, &err);
if(err == OS_NO_ERR){
ptrT2 = OSMemGet(pMemSml, &err);
if(err == OS_NO_ERR){
((MSG_HEAD *)ptrT1)-> Msg_ID = MSG_VOICE_CONREQ;
((MSG_HEAD *)ptrT1)-> Origin = peventDVS;
((MSG_HEAD *)ptrT1)-> pmemME = pMemSml;
((MSG_HEAD *)ptrT1)-> Attached = TRUE;
((MSG_HEAD *)ptrT1)-> LenOfAttach = ptrNumBuf;
((MSG_HEAD *)ptrT1)-> pMem = ptrT2;
((MSG_HEAD *)ptrT1)-> pmemATT = pMemSml;
}
//Add number process function here to replace the following codes
for(i = 0; i<ptrNumBuf; i++){
*ptrT2++ = NumBuf[i];
}
//
OSQPost(peventWICCmd, (OS_EVENT *)ptrT1);
pMsg = (INT8U rom *)PB_SearchMatchItem(NumBuf, ptrNumBuf);
if( pMsg != NULL_PTR){
Do_Clear_Screen(2,0,3,127);
app_printf((INT16U rom *)pMsg,10,2,0);
}
Display_PhoneCallOut();
OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_DIALOUT);
for(;;){
pMsg = OSQPend(peventDVS, 0, &err);
if(err == OS_NO_ERR){
if(((INT24U)pMsg) == MSG_HOOK_OFF){
Func_SetVoiceCh(VOX_HANDSET);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -