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

📄 tskdvs.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
					VoiceCh = HANDSET;
				}
				if(((INT24U)pMsg) == MSG_HOOK_ON){
					OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_DIALOUTSTOP);
					retval = DVS_ONHOOK;
				}
				if (((INT24U)pMsg) == MSG_WICRESP_RING){
					OSQPost(peventWICCmd, (OS_EVENT *) MSG_VOICE_REJECT);	//reject incoming call
				}				
				else if(((INT24U)pMsg) == MSG_VOICE_CONNECT){
					OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_DIALOUTSTOP);
					retval = DVS_CONNECT;
				}
				else if(((INT24U)pMsg) == MSG_VOICE_BUSY){
					OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_DIALOUTSTOP);
					retval = DVS_BUSY;
				}
				if(((INT24U)pMsg)<= PTR_MAX){
					if(((MSG_HEAD *)pMsg)->Msg_ID == MSG_KEY_PRESS){
						if( ((MSG_KEYPRESS *)pMsg)->Key == KEY_HANDFREE && VoiceCh == HANDFREE){
							OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_DIALOUTSTOP);
							retval = DVS_ONHOOK;
						}
					}
					Func_Clear_Msg(pMsg);
				}
			  }
			  if(retval != 0) return(retval);
			}
		}
	}
}

void Func_Busy(void){
	INT8U rom *pMsg;
	INT8U err,retval;
	
	retval = 0;

	Do_Clear_Screen(2,0,5,127);

	Display_PleaseOnHook();
	OSQPost(peventTone, (OS_EVENT *)MSG_TONE_BUSY);
	for(;;){
		pMsg = OSQPend(peventDVS, 0, &err);
		if(err == OS_NO_ERR){
			//waiting for on hook event
			if(((INT24U)pMsg) >= PTR_MAX){
				switch((INT24U)pMsg){
					case MSG_HOOK_ON:
						OSQPost(peventTone, (OS_EVENT *)MSG_TONE_STOP);
						retval = 1;//return;
					case MSG_HOOK_OFF:
						Func_SetVoiceCh(VOX_HANDSET);
						VoiceCh = HANDSET;
						break;
					case MSG_WICRESP_RING:
						OSQPost(peventWICCmd, (OS_EVENT *) MSG_VOICE_REJECT); //reject incoming call
						break;
				}
			}

			if(((INT24U)pMsg)< PTR_MAX){
				if(((MSG_HEAD *)pMsg)->Msg_ID == MSG_KEY_PRESS){
					if( ((MSG_KEYPRESS *)pMsg)->Key == KEY_HANDFREE && VoiceCh == HANDFREE){
						OSQPost(peventTone, (OS_EVENT *)MSG_TONE_STOP);
						retval = 1;
					}
				}
				Func_Clear_Msg(pMsg);
			}
			if(retval != 0) return;
		}
	}
}

