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

📄 r_send.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         :  r_send.c                                  *
**  COPYRIGHT    :  (c) 2001 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**  By : CCH 2002.1.15                                          *
****************************************************************/

#include "includes.h"
#include "uart_drv.h"
#include "tools.h"
#include "hardware.h"
#include "flash.h"
#include "message.h"
#include "list.h"
#include "timetask.h"
#include "at_core.h"
#include "tcpdrv.h"
#include "sm_list.h"
#include "sysframe.h"
#include "gsmtask.h"
#include "printer.h"
#include "systime.h"
#if EN_NOSIGNALRESEND > 0
#include "r_send.h"

#define PERIOD_SCAN       SECOND,  60

typedef struct 
{
	INT16U 			timeflag;
	SYSTIME_STRUCT	datatime;
} DATATIME_STRUCT;

typedef struct {
        INT16U  wrflag;
        INT16U  channltype;
        INT8U   mttellen;
        INT8U   mttel[SYS_TELLEN];
        INT8U   sendbuf[SIZE_MTDATA];
} MONITORBUF_STRUCT;

static INT8U    wr_sector, rd_sector;
static INT16U   wr_offset, rd_offset;
static TMR_TSK  *scantmr;
static DATATIME_STRUCT      blddatetime;
static MONITORBUF_STRUCT    tempmonitor;        

static INT16U   success = SUCCESS_;

#if DEBUG_UARTNo_GSMSTATUS <=3
static void PrintPara(void)
{
   	PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "\nwr_sector=");
   	SendFromUART_HEX(DEBUG_UARTNo_GSMSTATUS, wr_sector);
    PrintFromUART(DEBUG_UARTNo_GSMSTATUS,"\nwr_offset=");
    SendFromUART_HEX(DEBUG_UARTNo_GSMSTATUS, wr_offset>>8);
    SendFromUART_HEX(DEBUG_UARTNo_GSMSTATUS, wr_offset);
   	PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "\nrd_sector=");
   	SendFromUART_HEX(DEBUG_UARTNo_GSMSTATUS, rd_sector);
    PrintFromUART(DEBUG_UARTNo_GSMSTATUS,"\nrd_offset=");
    SendFromUART_HEX(DEBUG_UARTNo_GSMSTATUS, rd_offset>>8);
    SendFromUART_HEX(DEBUG_UARTNo_GSMSTATUS, rd_offset);
}
#endif

static void GotoNextWr(void)
{
    if (wr_offset == SIZE_FLASHID) {
        blddatetime.timeflag = SUCCESS_;
        GetSysTime((SYSTIME_STRUCT *)&blddatetime.datatime);
        FlashWrite(wr_sector, OFFSET_TIMEFLAG, (INT8U *)&blddatetime, sizeof(blddatetime));
    }
    wr_offset += DATA_LAN;
    if (wr_offset > SIZE_FLASHSECTOR-DATA_LAN) {
        FlashWrite(wr_sector, OFFSET_WRFLAG, (INT8U *)&success, 2);
        wr_offset = SIZE_FLASHID;
        if (++wr_sector > BLD_TOPSECTOR) {
            wr_sector = BLD_BOTTOMSECTOR;
        }
        if (ReadByteFrom_Flash(wr_sector, OFFSET_RDFLAG) == SUCCESS_) {
            SectorErase_Flash(wr_sector);
        } else {
            if (ReadByteFrom_Flash(wr_sector, OFFSET_WRFLAG) == SUCCESS_) {
                SectorErase_Flash(wr_sector);
                rd_offset = SIZE_FLASHID;
                rd_sector = wr_sector+1;
                if (rd_sector > BLD_TOPSECTOR) {
                    rd_sector = BLD_BOTTOMSECTOR;
                }
            }
        }
     }         
}

static void GotoNextRd(void)
{
    FlashWrite(rd_sector, rd_offset+OFFSET_RDFLAG, (INT8U *)&success, 2);
    rd_offset += DATA_LAN;
    if (rd_offset > SIZE_FLASHSECTOR-DATA_LAN) {
        FlashWrite(rd_sector, OFFSET_RDFLAG, (INT8U *)&success, 2);
        rd_offset = SIZE_FLASHID;
        if (++rd_sector > BLD_TOPSECTOR) {
            rd_sector = BLD_BOTTOMSECTOR;
        }
    }
}

void PrepareStoreDate(INT16U type, INT8U *tel, INT8U tellen, INT8U *dataptr)
{
    SYSFRAME_UP_STRUCT *tframe;
    
    if (!SysTimeValid()) return;
    
    tempmonitor.wrflag      = SUCCESS_;                    
    tempmonitor.channltype  = type;
    tempmonitor.mttellen     = tellen;
    memcpy(tempmonitor.mttel, tel, tellen);
    memcpy(tempmonitor.sendbuf, dataptr, SIZE_MTDATA);
    tframe = (SYSFRAME_UP_STRUCT *)tempmonitor.sendbuf;
    tframe->type[1] = 0x55;//这里改后校验和会错掉,但是在SM_List会重新计算并改写之
    FlashWrite(wr_sector, wr_offset+OFFSET_WRFLAG, (INT8U *)&tempmonitor, MTDATA_LAN+2);
    GotoNextWr();
    #if DEBUG_UARTNo_GSMSTATUS <=3
    PrintPara();
    #endif
}           
       
