STM32_WGY/User/uart_dtu.c

650 lines
18 KiB
C
Raw Permalink Normal View History

2025-04-03 15:29:20 +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><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};
// ά<><CEAC>ƽ̨<C6BD><CCA8><EFBFBD>Ӽ<EFBFBD>ʱ
volatile uint32_t DTU_ldmsTime = 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>
#define TASK_SENDBUFF_SIZE 400
uint8_t Task_sendBuff[TASK_SENDBUFF_SIZE] = {0}; // <20><>չ<EFBFBD>ڴ<EFBFBD>
#define TASK_RECVBUFF_SIZE (UPGRADE_DATA_LEN + 32)
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>
volatile uint8_t DTU_semGPS = 0;
volatile uint8_t DTU_semGPRS = 0;
volatile uint8_t DTU_semSync = 0;
// <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;
// ˫<><CBAB>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ݽṹ
typedef struct // size = 120
{
uint16_t serverVer; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B1BE>
uint8_t type; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t diameter; // <20>ھ<EFBFBD>
uint32_t len; // Բ<><D4B2><EFBFBD><EFBFBD><E5B3A4>
uint32_t lenExtra; // ֱ<>߷<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
uint32_t reserved_1[3];
uint8_t source; // ҺԴ
uint32_t density; // <20><>ҺԴ<D2BA>ı<EFBFBD><C4B1>أ<EFBFBD>kg/m3)
uint16_t fullPct; // <20><>Һλ<D2BA>ٷֱ<D9B7>
uint16_t priPct; // <20>ؼ<EFBFBD>Һλ<D2BA>ٷֱ<D9B7>
uint16_t orderPct; // <20><><EFBFBD><EFBFBD>Һλ<D2BA>ٷֱ<D9B7>
uint16_t emptyPct; // <20><>Һλ<D2BA>ٷֱ<D9B7>
uint32_t planMount; // ÿ<>ռƻ<D5BC><C6BB><EFBFBD><EFBFBD><EFBFBD>
uint32_t predictMount; // ÿ<><C3BF>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t warnVolt; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>: 10mV
uint16_t warnVoltH; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>: 10mV
uint16_t warnPress; // ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>: KPa
uint16_t warnPressH; // ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>: KPa
uint32_t intervalTrans; // <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>
uint32_t intervalSample; // <20><><EFBFBD>ݲɼ<DDB2><C9BC><EFBFBD><EFBFBD><EFBFBD>
uint32_t intervalGPSTrans; // λ<><CEBB><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>
uint32_t intervalGPS; // λ<>òɼ<C3B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
union
{
struct
{
char gpsServer[20]; // Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>)
int16_t gpsPort; // Զ<><D4B6><EFBFBD>˿<EFBFBD><>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>)
char pwd1[6]; // <20><><EFBFBD>޲<EFBFBD><DEB2><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>
};
struct
{
char gprsServer[26]; // praxair<69><72><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
int16_t gprsPort; // praxair: <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
};
};
uint32_t options; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
union
{
uint8_t reserved_2[12];
struct
{
uint16_t floorLevel; // praxair: Һ<><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t span; // praxair: Һ<><D2BA><EFBFBD><EFBFBD><E4BBAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t spanPeriod; // praxair: Һ<><D2BA><EFBFBD><EFBFBD><E4BBAF><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
unsigned floorLevelAssigned : 1; // praxair: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>floorLevel<65>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
unsigned spanAssigned : 1; // praxair: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>span<61>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
unsigned spanPeriodAssigned : 1; // praxair: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>spanPeriod<6F>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
unsigned intervalTransAssigned : 1; // praxair: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>intervalTrans<6E>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
unsigned gprsServerAssigned : 1; // praxair: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
unsigned gprsPortAssigned : 1; // praxair: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
unsigned : 2;
};
};
uint32_t ts; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
} param_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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>¼
typedef struct // size=76
{
unsigned short check; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>־, 0x55AA<41><41>ʾ<EFBFBD><CABE>Ч
uint8_t PSN[6]; // <20><>ȡ<EFBFBD><C8A1>Կ<EFBFBD><D4BF><EFBFBD>õ<EFBFBD>PSN<53><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PSN<53>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡ<EFBFBD><C8A1>
char product[12]; // <20><>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>
char device[21]; // Ĭ<><C4AC>ΪcPSN
char secret[33]; // <20><EFBFBD><E8B1B8>Կ
unsigned short crc; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>crcУ<63><D0A3>
} TAliyunSecret;
#define ALIYUN_SECRET_SIZE (66)
#pragma pack(pop)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ
TAliyunSecret aliyunSecret = {0};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
upgrade_info_t upInfo = {0};
// GPSѭ<53><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
loopbuff_t gpsBuff = {0};
// <20><><EFBFBD><EFBFBD>GPRS<52><53>¼<EFBFBD><C2BC>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
loopbuff_t gprsBuff = {0};
loopbuff_t bd_gprsBuff = {0};
// GPRS<52><53>¼<EFBFBD><C2BC>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
gprs_data_t gprsRWBuf;
/**
* @brief ?????,?????????
*/
struct reportInf_t {
uint32_t lastTime; //!< ?????????
uint32_t nextTime; //!< ??????????
uint32_t redoTime; //!< ????????????
uint8_t redoNum; //!< ????????????
uint8_t fiRedo; //!< ????,??????????????,(??)????????
};
/**
* @brief reportInf:????,????????
*/
// <20>Ƿ<EFBFBD>GPS<50><53>λ
volatile uint8_t GPS_Locate = 1;
volatile uint8_t GPS_Located = 0;
volatile uint32_t GPS_waitTick = 0;
volatile uint8_t GPS_Waiting = 0;
// GPS<50><53>λ<EFBFBD><CEBB>ʱ
const uint8_t DTU_tmrLocate = 90;
// GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
volatile uint32_t GPS_tranTick = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><CAB1>
bluetooth_timestamp_t GPS_LastTime = {0};
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>GPRS<52><53><EFBFBD><EFBFBD>
uint8_t GPRS_Send_Task = 0;
uint32_t GPRS_Send_Time = 0;
// <20>Ƿ񱣴<C7B7>GPRS<52><53><EFBFBD><EFBFBD>
uint8_t GPRS_Save_Task = 0;
uint32_t GPRS_Save_Time = 0;
/////////////////////////////////////////
uint32_t Fre[5] = {498000000, 499000000, 509770000, 868000000, 915000000};
uint8_t RXbuffer[60];
#define TASK_SENDBUFF_SIZE 400
//uint8_t Task_sendBuff[TASK_SENDBUFF_SIZE] = {0}; // <20><>չ<EFBFBD>ڴ<EFBFBD>
uint8_t TXbuffer[10] = {0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA};
tSX127xError set_lora_freq(int freq)
{
G_LoRaConfig.LoRa_Freq = Fre[freq]; //????470MHz
G_LoRaConfig.BandWidth = BW500KHZ; //BW = 125KHz BW125KHZ
G_LoRaConfig.SpreadingFactor = SF12; //SF = 9
G_LoRaConfig.CodingRate = CR_4_5; //CR = 4/6
G_LoRaConfig.PowerCfig = 15; //19<31><39>1dBm
G_LoRaConfig.MaxPowerOn = true; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD>
G_LoRaConfig.CRCON = true; //CRCУ<43><EFBFBD><E9BFAA><EFBFBD>
G_LoRaConfig.ExplicitHeaderOn = true; //Header<65><72><EFBFBD><EFBFBD>
G_LoRaConfig.PayloadLength = 42; //<2F><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>
return SX127X_Lora_init(G_LoRaConfig.LoRa_Freq);
}
////////////////////////////////////////////////////////////////////////////////////////
//-->add
#define LORA_COMMU_IDLE_STATE 0
#define LORA_COMMU_START_STATE 1
#define LORA_COMMU_SEND_STATE 2
#define LORA_COMMU_REC_STATE 3
#define LORA_COMMU_FAIL_STATE 4
#define LORA_COMMU_SUCC_STATE 5
uint16_t g_lora_commu_state=LORA_COMMU_IDLE_STATE;
////////////////////////////////////
uint8_t pack_lora_send_data(gprs_data_t *pGprs, uint32_t totalSeconds)
{
int i=0;
uint16_t val = 0;
Task_sendBuff[i++]=0x01;
Int2ByteS(Task_sendBuff, i, /*htons*/(dcBuff.sampleData.diff));
2025-04-03 15:29:20 +08:00
i +=2 ;
Int2ByteS(Task_sendBuff, i, /*htons*/(dcBuff.dtuData.batVoltage));
2025-04-03 15:29:20 +08:00
i += 2;
// <20><EFBFBD><E6B1BE>
Task_sendBuff[i++] = dcBuff.powerInfo.hardVer.minor;
Task_sendBuff[i++] = dcBuff.powerInfo.softVer.minor;
Int2ByteS(Task_sendBuff, i, /*htons*/(dcBuff.configData.intervalSample));
2025-04-03 15:29:20 +08:00
i += 2;
Int2ByteL(Task_sendBuff, i, /*htonl*/(dcBuff.configData.intervalTrans));
2025-04-03 15:29:20 +08:00
i += 4;
Int2ByteS(Task_sendBuff, i, /*htons*/(dcBuff.configBottle.fullPct)); //<2F><>apex<65><78>Ҫ<EFBFBD><D2AA>Ϊѹǿ
2025-04-03 15:29:20 +08:00
i += 2;
Int2ByteS(Task_sendBuff, i, /*htons*/(dcBuff.configBottle.emptyPct));
2025-04-03 15:29:20 +08:00
i += 2;
// // ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.warnPressH));
// i += 2;
// // ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.warnPress));
// i += 2;
// // <20>¶ȱ<C2B6><C8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.warnTemprH));
// i += 2;
// // <20>¶ȱ<C2B6><C8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Int2ByteS(Task_sendBuff, i, htons(dcBuff.configBottle.warnTempr));
// i += 2;
return i;
}
uint8_t parse_load(uint8_t *buf)
{
#pragma pack(push, 1)
typedef struct
{
uint8_t type;
uint32_t flag;
uint16_t intervalSample; // <20><><EFBFBD>ݲɼ<DDB2><C9BC><EFBFBD><EFBFBD><EFBFBD>
uint32_t intervalTrans; // <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>
uint16_t fullPct;
uint16_t emptyPct;
// uint16_t warnPressH;
// uint16_t warnPress;
// int16_t warnTemprH;
// int16_t warnTempr;
} parse_data_t;
#pragma pack(pop)
parse_data_t *buf2;
buf2 = (parse_data_t*) buf;
if(buf2->flag == 0) return 0;
dcBuff.configData.intervalSample=buf2->intervalSample;
dcBuff.configData.intervalTrans=buf2->intervalTrans;
dcBuff.configBottle.fullPct=buf2->fullPct;
dcBuff.configBottle.emptyPct=buf2->emptyPct;
//dcBuff.configBottle.warnPressH=buf2->warnPressH;
//dcBuff.configBottle.warnPress=buf2->warnPress;
//dcBuff.configBottle.warnTemprH=buf2->warnTemprH;
//dcBuff.configBottle.warnTempr=buf2->warnTempr;
dcBuff.configBottle.updateFlag = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>־
// <20><><EFBFBD><EFBFBD>
Config_SaveConfig();
// uint8_t ret = 0;
// S_RTC_TIME_DATA_T sRTC;
//
// if(strncmp(message, "$GPGGA", 6) == 0 || strncmp(message, "$GNGGA", 6) == 0)
// {
//// printf("\n%s\n", message);
// *bufIdx = 1 - *bufIdx;
// }
// else if(strncmp(message, "$GPRMC", 6) == 0 || strncmp(message, "$GNRMC", 6) == 0)
// {
// printf("\n%s\n", message);
// // <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
// RTC_GetDateAndTime(&sRTC);
// // <20><>¼GPS<50>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// DTU_gpsTime = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
// sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
// parse_gga(DTU_gpsData[1 - *bufIdx], sample);
// ret = parse_rmc(message, sample);
// if(!ret)
// sample->posState = 0;
// }
return 1;
}
static uint8_t first_send=1;
// <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;
uint8_t gpsCount, gpsDone;
uint16_t gpsInterval;
uint32_t totalSeconds;
uint32_t relativeTime;
S_RTC_TIME_DATA_T sRTC;
gprs_data_t *pGprs;
uint8_t try_count;
uint16_t recvLen;
uint8_t upgrade;
uint8_t ackUpgrade;
uint8_t downloadParam;
uint8_t ackParam;
uint8_t downloadConfig;
uint8_t ackConfig;
uint8_t reset = 0;
param_data_t *pParam;
TUpgradeHeader upHeader;
upgrade_frame_t *pFrame;
gps_data_t gps;
uint16_t nextPtr;
uint8_t write_count;
uint8_t rf_fail_count = 0;
uint8_t semSync, semGPRS, semGPS;
uint32_t tick;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memset(&dcBuff.dtuData, 0, sizeof(dcBuff.dtuData));
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
GPS_tranTick = GetDelayTick(dcBuff.configData.intervalGPSTrans * 1000);
// <20>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_semSync = 1;
DTU_semGPRS = 1;
DTU_semGPS = 1;
while(1)
{
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
RTC_GetDateAndTime(&sRTC);
printf("\n%04d-%02d-%02d %02d:%02d:%02d\n", sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
// <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;
// <20><>ȡ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
semSync = DTU_semSync;
DTU_semSync = 0;
semGPRS = DTU_semGPRS;
DTU_semGPRS = 0;
semGPS = DTU_semGPS;
DTU_semGPS = 0;
printf("\n\n\n------semGPRS=%d-------semSync=%d------\n\n\n",semGPRS,semSync);
if(semGPRS || semSync)
{
GPRS_Send_Task = 0;
printf("\n*** dcBuff.sampleData.warnning = %d ***\n", dcBuff.sampleData.warnning);
if(dcBuff.sampleData.warnning||first_send)
{
GPRS_Send_Task = 1;
dcBuff.sampleData.warnning = 0;
first_send=0;
}
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>Сֵ
if(totalSeconds + 3 >= GPRS_Send_Time + (dcBuff.configData.intervalTrans > 300 ? 300 : dcBuff.configData.intervalTrans))
{
GPRS_Send_Task = 1;
}
if(((SYS_RSTSTS & 0x13) && !(SYS_RSTSTS & 0x04) && // <20>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>λ, <20>ǿ<EFBFBD><C7BF>Ź<EFBFBD><C5B9><EFBFBD>λ
totalSeconds < INITIAL_TRAN_COUNT * (dcBuff.configData.intervalSample > 300 ? 300 : dcBuff.configData.intervalSample))
|| totalSeconds + 3 >= GPRS_Send_Time + dcBuff.configData.intervalTrans )
{
// <20><><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>Сֵ
if(totalSeconds + 3 >= GPRS_Send_Time + (dcBuff.configData.intervalTrans > 300 ? 300 : dcBuff.configData.intervalTrans))
GPRS_Send_Task = 1;
}
if(Wakeup_GetWorkMode() == WORK_MODE_NORMAL && GPRS_Send_Task)
{
if(set_lora_freq(0) != NORMAL) //
{
printf("\nlora init err\n");
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
GPRS_semSampled = 0;
// <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
Sample_Notify();
tick = GetDelayTick(3000);
while(!GPRS_semSampled && !IsTickOut(tick))
{
}
i = pack_lora_send_data(pGprs, totalSeconds);
try_count = 3;
while(try_count--)
{
j = rf_app_send_data(i, Task_sendBuff);
osDelay(5000);
if(g_lora_commu_state==LORA_COMMU_SUCC_STATE)
{
// <20><>¼<EFBFBD><C2BC><EFBFBD>ͳɹ<CDB3><C9B9><EFBFBD>ʱ<EFBFBD><CAB1>
RTC_GetDateAndTime(&sRTC);
DTU_succTime = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
printf("\ncommu success\n");
break;
}
else
{
printf("\ncommu fail\n");
}
}
GPRS_Send_Time = totalSeconds;
osDelay(1000);
}
}
printf("\nlora to SleepMode\n");
SX127X_SleepMode();
// DIO0_DisableInterrupt();
// printf("\nlora spi deinit\n");
Lora_spi_di_deinit();
osDelay(2000);
printf("\nlora to powerdown\n");
Wakeup_Powerdown();
//continue;
}
}