void Func_Talking(void){
	INT8U rom * pMsg;
	INT8U err,retval,i,thirdparty;
	INT8U rom * ptrTemp;
	INT8U rom * ptrT1, *ptrT2;
	
	retval = 0;
	thirdparty = FALSE;
	
	OSQPost(peventCharge, (OS_EVENT *) MSG_CHARGE_BEGIN);

	Do_Clear_Screen(4,0,5,127);

	Display_PhoneCallConnect();

	Func_EnableChargeDisplay();
	for(;;){
		pMsg = OSQPend(peventDVS, 0, &err);
		if(err == OS_NO_ERR){
			if(((INT24U)pMsg) == MSG_HOOK_ON){
				OSQPost(peventCharge, (OS_EVENT *)MSG_CHARGE_STOP);
				OSQPost(peventWICCmd, (OS_EVENT *) MSG_VOICE_ONHOOK);
				Func_DisableChargeDisplay();
				retval = 1;
			}
			else if(((INT24U)pMsg) == MSG_VOICE_BUSY){
				OSQPost(peventCharge, (OS_EVENT *)MSG_CHARGE_STOP);
				Func_DisableChargeDisplay();
				Func_Busy();
				retval = 1;
			}
			else if(((INT24U)pMsg) == MSG_HOOK_OFF){
				Func_SetVoiceCh(VOX_HANDSET);
				VoiceCh = HANDSET;
			}
			else if (((INT24U)pMsg) ==MSG_MENU_EXIT){
				MainWndType = WND_CALL;
				IdleNumBufPTR = 0;
				Func_EnableChargeDisplay();
			}
			if(((INT24U)pMsg)<= PTR_MAX){
				if(((MSG_HEAD *)pMsg)->Msg_ID == MSG_KEY_PRESS){
					err = ((MSG_KEYPRESS *)pMsg)->Key;
					if(err == KEY_HANDFREE && VoiceCh == HANDFREE){
						OSQPost(peventTone, (OS_EVENT *)MSG_TONE_STOP);
						Func_DisableChargeDisplay();
						retval = 1;
					}
					//else if((err == KEY_FUNC1) && (IdleNumBufPTR != 0)){
					//		MainWndType = WND_MENU;
					//		Func_DisableChargeDisplay();
					//		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);								
					//		}
					//}
					else{
						if((err >= '0' && err <= '9') || (err == KEY_STAR) || (err == KEY_CROSS)){
							if (IdleNumBufPTR < 24){
								IdleNumBuf[IdleNumBufPTR] = err;
								IdleNumBufPTR++;
							}
						}
						else if(err == KEY_C){
							if(IdleNumBufPTR != 0) IdleNumBufPTR--;
							Do_Clear_Screen(2,0,3,127);
						}
						if(IdleNumBufPTR == 1) Do_Clear_Screen(2,0,3,127);	//add by ZWM
						if(IdleNumBufPTR < 21)	Display_Num(IdleNumBuf, IdleNumBufPTR);
						else Display_Num(&IdleNumBuf[IdleNumBufPTR - 21], 21);
						if(err == KEY_SEND){
							if(IdleNumBufPTR != 0 && thirdparty == FALSE){
								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_3PARTY;
										((MSG_HEAD *)ptrT1)-> Origin = peventDVS;
										((MSG_HEAD *)ptrT1)-> pmemME = pMemSml;
										((MSG_HEAD *)ptrT1)-> Attached = TRUE;
										((MSG_HEAD *)ptrT1)-> LenOfAttach = IdleNumBufPTR;
										((MSG_HEAD *)ptrT1)-> pMem = ptrT2;
										((MSG_HEAD *)ptrT1)-> pmemATT = pMemSml;
									}
									//Add number process function here to replace the following codes
									for(i = 0; i<IdleNumBufPTR; i++){
										*ptrT2++ = IdleNumBuf[i];
									}
									IdleNumBufPTR = 0;
									//
									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);
									}
									thirdparty = TRUE;
									//Display_PhoneCallOut();
									//OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_DIALOUT);
								}
							}
							else OSQPost(peventWICCmd, (OS_EVENT *)MSG_VOICE_SWITCH);
						}
					}
				}
				else if(((MSG_HEAD *)pMsg)->Msg_ID ==MSG_WICRESP_CLIP){
					Do_Clear_Screen(2,0,3,127);	//add by ZWM
					ptrTemp = (INT8U rom *)PB_SearchMatchItem(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
					if( ptrTemp == NULL_PTR){
						Display_Num(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
					}
					else{
						app_printf((INT16U rom *)ptrTemp,10,2,0);
					}
					ptrTemp = ((MSG_HEAD *)pMsg)->pMem;
					for(i=0; i<((MSG_HEAD *)pMsg)->LenOfAttach; i++){
						if(i==MAX_NUMBER_LENGTH) break;
						CallInNum[i] = *ptrTemp;
						ptrTemp++;
					}
					ptrCallInNum = i;
					thirdparty = TRUE;
				}
				Func_Clear_Msg(pMsg);
			}
		}
		if(retval != 0) return;
	}
}

void Func_CallFinish(void){
}

