📄 tskwic.c
字号:
#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 + -