⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tskdvs.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -