📄 sm_list.c
字号:
if (!CheckList(listcollect[i])) ErrExit(ERR_SMLIST_MEM);
count += ListItem(listcollect[i]);
}
if (count != (sizeof(smlmemory)/sizeof(smlmemory[0]) + sizeof(bigmemory)/sizeof(bigmemory[0])))
ErrExit(ERR_SMLIST_MEM);
}
void InitSM_List(void)
{
numtest = 0;
InitList(&smlist);
InitList(&gpslist);
InitList(&tcplist);
InitList(&udplist);
InitList(&ivudplist);
InitList(&waitlist);
InitMemList(&smlfreelist, (LISTMEM *)smlmemory, sizeof(smlmemory)/sizeof(smlmemory[0]), sizeof(smlmemory[0]));
InitMemList(&bigfreelist, (LISTMEM *)bigmemory, sizeof(bigmemory)/sizeof(bigmemory[0]), sizeof(bigmemory[0]));
resendtmr = CreateTimer(ResendTmrProc, 0);
StartTmr(resendtmr, PERIOD_RESEND);
InstallDiagProc(DiagnoseProc);
}
BOOLEAN SendSM(INT16U attrib, INT8U *tel, INT8U tellen, INT8U *data, INT16U datalen, void (*fp)(INT8U result))
{
CELL_STRUCT *cell;
if (attrib & SM_ATTR_SM_CODEMASK) {
if (tellen > sizeof(cell->tel) || tellen == 0) return FALSE;
}
if (datalen > BIG_SIZE_DATA || datalen == 0) return FALSE;
if (attrib & SM_ATTR_GPS) {
if (ListItem(&gpslist) >= MAX_GPSCELL) return FALSE;
}
if (attrib & SM_ATTR_IVUDP) {
if (ListItem(&ivudplist) >= MAX_IVUDPCELL) return FALSE;
}
cell = 0;
if (datalen <= SML_SIZE_DATA) {
cell = (CELL_STRUCT *)DelListHead(&smlfreelist);
if (cell != 0) cell->isbig = FALSE;
}
if (cell == 0) {
cell = (CELL_STRUCT *)DelListHead(&bigfreelist);
if (cell != 0) cell->isbig = TRUE;
}
if (cell == 0) return FALSE;
cell->resend = 0;
cell->flowtime = 0;
cell->attrib = attrib;
cell->fp = fp;
if (attrib & SM_ATTR_SM_CODEMASK) {
cell->tellen = tellen;
memcpy(cell->tel, tel, tellen);
}
cell->datalen = datalen;
memcpy(cell->data, data, datalen);
if (cell->attrib & SM_ATTR_GPS)
AppendListEle(&gpslist, (LISTMEM *)cell);
else if (cell->attrib & SM_ATTR_TCP)
AppendListEle(&tcplist, (LISTMEM *)cell);
else if (cell->attrib & SM_ATTR_UDP)
AppendListEle(&udplist, (LISTMEM *)cell);
else if (cell->attrib & SM_ATTR_IVUDP)
AppendListEle(&ivudplist, (LISTMEM *)cell);
else
AppendListEle(&smlist, (LISTMEM *)cell);
OSQPost(GsmTaskMsgQue, MSG_SMLIST_TSK, 0, 0);
return TRUE;
}
static void SendCell(CELL_STRUCT *cell, LIST *curlist)
{
INT16U attrib, len;
INT8U *ptr, dcstype;
attrib = cell->attrib;
if (attrib & SM_ATTR_GPRS_CODEMASK) {
if (!GprsActivated()) {
if (attrib & SM_ATTR_TCP)
ActivateGPRS(ACTIVATE_TCP);
else if (attrib & SM_ATTR_UDP)
ActivateGPRS(ACTIVATE_UDP);
else
ActivateGPRS_DEF();
} else {
if (attrib & SM_ATTR_TCP) {
if (!CanSendFromTcpLink()) {
attrib &= ~SM_ATTR_GPRS_CODEMASK;
attrib |= SM_ATTR_UDP;
}
} else if (attrib & SM_ATTR_UDP) {
if (CanSendFromTcpLink()) {
attrib &= ~SM_ATTR_GPRS_CODEMASK;
attrib |= SM_ATTR_TCP;
}
}
}
if (attrib & SM_ATTR_TCP) {
if (TcpDrvCanCom() || cell->tellen == 0) {
attrib &= ~SM_ATTR_CODEMASK;
attrib |= SM_ATTR_TCP;
} else if (attrib & SM_ATTR_SM_CODEMASK) {
attrib &= ~SM_ATTR_GPRS_CODEMASK;
}
} else if (attrib & SM_ATTR_UDP) {
if (UDPDrvCanCom() || cell->tellen == 0) {
attrib &= ~SM_ATTR_CODEMASK;
attrib |= SM_ATTR_UDP;
} else if (attrib & SM_ATTR_SM_CODEMASK) {
attrib &= ~SM_ATTR_GPRS_CODEMASK;
}
}
if (attrib & SM_ATTR_IVUDP) {
attrib &= ~SM_ATTR_CODEMASK;
attrib |= SM_ATTR_IVUDP;
}
}
if ((attrib & SM_ATTR_SM_CODEMASK) == SM_ATTR_SM) {
attrib &= ~SM_ATTR_SM_CODEMASK;
attrib |= SM_ATTR_GSMCODE;
}
if ((attrib & SM_ATTR_SM_CODEMASK) == SM_ATTR_AUTOCODE) {
attrib &= ~SM_ATTR_SM_CODEMASK;
if (SearchGBCode(cell->data, cell->datalen))
attrib |= SM_ATTR_UNICODE;
else
attrib |= SM_ATTR_GSMCODE;
}
if ((attrib & SM_ATTR_GPRS_CODEMASK) == 0 && CanSendSM()) {
len = cell->datalen;
ptr = cell->data;
switch (attrib & SM_ATTR_SM_CODEMASK)
{
case SM_ATTR_GSMCODE:
#if EN_CODE6 > 0
if ((attrib & SM_ATTR_DISCODE6) == 0) {
len = CodeX_To_Code6(MODE_CODE7, tempbuf, cell->data, cell->datalen, sizeof(tempbuf));
ptr = tempbuf;
}
#endif
dcstype = SM_DCS_BIT7;
break;
case SM_ATTR_UNICODE:
dcstype = SM_DCS_UCS2;
break;
case SM_ATTR_CODE8:
dcstype = SM_DCS_BIT8;
break;
default:
dcstype = SM_DCS_BIT8;
break;
}
if (SendSM_DCS((INT8U)dcstype, (INT8U*)cell->tel, (INT8U)cell->tellen, (INT8U*)ptr, len, Informer, curlist))
PrintSM(attrib, cell);
else
Informer(_FAILURE, curlist);
}
switch(attrib & SM_ATTR_GPRS_CODEMASK)
{
case SM_ATTR_TCP:
if (!GprsActivated()) {
Informer(_FAILURE, curlist);
} else if (TcpDrvCanCom()) {
if (cell->datalen > sizeof(tempbuf) || cell->datalen < 6 + SYS_TELLEN) {
Informer(_SUCCESS, curlist);
} else {
memcpy(&tempbuf[0], &cell->data[0], 5);
memcpy(&tempbuf[5], &cell->data[5 + SYS_TELLEN], cell->datalen - (6 + SYS_TELLEN));
len = cell->datalen - (1 + SYS_TELLEN);
tempbuf[len] = GetChkSum_7C(tempbuf, len);
if (SendFromGPRS(CHA_TCP, 0x10, 0x02, tempbuf, len + 1)) {
PrintSM(attrib, cell);
Informer(_SUCCESS, curlist);
}
}
}
break;
case SM_ATTR_UDP:
if (!GprsActivated()) {
Informer(_FAILURE, curlist);
} else if (UDPDrvCanCom()) {
if (cell->datalen > sizeof(tempbuf) || cell->datalen < 6 + SYS_TELLEN) {
Informer(_SUCCESS, curlist);
} else {
memcpy(&tempbuf[0], &cell->data[0], 5);
memcpy(&tempbuf[5], &cell->data[5 + SYS_TELLEN], cell->datalen - (6 + SYS_TELLEN));
len = cell->datalen - (1 + SYS_TELLEN);
tempbuf[len] = GetChkSum_7C(tempbuf, len);
if (SendFromGPRS(CHA_UDP, 0x10, 0x02, tempbuf, len + 1)) {
PrintSM(attrib, cell);
Informer(_SUCCESS, curlist);
}
}
}
break;
case SM_ATTR_IVUDP:
if (IVUDPDrvCanCom()) {
if (SendFromGPRS(CHA_IV_UDP, 0x10, 0x07, cell->data, cell->datalen)) {
PrintSM(attrib, cell);
Informer(_SUCCESS, curlist);
}
} else {
Informer(_FAILURE, curlist);
}
break;
default:
break;
}
}
void SM_ListEntry(void)
{
INT8U i;
CELL_STRUCT *cell;
for (i = 0; i < 5; i++) {
if ((cell = (CELL_STRUCT *)GetListHead(listcollect[i])) != 0) {
SendCell(cell, listcollect[i]);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -