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

📄 tskwic.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <p18cxxx.h>
#include "includes.h"
#include "event.h"
#include "hardware.h"
#include "funcfontlib.h"
#include "file.h"
#include "filesys.h"

#define APP_NO_ERROR	0
#define APP_ERROR		1
#define APP_FAIL		2
#define APP_NO_ANSWER	3
#define APP_PIN			4

#define VOICE	0
#define DATA	1

//extern MCNM_FILE	SystemFile;

extern OS_MEM			*pMemSml;
extern OS_MEM			*pMemLge;

INT8U WIC_Send_Cmd(INT8U rom * ptrCmd);
INT8U WIC_DoCmd(INT8U rom * ptrCmd);
void WIC_OffHook(void);
void WIC_OnHook(void);
void WIC_KeySound(INT8U key);
INT8U WIC_Call(INT8U rom * ptrNumber, INT8U len, INT8U type);
void WIC_KeyDTMF(INT8U key);
void WIC_ChgToCmdMod(void);
void WIC_Call3Party(INT8U rom * pn, INT8U len);
void WIC_PlayTone(INT8U rom * pd);

void Make_RingCmd(void);
INT8U WIC_Init_Module(void);
void WIC_SendSM(INT8U rom * ptrData, INT8U len, OS_EVENT * Origin);


//The commands to be send to module
#pragma romdata CCODE
INT8U rom WICCmd_AT[]={"AT\r\n"};
INT8U rom WICCmd_E0[]={"ATE0\r\n"};
INT8U rom WICCmd_S0[]={"ATS0\r\n"};
INT8U rom WICCmd_D[]={"ATD"};
INT8U rom WICCmd_A[]={"ATA\r\n"};
INT8U rom WICCmd_ON_HOOK[]={"ATH\r\n"};
INT8U rom WICCmd_RING_OPEN[]={"AT+CRMP=0,1,0,1\r\n"};
INT8U rom WICCmd_RING_STOP[]={"AT+CRMP=0,,,0\r\n"};
INT8U rom WICCmd_SIG_QL[]={"AT+CSQ\r\n"};
INT8U rom WICCmd_CCED[]={"AT+CCED=1,8\r\n"};
INT8U rom WICCmd_CPOS[]={"AT+COPS?\r\n"};
INT8U rom WICCmd_PIN_STT[]={"AT+CPIN?\r\n"};
INT8U rom WICCmd_PIN_INPUT[]={"AT+CPIN=0000\r\n"};
INT8U rom WICCmd_LCK_STT[]={"AT+CLCK?\r\n"};
INT8U rom WICCmd_LCK_OPEN_OFF[]={"AT+CLCK=\"SC\",0,0000\r\n"};
INT8U rom WICCmd_LCK_CHANGE[]={"AT+CPWD=\"SC\",0000,0000\r\n"};
INT8U rom WICCmd_TIME_GET[]={"AT+CCLK?\r\n"};
INT8U rom WICCmd_CALLWAIT[]={"AT+WFSH\r\n"};
INT8U rom WICCmd_VTS[]={"AT+VTS=0\r\n"};
INT8U rom WICCmd_VTD[]={"AT+VTD=4,3\r\n"};
INT8U rom WICCmd_MIC_GAIN[]={"AT+VGT=3\r\n"};
INT8U rom WICCmd_SPK_GAIN[]={"AT+VGR=3\r\n"};
INT8U rom WICCmd_CHANNEL[]={"AT+SPEAKER=0\r\n"};
INT8U rom WICCmd_DIATON_OPEN[]={"AT+WTONE=1,1,450,2,0\r\n"};
INT8U rom WICCmd_DIATON_OFF[]={"AT+WTONE=0\r\n"};
INT8U rom WICCmd_DTMFTON_OPEN[]={"AT+WDTMF=1,\"0\",1,2\r\n"};
INT8U rom WICCmd_DTMFTON_OFF[]={"AT+WDTMF=0\r\n"};
INT8U rom WICCmd_MODUL_STT[]={"AT+CAD?\r\n"};
INT8U rom WICCmd_POW_STT[]={"AT+CBC?\r\n"};
INT8U rom WICCmd_SM_HANDLMODE[]={"AT+CNMI=2,2,2,0,0\r\n"};
INT8U rom WICCmd_SM_RCACK[]={"AT+CNMA\r\n"};
INT8U rom WICCmd_SM_DEL[]={"AT+CMGD=1,4\r\n"};
INT8U rom WICCmd_SIM_IMSI[]={"AT+CIMI\r\n"};
INT8U rom WICCmd_SOFTRESET[]={"AT+CFUN=1\r\n"};
INT8U rom WICCmd_MODUL_ESN[]={"AT+CGSN\r\n"};
INT8U rom WICCmd_INCALL_TYPE[]={"AT+CRC=0\r\n"};
INT8U rom WICCmd_WIND_SET[]={"AT+WIND=201\r\n"};
INT8U rom WICCmd_CREG[]={"AT+CREG=1\r\n"};
INT8U rom WICCmd_IFC[]={"AT+IFC=0,0\r\n"};
INT8U rom WICCmd_CMGF[]={"AT+CMGF=0\r\n"};
INT8U rom WICCmd_CLIP[]={"AT+CLIP=1\r\n"};
INT8U rom WICCmd_WSVG[]={"AT+WSVG=1\r\n"};
INT8U rom WICCmd_CNMI[]={"AT+CNMI=2,2,0,1,0\r\n"};
INT8U rom WICCmd_SM_SOUND[]={"AT+CRMP=3,1,0,2\r\n"};
INT8U rom WICCmd_WSCL[] = {"AT+WSCL=6,4\r\n"};	//set SM Chinese and Unicode
INT8U rom WICCmd_CMGS[] = {"AT+CMGS="};	//the header of SM sending command
INT8U rom WICCmd_PINWORD[] = {"AT+CPIN=1234\r\n"};
INT8U rom WICCmd_WFSH[] = {"AT+WFSH\r\n"};
//INT8U rom WICCmd_CCWA[] = {"AT+CCWA=1,1\r\n"};	//enable call hold function