INT8U Func_EnterCallInStt(void){
	INT8U rom * pMsg;
	INT8U err;
	INT8U Temp,i,j,retval;
	INT8U rom *ptrTemp;
	
	MainWndType = WND_CALL;
	OSQPost(peventMenu, (OS_EVENT *)MSG_MENU_CANCEL);

	retval = 0;

	Do_Clear_Screen(2,0,5,127);

	Display_Ring();
	
	OSQPost(peventCartoon, (OS_EVENT *) MSG_CARTOON_RING);		//Strat to display ring cartoon
	Func_SetVoiceCh(VOX_HANDFREE);
	OSQPost(peventWICCmd, (OS_EVENT *) MSG_RING_BEGIN);			//Told WIC to send ring
	Func_GetSysTime(&CurCallStartTime);
	
	ptrCallInNum = 0;	//clear the call in number buffer
	
	for(;;){
		pMsg = OSQPend(peventDVS, 0, &err);
		if(err == OS_NO_ERR){
			if(((INT24U)pMsg) == MSG_HOOK_OFF){
				OSQPost(peventCharge, (OS_EVENT *)MSG_CHARGE_BEGIN);
				OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_RINGSTOP);
				OSQPost(peventWICCmd, (OS_EVENT *)MSG_VOICE_ANSWER);
				Func_SetVoiceCh(VOX_HANDSET);
				VoiceCh = HANDSET;
				CallRecord_Save(&CallInNum[0], ptrCallInNum, &CurCallStartTime, RECENTRXCALL);//&SystemFile.RecentRxCall);
				retval = DVS_CONNECT;
			}
			else if(((INT24U)pMsg) == MSG_VOICE_BUSY){
				OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_RINGSTOP);
				OSQPost(peventWICCmd, (OS_EVENT *)MSG_RING_STOP);
				Func_SetVoiceCh(VOX_IDLE);
				CallRecord_Save(&CallInNum[0], ptrCallInNum, &CurCallStartTime, UNACCEPTCALL);//&SystemFile.UnAcceptCall);
				if(UnreadUnacceptCall<CALLRECORDNUM) UnreadUnacceptCall++;
				retval = DVS_BUSY;
			}
			else if(((INT24U)pMsg) == MSG_MENU_EXIT){
				Func_SetVoiceCh(VOX_HANDFREE);
			}						
			if(((INT24U)pMsg)<= PTR_MAX){
				if(((MSG_HEAD *)pMsg)->Msg_ID == MSG_KEY_PRESS){
					if( ((MSG_KEYPRESS *)pMsg)->Key == KEY_HANDFREE ){
						OSQPost(peventCharge, (OS_EVENT *)MSG_CHARGE_BEGIN);
						OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_RINGSTOP);
						OSQPost(peventWICCmd, (OS_EVENT *)MSG_VOICE_ANSWER);
						VoiceCh = HANDFREE;
						Func_SetVoiceCh(VOX_HANDFREE);
						CallRecord_Save(&CallInNum[0], ptrCallInNum, &CurCallStartTime, RECENTRXCALL);//&SystemFile.RecentRxCall);
						retval = DVS_CONNECT;
					}
					else if(((MSG_KEYPRESS *)pMsg)->Key == KEY_C){
						OSQPost(peventCartoon, (OS_EVENT *)MSG_CARTOON_RINGSTOP);
						retval = DVS_REJECT;
					}			
				}
				else if(((MSG_HEAD *)pMsg)->Msg_ID ==MSG_WICRESP_CLIP){
					Do_Clear_Screen(2,0,3,127);	//add by ZWM
					ptrTemp = (INT8U rom *)PB_SearchMatchItem(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
					if( ptrTemp == NULL_PTR){
						Display_Num(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
					}
					else{
						app_printf((INT16U rom *)ptrTemp,10,2,0);
					}
					ptrTemp = ((MSG_HEAD *)pMsg)->pMem;
					for(i=0; i<((MSG_HEAD *)pMsg)->LenOfAttach; i++){
						if(i==MAX_NUMBER_LENGTH) break;
						CallInNum[i] = *ptrTemp;
						ptrTemp++;
					}
					ptrCallInNum = i;
				}
				Func_Clear_Msg(pMsg);
			}
		}
		if(retval != 0) return(retval);
	}
}

void Func_ExitCallInStt(void){
	INT8U err;

	Do_Clear_Screen(2,0,5,127);

	OSQPost(peventWICCmd, (OS_EVENT *) MSG_VOICE_ONHOOK);
	MainWndType = WND_IDLE;
	Func_DisplaySysTime(0);
	Func_SetVoiceCh(VOX_IDLE);
}

void Func_ProcessSuperCmd(void);