static void ScanTmrProc(void)
{
    StartTmr(scantmr, PERIOD_SCAN);
    if ((ReadByteFrom_Flash(rd_sector, rd_offset+OFFSET_RDFLAG) != SUCCESS_) &&
        (ReadByteFrom_Flash(rd_sector, rd_offset+OFFSET_WRFLAG) == SUCCESS_)) { //有数据等待发送时发消息
        OSQPost(GsmTaskMsgQue, MSG_MTRESEND_TSK, 0, 0);
    } 
}

void MTResendTskEntry(void)
{    
    if (NetworkRegisted()) {
       #if DEBUG_UARTNo_GSMSTATUS <=3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS,"\nNetworkRegisted!\n");
        #endif
        if (TCPDrvLoged()) {
            #if DEBUG_UARTNo_GSMSTATUS <=3
            PrintFromUART(DEBUG_UARTNo_GSMSTATUS,"\nTCPDrvLoged!\n");
            #endif
            memcpy((INT8U *)&tempmonitor.channltype,(INT8U *)FlashAbsAddr(rd_sector,rd_offset+OFFSET_MTDATA),MTDATA_LAN);      
            if (SendSM(tempmonitor.channltype,tempmonitor.mttel,
                    tempmonitor.mttellen,tempmonitor.sendbuf,SIZE_MTDATA,(void (*)(INT8U)) 0)) {
                #if DEBUG_UARTNo_GSMSTATUS <=3
                PrintFromUART(DEBUG_UARTNo_GSMSTATUS,"\n可以发送tempmonitor!\n");
                FormatPrintDataBlock(FORMAT_HEX, DEBUG_UARTNo_GSMSTATUS, tempmonitor.sendbuf, SIZE_MTDATA);
                #endif    
                GotoNextRd();
            } 
        }
    } 
}

static void InitWrPara(void)
{
    INT16U offset;
    INT8U  sector, i;

    sector = BLD_BOTTOMSECTOR;
    for (i=BLD_BOTTOMSECTOR;i<=BLD_TOPSECTOR;i++) {
    	#if DEBUG_UARTNo_GSMSTATUS <=3
    	PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "\ni=");
    	SendFromUART_HEX(DEBUG_UARTNo_GSMSTATUS, i);
    	PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "\nReadByteFrom_Flash(i, OFFSET_WRFLAG)=");
    	SendFromUART_HEX(DEBUG_UARTNo_GSMSTATUS, ReadByteFrom_Flash(i, OFFSET_WRFLAG));
    	#endif
        if (ReadByteFrom_Flash(i, OFFSET_WRFLAG)!=SUCCESS_) {//如果该扇区没有写满,则执行如下算法
            wr_sector = i;
            offset = SIZE_FLASHID;
            while(ReadByteFrom_Flash(i, offset+OFFSET_WRFLAG)==SUCCESS_) {
	            offset += DATA_LAN;
	            if ((offset+DATA_LAN)>SIZE_FLASHSECTOR) {
	                FlashWrite(i, OFFSET_WRFLAG, (INT8U *)&success, 2);
	                break;
	            } 
	        }
            if (offset+DATA_LAN < SIZE_FLASHSECTOR) {
                wr_offset = offset;
                return;
            }
        }
        if (CmpData((INT8U *)(FlashAbsAddr(i,OFFSET_TIME)),(INT8U *)(FlashAbsAddr(sector,OFFSET_TIME)),sizeof(SYSTIME_STRUCT),sizeof(SYSTIME_STRUCT))==STR_LESS) {
            sector = i;
        }
    }
    wr_sector = sector;
    wr_offset = SIZE_FLASHID;
    SectorErase_Flash(wr_sector);    
}

static void InitRdPara(void)
{
    INT8U   sector, i;
    INT16U  offset;
    
    sector = wr_sector + 1;
    offset = SIZE_FLASHID;
    if (sector > BLD_TOPSECTOR) {
        sector = BLD_BOTTOMSECTOR;
    }
    if (ReadByteFrom_Flash(sector, OFFSET_WRFLAG) != SUCCESS_) {
        sector = BLD_BOTTOMSECTOR;
    }     
    for (i=0; i<=BLD_TOPSECTOR-BLD_BOTTOMSECTOR; i++) {
        if (ReadByteFrom_Flash(sector, OFFSET_RDFLAG) != SUCCESS_) {
            while (ReadByteFrom_Flash(sector, offset+OFFSET_RDFLAG) == SUCCESS_) {
                offset += DATA_LAN;
                if (offset+DATA_LAN > SIZE_FLASHSECTOR) { 
                    FlashWrite(offset, OFFSET_RDFLAG, (INT8U *)&success, 2);
                    offset = SIZE_FLASHID;
                    if(++sector > BLD_TOPSECTOR) {
                        sector = BLD_BOTTOMSECTOR;
                    }
                    break;
                }
            }
            break;
        } else {
            if(++sector > BLD_TOPSECTOR) {
                sector = BLD_BOTTOMSECTOR;
            }
        }
    }
    rd_sector = sector;
    rd_offset = offset; 
}   

		
void InitBlindAreaResend(void) 
{
    InitWrPara();
    InitRdPara();
    scantmr  = CreateTimer(ScanTmrProc, 0);
    StartTmr(scantmr, MINUTE, 1); 
    #if DEBUG_UARTNo_GSMSTATUS <= 3
    PrintPara();
    #endif     
}
#endif

⌨️ 快捷键说明

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