📄 isomodem.c
字号:
NU_Sleep(1);
}
}
uchar EA_ucGetLineStatus(DevHandle hDev, uchar *pucSTS)
{
uchar ucMode;
if(EI_JudgeModemHandle(hDev,&ucMode)!=EM_SUCCESS)
return EM_ERRHANDLE;
if(pucSTS==NULL)
return EM_ERRPARAM;
if(EG_modem_STS.dial_err!=EM_DIALERR_NONE)
{
switch(EG_modem_STS.dial_err)
{
case EM_DIALERR_NOCARRIER:
return EM_modem_NOCARRIER;
case EM_DIALERR_NOANSWER:
break;
case EM_DIALERR_NODIALTONE:
return EM_modem_NODIALTONE;
case EM_DIALERR_BUSY:
return EM_modem_LINEBUSY;
case EM_DIALERR_TIMEOUT:
return EM_modem_TIMEOUT;
case EM_DIALERR_ELSE:
return EM_modem_NOCARRIER;
default:
uprintf("FATAL ERROR:%s",__FUNCTION__);
return EM_modem_NOCARRIER;
}
}
if(EG_modem_STS.online==EM_ONLINE_CONNECTED
||EG_modem_STS.online==EM_ONLINE_DIALING
)
return EM_modem_INPROCESS;
else if(EG_modem_STS.online==EM_ONLINE_DATA)
{
*pucSTS = EM_modem_CNT1200V22; /* write a random speed */
return EM_SUCCESS;
}
else if(EG_modem_STS.online==EM_ONLINE_OFFLINE
||EG_modem_STS.online==EM_ONLINE_AT
)
return EM_ERROR;
uprintf("FATAL ERROR:%s",__FUNCTION__);
return EM_ERROR;
}
uchar EA_ucIfExistDialTone(DevHandle hDev)
{
uchar ucMode;
uprintf("API:%s\r\n",__FUNCTION__);
if(EI_JudgeModemHandle(hDev,&ucMode)!=EM_SUCCESS)
return EM_ERRHANDLE;
if(EG_modem_STS.online==EM_ONLINE_OFFLINE
||EG_modem_STS.online==EM_ONLINE_AT
)
{
return EI_Ifexistdialtone();
}
return EM_ERROR;
}
uchar EI_InitDial(uchar ucBPS, uchar ucPAR, uchar ucDBS)
{
if(EG_modem_STS.online!=EM_ONLINE_OFFLINE
&&EG_modem_STS.online!=EM_ONLINE_AT)
return EM_ERROR;
if(!(ucPAR==EM_modem_NOPAR||ucPAR==EM_modem_EVENPAR||ucPAR==EM_modem_ODDPAR))
return EM_ERRPARAM;
if(ucDBS!=EM_modem_8DBS)
return EM_ERRPARAM;
if(ucBPS!=EM_modem_1200BPS
&&ucBPS!=EM_modem_2400BPS
&&ucBPS!=EM_modem_9600BPS
&&ucBPS!=EM_modem_14400BPS
&&ucBPS!=EM_modem_19200BPS
&&ucBPS!=EM_modem_24000BPS
&&ucBPS!=EM_modem_26400BPS
&&ucBPS!=EM_modem_28800BPS
&&ucBPS!=EM_modem_33600BPS
&&ucBPS!=EM_modem_NONEBPS
)
return EM_ERRPARAM;
if(EG_modem_STS.mode==EM_MODEM_MODE_SDLC)
{
/* 这里不能用AT&F/ATZ之类的命令回默认值,因为这有可能破坏补丁的作用 */
EI_ResetModem();
EI_PatchModem();
}
if(EG_patch_Info.ucProfileUse==1
&&EG_patch_Info.uiInitAsysLen>0
)
{
uprintf("use patch initsdlc\r\n");
if(EI_PatchAT(EG_patch_Info.m_pcInitAsys,EG_patch_Info.uiInitAsysLen)!=EM_SUCCESS)
return EM_ERROR;
}
else
{
if(EI_SendAT_OK("AT+MS=V34,1,300,33600,300,33600\r",1)!=EM_SUCCESS)
return EM_ERROR;
}
EG_modem_STS.mode = EM_MODEM_MODE_ASYS;
return EM_SUCCESS;
}
uchar EA_ucInitDial(DevHandle hDev, uchar ucBPS, uchar ucPAR, uchar ucDBS)
{
uprintf("API:%s\r\n",__FUNCTION__);
if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)
return EM_ERRHANDLE;
return EI_InitDial(ucBPS,ucPAR,ucDBS);
}
uchar EA_ucInitRingDetect(DevHandle hDev)
{
uprintf("API:%s\r\n",__FUNCTION__);
if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)
return EM_ERRHANDLE;
if(EG_modem_STS.online!=EM_ONLINE_OFFLINE
&&EG_modem_STS.online!=EM_ONLINE_AT)
return EM_ERROR;
if(EI_Ifexistdialtone()==EM_modem_PHONEINUSE)
return EM_modem_PHONEINUSE;
EG_modem_STS.ring_detect = EM_ERROR;
return EM_SUCCESS;
}
uchar EA_ucRingDetect(DevHandle hDev)
{
//uprintf("API:%s\r\n",__FUNCTION__);
if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)
return EM_ERRHANDLE;
return EG_modem_STS.ring_detect;
}
uchar EA_ucAnswerModem(DevHandle hDev,uchar ucBPS,uchar *pucSTS)
{
uprintf("API:%s\r\n",__FUNCTION__);
if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)
return EM_ERRHANDLE;
if(pucSTS==NULL)
return EM_ERROR;
if(EG_modem_STS.online!=EM_ONLINE_OFFLINE
&&EG_modem_STS.online!=EM_ONLINE_AT)
return EM_ERROR;
if(EI_InitDial(ucBPS,EM_modem_NOPAR,EM_modem_8DBS)!=EM_SUCCESS)
return EM_ERROR;
/* here we must protect it */
NU_Obtain_Semaphore(&(EG_modem_STS.drv_api_SEM),NU_SUSPEND);
EI_SetModemOnline(EM_ONLINE_DIALING);
EG_modem_STS.dialing_buf_len = 0;
memset(EG_modem_STS.dialing_buf,0x00,sizeof(EG_modem_STS.dialing_buf));
EG_modem_STS.dial_err = EM_DIALERR_NONE;
EG_modem_STS.dial_start = NU_Retrieve_Clock();
EG_modem_STS.dial_connect = 0;
EI_vShow(EM_icon_SHOW,EM_icon_MODEM);
loop_reset(EG_modem_STS.serial_recvbuf);
NU_Release_Semaphore(&(EG_modem_STS.drv_api_SEM));
EI_vLineToModem();
EI_SendAT("ATA\r");
while(1)
{
if(EG_modem_STS.online==EM_ONLINE_DIALING)
NU_Sleep(1);
else if(EG_modem_STS.online==EM_ONLINE_DATA)
{
*pucSTS = EM_modem_33600BPS;
return EM_SUCCESS;
}
else if(EG_modem_STS.online==EM_ONLINE_OFFLINE)
goto answer_err;
else
{
uprintf("FATAL ERROR:%s online=%d\r\n",__FUNCTION__,EG_modem_STS.online);
goto answer_err;
}
}
answer_err:
EI_vLineToPhone();
return EM_ERROR;
}
uchar EA_ucIfModemRecBufEmpty(DevHandle hDev,uchar *pucBufStatus)
{
uprintf("API:%s\r\n",__FUNCTION__);
if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS
&&EI_VerifyHandle_sync(hDev)!=EM_SUCCESS)
return EM_ERRHANDLE;
if(pucBufStatus==NULL)
return EM_ERRPARAM;
if(EG_modem_STS.online!=EM_ONLINE_DATA)
{
/* 非数据态 */
*pucBufStatus = EM_BUFEMPTY ;
return EM_SUCCESS;
}
switch(EG_modem_STS.mode)
{
case EM_MODEM_MODE_SDLC:
if(loop_size(EG_modem_STS.hdlc_recvbuf)>0)
*pucBufStatus = EM_BUFNOEMPTY ;
else
*pucBufStatus = EM_BUFEMPTY ;
break;
case EM_MODEM_MODE_ASYS:
if(loop_size(EG_modem_STS.serial_recvbuf)>0)
*pucBufStatus = EM_BUFNOEMPTY ;
else
*pucBufStatus = EM_BUFEMPTY ;
break;
default:
if(loop_size(EG_modem_STS.serial_recvbuf)>0)
*pucBufStatus = EM_BUFNOEMPTY ;
else
*pucBufStatus = EM_BUFEMPTY ;
break;
}
return EM_SUCCESS;
}
uchar EA_ucClrModemRecBuf(DevHandle hDev)
{
uprintf("API:%s\r\n",__FUNCTION__);;
if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS
&&EI_VerifyHandle_sync(hDev)!=EM_SUCCESS)
return EM_ERRHANDLE;
switch(EG_modem_STS.mode)
{
case EM_MODEM_MODE_SDLC:
loop_reset(EG_modem_STS.hdlc_recvbuf);
break;
case EM_MODEM_MODE_ASYS:
default:
loop_reset(EG_modem_STS.serial_recvbuf);
break;
}
return EM_SUCCESS;
}
uchar EA_ucIfPhoneUsed(DevHandle hDevHandle)
{
return EA_ucIfExistDialTone(hDevHandle);
}
uchar EA_ucModemIoctl(DevHandle hDev,ulong cmd,void *argu)
{
uchar ucMode;
uchar ucRet=EM_SUCCESS;
uprintf("API:%s\r\n",__FUNCTION__);;
if(EI_JudgeModemHandle(hDev,&ucMode)!=EM_SUCCESS)
return EM_ERRHANDLE;
switch(cmd)
{
case EM_modem_CMD_RESET_MODEM:
ucRet = EI_ResetModem();
break;
case EM_modem_CMD_DEBUG_ON:
ucRet = EI_ucIoctlDebug(1);
break;
case EM_modem_CMD_DEBUG_OFF:
ucRet = EI_ucIoctlDebug(0);
break;
case EM_modem_CMD_TEST_LINE:
EI_ucTestLine();
return EM_SUCCESS;
case EM_modem_CMD_CONNECT_TIME:
EI_ucSetConnectTime(argu);
return EM_SUCCESS;
case EM_modem_CMD_SNRM_TIME:
EI_ucSetSnrmTime(argu);
return EM_SUCCESS;
default:
ucRet = EM_ERROR;
break;
}
return ucRet;
}
uchar EA_ucSendAsys(DevHandle hDev, uint uiBufSize , const char *pcsBuf)
{
if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)
return EM_ERRHANDLE;
if(pcsBuf==NULL)
return EM_ERRPARAM;
if(uiBufSize==0)
return EM_SUCCESS;
if(EG_modem_STS.online!=EM_ONLINE_DATA)
return EM_ERROR;
EI_WriteUart((char *)pcsBuf,uiBufSize);
return EM_SUCCESS;
}
uchar EA_ucReadAsys(DevHandle hDev, uint uiSecond , uint uiReadLen ,
void *pvBuf , uint *puiBufSize)
{
unsigned int tout;
UNSIGNED time_start,time_cur;
unsigned int pos = 0;
int ret;
if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)
return EM_ERRHANDLE;
if(pvBuf==NULL||puiBufSize==NULL)
return EM_ERRPARAM;
time_start = NU_Retrieve_Clock();
if(uiSecond==0||uiSecond>60)
tout = EM_TIME_TICK_IN1S*60;
else
tout = EM_TIME_TICK_IN1S*uiSecond;
*puiBufSize = 0;
while(1)
{
if(EG_modem_STS.online!=EM_ONLINE_DATA)
return EM_ERROR;
time_cur = NU_Retrieve_Clock();
ret = loop_read(EG_modem_STS.serial_recvbuf,(char *)pvBuf+pos,uiReadLen-pos);
if(ret>0)
pos+=ret;
if(pos>=uiReadLen||time_cur>=(time_start+tout))
break;
}
*puiBufSize = pos;
return EM_SUCCESS;
}
char *cx_all[]={
"S30E00001700A9008D17463403D72217\r",
"S306000047DF4093\r",
"S306000047E4FFCF\r",
"S32500004B5926434849303031850DABE4140E28C3F677B40CB0F4140EA0C56C6C00FF000C90B2\r",
"S32500004B79014A0C01E7CC0C28C3F677CC0C5EF9CC0CA0C5176700FF0002B01080150A42001B\r",
"S32500004B990E00130F64000301000000000041DC022003320000001E010A0700002C00FF2F60\r",
"S32500004BB9FF1FFF0F03020A0041000A0041000414007800100058020219005A0019005A002D\r",
"S32500004BD9030000000000000000010000000000000000010A0041000A00410004140078008B\r",
"S32500004BF9B40058020219005A0019005A00030000000000000000010000000000000000019B\r",
"S32500004C196400005A5A4700000000004B2C0100000000000014000500000500780000000008\r",
"S32500004C390000000000201C010007004600008311401B00000800060208020701FF5A080158\r",
"S32500004C59FF010901FF060A01FE0E0B32FF551BFF00491CFF00001D0564325B010F0A5C0A6D\r",
"S30800004C790F0AFF1A\r"
};
char cx_default_patch_info[]=
"[TYPE=1]\x0d\x0a"
"[PATCH_BEGIN]\x0d\x0a"
"S32500003000A9008D1746830200200D3080FB4303C901B0577C163066306B308030853080309B\x0d\x0a"
"S3250000302090308030B4308030B4308030B430803007318030A4305E3065306530B94B308531\x0d\x0a"
"S3250000304040B94C3085414303F9AC604D300D0A52414D204C6F6164204572726F7200A00006\x0d\x0a"
"S32500003060203C30A22260C953F03760C390C930F0301419C933F02A1419C937F024A22060E5\x0d\x0a"
"S3250000308020B831801C20B831C3A314B3C3B3801120B831043AC000F004C080D0E0C3C3C314\x0d\x0a"
"S325000030A080E8E86020B831043AC31AC9FFD0CEC3297C183120B831043A0488048804880430\x0d\x0a"
"S325000030C08804880488048804880438E016D0D2830D000016F30BF02CF309F0C5F30CF0C13D\x0d\x0a"
"S325000030E092080000164E00166E02166E0116AD01168D160CAD02168D170C7B0CB494C2082A\x0d\x0a"
"S325000031001F0C809DA21C6020B831043A98A39DCACA14FBD00214326056311E315731A20009\x0d\x0a"
"S32500003120F30CD016830C000016F4CDC33DF027A31CA39888D0F960A26560F21B0C80F88301\x0d\x0a"
"S325000031400C000016F4CDC33DA31C8D800CA31C8D810C8888D0F260F308F008F30CD0094395\x0d\x0a"
"S32500003160006631A20060C37892080000164E00166E02166E01164E00166E02166E0116A93E\x0d\x0a"
"S32500003180008D740C8D750CA9D08D720CA9128D730CA9408D740CA9008D750CAD01168D7253\x0d\x0a"
"S325000031A00CAD02168D730CA9808D740CA9008D750CC2081F0CA2006004330433043304336C\x0d\x0a"
"S31F000031C038E9309011C90A900AE9119009C906B005890A041360DBA2206072\x0d\x0a"
"S70500003000CA\x0d\x0a"
"S025000000000123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEFDA\x0d\x0a"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -