ShipCentralControl/Anjiehui7_DTU/User/uart_dtu.c

2513 lines
71 KiB
C
Raw Normal View History

2025-04-03 15:59:48 +08:00
/*
*********************************************************************************************************
* IAR Development Kits
* on the
*
* M451
*
* Filename : uart_dtu.c
* Version : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/
#include "includes.h"
#include "drv_dtu.h"
#include "drv_gps.h"
// <20>˶<EFBFBD>״̬<D7B4><CCAC>Ĭ<EFBFBD><C4AC>Ϊ1<CEAA><31><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
volatile uint8_t Motion_Status = 1;
// <20><>ʼ<EFBFBD><CABC><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD>(<28><><EFBFBD>ٷ<EFBFBD><D9B7>ͣ<EFBFBD>
#define INITIAL_TRAN_COUNT 6
// <20><><EFBFBD><EFBFBD>ֵ
#define abs(x) ((x) < 0 ? -(x) : (x))
// GPS<50>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2010
#define GPS_BASE_YEAR 2010
// Boot-loader<65><72>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>
#define LDROM_BASE 0x100000ul // 1M
// GPRS<52><53><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define DTU_TASKM_DATA_COUNT 200
loopbuff_t DTU_TaskM;
uint8_t DTU_TaskM_Data[sizeof(uint8_t) * (DTU_TASKM_DATA_COUNT + 1)] = {0};
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݵIJɼ<C4B2>ʱ<EFBFBD><CAB1>
volatile uint32_t DTU_dataTime = 0;
// <20><><EFBFBD>ͳɹ<CDB3>ʱ<EFBFBD><CAB1>
volatile uint32_t DTU_succTime = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚϴ󣬲<CFB4><F3A3ACB2><EFBFBD><EFBFBD><EFBFBD>stack<63><6B><EFBFBD><EFBFBD>
char DTU_gpsData[2][DTU_GPSDATA_SIZE] = {0}; // <20><>չ<EFBFBD>ڴ<EFBFBD>
char DTU_recvBuff[DTU_RECVBUFF_SIZE] = {0}; // <20><>չ<EFBFBD>ڴ<EFBFBD>
// һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
#define UPGRADE_DATA_LEN 1024
// DTU_Task<73><6B><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>
uint8_t Task_sendBuff[TASK_SENDBUFF_SIZE] = {0}; // <20><>չ<EFBFBD>ڴ<EFBFBD>
#if UPGRADE_DATA_LEN >= SFLASH_ERASE_SIZE
#define TASK_RECVBUFF_SIZE (UPGRADE_DATA_LEN + 32)
#else
#define TASK_RECVBUFF_SIZE (SFLASH_ERASE_SIZE)
#endif
uint8_t Task_recvBuff[TASK_RECVBUFF_SIZE] = {0}; // <20><>չ<EFBFBD>ڴ<EFBFBD>
// <20>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ֪ͨ<D6AA><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SemaphoreHandle_t DTU_semUpgrade = NULL;
// <20><><EFBFBD>ڷ<EFBFBD><DAB7>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
#pragma pack(push, 1)
typedef struct
{
uint16_t mark;
unsigned ver : 7;
unsigned trans : 1;
unsigned reserved: 8;
uint16_t len;
union
{
uint16_t cmd;
struct
{
uint8_t err;
uint8_t cmd_L;
};
};
} bluetooth_recv_t;
typedef bluetooth_recv_t bluetooth_send_t;
typedef struct
{
unsigned staEPress3 : 2;
unsigned staETempr1 : 2;
unsigned staETempr2 : 2;
unsigned staETempr3 : 2;
unsigned staDiff : 2;
unsigned staPress : 2;
unsigned staEPress1 : 2;
unsigned staEPress2 : 2;
} bluetooth_sensor_t;
typedef struct
{
unsigned maskStamp : 1;
unsigned maskEPress1 : 1;
unsigned maskEPress2 : 1;
unsigned maskEPress3 : 1;
unsigned : 1;
unsigned maskLowPower : 1;
unsigned maskAbnormal : 1;
unsigned maskCharging : 1;
unsigned maskRssi : 1;
unsigned maskGPS : 1;
unsigned maskETempr1 : 1;
unsigned maskETempr2 : 1;
unsigned maskETempr3 : 1;
unsigned maskBattery : 1;
unsigned maskFlow : 1;
unsigned maskLeak : 1;
} bluetooth_mask_t;
typedef union
{
struct
{
unsigned sec : 6;
unsigned min : 6;
unsigned hour_L : 4;
unsigned hour_H : 1;
unsigned day : 5;
unsigned mon : 4;
unsigned year : 6;
};
uint32_t tm;
} bluetooth_timestamp_t;
typedef union
{
unsigned long long ll;
struct
{
unsigned long l;
unsigned long h;
};
} longlong_mask_t;
typedef struct
{
union
{
struct
{
unsigned sateCount : 5; // gps<70>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned posState : 1; // gps<70><73>λ״̬ <09><>0-GPSδ<53><CEB4>λ<EFBFBD><CEBB>1-GPS<50>Ѷ<EFBFBD>λ<EFBFBD><CEBB>
unsigned carState : 1; // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> <09><>0-<2D><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned carEvent : 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<CDA3>¼<EFBFBD><C2BC><EFBFBD>0-<2D><><EFBFBD><EFBFBD>״̬δ<CCAC>ı䣬1-<2D><><EFBFBD><EFBFBD>״̬<D7B4>Ѹı
};
uint8_t state;
};
bluetooth_timestamp_t time; // ʱ<><CAB1><EFBFBD><EFBFBD>
int32_t latitude;
int32_t longitude;
uint16_t speed;
} gps_data_t;
typedef struct // size = 158
{
uint32_t sample_time; // <20>ɼ<EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data_dtu_t dtuData; // size = 36
data_sample_t sampleData; // size = 118
} gprs_data_t;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FRAM<41>У<EFBFBD><D0A3>ɶϵ<C9B6><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint16_t check; // <20><>־<EFBFBD><D6BE><EFBFBD>̶<EFBFBD>Ϊ0x55AA
uint32_t ver; // <20>̼<EFBFBD><CCBC>
int32_t fileSize; // <20>̼<EFBFBD><CCBC><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
uint16_t fileCrc; // <20>̼<EFBFBD><CCBC>ܵ<EFBFBD>crc
int32_t offset; // <20><><EFBFBD>ι̼<CEB9>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
int32_t len; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
uint16_t crc; // <20><><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>crc
} upgrade_info_t;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>¼
typedef struct
{
uint32_t ver; // <20>̼<EFBFBD><CCBC>
int32_t fileSize; // <20>̼<EFBFBD><CCBC><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
uint16_t fileCrc; // <20>̼<EFBFBD><CCBC>ܵ<EFBFBD>crc
int32_t offset; // <20><><EFBFBD>ι̼<CEB9>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
int32_t len; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
uint8_t data[UPGRADE_DATA_LEN]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t crc; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>crc
} upgrade_frame_t;
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ͷ
typedef struct // size=12
{
unsigned short check; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>־, 0x55AA<41><41>ʾ<EFBFBD><CABE>Ч
unsigned upgrade_request : 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>0-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned upgrade_result : 3; // <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܱ<EFBFBD>־<EFBFBD><D6BE>0-<2D>ɹ<EFBFBD><C9B9><EFBFBD>1-ʧ<>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><E0B1A3>
unsigned encrypt_flag : 2; // <20><><EFBFBD>ܱ<EFBFBD>־<EFBFBD><D6BE> 0-<2D>޼<EFBFBD><DEBC>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><E0B1A3>
unsigned compress_flag : 2; // ѹ<><D1B9><EFBFBD><EFBFBD>־<EFBFBD><D6BE> 0-<2D><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>1-<2D><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0B1A3>
unsigned rerseved1 : 8; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0xFF
unsigned long upgrade_length; // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
unsigned rerseved2 : 8; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0xFF
unsigned rerseved3 : 8; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0xFF
unsigned short crc; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>crcУ<63><D0A3>
} TUpgradeHeader;
#pragma pack(pop)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
upgrade_info_t upInfo = {0};
// <20><><EFBFBD>ش<EFBFBD><D8B4>޵<EFBFBD><DEB5><EFBFBD><EFBFBD><EFBFBD>¼
upgrade_info_t boxesInfo = {0};
// <20><><EFBFBD>޵<EFBFBD><DEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char boxesBuff[16384 + 1] = {0};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>֮<EFBFBD><D6AE><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
const double EARTH_RADIUS = 6378.137;
double rad(double d)
{
return d * PI / 180.0;
}
double GetDistance(int32_t lat1, int32_t lng1, int32_t lat2, int32_t lng2)
{
double radLat1 = rad(lat1 * 0.000001);
double radLat2 = rad(lat2 * 0.000001);
double a = radLat1 - radLat2;
double b = rad(lng1 * 0.000001) - rad(lng2 * 0.000001);
double s = 2 * asin(sqrt(pow(sin(a / 2), 2) +
cos(radLat1) * cos(radLat2) * pow(sin(b / 2), 2)));
s = s * EARTH_RADIUS;
return s;
}
// <20>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><CAB1>
int32_t GPS_IsLateThan(bluetooth_timestamp_t *pNewTime, bluetooth_timestamp_t *pOldTime)
{
uint8_t newHour = (pNewTime->hour_H << 4) | pNewTime->hour_L;
uint8_t oldHour = (pOldTime->hour_H << 4) | pOldTime->hour_L;
if(pNewTime->year > pOldTime->year)
return TRUE;
if(pNewTime->year < pOldTime->year)
return FALSE;
if(pNewTime->mon > pOldTime->mon)
return TRUE;
if(pNewTime->mon < pOldTime->mon)
return FALSE;
if(pNewTime->day > pOldTime->day)
return TRUE;
if(pNewTime->day < pOldTime->day)
return FALSE;
if(newHour > oldHour)
return TRUE;
if(newHour < oldHour)
return FALSE;
if(pNewTime->min > pOldTime->min)
return TRUE;
if(pNewTime->min < pOldTime->min)
return FALSE;
return pNewTime->sec > pOldTime->sec;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t GPS_CalcInterval(bluetooth_timestamp_t *pNewTime, bluetooth_timestamp_t *pOldTime)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OldYear<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t newSeconds = Calc_SecondsFromYear(GPS_BASE_YEAR + pOldTime->year, pNewTime->year + GPS_BASE_YEAR, pNewTime->mon,
pNewTime->day, (pNewTime->hour_H << 4) | pNewTime->hour_L, pNewTime->min, pNewTime->sec);
uint32_t oldSeconds = Calc_SecondsFromYear(GPS_BASE_YEAR + pOldTime->year, pOldTime->year + GPS_BASE_YEAR, pOldTime->mon,
pOldTime->day, (pOldTime->hour_H << 4) | pOldTime->hour_L, pOldTime->min, pOldTime->sec);
return newSeconds - oldSeconds;
}
// <20><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĴ<D0B5><C4B4><EFBFBD><EFBFBD><EFBFBD>״̬ת<CCAC><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>е<EFBFBD>״̬
static uint8_t Bluetooth_ConvertStat(sensor_status_t *pStat)
{
if(pStat->notConnect)
return 3;
if(pStat->overFlow)
return 1;
if(pStat->underFlow)
return 2;
return 0;
}
// GPS uart
void GPS_IRQHandler(USART_Handle *huart)
{
uint8_t u8DTU = (uint8_t) huart->Instance->DR;
// printf("%c", u8DTU);
// ֱ<>Ӵ<EFBFBD><D3B4><EFBFBD>
DTU_Task0(u8DTU);
}
// GSM uart
void GPRS_IRQHandler(USART_Handle *huart)
{
uint8_t u8DTU = (uint8_t) huart->Instance->DR;
if(DTU_uartPrint)
{
// if(u8DTU == '\n')
// printf("\\n\n");
// else if(u8DTU == '\r')
// printf("\\r");
// else
printf("%c", u8DTU);
}
// <20><><EFBFBD><EFBFBD><EBBBBA>
LoopBuff_PutItem(&DTU_TaskM, &u8DTU);
}
void DTU_Open()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD>ڴ<EFBFBD>
// DTU_gpsData[0] = (char *) SRAM_Alloc(DTU_GPSDATA_SIZE);
// DTU_gpsData[1] = (char *) SRAM_Alloc(DTU_GPSDATA_SIZE);
// DTU_recvBuff = (char *) SRAM_Alloc(DTU_RECVBUFF_SIZE);
// Task_sendBuff = (uint8_t *) SRAM_Alloc(TASK_SENDBUFF_SIZE);
// Task_recvBuff = (uint8_t *) SRAM_Alloc(TASK_RECVBUFF_SIZE);
LoopBuff_Create(&DTU_TaskM, sizeof(uint8_t), DTU_TASKM_DATA_COUNT, 0, (uint32_t) DTU_TaskM_Data);
// <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
DTU_semUpgrade = xSemaphoreCreateBinary();
huart1.RxISR = GPRS_IRQHandler;
huart6.RxISR = GPS_IRQHandler;
SET_BIT(USART1->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
LL_USART_Enable(USART1);
/* <20><><EFBFBD><EFBFBD>GPS<50>˿<EFBFBD>: GPS<50><53>Debug<75><67><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>GPS<50>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>룬DEBUG<55>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD> */
SET_BIT(USART6->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>GPS<50><53><EFBFBD><EFBFBD>
void DTU_Task0(uint8_t c)
{
static uint16_t RdIdx = 0;
static uint8_t bufIdx = 0;
static data_dtu_t sample = {0};
static int32_t last_latitude, last_longitude;
static uint8_t gps_flag = 0, motion_count = 0, motionless_count = 0;
static uint32_t last_time = 0;
static uint32_t last_gpsTime = 0;
uint32_t time;
if(c == '$' || RdIdx >= DTU_GPSDATA_SIZE)
RdIdx = 0;
if(RdIdx == 0 && c != '$')
return;
if(c != '\r' && c != '\n')
DTU_gpsData[bufIdx][RdIdx++] = c;
else
{
// <20>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
DTU_gpsData[bufIdx][RdIdx] = 0;
RdIdx = 0;
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(parse_frame(&bufIdx, DTU_gpsData[bufIdx], &sample))
{
if(sample.sateCount > 0)
printf("sateCount:\t%d\n", sample.sateCount);
if(sample.posState)
{
time = Calc_SecondsFromYear(INITIAL_YEAR, sample.sysTime.year + 2000, sample.sysTime.month,
sample.sysTime.day, sample.sysTime.hour, sample.sysTime.minute, sample.sysTime.second);
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʱ<EFBFBD>
if(RTC_offsetSeconds == 0 && time >= DTU_gpsTime)
{
RTC_offsetSeconds = time - DTU_gpsTime;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SFlash<73><68>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
CheckFramSFlashValid(DTU_gpsTime);
}
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʱ<EFBFBD>
if(time >= DTU_gpsTime) // ÿ<>γɹ<CEB3><C9B9><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
RTC_offsetSeconds = time - DTU_gpsTime;
if(sample.sateCount >= 4)
{
if(time >= last_time + dcBuff.configData.intervalGPS)
{
last_time = time;
// û<><C3BB>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>ٶȼƣ<C8BC><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ж<EFBFBD>
if(sample.speed <= 3)
{
motion_count = 0;
if(Motion_Status == 1 && ++motionless_count >= 3)
{
Motion_Status = 0;
printf("\nSoft Motion status = 0\n");
}
}
else
{
motionless_count = 0;
if(Motion_Status == 0 && ++motion_count >= 3)
{
Motion_Status = 1;
printf("\nSoft Motion status = 1\n");
}
}
printf("Latitude:\t%10.6f\n", sample.latitude * 0.000001);
printf("Longitude:\t%10.6f\n", sample.longitude * 0.000001);
printf("Speed:\t\t%d km/h\n", sample.speed);
printf("GPS time:\t%d-%02d-%02d %02d:%02d:%02d\n",
sample.sysTime.year + 2000, sample.sysTime.month, sample.sysTime.day,
sample.sysTime.hour, sample.sysTime.minute, sample.sysTime.second);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴζ<CFB4>λ֮<CEBB><D6AE><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>˶<EFBFBD>״̬
if(gps_flag == 1 && (
!Motion_Status
// || (sample.speed < 5 && GetDistance(last_latitude, last_longitude, sample.latitude, sample.longitude) < 10)
))
{
printf("\nCalibrate to last position\n");
sample.latitude = last_latitude;
sample.longitude = last_longitude;
}
else
{
gps_flag = 1;
last_latitude = sample.latitude;
last_longitude = sample.longitude;
}
// д<><D0B4>ȫ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>
dcBuff.dtuData.posState = sample.posState;
dcBuff.dtuData.sateCount = sample.sateCount;
dcBuff.dtuData.latitude = sample.latitude;
dcBuff.dtuData.longitude = sample.longitude;
dcBuff.dtuData.speed = sample.speed;
dcBuff.dtuData.sysTime = sample.sysTime;
// ÿ30<33><EFBFBD><EBB1A3>һ<EFBFBD>ζ<EFBFBD>λ<EFBFBD><CEBB>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
if(time >= last_gpsTime + 30)
{
last_gpsTime = time;
Ext_GPS.sysTime = dcBuff.dtuData.sysTime;
Ext_GPS.longitude = dcBuff.dtuData.longitude;
Ext_GPS.latitude = dcBuff.dtuData.latitude;
Ext_GPS.speed = dcBuff.dtuData.speed;
Ext_GPS.sateCount = dcBuff.dtuData.sateCount;
Ext_GPS.posState = dcBuff.dtuData.posState;
FRAM_SaveInfo(FRAM_GPS_INFO_BASE, (uint8_t *) &Ext_GPS, sizeof(ext_gps_t));
}
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memset(&sample, 0, sizeof(sample));
}
}
}
uint8_t pack_gprs_tran_data(ext_data_t *pGprs, uint8_t is4G)
{
uint16_t i, j;
bluetooth_sensor_t *pSensor;
bluetooth_mask_t *pMask;
uint16_t crc;
rf_app_data_t *pData = (rf_app_data_t *) pGprs->payload;
static data_sample_t sample;
// TODO: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
cacl_gprs_tran_data(pGprs, &sample);
// <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>modbus<75>ӻ<EFBFBD><D3BB><EFBFBD>Ӧ<EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD>
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = 0;
// PSN
memmove(Task_sendBuff + i, pGprs->oriPSN, 6);
i += 6;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Task_sendBuff[i++] = 0x10;
// <20><><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD>Ԥ<EFBFBD><D4A4>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸ģ<DEB8>λ<EFBFBD><CEBB>ΪTask_sendBuff[7]
Task_sendBuff[i++] = 0;
// <20><>ǰ<EFBFBD><C7B0>ѹֵ
*(uint16_t *) (Task_sendBuff + i) = htons(sample.diff);
i +=2 ;
// <20>ݻ<EFBFBD><DDBB>ٷֱ<D9B7>
*(uint16_t *) (Task_sendBuff + i) = htons(sample.volumePct);
i += 2;
// <20><>ǰ<EFBFBD>ݻ<EFBFBD>
*(uint32_t *) (Task_sendBuff + i) = htonl(sample.volume);
i += 4;
// <20><><EFBFBD><EFBFBD>
*(uint32_t *) (Task_sendBuff + i) = htonl(sample.weight);
i += 4;
if(pData->Sensor.measure_type == 0) // <20><>ѹ
{
// <20>߶ȣ<DFB6>mmWC
*(uint16_t *) (Task_sendBuff + i) = htons((uint16_t) (sample.diff * 101.9716213));
}
else if(pData->Sensor.measure_type == 2) // <20><><EFBFBD><EFBFBD>
{
// <20>߶ȣ<DFB6>mm
*(uint16_t *) (Task_sendBuff + i) = htons((uint16_t) (sample.height));
}
i += 2;
// ѹ<><D1B9>
*(uint16_t *) (Task_sendBuff + i) = htons(pData->press);
i += 2;
// <20><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
*(int16_t *) (Task_sendBuff + i) = htons(is4G ? 3 : 1); // 1-<2D><>ʶΪLoRaת<61><D7AA>,2-<2D><>־Ϊ<D6BE><CEAA><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>3-<2D><>־Ϊ4Gת<47><D7AA>
i += 2;
// ҺԴ
if(pData->Sensor.L_source <= SOURCE_POPO)
Task_sendBuff[i] = pData->Sensor.L_source;
i++;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pData->Sensor.bottle_type == BOTTLE_TYPE_STAND)
Task_sendBuff[i] = 0;
else if(pData->Sensor.bottle_type == BOTTLE_TYPE_LYING)
Task_sendBuff[i] = 1;
else if(pData->Sensor.bottle_type == BOTTLE_TYPE_SPHERICAL)
Task_sendBuff[i] = 2;
i++;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pSensor = (bluetooth_sensor_t *) (Task_sendBuff + i);
pSensor->staDiff = pData->Sensor.staDiff;
pSensor->staPress = pData->Sensor.staPress;
pSensor->staEPress1 = 3;
pSensor->staEPress2 = 3;
pSensor->staEPress3 = 3;
pSensor->staETempr1 = pData->Sensor.staETempr1;
pSensor->staETempr2 = 3;
pSensor->staETempr3 = 3;
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
pMask = (bluetooth_mask_t *) (Task_sendBuff + i);
memset(pMask, 0xFF, 2);
pMask->maskFlow = 0;
pMask->maskLowPower = pData->Sensor.bat_low;
pMask->maskAbnormal = 0;
pMask->maskCharging = pData->Sensor.charging;
i += 2;
// <20><EFBFBD><E6B1BE>
Task_sendBuff[i++] = dcBuff.powerInfo.protocolVer.minor;
// rssi
Task_sendBuff[i++] = 0;
if(pMask->maskGPS)
{
// <20><><EFBFBD><EFBFBD>
*(int32_t *) (Task_sendBuff + i) = htonl(pData->longitude);
i += 4;
// γ<><CEB3>
*(int32_t *) (Task_sendBuff + i) = htonl(pData->latitude);
i += 4;
}
// <20><>չ<EFBFBD><EFBFBD>
if(pMask->maskETempr1)
{
*(uint16_t *) (Task_sendBuff + i) = htons(pData->tempr);
i += 2;
}
if(pMask->maskETempr2)
{
i += 2;
}
if(pMask->maskETempr3)
{
i += 2;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
if(pMask->maskBattery)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ٷֱ<D9B7>
*(uint16_t *) (Task_sendBuff + i) = htons(pData->batPct);
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>
i += 2;
// <20><><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><C7B0>ѹ
*(int16_t *) (Task_sendBuff + i) = htons(pData->voltage);
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 2;
// <20><><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7>ű<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ŵ<EFBFBD>״̬
*(int16_t *) (Task_sendBuff + i) = htons(pData->batCurrent);
i += 2;
// <20><><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>
i += 2;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pMask->maskFlow)
{
// <20><><EFBFBD><EFBFBD>MODBUS /A1 ͨ<><CDA8>Э<EFBFBD><D0AD> (BCD<43>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 6;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 4;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 4;
// <20><EFBFBD>
i += 4;
// ѹ<><D1B9>
i += 4;
}
// й¶<D0B9><C2B6><EFBFBD><EFBFBD>
if(pMask->maskLeak)
{
// <20><><EFBFBD><EFBFBD>
Task_sendBuff[i++] = LEAK_TYPE_SWITCH | LEAK_TYPE_CURRENT | LEAK_TYPE_MODBUS;
// ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ũ<EFBFBD><C5A8>
Task_sendBuff[i++] = 0x80;
}
if(pMask->maskStamp)
{
if(dcBuff.powerInfo.protocolVer.minor == 107)
{
*(uint32_t *) (Task_sendBuff + i) = htonl(pData->relative_time + (RTC_offsetSeconds + rf_get_seconds() - pGprs->recvTime));
}
// ʱ<><CAB1>
i += 4;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 4;
}
// <20><>չѹ<D5B9><D1B9>
if(pMask->maskEPress1)
{
i += 2;
}
if(pMask->maskEPress2)
{
i += 2;
}
if(pMask->maskEPress3)
{
i += 2;
}
// Ӳ<><D3B2><EFBFBD>
// Task_sendBuff[i++] = ((pData->hardVer / 10) << 4) + pData->hardVer % 10;
Task_sendBuff[i++] = pData->hardVer;
// <20><><EFBFBD><EFBFBD><EFBFBD>
// Task_sendBuff[i++] = ((pData->softVer / 10) << 4) + pData->softVer % 10;;
Task_sendBuff[i++] = pData->softVer;
// <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD>
for(j = 0; j < 2; j++)
{
// ״̬
*(uint16_t *) (Task_sendBuff + i) = htons(0);
i += 2;
// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 2;
// <20><><EFBFBD>ն<EFBFBD>
i += 4;
// ©<><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 4;
}
// <20><>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD>
*(uint32_t *) (Task_sendBuff + i) = htonl(Theoretical_Param.v);
i += 4;
// <20><><EFBFBD>޷<EFBFBD>ͷֱ<CDB7>߳<EFBFBD>
*(uint16_t *) (Task_sendBuff + i) = htons(0);
i += 2;
// <20><><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD>
*(uint32_t *) (Task_sendBuff + i) = htonl(pData->L);
i += 4;
// <20><><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>
*(uint32_t *) (Task_sendBuff + i) = htonl(pData->d);
i += 4;
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
i += 2;
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>Ƶ<EFBFBD><C6B5>
i += 2;
// <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
Task_sendBuff[7] = i - 8;
// У<><D0A3><EFBFBD><EFBFBD>
crc = MODBUS_RTU_CRC16((uint8_t *) Task_sendBuff, i);
*(uint16_t *)(Task_sendBuff + i) = htons(crc);
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Task_sendBuff[i++] = 0x0d;
Task_sendBuff[i++] = 0x0a;
return i;
}
uint8_t pack_modbus_tran_data(ext_data_t *pGprs)
{
uint16_t i, j;
bluetooth_sensor_t *pSensor;
bluetooth_mask_t *pMask;
uint16_t crc;
rf_app_data_t *pData = (rf_app_data_t *) pGprs->payload;
static data_sample_t sample;
// TODO: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
cacl_gprs_tran_data(pGprs, &sample);
// <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>modbus<75>ӻ<EFBFBD><D3BB><EFBFBD>Ӧ<EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD>
memset(Modbus_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = 0;
// PSN
memmove(Modbus_sendBuff + i, pGprs->oriPSN, 6);
i += 6;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Modbus_sendBuff[i++] = 0x10;
// <20><><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD>Ԥ<EFBFBD><D4A4>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸ģ<DEB8>λ<EFBFBD><CEBB>ΪModbus_sendBuff[7]
Modbus_sendBuff[i++] = 0;
// <20><>ǰ<EFBFBD><C7B0>ѹֵ
*(uint16_t *) (Modbus_sendBuff + i) = htons(sample.diff);
i +=2 ;
// <20>ݻ<EFBFBD><DDBB>ٷֱ<D9B7>
*(uint16_t *) (Modbus_sendBuff + i) = htons(sample.volumePct / 100);
i += 2;
// <20><>ǰ<EFBFBD>ݻ<EFBFBD>
*(uint32_t *) (Modbus_sendBuff + i) = htonl(sample.volume);
i += 4;
// <20><><EFBFBD><EFBFBD>
*(uint32_t *) (Modbus_sendBuff + i) = htonl(sample.weight);
i += 4;
if(pData->Sensor.measure_type == 0) // <20><>ѹ
{
// <20>߶ȣ<DFB6>mmWC
*(uint16_t *) (Modbus_sendBuff + i) = htons((uint16_t) (sample.diff * 101.9716213));
}
else if(pData->Sensor.measure_type == 2) // <20><><EFBFBD><EFBFBD>
{
// <20>߶ȣ<DFB6>mm
*(uint16_t *) (Modbus_sendBuff + i) = htons((uint16_t) (sample.height));
}
i += 2;
// ѹ<><D1B9>
*(uint16_t *) (Modbus_sendBuff + i) = htons(pData->press);
i += 2;
// <20><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
*(int16_t *) (Modbus_sendBuff + i) = 1; // 1-<2D><>ʶΪLoRaת<61><D7AA>,2-<2D><>־Ϊ<D6BE><CEAA><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>3-<2D><>־Ϊ4Gת<47><D7AA>
i += 2;
// ҺԴ
if(pData->Sensor.L_source <= SOURCE_POPO)
Modbus_sendBuff[i] = pData->Sensor.L_source;
i++;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pData->Sensor.bottle_type == BOTTLE_TYPE_STAND)
Modbus_sendBuff[i] = 0;
else if(pData->Sensor.bottle_type == BOTTLE_TYPE_LYING)
Modbus_sendBuff[i] = 1;
else if(pData->Sensor.bottle_type == BOTTLE_TYPE_SPHERICAL)
Modbus_sendBuff[i] = 2;
i++;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pSensor = (bluetooth_sensor_t *) (Modbus_sendBuff + i);
pSensor->staDiff = pData->Sensor.staDiff;
pSensor->staPress = pData->Sensor.staPress;
pSensor->staEPress1 = 3;
pSensor->staEPress2 = 3;
pSensor->staEPress3 = 3;
pSensor->staETempr1 = pData->Sensor.staETempr1;
pSensor->staETempr2 = 3;
pSensor->staETempr3 = 3;
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
pMask = (bluetooth_mask_t *) (Modbus_sendBuff + i);
memset(pMask, 0xFF, 2);
pMask->maskFlow = 0;
pMask->maskLowPower = pData->Sensor.bat_low;
pMask->maskAbnormal = 0;
pMask->maskCharging = pData->Sensor.charging;
i += 2;
// <20><EFBFBD><E6B1BE>
Modbus_sendBuff[i++] = dcBuff.powerInfo.protocolVer.minor;
// rssi
Modbus_sendBuff[i++] = 0;
if(pMask->maskGPS)
{
// <20><><EFBFBD><EFBFBD>
*(int32_t *) (Modbus_sendBuff + i) = htonl(pData->longitude);
i += 4;
// γ<><CEB3>
*(int32_t *) (Modbus_sendBuff + i) = htonl(pData->latitude);
i += 4;
}
// <20><>չ<EFBFBD><EFBFBD>
if(pMask->maskETempr1)
{
*(uint16_t *) (Modbus_sendBuff + i) = htons(pData->tempr);
i += 2;
}
if(pMask->maskETempr2)
{
i += 2;
}
if(pMask->maskETempr3)
{
i += 2;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
if(pMask->maskBattery)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ٷֱ<D9B7>
*(uint16_t *) (Modbus_sendBuff + i) = htons(pData->batPct);
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>
i += 2;
// <20><><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><C7B0>ѹ
*(int16_t *) (Modbus_sendBuff + i) = htons(pData->voltage);
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 2;
// <20><><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7>ű<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ŵ<EFBFBD>״̬
*(int16_t *) (Modbus_sendBuff + i) = htons(pData->batCurrent);
i += 2;
// <20><><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>
i += 2;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pMask->maskFlow)
{
// <20><><EFBFBD><EFBFBD>MODBUS /A1 ͨ<><CDA8>Э<EFBFBD><D0AD> (BCD<43>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 6;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 4;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 4;
// <20><EFBFBD>
i += 4;
// ѹ<><D1B9>
i += 4;
}
// й¶<D0B9><C2B6><EFBFBD><EFBFBD>
if(pMask->maskLeak)
{
// <20><><EFBFBD><EFBFBD>
Modbus_sendBuff[i++] = LEAK_TYPE_SWITCH | LEAK_TYPE_CURRENT | LEAK_TYPE_MODBUS;
// ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ũ<EFBFBD><C5A8>
Modbus_sendBuff[i++] = 0x80;
}
if(pMask->maskStamp)
{
if(dcBuff.powerInfo.protocolVer.minor == 107)
{
*(uint32_t *) (Modbus_sendBuff + i) = htonl(pData->relative_time + (RTC_offsetSeconds + rf_get_seconds() - pGprs->recvTime));
}
// ʱ<><CAB1>
i += 4;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 4;
}
// <20><>չѹ<D5B9><D1B9>
if(pMask->maskEPress1)
{
i += 2;
}
if(pMask->maskEPress2)
{
i += 2;
}
if(pMask->maskEPress3)
{
i += 2;
}
// Ӳ<><D3B2><EFBFBD>
// Modbus_sendBuff[i++] = ((pData->hardVer / 10) << 4) + pData->hardVer % 10;
Modbus_sendBuff[i++] = pData->hardVer;
// <20><><EFBFBD><EFBFBD><EFBFBD>
// Modbus_sendBuff[i++] = ((pData->softVer / 10) << 4) + pData->softVer % 10;;
Modbus_sendBuff[i++] = pData->softVer;
// <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD>
for(j = 0; j < 2; j++)
{
// ״̬
*(uint16_t *) (Modbus_sendBuff + i) = htons(0);
i += 2;
// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 2;
// <20><><EFBFBD>ն<EFBFBD>
i += 4;
// ©<><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += 4;
}
// <20><>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD>
*(uint32_t *) (Modbus_sendBuff + i) = htonl(Theoretical_Param.v);
i += 4;
// <20><><EFBFBD>޷<EFBFBD>ͷֱ<CDB7>߳<EFBFBD>
*(uint16_t *) (Modbus_sendBuff + i) = htons(0);
i += 2;
// <20><><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD>
*(uint32_t *) (Modbus_sendBuff + i) = htonl(pData->L);
i += 4;
// <20><><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>
*(uint32_t *) (Modbus_sendBuff + i) = htonl(pData->d);
i += 4;
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
i += 2;
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>Ƶ<EFBFBD><C6B5>
i += 2;
// <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
Modbus_sendBuff[7] = i - 8;
// У<><D0A3><EFBFBD><EFBFBD>
crc = MODBUS_RTU_CRC16((uint8_t *) Modbus_sendBuff, i);
*(uint16_t *)(Modbus_sendBuff + i) = htons(crc);
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Modbus_sendBuff[i++] = 0x0d;
Modbus_sendBuff[i++] = 0x0a;
return i;
}
////////////////////////////////////////////////////////////////////////////////////////
// <20><>д˫<D0B4><CBAB>ͨѶ<CDA8>Ĺ̶<C4B9><CCB6>ֶ<EFBFBD>
uint16_t fill_biDir_fixFields(uint16_t cmd, uint16_t len)
{
bluetooth_send_t *pSend = (bluetooth_send_t *) Task_sendBuff;
uint16_t crc;
pSend->mark = CONFIG_MARK_LS;
pSend->ver = htons(dcBuff.powerInfo.protocolVer.major);
pSend->trans = 0;
pSend->len = htons(len - sizeof(bluetooth_send_t) + 2);
pSend->cmd = htons(cmd);
crc = MODBUS_RTU_CRC16((uint8_t *) Task_sendBuff, len);
Int2ByteS(Task_sendBuff, len, htons(crc));
return len + 2;
}
uint16_t pack_ldms_info_data(uint32_t dataTime, uint32_t totalSeconds)
{
uint16_t i = 0;
S_RTC_TIME_DATA_T sRTC;
bluetooth_timestamp_t t;
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
// ͷ<><CDB7>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
i += sizeof(bluetooth_send_t);
// PSN
memmove(Task_sendBuff + i, dcBuff.configBottle.PSN, 6);
i += 6;
Task_sendBuff[i++] = dcBuff.powerInfo.hardVer.major;
Task_sendBuff[i++] = dcBuff.powerInfo.hardVer.minor;
Task_sendBuff[i++] = dcBuff.powerInfo.softVer.major;
Task_sendBuff[i++] = dcBuff.powerInfo.softVer.minor;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>yyyymmdd
Int2ByteL(Task_sendBuff, i, htonl((2000 + dcBuff.powerInfo.softDate.year) * 10000 + dcBuff.powerInfo.softDate.month * 100 + dcBuff.powerInfo.softDate.day));
i += 4;
// Report format
Task_sendBuff[i++] = dcBuff.powerInfo.protocolVer.major;
Task_sendBuff[i++] = dcBuff.powerInfo.protocolVer.minor;
// Config format
Task_sendBuff[i++] = dcBuff.configBottle.header.ver.major;
Task_sendBuff[i++] = dcBuff.configBottle.header.ver.minor;
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3BA><EFBFBD><EFBFBD>
Int2ByteL(Task_sendBuff, i, htonl(totalSeconds / 60));
i += 4;
Int2ByteS(Task_sendBuff, i, htons(SYS_RSTSTS));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.dtuData.batCurrent));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.dtuData.batVoltage / 10));
i += 2;
Task_sendBuff[i++] = dcBuff.dtuData.batPct;
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.dtuData.batCapa));
i += 4;
Task_sendBuff[i] = 0;
i++;
if(dcBuff.dtuData.posState)
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.dtuData.latitude));
i += 4;
if(dcBuff.dtuData.posState)
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.dtuData.longitude));
i += 4;
// <20><>λʱ<CEBB><CAB1>
if(dcBuff.dtuData.posState && dcBuff.dtuData.sysTime.year)
{
t.year = dcBuff.dtuData.sysTime.year + 2000 - 2010;
t.mon = dcBuff.dtuData.sysTime.month;
t.day = dcBuff.dtuData.sysTime.day;
t.hour_H = dcBuff.dtuData.sysTime.hour >> 4;
t.hour_L = dcBuff.dtuData.sysTime.hour & 0x0F;
t.min = dcBuff.dtuData.sysTime.minute;
t.sec = dcBuff.dtuData.sysTime.second;
Int2ByteL(Task_sendBuff, i, htonl(t.tm));
}
i += 4;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Task_sendBuff[i++] = dcBuff.dtuData.sateCount;
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
Wakeup_CalcUTCTime(dataTime + RTC_offsetSeconds, &sRTC);
t.year = sRTC.u32Year - 2010;
t.mon = sRTC.u32Month;
t.day = sRTC.u32Day;
t.hour_H = sRTC.u32Hour >> 4;
t.hour_L = sRTC.u32Hour & 0x0F;
t.min = sRTC.u32Minute;
t.sec = sRTC.u32Second;
Int2ByteL(Task_sendBuff, i, htonl(t.tm));
i += 4;
// <20>ź<EFBFBD>ǿ<EFBFBD><C7BF>
Task_sendBuff[i++] = dcBuff.dtuData.rssi;
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.powerInfo.gprsSuccCount));
i += 4;
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.powerInfo.gprsSendCount - dcBuff.powerInfo.gprsSuccCount));
i += 4;
if(dcBuff.powerInfo.gprsSendCount > 0)
Task_sendBuff[i] = dcBuff.powerInfo.gprsSuccCount * 100 / dcBuff.powerInfo.gprsSendCount;
i++;
memmove(Task_sendBuff + i, dcBuff.powerInfo.gprsFailCode, strlen(dcBuff.powerInfo.gprsFailCode));
i += 6;
memmove(Task_sendBuff + i, dcBuff.powerInfo.simNumber, strlen(dcBuff.powerInfo.simNumber));
i += 24;
// Int2ByteL(Task_sendBuff, i, htonl(dcBuff.powerInfo.bdNumber));
i += 4;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Task_sendBuff[i++] = dcBuff.configBottle.type;
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configBottle.diameter));
i += 4;
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configBottle.len));
i += 4;
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configBottle.lenExtra));
i += 4;
Int2ByteL(Task_sendBuff, i, htonl(Theoretical_Param.v));
i += 4;
Task_sendBuff[i++] = dcBuff.configBottle.chargePct;
Task_sendBuff[i++] = dcBuff.configBottle.source;
// Int2ByteS(Task_sendBuff, i, htons(Config_GetDensity(dcBuff.configBottle.source) * 1000));
i += 2;
Task_sendBuff[i++] = dcBuff.configBottle.dispMode;
// if(dcBuff.configDisplay.L_Unit == UNIT_KPA)
// Task_sendBuff[i] = 0;
// else if(dcBuff.configDisplay.L_Unit == UNIT_KG)
// Task_sendBuff[i] = 1;
// else if(dcBuff.configDisplay.L_Unit == UNIT_L)
// Task_sendBuff[i] = 2;
// else if(dcBuff.configDisplay.L_Unit == UNIT_MMH2O)
// Task_sendBuff[i] = 4;
// else
// Task_sendBuff[i] = 3;
i++;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.serverVer));
i += 2;
memmove(Task_sendBuff + i, dcBuff.configData.server, strlen(dcBuff.configData.server));
i += 26;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configData.port));
i += 2;
memmove(Task_sendBuff + i, dcBuff.configData.gpsServer, strlen(dcBuff.configData.gpsServer));
i += 26;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configData.gpsPort));
i += 2;
memmove(Task_sendBuff + i, dcBuff.configData.upgServer, strlen(dcBuff.configData.upgServer));
i += 26;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configData.upgPort));
i += 2;
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configData.intervalTrans));
i += 4;
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configData.intervalSample));
i += 4;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configData.intervalGPSTrans));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configData.intervalGPS));
i += 2;
Task_sendBuff[i++] = dcBuff.configData.timeLag;
strcpy((char *) Task_sendBuff + i, DTU_DecideAPN());
i += 20;
// Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configDisplay.bdCommander));
i += 4;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.warnPress));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.warnPressH));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.fullPct));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.priPct));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.orderPct));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.emptyPct));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.warnVolt));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.warnVoltH));
i += 2;
//Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configBottle.planMount));
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configBottle.offlineSeconds));
i += 4;
//Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configBottle.predictMount));
i += 4;
//Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.floorLevel));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.warnTempr)); // span
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.warnTemprH)); // spanPeriod
i += 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
// Task_sendBuff[i] = dcBuff.configDisplay.op_USE_CAPACITY_SENSOR ? 2 : dcBuff.configBottle.measureType;
i++;
// Task_sendBuff[i] = 0;
i++;
// Task_sendBuff[i] = dcBuff.configDisplay.op_USE_PT100_SENSOR ? 0 : 1;
i++;
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorDPress.lowRange));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorDPress.highRange));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorDPress.zeroValue));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorDPress.fullValue));
i += 2;
// <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorCap.baseC));
i += 2;
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorCap.refC));
i += 2;
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorCap.c1ADC));
i += 2;
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorCap.c2ADC));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(CAP_K_C1));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(CAP_K_C2));
i += 2;
// <20><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configSensor.sensorWeight.lowRange));
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.sampleData.adDPress));
i += 4;
// Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configSensor.sensorWeight.highRange));
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.sampleData.adPress));
i += 4;
// Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configSensor.sensorWeight.zeroValue));
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.sampleData.adExtTempr[0]));
i += 4;
// Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configSensor.sensorWeight.fullValue));
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.sampleData.adExtTempr[1]));
i += 4;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPress.lowRange));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPress.highRange));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPress.zeroValue));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPress.fullValue));
i += 2;
// <20><>չѹ<D5B9><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorEPress[0].lowRange));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorEPress[0].highRange));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorEPress[0].zeroValue));
i += 2;
Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorEPress[0].fullValue));
i += 2;
// <20><>չ<EFBFBD>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPTempr[0].calibrateT));
i += 2;
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPTempr[0].calibrateR));
i += 2;
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPTempr[0].zeroValue));
i += 2;
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPTempr[0].fullValue));
i += 2;
// <20><>չ<EFBFBD>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPTempr[1].calibrateT));
i += 2;
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPTempr[1].calibrateR));
i += 2;
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPTempr[1].zeroValue));
i += 2;
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configSensor.sensorPTempr[1].fullValue));
i += 2;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
return fill_biDir_fixFields(0xD035, i);
}
#define D036_PARAM_SIZE (240)
uint8_t parse_param_D036_data(uint8_t *param, uint8_t *reset)
{
longlong_mask_t mask;
uint16_t i = 0, shift = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>־λ<D6BE><CEBB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>޷<EFBFBD><DEB7>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ, <20><>63<36><33><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ã<EFBFBD>bit 0~62<36><32>, <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>bit 63<36><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD> 12 34 56 78 90 ab cd ef
// h = 0x78563412, l = 0xefcdab90 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
// h = 0x12345678, l = 0x90abcdef <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>)
// mask = 0x1234567890abcdef
mask.h = ntohl(Byte2IntL(param, i));
i += 4;
mask.l = ntohl(Byte2IntL(param, i));
i += 4;
printf("\nmask = %016llX\n", mask.ll);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.type = param[i];
i++;
// ֱ<><D6B1>
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.diameter = ntohl(Byte2IntL(param, i));
i += 4;
// <20><><EFBFBD><EFBFBD>
if(mask.ll & (1ull << (shift++)))
{
dcBuff.configBottle.len = ntohl(Byte2IntL(param, i));
dcBuff.configBottle.lenExtra = 0;
}
i += 4;
// <20><>װ<EFBFBD><D7B0>
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.chargePct = param[i];
i++;
// <20><><EFBFBD><EFBFBD>
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.source = param[i];
i++;
// <20>ܶ<EFBFBD>
if(mask.ll & (1ull << (shift++)))
;//Config_SetDensity(dcBuff.configBottle.source, ntohs(Byte2IntS(param, i)) / 1000.0);
i += 2;
// <20><>ʾģʽ
if(mask.ll & (1ull << (shift++)))
{
dcBuff.configBottle.dispMode = param[i];
dcBuff.configBottle.options &= ~0x0003ul;
if(dcBuff.configBottle.dispMode == DISP_MODE_ALL)
dcBuff.configBottle.options |= 0x0003ul;
else if(dcBuff.configBottle.dispMode == DISP_MODE_L)
dcBuff.configBottle.options |= 0x0001ul;
else if(dcBuff.configBottle.dispMode == DISP_MODE_KG)
dcBuff.configBottle.options |= 0x0002ul;
}
i++;
// <20><>ʾ<EFBFBD><CABE>λ
if(mask.ll & (1ull << (shift++)))
{
if(param[i] == 0)
dcBuff.configDisplay.L_Unit = UNIT_KPA;
else if(param[i] == 1)
dcBuff.configDisplay.L_Unit = UNIT_KG;
else if(param[i] == 2)
dcBuff.configDisplay.L_Unit = UNIT_L;
else if(param[i] == 4)
dcBuff.configDisplay.L_Unit = UNIT_MMH2O;
else
dcBuff.configDisplay.L_Unit = UNIT_PCT;
}
i++;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.serverVer = ntohs(Byte2IntS(param, i));
i += 2;
// Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(mask.ll & (1ull << (shift++)))
strcpy(dcBuff.configData.server, (char *) param + i);
i += 26;
// Զ<><D4B6><EFBFBD>˿<EFBFBD>
if(mask.ll & (1ull << (shift++)))
dcBuff.configData.port = ntohs(Byte2IntS(param, i));
i += 2;
// Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(mask.ll & (1ull << (shift++)))
strcpy(dcBuff.configData.gpsServer, (char *) param + i);
i += 26;
// Զ<><D4B6><EFBFBD>˿<EFBFBD>
if(mask.ll & (1ull << (shift++)))
dcBuff.configData.gpsPort = ntohs(Byte2IntS(param, i));
i += 2;
// Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(mask.ll & (1ull << (shift++)))
strcpy(dcBuff.configData.upgServer, (char *) param + i);
i += 26;
// Զ<><D4B6><EFBFBD>˿<EFBFBD>
if(mask.ll & (1ull << (shift++)))
dcBuff.configData.upgPort = ntohs(Byte2IntS(param, i));
i += 2;
// <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
if(mask.ll & (1ull << (shift++)))
dcBuff.configData.intervalTrans = ntohl(Byte2IntL(param, i));
i += 4;
// <20>ɼ<EFBFBD>Ƶ<EFBFBD><C6B5>
if(mask.ll & (1ull << (shift++)))
dcBuff.configData.intervalSample = ntohl(Byte2IntL(param, i));
i += 4;
// <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
if(mask.ll & (1ull << (shift++)))
dcBuff.configData.intervalGPSTrans = ntohs(Byte2IntS(param, i));
i += 2;
// <20>ɼ<EFBFBD>Ƶ<EFBFBD><C6B5>
if(mask.ll & (1ull << (shift++)))
dcBuff.configData.intervalGPS = ntohs(Byte2IntS(param, i));
i += 2;
// ʱ<><CAB1>
if(mask.ll & (1ull << (shift++)))
dcBuff.configData.timeLag = param[i];
i++;
// APN
if(mask.ll & (1ull << (shift++)))
strcpy(dcBuff.configDisplay.APN, (char *) param + i);
i += 20;
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configDisplay.bdCommander = ntohl(Byte2IntL(param, i));
i += 4;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: KPa
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.warnPress = ntohs(Byte2IntS(param, i));
i += 2;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: KPa
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.warnPressH = ntohs(Byte2IntS(param, i));
i += 2;
// <20><>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 0.01%
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.fullPct = ntohs(Byte2IntS(param, i));
i += 2;
// <20>ؼ<EFBFBD>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 0.01%
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.priPct = ntohs(Byte2IntS(param, i));
i += 2;
// <20><><EFBFBD><EFBFBD>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 0.01%
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.orderPct = ntohs(Byte2IntS(param, i));
i += 2;
// <20><>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 0.01%
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.emptyPct = ntohs(Byte2IntS(param, i));
i += 2;
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>: mV
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.warnVolt = ntohs(Byte2IntS(param, i));
i += 2;
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>: mV
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.warnVoltH = ntohs(Byte2IntS(param, i));
i += 2;
// ÿ<>ռƻ<D5BC><C6BB><EFBFBD><EFBFBD><EFBFBD>: L
if(mask.ll & (1ull << (shift++)))
{
//dcBuff.configBottle.planMount = ntohl(Byte2IntL(param, i));
dcBuff.configBottle.offlineSeconds = ntohl(Byte2IntL(param, i));
}
i += 4;
// ÿ<><C3BF>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: L
if(mask.ll & (1ull << (shift++)))
; // dcBuff.configBottle.predictMount = ntohl(Byte2IntL(param, i));
i += 4;
// TTS-<2D><>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 0.01%
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configBottle.floorLevel = ntohs(Byte2IntS(param, i));
i += 2;
// TTS-<2D><EFBFBD><E4BBAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 0.01%
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.warnTempr = ntohs(Byte2IntS(param, i)); // span
i += 2;
// TTS-<2D><EFBFBD><E4BBAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configBottle.warnTemprH = ntohs(Byte2IntS(param, i)); // spanPeriod
i += 2;
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorDPress.lowRange = ntohs(Byte2IntS(param, i));
i += 2;
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorDPress.highRange = ntohs(Byte2IntS(param, i));
i += 2;
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorDPress.zeroValue = ntohs(Byte2IntS(param, i));
i += 2;
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorDPress.fullValue = ntohs(Byte2IntS(param, i));
i += 2;
// <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20>׵<EFBFBD><D7B5><EFBFBD>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorCap.baseC = ntohs(Byte2IntS(param, i));
i += 2;
// <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorCap.refC = ntohs(Byte2IntS(param, i));
i += 2;
// <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>궨: C1ADC
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorCap.c1ADC = ntohs(Byte2IntS(param, i));
i += 2;
// <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>궨: C2ADC
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorCap.c2ADC = ntohs(Byte2IntS(param, i));
i += 2;
// <20><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorWeight.lowRange = ntohl(Byte2IntL(param, i));
i += 4;
// <20><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorWeight.highRange = ntohl(Byte2IntL(param, i));
i += 4;
// <20><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorWeight.zeroValue = ntohl(Byte2IntL(param, i));
i += 4;
// <20><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorWeight.fullValue = ntohl(Byte2IntL(param, i));
i += 4;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorPress.lowRange = ntohs(Byte2IntS(param, i));
i += 2;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorPress.highRange = ntohs(Byte2IntS(param, i));
i += 2;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorPress.zeroValue = ntohs(Byte2IntS(param, i));
i += 2;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorPress.fullValue = ntohs(Byte2IntS(param, i));
i += 2;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorEPress[0].lowRange = ntohs(Byte2IntS(param, i));
i += 2;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorEPress[0].highRange = ntohs(Byte2IntS(param, i));
i += 2;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorEPress[0].zeroValue = ntohs(Byte2IntS(param, i));
i += 2;
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
dcBuff.configSensor.sensorEPress[0].fullValue = ntohs(Byte2IntS(param, i));
i += 2;
// <20>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorPTempr[0].calibrateT = ntohs(Byte2IntS(param, i));
i += 2;
// <20>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorPTempr[0].calibrateR = ntohs(Byte2IntS(param, i));
i += 2;
// <20>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorPTempr[0].zeroValue = ntohs(Byte2IntS(param, i));
i += 2;
// <20>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorPTempr[0].fullValue = ntohs(Byte2IntS(param, i));
i += 2;
// <20>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorPTempr[1].calibrateT = ntohs(Byte2IntS(param, i));
i += 2;
// <20>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>: <20><>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorPTempr[1].calibrateR = ntohs(Byte2IntS(param, i));
i += 2;
// <20>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorPTempr[1].zeroValue = ntohs(Byte2IntS(param, i));
i += 2;
// <20>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>궨: <20><>
if(mask.ll & (1ull << (shift++)))
; //dcBuff.configSensor.sensorPTempr[1].fullValue = ntohs(Byte2IntS(param, i));
i += 2;
*reset = ((mask.ll & (1ull << shift)) != 0);
return ((mask.ll & ~(1ull << shift)) != 0);
}
#define D038_CONFIG_SIZE (74)
uint8_t parse_config_D038_data(uint8_t *param)
{
uint16_t i = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcBuff.configBottle.serverVer = ntohs(Byte2IntS(param, i));
i += 2;
// Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strcpy(dcBuff.configData.server, (char *) param + i);
i += 26;
// Զ<><D4B6><EFBFBD>˿<EFBFBD>
dcBuff.configData.port = ntohs(Byte2IntS(param, i));
i += 2;
// Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strcpy(dcBuff.configData.gpsServer, (char *) param + i);
i += 26;
// Զ<><D4B6><EFBFBD>˿<EFBFBD>
dcBuff.configData.gpsPort = ntohs(Byte2IntS(param, i));
i += 2;
// <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
dcBuff.configData.intervalTrans = ntohl(Byte2IntL(param, i));
i += 4;
// <20>ɼ<EFBFBD>Ƶ<EFBFBD><C6B5>
dcBuff.configData.intervalSample = ntohl(Byte2IntL(param, i));
i += 4;
// Ӳ<><D3B2><EFBFBD>
// dcBuff.configDisplay.op_HARDWARE_VER_MAJOR = param[i];
i++;
// ֻ<><D6BB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ˮ<EFBFBD><CBAE>
// dcBuff.configDisplay.op_DISP_MMWC_ONLY = param[i];
i++;
// <20><><EFBFBD><EFBFBD><EFBFBD>
// dcBuff.configDisplay.op_BOX_VER = param[i];
i++;
// <20><>վ<EFBFBD><D5BE>λ
// dcBuff.configDisplay.op_CELL_LOCATION = param[i];
i++;
// <20><><EFBFBD>͹켣
// dcBuff.configDisplay.op_SEND_GPS_DATA = param[i];
i++;
// ͨ<>ŷ<EFBFBD>ʽ
// dcBuff.configDisplay.op_SERVER_PROTOCOL = param[i];
i++;
// URL<52><4C><EFBFBD><EFBFBD>
// dcBuff.configDisplay.op_SERVER_INDEX = param[i];
i++;
// <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
// dcBuff.configDisplay.op_UNIDIR_COMM = param[i];
i++;
return 1;
}
// <20>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡʱ<C8A1><CAB1>
void DTU_setOffsetSecondsFromServer()
{
bluetooth_send_t *pRecv = (bluetooth_send_t *) Task_recvBuff;
S_RTC_TIME_DATA_T sRTC;
uint32_t totalSeconds1, totalSeconds2;
int16_t zz;
uint16_t i, recvLen;
// <20>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
printf("\nGet time from server ...\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(DTU_Connect(0, dcBuff.configData.upgServer, dcBuff.configData.upgPort))
{
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = sizeof(bluetooth_send_t);
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
i = fill_biDir_fixFields(0xD03B, i);
// <20><><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>10<31><30><EFBFBD>ֽ<EFBFBD>
recvLen = sizeof(bluetooth_recv_t) + 2;
if(DTU_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
{
if(recvLen >= sizeof(bluetooth_recv_t) + 2
&& MODBUS_RTU_CRC16(Task_recvBuff, recvLen) == 0)
{
if(recvLen >= sizeof(bluetooth_recv_t) + 11
&& pRecv->cmd == ntohs(0x003B)
&& MODBUS_RTU_CRC16(Task_recvBuff, sizeof(bluetooth_recv_t) + 11) == 0)
{
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
RTC_GetDateAndTime(&sRTC);
totalSeconds1 = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
// UTC<54><43><EFBFBD><EFBFBD>
i = sizeof(bluetooth_recv_t);
// <20><>
sRTC.u32Year = ntohs(Byte2IntS(Task_recvBuff, i));
i += 2;
// <20><>
sRTC.u32Month = Task_recvBuff[i++];
// <20><>
sRTC.u32Day = Task_recvBuff[i++];
// ʱ
sRTC.u32Hour = Task_recvBuff[i++];
// <20><>
sRTC.u32Minute = Task_recvBuff[i++];
// <20><>
sRTC.u32Second = Task_recvBuff[i++];
// ʱ<><EFBFBD><EEA3A8>1/4Сʱ, <20><><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>
recvLen = ntohs(Byte2IntS(Task_recvBuff, i));
memmove(&zz, &recvLen, 2);
printf("\n%04d-%02d-%02d %02d:%02d:%02d %d\n", sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second, zz);
totalSeconds2 = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
// <20><>UTCʱ<43><CAB1>ת<EFBFBD><D7AA>ΪGMTʱ<54>䣨ʱ<E4A3A8><CAB1>Ϊ0<CEAA><30>
totalSeconds2 -= zz * 900;
// <20><>GMTʱ<54><CAB1>ת<EFBFBD><D7AA>ΪUTCʱ<43><EFBFBD><E4A3A8><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ʱ<EFBFBD>
totalSeconds2 += dcBuff.configData.timeLag * 3600;
if(RTC_offsetSeconds == 0)
{
RTC_offsetSeconds = totalSeconds2 - totalSeconds1;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SFlash<73><68>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
CheckFramSFlashValid(totalSeconds1);
}
}
}
}
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
}
}
////////////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD>GPS<50><53><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȵ<EFBFBD>
void DTU_Task(void *p_arg)
{
bluetooth_send_t *pSend = (bluetooth_send_t *) Task_sendBuff;
bluetooth_send_t *pRecv = (bluetooth_send_t *) Task_recvBuff;
uint16_t i, j, k;
uint32_t totalSeconds;
S_RTC_TIME_DATA_T sRTC;
uint8_t try_count;
uint16_t recvLen;
uint8_t upgrade;
uint8_t ackUpgrade;
uint8_t downloadParam;
uint8_t ackParam;
uint8_t downloadOptions;
uint8_t ackOptions;
uint8_t downloadBoxes;
uint8_t ackBoxes;
uint8_t downloadConfig;
uint8_t ackConfig;
uint8_t reset = 0;
TUpgradeHeader upHeader;
upgrade_frame_t *pFrame;
int32_t nextPtr;
uint8_t write_count;
uint32_t rssiTick = 0;
uint8_t tranLocked = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memset(&dcBuff.dtuData, 0, sizeof(dcBuff.dtuData));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>GPS<50><53>λ<EFBFBD><CEBB>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>
if(FRAM_LoadInfo(FRAM_GPS_INFO_BASE, (uint8_t *) &Ext_GPS, sizeof(ext_gps_t)))
{
dcBuff.dtuData.sysTime = Ext_GPS.sysTime;
dcBuff.dtuData.longitude = Ext_GPS.longitude;
dcBuff.dtuData.latitude = Ext_GPS.latitude;
dcBuff.dtuData.speed = Ext_GPS.speed;
dcBuff.dtuData.sateCount = Ext_GPS.sateCount;
dcBuff.dtuData.posState = Ext_GPS.posState;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD><CCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>񣺿<EFBFBD><F1A3BABF><EFBFBD>ִ<EFBFBD><D6B4>һ<EFBFBD><D2BB>
xSemaphoreGive(DTU_semUpgrade);
while(1)
{
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
RTC_GetDateAndTime(&sRTC);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>gps<70><73>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
totalSeconds = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
// <20>տ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>е<EFBFBD>ʱ<EFBFBD>򣬻<EFBFBD><F2A3ACBB>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3A8><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3>ʼ<EFBFBD><CABC>ʱ<EFBFBD>
if(totalSeconds < 10)
totalSeconds = 0;
// ÿ30<33><30>ˢ<EFBFBD><CBA2>һ<EFBFBD><D2BB>4G<34>ź<EFBFBD>
if(IsTickOut(rssiTick))
{
rssiTick = GetDelayTick(30000);
DTU_PowerOn();
// <20>ɼ<EFBFBD><C9BC>ź<EFBFBD>ǿ<EFBFBD>Ⱥ<EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>Ϣ
Sim808_ReadGPRS();
// GPRS<52><53><EFBFBD>ź<EFBFBD>GPS<50><53>λͬʱ<CDAC><CAB1><EFBFBD>У<EFBFBD><D0A3>Խ<EFBFBD>ʡʱ<CAA1><CAB1>
if(dcBuff.dtuData.networked)
Sim808_GPRSDial();
}
// <20><><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD><EFBFBD>Է<EFBFBD><D4B7>ͼ<EFBFBD><CDBC><EFBFBD>
if(!dcBuff.dtuData.connected && Sim808_Connect(0, dcBuff.configData.server, dcBuff.configData.port) && !tranLocked)
{
xSemaphoreTake(RF_TranLock, portMAX_DELAY);
tranLocked = 1;
}
if(!dcBuff.dtuData.connected && tranLocked)
{
// 4G<34><47><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><E1B7A2>
xSemaphoreGive(RF_TranLock);
tranLocked = 0;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ȡ<EFBFBD><C8A1>UTCʱ<43><EFBFBD><E4A3AC>ת<EFBFBD><D7AA>
if(RTC_offsetSeconds > 0 && dcBuff.dtuData.connected && LoopBuff_GetCount(&RF_TranM) > 0)
{
nextPtr = RF_TranM.info.rdPtr;
for(k = 0; k < LoopBuff_GetCount(&RF_TranM); k++)
{
dcBuff.powerInfo.gprsSendCount++;
if(!SFlash_LoadInfo(LoopBuff_GetDataPos(&RF_TranM, nextPtr), (uint8_t *) &Ext_Data_Rec1, sizeof(ext_data_t)))
{
nextPtr = LoopBuff_GetNextPtr(&RF_TranM, nextPtr);
continue; // <20><><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>ʧ<EFBFBD><CAA7>1<EFBFBD><31>
}
nextPtr = LoopBuff_GetNextPtr(&RF_TranM, nextPtr);
// <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>modbus<75>ӻ<EFBFBD><D3BB><EFBFBD>Ӧ<EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD>
i = pack_gprs_tran_data(&Ext_Data_Rec1, 1);
recvLen = 2;
if(!Sim808_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
{
if(tranLocked)
{
// 4G<34><47><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><E1B7A2>
xSemaphoreGive(RF_TranLock);
tranLocked = 0;
}
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
break;
}
// <20>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><CAB1>: ȡ<><C8A1>ǰʱ<C7B0><CAB1>
DTU_dataTime = totalSeconds;
dcBuff.powerInfo.gprsSuccCount++;
}
// <20>Ƴ<EFBFBD><C6B3>ѳɹ<D1B3><C9B9><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
if(k > 0)
{
LoopBuff_RemoveItems(&RF_TranM, k);
// <20><><EFBFBD><EFBFBD><E6B5BD><EFBFBD><EFBFBD>
FRAM_SaveInfo(RF_TranM.info_base, (uint8_t *) &RF_TranM.info, sizeof(RF_TranM.info));
}
}
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ά<EFBFBD><CEAC>ƽ̨<C6BD><CCA8>ÿ<EFBFBD><C3BF>12Сʱһ<CAB1>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˹<EFBFBD><CBB9><EFBFBD>ֵµ<D6B5>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
if(xSemaphoreTake(DTU_semUpgrade, 0) == pdTRUE)
{
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD>ά<EFBFBD><CEAC>ƽ̨
upgrade = 0;
ackUpgrade = 0;
downloadParam = 0;
ackParam = 0;
downloadOptions = 0;
ackOptions = 0;
downloadBoxes = 0;
ackBoxes = 0;
downloadConfig = 0;
ackConfig = 0;
reset = 0;
k = 1; // <20><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
try_count = 2;
while((try_count--) && (k || upgrade || ackUpgrade || downloadParam || ackParam || downloadOptions || ackOptions || downloadBoxes || ackBoxes || downloadConfig || ackConfig))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(Sim808_Connect(0, dcBuff.configData.upgServer, dcBuff.configData.upgPort))
{
if(k)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>12<31><32><EFBFBD>ֽ<EFBFBD>
i = pack_ldms_info_data(DTU_dataTime, totalSeconds);
recvLen = sizeof(bluetooth_recv_t) + 2 + 2;
if(!Sim808_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
{
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20><><EFBFBD><EFBFBD>
continue;
}
if(recvLen >= sizeof(bluetooth_recv_t) + 2 + 2 && MODBUS_RTU_CRC16(Task_recvBuff, recvLen) == 0
&& pRecv->cmd == ntohs(0x0035))
{
upgrade = Task_recvBuff[sizeof(bluetooth_recv_t)];
downloadParam = Task_recvBuff[sizeof(bluetooth_recv_t) + 1];
if(recvLen >= sizeof(bluetooth_recv_t) + 3 + 2)
downloadConfig = Task_recvBuff[sizeof(bluetooth_recv_t) + 2];
if(recvLen >= sizeof(bluetooth_recv_t) + 4 + 2)
downloadOptions = Task_recvBuff[sizeof(bluetooth_recv_t) + 3];
if(recvLen >= sizeof(bluetooth_recv_t) + 5 + 2)
downloadBoxes = Task_recvBuff[sizeof(bluetooth_recv_t) + 4];
k--; // <20><><EFBFBD>ͳɹ<CDB3>
}
}
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>
if(downloadParam)
{
printf("\nDownload parameters ...\n");
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = sizeof(bluetooth_send_t);
// PSN
memmove(Task_sendBuff + i, dcBuff.configBottle.PSN, 6);
i += 6;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
i = fill_biDir_fixFields(0xD036, i);
// <20><><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>10<31><30><EFBFBD>ֽ<EFBFBD>
recvLen = sizeof(bluetooth_recv_t) + 2;
if(Sim808_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
{
if(recvLen >= sizeof(bluetooth_recv_t) + 2
&& MODBUS_RTU_CRC16(Task_recvBuff, recvLen) == 0)
{
downloadParam = 0;
if(recvLen >= sizeof(bluetooth_recv_t) + D036_PARAM_SIZE + 2
&& pRecv->cmd == ntohs(0x0036)
&& MODBUS_RTU_CRC16(Task_recvBuff, sizeof(bluetooth_recv_t) + D036_PARAM_SIZE + 2) == 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(parse_param_D036_data(Task_recvBuff + sizeof(bluetooth_recv_t), &reset))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Config_SaveConfig();
// Can_Write(CONFIG_BOARD_SAMPLE,CAN_DC_BOTTLE_CONFIG, &display_modifi);
// Can_Write(CONFIG_BOARD_SAMPLE,CAN_DC_SENSOR_CONFIG, &display_modifi);
// Can_Write(CONFIG_BOARD_SAMPLE,CAN_DC_DATA_CONFIG, &display_modifi);
// Can_Write(CONFIG_BOARD_SAMPLE,CAN_DC_DISPLAY_CONFIG, &display_modifi);
}
ackParam = 1;
}
}
}
else
{
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20><><EFBFBD><EFBFBD>
continue;
}
}
// ȷ<>ϲ<EFBFBD><CFB2><EFBFBD>
if(ackParam)
{
printf("\nConfirm download parameters ...\n");
// <20><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = sizeof(bluetooth_send_t);
// PSN
memmove(Task_sendBuff + i, dcBuff.configBottle.PSN, 6);
i += 6;
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
Int2ByteL(Task_sendBuff, i, htonl(dcBuff.configBottle.ts));
i += 4;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
i = fill_biDir_fixFields(0xD022, i);
// <20><><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>10<31><30><EFBFBD>ֽ<EFBFBD>
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3>´<EFBFBD><C2B4>ٷ<EFBFBD><D9B7><EFBFBD>
recvLen = sizeof(bluetooth_recv_t) + 2;
if(!Sim808_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
{
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20><><EFBFBD><EFBFBD>
continue;
}
ackParam = 0;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
if(downloadOptions)
{
}
// ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
if(ackOptions)
{
}
// <20><><EFBFBD>ع<EFBFBD><D8B9><EFBFBD><E4B5B5>
if(downloadBoxes)
{
printf("\nDownload boxes ...\n");
if(boxesInfo.fileSize == 0)
{
// <20><>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
memset(&boxesInfo, 0, sizeof(boxesInfo));
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(boxesInfo.fileSize == 0 || boxesInfo.offset < boxesInfo.fileSize)
{
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = sizeof(bluetooth_send_t);
// PSN
memmove(Task_sendBuff + i, dcBuff.configBottle.PSN, 6);
i += 6;
// <20><>ǰ<EFBFBD><EFBFBD><E6B1BE>
i += 4;
// <20>ļ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
Int2ByteL(Task_sendBuff, i, htonl(boxesInfo.offset));
i += 4;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
Int2ByteL(Task_sendBuff, i, htonl(UPGRADE_DATA_LEN));
i += 4;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
i = fill_biDir_fixFields(0xD0E2, i);
// <20><><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>10<31><30><EFBFBD>ֽ<EFBFBD>
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
recvLen = sizeof(bluetooth_recv_t) + 2;
if(!Sim808_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
break;
if(recvLen >= sizeof(bluetooth_recv_t) + 2 && MODBUS_RTU_CRC16(Task_recvBuff, recvLen) == 0)
{
if(pRecv->cmd == ntohs(0x00E2))
{
pFrame = (upgrade_frame_t *) (Task_recvBuff + sizeof(bluetooth_recv_t));
if(MODBUS_RTU_CRC16(pFrame->data, ntohl(pFrame->len) + 2) == 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>سɹ<D8B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
try_count = 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD><DEB5><EFBFBD><EFBFBD>б
if(boxesInfo.fileSize > 0 && (boxesInfo.fileSize != ntohl(pFrame->fileSize) || boxesInfo.fileCrc != pFrame->fileCrc
|| boxesInfo.offset > ntohl(pFrame->fileSize)))
{
// <20><>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
memset(&boxesInfo, 0, sizeof(boxesInfo));
continue;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// <20><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>
boxesInfo.fileSize = ntohl(pFrame->fileSize);
boxesInfo.offset = ntohl(pFrame->offset);
boxesInfo.len = ntohl(pFrame->len);
boxesInfo.fileCrc = pFrame->fileCrc;
printf("\nfileSize = %d, offset = %d, len = %d\n",
boxesInfo.fileSize, boxesInfo.offset, boxesInfo.len);
// Ҫ<><D2AA>1<EFBFBD><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD>
if(boxesInfo.offset + boxesInfo.len < sizeof(boxesBuff))
{
memmove(boxesBuff + boxesInfo.offset, pFrame->data, boxesInfo.len);
boxesInfo.offset += boxesInfo.len;
}
else
{
// ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
boxesInfo.fileSize = 0;
downloadBoxes = 0;
break;
}
}
}
else // <20><><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>
{
// ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
boxesInfo.fileSize = 0;
downloadBoxes = 0;
break;
}
}
}
if(boxesInfo.fileSize > 0 && boxesInfo.offset == boxesInfo.fileSize)
{
if(do_crc_16(0, (uint8_t *) boxesBuff, boxesInfo.fileSize) == boxesInfo.fileCrc)
{
// У<><D0A3>ͨ<EFBFBD><CDA8>
printf("\nBoxes confirm passed\n");
downloadBoxes = 0;
// <20><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
ackBoxes = 1;
}
else
{
// У<><D0A3>δͨ<CEB4><CDA8>
printf("\n****** Boxes confirm failed\n");
// <20><>ͷ<EFBFBD><CDB7>ʼ
boxesInfo.fileSize = 0;
}
}
else
{
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20><><EFBFBD><EFBFBD>
continue;
}
}
// ȷ<>Ϲ<EFBFBD><CFB9><EFBFBD><E4B5B5>
if(ackBoxes)
{
printf("\nConfirm boxes ...\n");
// <20><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = sizeof(bluetooth_send_t);
// PSN
memmove(Task_sendBuff + i, dcBuff.configBottle.PSN, 6);
i += 6;
// <20><>ǰ<EFBFBD><EFBFBD><E6B1BE>
Int2ByteL(Task_sendBuff, i, htonl(boxesInfo.ver));
i += 4;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CRC16
Int2ByteS(Task_sendBuff, i, boxesInfo.fileCrc);
i += 2;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
i = fill_biDir_fixFields(0xD0E3, i);
// <20><><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>10<31><30><EFBFBD>ֽ<EFBFBD>
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3>´<EFBFBD><C2B4>ٷ<EFBFBD><D9B7><EFBFBD>
recvLen = sizeof(bluetooth_recv_t) + 2;
if(!Sim808_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
{
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20><><EFBFBD><EFBFBD>
continue;
}
if(recvLen == sizeof(bluetooth_recv_t) + 2 && pRecv->cmd == ntohs(0x00E3))
{
ackBoxes = 0;
// <20><><EFBFBD>´<EFBFBD><C2B4>޵<EFBFBD><DEB5><EFBFBD>
boxesBuff[boxesInfo.fileSize] = 0;
Ext_Update_Boxes(boxesBuff);
// <20>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ
boxesInfo.fileSize = 0;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(downloadConfig)
{
printf("\nDownload configuration ...\n");
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = sizeof(bluetooth_send_t);
// PSN
memmove(Task_sendBuff + i, dcBuff.configBottle.PSN, 6);
i += 6;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
i = fill_biDir_fixFields(0xD038, i);
// <20><><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>10<31><30><EFBFBD>ֽ<EFBFBD>
recvLen = sizeof(bluetooth_recv_t) + 2;
if(Sim808_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
{
if(recvLen >= sizeof(bluetooth_recv_t) + 2
&& MODBUS_RTU_CRC16(Task_recvBuff, recvLen) == 0)
{
downloadConfig = 0;
if(recvLen >= sizeof(bluetooth_recv_t) + D038_CONFIG_SIZE + 2
&& pRecv->cmd == ntohs(0x0038)
&& MODBUS_RTU_CRC16(Task_recvBuff, sizeof(bluetooth_recv_t) + D038_CONFIG_SIZE + 2) == 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(parse_config_D038_data(Task_recvBuff + sizeof(bluetooth_recv_t)))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Config_SaveConfig();
// Can_Write(CONFIG_BOARD_SAMPLE,CAN_DC_BOTTLE_CONFIG, &display_modifi);
// Can_Write(CONFIG_BOARD_SAMPLE,CAN_DC_SENSOR_CONFIG, &display_modifi);
// Can_Write(CONFIG_BOARD_SAMPLE,CAN_DC_DATA_CONFIG, &display_modifi);
// Can_Write(CONFIG_BOARD_SAMPLE,CAN_DC_DISPLAY_CONFIG, &display_modifi);
}
ackConfig = 1;
}
}
}
else
{
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20><><EFBFBD><EFBFBD>
continue;
}
}
// ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(ackConfig)
{
printf("\nConfirm download configuration ...\n");
// <20><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = sizeof(bluetooth_send_t);
// PSN
memmove(Task_sendBuff + i, dcBuff.configBottle.PSN, 6);
i += 6;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
i = fill_biDir_fixFields(0xD039, i);
// <20><><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>10<31><30><EFBFBD>ֽ<EFBFBD>
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3>´<EFBFBD><C2B4>ٷ<EFBFBD><D9B7><EFBFBD>
recvLen = sizeof(bluetooth_recv_t) + 2;
if(!Sim808_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
{
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20><><EFBFBD><EFBFBD>
continue;
}
ackConfig = 0;
// <20><><EFBFBD>øı<C4B1><E4A3AC>Ҫ<EFBFBD><D2AA>λ
reset = 1;
}
// <20><><EFBFBD><EFBFBD>
if(upgrade)
{
printf("\nUpgrade software ...\n");
// <20><>FRAM<41><4D>ȡ<EFBFBD><C8A1>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
FRAM_LoadInfo(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo));
if(upInfo.fileSize == 0)
{
// <20><>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
memset(&upInfo, 0, sizeof(upInfo));
// <20><><EFBFBD><EFBFBD><E6B5BD><EFBFBD><EFBFBD>
for(write_count = 0; write_count < 2; write_count++)
{
FRAM_SaveInfo(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo));
if(FRAM_BufferVerify(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo)))
break;
printf("**** Verify FRAM failed at: 0x%08X, %d bytes\n", FRAM_UPGRADE_INFO_BASE, sizeof(upInfo));
delay_ms(200);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(upInfo.fileSize == 0 || upInfo.offset < upInfo.fileSize)
{
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = sizeof(bluetooth_send_t);
// PSN
memmove(Task_sendBuff + i, dcBuff.configBottle.PSN, 6);
i += 6;
// <20><>ǰ<EFBFBD>̼<EFBFBD><CCBC><EFBFBD>
Int2ByteL(Task_sendBuff, i, htonl(upInfo.ver));
i += 4;
// <20>ļ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
Int2ByteL(Task_sendBuff, i, htonl(upInfo.offset));
i += 4;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
Int2ByteL(Task_sendBuff, i, htonl(UPGRADE_DATA_LEN));
i += 4;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
i = fill_biDir_fixFields(0xD0E0, i);
// <20><><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>10<31><30><EFBFBD>ֽ<EFBFBD>
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
recvLen = sizeof(bluetooth_recv_t) + 2;
if(!Sim808_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
break;
if(recvLen >= sizeof(bluetooth_recv_t) + 2 && MODBUS_RTU_CRC16(Task_recvBuff, recvLen) == 0)
{
if(pRecv->cmd == ntohs(0x00E0))
{
pFrame = (upgrade_frame_t *) (Task_recvBuff + sizeof(bluetooth_recv_t));
if(MODBUS_RTU_CRC16(pFrame->data, ntohl(pFrame->len) + 2) == 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>سɹ<D8B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
try_count = 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б
if(upInfo.fileSize > 0 && (upInfo.fileSize != ntohl(pFrame->fileSize) || upInfo.fileCrc != pFrame->fileCrc
|| upInfo.offset > ntohl(pFrame->fileSize) || upInfo.ver != ntohl(pFrame->ver)))
{
// <20><>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
memset(&upInfo, 0, sizeof(upInfo));
// <20><><EFBFBD><EFBFBD><E6B5BD><EFBFBD><EFBFBD>
for(write_count = 0; write_count < 2; write_count++)
{
FRAM_SaveInfo(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo));
if(FRAM_BufferVerify(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo)))
break;
printf("**** Verify FRAM failed at: 0x%08X, %d bytes\n", FRAM_UPGRADE_INFO_BASE, sizeof(upInfo));
delay_ms(200);
}
continue;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// <20><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>
upInfo.ver = ntohl(pFrame->ver);
upInfo.fileSize = ntohl(pFrame->fileSize);
upInfo.offset = ntohl(pFrame->offset);
upInfo.len = ntohl(pFrame->len);
upInfo.fileCrc = pFrame->fileCrc;
printf("\nfileSize = %d, offset = %d, len = %d\n",
upInfo.fileSize, upInfo.offset, upInfo.len);
// <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>boot-loader<65><72>ѹ
// <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD>ٸ<EFBFBD>Ϊ1
if(upInfo.offset == 0)
((TUpgradeHeader *) pFrame->data)->upgrade_request = 0;
#if UPGRADE_DATA_LEN >= SFLASH_ERASE_SIZE
// ֱ<><D6B1>д<EFBFBD><D0B4>flash
for(write_count = 0; write_count < 2; write_count++)
{
SFlash_BufferWrite(SFLASH_UPGRADE_BASE + upInfo.offset, pFrame->data, upInfo.len);
if(SFlash_BufferVerify(SFLASH_UPGRADE_BASE + upInfo.offset, pFrame->data, upInfo.len))
break;
printf("**** Verify SFlash failed at: 0x%08X, %d bytes\n", SFLASH_UPGRADE_BASE + upInfo.offset, upInfo.len);
delay_ms(200);
}
upInfo.offset += upInfo.len;
#else
// Ϊ<>˼<EFBFBD><CBBC><EFBFBD>flash<73>Ķ<EFBFBD><C4B6>β<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ֽ<EFBFBD>Լ<EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>
// <20>Ȱ<EFBFBD><C8B0><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD>flashҳ<68><D2B3><EFBFBD><EFBFBD>
for(write_count = 0; write_count < 2; write_count++)
{
FRAM_BufferWrite(FRAM_UPGRADE_DATA_BASE + upInfo.offset % SFLASH_ERASE_SIZE, pFrame->data, upInfo.len);
if(FRAM_BufferVerify(FRAM_UPGRADE_DATA_BASE + upInfo.offset % SFLASH_ERASE_SIZE, pFrame->data, upInfo.len))
break;
printf("**** Verify FRAM failed at: 0x%08X, %d bytes\n", FRAM_UPGRADE_DATA_BASE + upInfo.offset % SFLASH_ERASE_SIZE, upInfo.len);
delay_ms(200);
}
upInfo.offset += upInfo.len;
// <20><>һҳ<D2BB>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˾ʹ<CBBE><CDB4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>flash
if(upInfo.offset % SFLASH_ERASE_SIZE == 0)
{
FRAM_BufferRead(FRAM_UPGRADE_DATA_BASE, Task_recvBuff, SFLASH_ERASE_SIZE);
for(write_count = 0; write_count < 2; write_count++)
{
SFlash_BufferWrite(SFLASH_UPGRADE_BASE + (upInfo.offset - SFLASH_ERASE_SIZE), Task_recvBuff, SFLASH_ERASE_SIZE);
if(SFlash_BufferVerify(SFLASH_UPGRADE_BASE + (upInfo.offset - SFLASH_ERASE_SIZE), Task_recvBuff, SFLASH_ERASE_SIZE))
break;
printf("**** Verify SFlash failed at: 0x%08X, %d bytes\n", SFLASH_UPGRADE_BASE + (upInfo.offset - SFLASH_ERASE_SIZE), SFLASH_ERASE_SIZE);
delay_ms(200);
}
}
else if(upInfo.offset == upInfo.fileSize)
{
FRAM_BufferRead(FRAM_UPGRADE_DATA_BASE, Task_recvBuff, upInfo.offset % SFLASH_ERASE_SIZE);
for(write_count = 0; write_count < 2; write_count++)
{
SFlash_BufferWrite(SFLASH_UPGRADE_BASE + (upInfo.offset - upInfo.offset % SFLASH_ERASE_SIZE), Task_recvBuff, upInfo.offset % SFLASH_ERASE_SIZE);
if(SFlash_BufferVerify(SFLASH_UPGRADE_BASE + (upInfo.offset - upInfo.offset % SFLASH_ERASE_SIZE), Task_recvBuff, upInfo.offset % SFLASH_ERASE_SIZE))
break;
printf("**** Verify SFlash failed at: 0x%08X, %d bytes\n", SFLASH_UPGRADE_BASE + (upInfo.offset - upInfo.offset % SFLASH_ERASE_SIZE), upInfo.offset % SFLASH_ERASE_SIZE);
delay_ms(200);
}
}
#endif
for(write_count = 0; write_count < 2; write_count++)
{
// <20><><EFBFBD><EFBFBD><E6B5BD><EFBFBD><EFBFBD>
FRAM_SaveInfo(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo));
if(FRAM_BufferVerify(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo)))
break;
printf("**** Verify FRAM failed at: 0x%08X, %d bytes\n", FRAM_UPGRADE_INFO_BASE, sizeof(upInfo));
delay_ms(200);
}
}
}
else // <20><><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>
{
// ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
upInfo.fileSize = 0;
// <20><><EFBFBD><EFBFBD><E6B5BD><EFBFBD><EFBFBD>
for(write_count = 0; write_count < 2; write_count++)
{
FRAM_SaveInfo(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo));
if(FRAM_BufferVerify(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo)))
break;
printf("**** Verify FRAM failed at: 0x%08X, %d bytes\n", FRAM_UPGRADE_INFO_BASE, sizeof(upInfo));
delay_ms(200);
}
upgrade = 0;
break;
}
}
}
if(upInfo.fileSize > 0 && upInfo.offset == upInfo.fileSize)
{
SFlash_BufferRead(SFLASH_UPGRADE_BASE, (uint8_t *) &upHeader, sizeof(upHeader));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1
upHeader.upgrade_request = 1;
if(upHeader.check == 0x55AA
&& do_crc_16(0, (uint8_t *) &upHeader, sizeof(upHeader)) == 0
&& do_sflash_crc(SFLASH_UPGRADE_BASE + sizeof(upHeader), upHeader.upgrade_length) == 0)
{
// У<><D0A3>ͨ<EFBFBD><CDA8>
printf("\nUpgrade package confirm passed\n");
// <20><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
ackUpgrade = 1;
}
else
{
// У<><D0A3>δͨ<CEB4><CDA8>
printf("\n****** Upgrade package confirm failed\n");
// <20><>ͷ<EFBFBD><CDB7>ʼ
upInfo.fileSize = 0;
// <20><><EFBFBD><EFBFBD><E6B5BD><EFBFBD><EFBFBD>
for(write_count = 0; write_count < 2; write_count++)
{
FRAM_SaveInfo(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo));
if(FRAM_BufferVerify(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo)))
break;
printf("**** Verify FRAM failed at: 0x%08X, %d bytes\n", FRAM_UPGRADE_INFO_BASE, sizeof(upInfo));
delay_ms(200);
}
}
}
else
{
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20><><EFBFBD><EFBFBD>
continue;
}
}
// ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
if(ackUpgrade)
{
printf("\nConfirm upgrade software ...\n");
// <20><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
memset(Task_sendBuff, 0, TASK_SENDBUFF_SIZE);
i = sizeof(bluetooth_send_t);
// PSN
memmove(Task_sendBuff + i, dcBuff.configBottle.PSN, 6);
i += 6;
// <20><>ǰ<EFBFBD>̼<EFBFBD><CCBC><EFBFBD>
Int2ByteL(Task_sendBuff, i, htonl(upInfo.ver));
i += 4;
// <20>̼<EFBFBD><CCBC><EFBFBD>CRC16
Int2ByteS(Task_sendBuff, i, upInfo.fileCrc);
i += 2;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
i = fill_biDir_fixFields(0xD0E1, i);
// <20><><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>10<31><30><EFBFBD>ֽ<EFBFBD>
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3>´<EFBFBD><C2B4>ٷ<EFBFBD><D9B7><EFBFBD>
recvLen = sizeof(bluetooth_recv_t) + 2;
if(!Sim808_SendAndRecv(0, Task_sendBuff, i, &recvLen, Task_recvBuff, TASK_RECVBUFF_SIZE))
{
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20><><EFBFBD><EFBFBD>
continue;
}
if(recvLen == sizeof(bluetooth_recv_t) + 2 && pRecv->cmd == ntohs(0x00E1))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1
SFlash_BufferRead(SFLASH_UPGRADE_BASE, (uint8_t *) &upHeader, sizeof(upHeader));
upHeader.upgrade_request = 1;
for(write_count = 0; write_count < 2; write_count++)
{
SFlash_BufferWrite(SFLASH_UPGRADE_BASE, (uint8_t *) &upHeader, sizeof(upHeader));
if(SFlash_BufferVerify(SFLASH_UPGRADE_BASE, (uint8_t *) &upHeader, sizeof(upHeader)))
break;
printf("**** Verify SFlash failed at: 0x%08X, %d bytes\n", SFLASH_UPGRADE_BASE, sizeof(upHeader));
delay_ms(200);
}
// <20>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ
upInfo.fileSize = 0;
// <20><><EFBFBD><EFBFBD><E6B5BD><EFBFBD><EFBFBD>
for(write_count = 0; write_count < 2; write_count++)
{
FRAM_SaveInfo(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo));
if(FRAM_BufferVerify(FRAM_UPGRADE_INFO_BASE, (uint8_t *) &upInfo, sizeof(upInfo)))
break;
printf("**** Verify FRAM failed at: 0x%08X, %d bytes\n", FRAM_UPGRADE_INFO_BASE, sizeof(upInfo));
delay_ms(200);
}
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// <20>ر<EFBFBD>DTU<54><55>Դ
VCC_GSM_OFF();
delay_ms(200);
// <20><>LDROMӳ<4D><EFBFBD><E4B5BD>ַ0x0
// FMC_Open();
// FMC_SetVectorPageAddr(LDROM_BASE);
// FMC_Close();
// <20><>λ<EFBFBD>Ժ<EFBFBD>ִ<EFBFBD><D6B4>Bootloader<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
//WDT_Close(); // <20>ȹؿ<C8B9><D8BF>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bootloader<65><72>λ
NVIC_SystemReset();
}
}
// <20>رպͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_Close(0);
// ȷ<>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD>ִ<EFBFBD>и<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EEA3A8><EFBFBD><EFBFBD><E2B7B4><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
if(reset && !ackParam)
{
VCC_GSM_OFF();
delay_ms(200);
NVIC_SystemReset();
}
}
}
// <20>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>źš<C5BA><C5A1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>
xSemaphoreTake(DTU_semUpgrade, 0);
}
}
}