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

📄 gprssend.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         :  GPRSSend.C                                  *
**  COPYRIGHT    :  (c) 2001 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**  By : CCH 2003.4.18                                          *
****************************************************************/
#include "includes.h"
#include "bsp.h"
#include "message.h"
#include "errtask.h"
#include "list.h"
#include "tools.h"
#include "roundbuf.h"
#include "socktask.h"
#include "udptask.h"
#include "ivudptsk.h"
#include "gsmtask.h"
#include "gprssend.h"
#include "zprint.h"




/*
********************************************************************************
*                  DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define NUM_CHA                         3
#define SML_NUM_MEM                     20
#define BIG_NUM_MEM                     2
#define SML_SIZE_DATA                   256
#define BIG_SIZE_DATA                   1024
#define SIZE_TEMPBUF                    2048



/*
********************************************************************************
*                  DEFINE CELL STRUCTURE
********************************************************************************
*/
#define CELL_COMMON                     INT8U       channel; \
                                        BOOLEAN     isbig; \
                                        INT16U      datalen

typedef struct {
    CELL_COMMON;
    INT8U   data[1];
} CELL_STRUCT;

typedef struct {
    CELL_COMMON;
    INT8U   data[SML_SIZE_DATA];
} SML_CELL_STRUCT;

typedef struct {
    CELL_COMMON;
    INT8U   data[BIG_SIZE_DATA];
} BIG_CELL_STRUCT;

/*
********************************************************************************
*                  DEFINE MODULE VARIANT
********************************************************************************
*/
static struct {
    NODE            reserve;
    SML_CELL_STRUCT cell;
} smlmemory[SML_NUM_MEM];

static struct {
    NODE            reserve;
    BIG_CELL_STRUCT cell;
} bigmemory[BIG_NUM_MEM];


static LIST  sendlist[NUM_CHA], smlfreelist, bigfreelist;
static INT8U tempbuf[SIZE_TEMPBUF];
static const INT8U maxcell[NUM_CHA] = {10, 10, 10};
static ASMRULE_STRUCT rules = {0x7e, 0x7d, 0x02, 0x01};




static void FreeCell(CELL_STRUCT *cell)
{
    if (cell->isbig)
        AppendListEle(&bigfreelist, (LISTMEM *)cell);
    else
        AppendListEle(&smlfreelist, (LISTMEM *)cell);
}