void Monitor_Super_Command(INT8U key){
	INT8U err;
	INT8U rom * pSml;
	
	if(key == KEY_STAR || key == KEY_CROSS || (key <= '9' && key >= '0')){
		if(IdleNumBufPTR == 0) 
			MainWndType = WND_CALL;
		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_20_S_ID;
			((TIMER_MESSAGE *)pSml)->Val=2000;	//20s
		    OSQPost(peventTimer,pSml);
		}
		if (IdleNumBufPTR < 24){
			IdleNumBuf[IdleNumBufPTR] = key;
			IdleNumBufPTR++;
		}
		Do_Clear_Screen(2,0,5,127);	//add by ZWM
		if(IdleNumBufPTR < 16)	Display_Num(IdleNumBuf, IdleNumBufPTR);
		else Display_Num(&IdleNumBuf[IdleNumBufPTR - 16], 16);
		if(key == KEY_CROSS)	Func_ProcessSuperCmd();
	}
	else if(key == KEY_C){
		if(IdleNumBufPTR != 0) IdleNumBufPTR--;
		if(IdleNumBufPTR == 0){
			Do_Clear_Screen(2,0,5,127);
			MainWndType = WND_IDLE;
			Func_DisplaySysTime(0);
		}
		else{
			Do_Clear_Screen(2,0,5,127);	//add by ZWM
			if(IdleNumBufPTR < 16)	Display_Num(IdleNumBuf, IdleNumBufPTR);
			else Display_Num(&IdleNumBuf[IdleNumBufPTR - 20], 16);
		}
	}
}


void Func_ProcessSuperCmd(void){
	INT8U i,j,found,err;
	
	if(IdleNumBufPTR <3) return;
	if((IdleNumBuf[0] != '*') || (IdleNumBuf[1] != '#')) return;
	
	found = FALSE;
	i = 0;
	for(j=0;j<IdleNumBufPTR-2;){
		if((IdleNumBuf[j+2] & SuperCmd[i][j]) == 0) {
			found = TRUE;
			break;
		}
		if(IdleNumBuf[j+2] != SuperCmd[i][j]){
			i++;
			j = 0;
			if(SuperCmd[i][0] == 0xff) break;
		}
		else j++;
	}
	
	if(found == TRUE){	//"found" only means the input contains a command
		switch(i){
			case 0:	//*##
				break;
			case 1:	//*#06#
				break;
			case 2:	//*#07*
				break;
			case 3:	//*#08*
				break;
			case 4:	//*#0001*
				switch (IdleNumBuf[7]){
					case '0'://normal
						if(IdleNumBufPTR != 0){
							IdleNumBufPTR = 0;
						}
						Func_ChangeCOMMode(S_NORMAL);

						Do_Clear_Screen(2,0,5,127);

						MainWndType = WND_IDLE;
						Func_DisplaySysTime(0);
						break;
					case '1'://debug
						if(IdleNumBufPTR != 0){
							IdleNumBufPTR = 0;
						}
						Func_ChangeCOMMode(S_DEBUG);
						//an OK response shall be send to WIC to end current command
						MainWndType = WND_CALL;
						Display_Menu_Picture(&PIC_DEBUG);
						break;
					case '2'://monitor
						if(IdleNumBufPTR != 0){
							IdleNumBufPTR = 0;
						}
						Func_ChangeCOMMode(S_MONITOR);

						Do_Clear_Screen(2,0,5,127);

						MainWndType = WND_IDLE;
						Func_DisplaySysTime(0);
						break;
					case '3'://modem
						if(IdleNumBufPTR != 0){
							IdleNumBufPTR = 0;
						}
						Func_ChangeCOMMode(S_OFFLINE);
						//an OK response shall be send to WIC to end current command
						Display_Menu_Picture(&PIC_NETWORK);
						MainWndType = WND_CALL;
						break;
				}
				
				break;
			case 5:	//*#0002#
				break;
			case 6:	//*#0003#
				break;
			case 7:	//*#1113*
				break;
		}
		IdleNumBufPTR = 0;
	}
}



INT8U get_inputnum(void){
	IdleNumBufPTR = 0;
	Func_EnterOffHookStt();
	if(Func_OffHookProc() == DVS_ONHOOK){
		Func_ExitOffHookStt();
		return(DVS_ONHOOK);
	}
	return(DVS_DIALOUT);
}

void call_process(INT8U mode){
	INT8U err;
	if(mode == CALL_IN){
		err = Func_EnterCallInStt();
		if (err != DVS_CONNECT){
			Func_ExitCallInStt();
			return;
		}
	}
	else{
		err = Func_DialingProc();
		if(err == DVS_ONHOOK){
			Func_ExitOffHookStt();
			return;
		}
		else if(err == DVS_BUSY){ //remote reject or busy
			Func_Busy();
			Func_ExitOffHookStt();
			return;
		}
	}
	Func_Talking();
	Func_CallFinish();
	Func_ExitOffHookStt();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -