📄 r_send.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 + -