BOOLEAN SendFromGPRS(INT8U channel, INT8U priority, INT8U type, INT8U *data, INT16U datalen)
{
    CELL_STRUCT *cell;
    INT16U       pos;
    
    if (channel >= NUM_CHA) return FALSE;
    if (ListItem(&sendlist[channel]) >= maxcell[channel]) return FALSE;
    
    cell = 0;
    if (datalen + 5 > BIG_SIZE_DATA) return FALSE;
    if (datalen + 5 <= 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;
    
    pos = 1;
    cell->data[pos++] = priority;
    cell->data[pos++] = type;
    if (channel == CHA_IV_UDP) {
        cell->data[pos++] = datalen >> 8;
        cell->data[pos++] = datalen & 0xff;
    }
    memcpy(&cell->data[pos], data, datalen);
    cell->data[0] = GetChkSum_C(&cell->data[1], datalen + (pos - 1));
    cell->datalen = datalen + pos;
    cell->channel = channel;
    AppendListEle(&sendlist[channel], (LISTMEM *)cell);
    OSQPost(GsmTaskMsgQue, MSG_GPRSSEND_TSK, 0, 0);
    
    return TRUE;
}

static void DiagnoseProc(void)
{
    INT8U i, count;
    
    count = 0;
    for (i = 0; i < NUM_CHA; i++) {
        if (!CheckList(&sendlist[i])) ErrExit(ERR_GPRSSEND_MEM);
        count += ListItem(&sendlist[i]);
    }
    if (!CheckList(&smlfreelist) || !CheckList(&bigfreelist)) ErrExit(ERR_GPRSSEND_MEM);
    count += ListItem(&smlfreelist) + ListItem(&bigfreelist);
    if (count != sizeof(smlmemory)/sizeof(smlmemory[0]) + sizeof(bigmemory)/sizeof(bigmemory[0]))
        ErrExit(ERR_GPRSSEND_MEM);
}

void InitGPRSSend(void)
{
    INT8U i;
    
    for (i = 0; i < NUM_CHA; i++) InitList(&sendlist[i]);
    InitMemList(&smlfreelist, (LISTMEM *)smlmemory, sizeof(smlmemory)/sizeof(smlmemory[0]), sizeof(smlmemory[0]));
    InitMemList(&bigfreelist, (LISTMEM *)bigmemory, sizeof(bigmemory)/sizeof(bigmemory[0]), sizeof(bigmemory[0]));
    InstallDiagProc(DiagnoseProc);
}

void GPRSSendEntry(void)
{
    INT8U  i;
    INT16U templen;
    CELL_STRUCT *cell;
    

    if (GPRSComIsSuspended()) return;
    
    for (i = 0; i < NUM_CHA; i++) {
        if ((cell = (CELL_STRUCT *)GetListHead(&sendlist[i])) != 0) {
            switch (i) {
                case CHA_TCP:
                    templen = AssembleByRules(tempbuf, cell->data, cell->datalen, &rules);
                    if (templen > sizeof(tempbuf)) ErrExit(ERR_GPRSSEND_SEND);
                    if (SendFromSocket(tempbuf, templen)) {
                        #if DEBUG_UARTNo_GSMSTATUS <= 3
                        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<submit data to socktask>\n");
                        #endif
                        
                        FreeCell((CELL_STRUCT *)DelListHead(&sendlist[CHA_TCP]));
                        OSQPost(GsmTaskMsgQue, MSG_GPRSSEND_FREE, 0, 0);
                    }
                    break;
                case CHA_UDP:
                    if (SendFromUDPCom(cell->data, cell->datalen)) {
                        #if DEBUG_UARTNo_GSMSTATUS <= 3
                        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<submit data to udptask>\n");
                        #endif
                        
                        FreeCell((CELL_STRUCT *)DelListHead(&sendlist[CHA_UDP]));
                        OSQPost(GsmTaskMsgQue, MSG_GPRSSEND_FREE, 0, 0);
                    }
                    break;
                case CHA_IV_UDP:
                    templen = AssembleByRules(tempbuf, cell->data, cell->datalen, &rules);
                    if (templen > sizeof(tempbuf)) ErrExit(ERR_GPRSSEND_SEND);
                    
                    if (SendFromIVUDPCom(tempbuf, templen)) {
                        #if DEBUG_UARTNo_GSMSTATUS <= 3
                        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<submit data to ivudptsk>\n");
                        #endif

                        FreeCell((CELL_STRUCT *)DelListHead(&sendlist[CHA_IV_UDP]));
                        OSQPost(GsmTaskMsgQue, MSG_GPRSSEND_FREE, 0, 0);
                    }
                    break;
                default:
                    break;
            }
        }
    }
}

void ClearGPRSSendChannel(INT8U channel)
{
    LISTMEM *cell;
    
    if (channel < NUM_CHA) {
        for (;;) {
            cell = DelListHead(&sendlist[channel]);
            if (cell == 0) break;
            else FreeCell((CELL_STRUCT *)cell);
        }
    }
}

BOOLEAN GPRSChannelReady(INT8U channel)
{
    if (channel < NUM_CHA) {
        if (ListItem(&sendlist[channel]) < maxcell[channel] && 
        (ListItem(&smlfreelist) > 0 || ListItem(&bigfreelist) > 0))
            return TRUE;
        else 
            return FALSE;
    } else {
        return FALSE;
    }
}

⌨️ 快捷键说明

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