#pragma romdata EXTRAM
INT8U rom chrWICBuffer[50];	//to convert command contents
INT8U rom WICCmd_RINGX_OPEN[20];
INT8U rom ModuleMod;	//mode of module, COMMAND or DATA
F_LocalPara * p_lp;
INT8U rom Mod_Rdy;
#pragma code MYCODE
void tskWIC(void * data){
	void rom * pMsg;
	INT8U err,chrTemp;
	
	Mod_Rdy = FALSE;
	ModuleMod = MOD_COMMAND;
	Func_ResetWM();
	if(WIC_Init_Module()==0)
		OSQPost(peventDVS, (OS_EVENT *)MSG_WIC_INITOK);
	else
		OSQPost(peventDVS, (OS_EVENT *)MSG_WIC_NOUIM);
	file_open(localpara_file, &pMsg);//We have to use pMsg as a relay for the p_lp lays in "rom" region
	p_lp = pMsg;

	for(;;){
	WIC_WAIT:
		pMsg = OSQPend(peventWICCmd, 0, &err);
		if( Mod_Rdy ==FALSE ){
			if((INT24U)pMsg < PTR_MAX){
				Func_Clear_Msg(pMsg);
			}
			goto WIC_WAIT;
		}
		chrTemp = Func_ReadCOMMode();
		if((chrTemp != S_NORMAL) && (chrTemp != S_MONITOR)){//if not correct serial port stt, don't send data
			if((INT24U)pMsg < PTR_MAX){
				Func_Clear_Msg(pMsg);
				goto WIC_WAIT;
			}
		}
		if(err == OS_NO_ERR){
			if((INT24U)pMsg >= PTR_MAX){
			  if(ModuleMod == MOD_COMMAND){
				switch ((INT24U)pMsg){
					case MSG_TIME_QUERY:
						do{err = WIC_DoCmd(WICCmd_POW_STT);
						}while(err != APP_NO_ERROR);
						WIC_DoCmd(WICCmd_TIME_GET);
						break;
					case MSG_VOICE_OFFHOOK:
						WIC_OffHook();
						break;
					case MSG_VOICE_ONHOOK:
						WIC_OnHook();
						break;
					case MSG_TONE450_OFF:
						do{err = WIC_DoCmd(WICCmd_DIATON_OFF);
						}while(err != APP_NO_ERROR);
						break;
					case MSG_TONE450_ON:
						do{err = WIC_DoCmd(WICCmd_DIATON_OPEN);
						}while(err != APP_NO_ERROR);
						break;
					case MSG_RING_BEGIN:
						Make_RingCmd();
						do{err = WIC_DoCmd(WICCmd_RINGX_OPEN);
						}while(err != APP_NO_ERROR);
						break;
					case MSG_RING_STOP:
						do{err = WIC_DoCmd(WICCmd_RING_STOP);
						}while(err != APP_NO_ERROR);
						break;
					case MSG_VOICE_ANSWER:
						do{err = WIC_DoCmd(WICCmd_RING_STOP);
						}while(err != APP_NO_ERROR);
						do{err = WIC_DoCmd(WICCmd_A);
						}while(err != APP_NO_ERROR);
						break;
					case MSG_VOICE_REJECT:
						do{err = WIC_DoCmd(WICCmd_ON_HOOK);
						}while(err != APP_NO_ERROR);
						break;
					case MSG_SM_ACCEPT:
						do{err = WIC_DoCmd(WICCmd_SM_RCACK);
						}while(err != APP_NO_ERROR);
						do{err = WIC_DoCmd(WICCmd_SM_SOUND);
						}while(err != APP_NO_ERROR);
						break;
					case MSG_VOICE_SWITCH:
						WIC_DoCmd(WICCmd_WFSH);
						break;
				}
			  }//End of if(ModuleMod...
			  else{	//If in DATA mode
			  	if((INT24U)pMsg == MSG_DATA_ONHOOK){
			  		WIC_ChgToCmdMod();
					ModuleMod = MOD_COMMAND;
					WIC_OnHook();
					OSQPost(peventPPPHandler, (OS_EVENT *)MSG_LOW_DOWN);
			  	}
			  }
			}
			else{
			  if(ModuleMod == MOD_COMMAND){
				switch (((MSG_HEAD *)pMsg)->Msg_ID){
					case MSG_WICRESP_CLIP:
						break;
					case MSG_KEY_PRESS:
						WIC_KeySound(((MSG_KEYPRESS *)pMsg)->Key);
						break;
					case MSG_VOICE_CONREQ:
						WIC_Call(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach, VOICE);
						break;
					case MSG_SM_SEND:
						WIC_SendSM(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach, ((MSG_HEAD *)pMsg)->Origin);
						break;
					case MSG_DATA_CONREQ:	//Data call request
						if(WIC_Call( &(((MSG_DCONREQ *)pMsg)->Num[0]), ((MSG_HEAD *)pMsg)->LenOfBody, DATA) == 0){//if successful
							ModuleMod = MOD_DATA;
						}
						break;
					case MSG_VOICE_3PARTY:
						WIC_Call3Party(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
						break;
					case MSG_TONE_PLAY:
						WIC_PlayTone(((MSG_TONEPLAY *)pMsg)->Num);
						break;
				}
			  }
			  Func_Clear_Msg(pMsg);
			}
		}
	}
} 


//Internal function to send command and wait response
void Make_RingCmd(void){
	//AT+CRMP=0,1,0,1~9\r\n AT+CRMP=0,1,0,10\r\n
	//internal type 0~9 correxponding to 1~10 of WIC module
	INT8U i;
	for(i=0; i<25 ;i++){
		WICCmd_RINGX_OPEN[i]=WICCmd_RING_OPEN[i];
		if(WICCmd_RING_OPEN[i] == 0) break;
	};
	if(p_lp->RingType >= 0x09){//(SystemFile.RingType >= 0x09){
	//if(SystemFile.chrIP1Num[0] >= 0x09){
		WICCmd_RINGX_OPEN[14] = '1';
		WICCmd_RINGX_OPEN[15] = '0';
		WICCmd_RINGX_OPEN[16] = '\r';
		WICCmd_RINGX_OPEN[17] = '\n';
		WICCmd_RINGX_OPEN[18] = 0x00;
	}
	else{
		WICCmd_RINGX_OPEN[14] = 0x31 + p_lp->RingType;//SystemFile.RingType;
	//	WICCmd_RINGX_OPEN[14] = 0x31 + SystemFile.chrIP1Num[0];
	}
}


INT8U WIC_Send_Cmd(INT8U rom * ptrCmd){
	INT8U rom * ptrT1;
	INT8U rom * ptrT2;
	INT8U chrT,i,err;
	ptrT1 = OSMemGet(pMemSml,&err);
	if(err == OS_NO_ERR){
		ptrT2 = OSMemGet(pMemLge,&err);
		if(err == OS_NO_ERR){
			((MSG_HEAD *)ptrT1)->Msg_ID = MSG_COM0_TRANSMIT;
			((MSG_HEAD *)ptrT1)->Origin = peventWIC;
			((MSG_HEAD *)ptrT1)->pmemME = pMemSml;
			((MSG_HEAD *)ptrT1)->Attached = TRUE;
			((MSG_HEAD *)ptrT1)->pMem = ptrT2;
			((MSG_HEAD *)ptrT1)->pmemATT = pMemLge;
			
			i=0;
			for(;;){
				chrT = *ptrCmd++;
				if(chrT == 0x00) break;
				*ptrT2++ = chrT;
				i++;
				if(i>=100){
					OSMemPut(pMemLge,((MSG_HEAD *)ptrT1)->pMem);
					OSMemPut(pMemSml, ptrT1);
					return (APP_FAIL);
				}
			}
			if(i==0){
				OSMemPut(pMemLge, ((MSG_HEAD *)ptrT1)->pMem);
				OSMemPut(pMemSml, ptrT1);
				return (APP_FAIL);
			}
			((MSG_HEAD *)ptrT1)->LenOfAttach = i;
			OSQPost(peventHardware, (OS_EVENT *)ptrT1);
			return (APP_NO_ERROR);
		}
	}
	return (APP_FAIL);
}


INT8U WIC_DoCmd(INT8U rom * ptrCmd){
	INT8U rom * ptrT1;
	INT8U rom * ptrT2;
	INT8U err,chrT,i;
	OS_EVENT * pMsg;
	if(WIC_Send_Cmd(ptrCmd) == APP_NO_ERROR){
	  for(;;){
		pMsg = OSQPend(peventWIC, 200, &err);
		if(err == OS_TIMEOUT){
			err = Func_ReadCOMMode();
			if((err == S_NORMAL) || (err == S_MONITOR)){//if not correct serial port stt, don't send data again

⌨️ 快捷键说明

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