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

📄 sm_list.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -