You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

522 lines
15 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*****************************************************************************
* file Inc/common.h
* author YuLiang
* version 1.0.0
* date 10-Jun-2022
* brief This file provides all the headers of common function.
******************************************************************************
* Attention
*
* <h2><center>&copy; COPYRIGHT(c) 2022 LandPower</center></h2>
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of WTOE nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
#ifndef __COMMON_H__
#define __COMMON_H__
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
//#include "cmsis_os.h"
//#include "task.h"
#include <QString>
#include <QByteArray>
#include <QDebug>
/* Define --------------------------------------------------------------------*/
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef short int16_t;
typedef unsigned short uint16_t;
typedef int int32_t;
typedef unsigned uint32_t;
#define TRUE 1
#define FALSE 0
#define OTHER 2
/* int16_t无效时的数据. */
#define INVALID_DATE_8 0x7F
/* uint16_t无效数据.*/
#define INVALID_DATA_U8 0xFF
/* int16_t无效时的数据. */
#define INVALID_DATE_16 0x7FFF
/* uint16_t无效数据.*/
#define INVALID_DATA_U16 0xFFFF
/* int32_t无效时的数据. */
#define INVALID_DATE_32 0x7FFFFFFF
/* uint32_t无效数据.*/
#define INVALID_DATA_U32 0xFFFFFFFF
/* DAU 工频通道数. */
#define DAU_PORT_POWER_CNT 8
#define DAU_PORT_DEFECT_MAX 4
#define DAU_PORT_FAULT_MAX 4
/* ADC 校准点. */
#define DAU_POWER_ADJ_CNT 5
/* ADC 通道数. */
#define CFG_ADC_CH_CNT 8
#define SENSOR_SUM 8
/* ADC 校准点. */
#define ADC_COLLECT_CNT 2000 // ADC 每个通道采样次数.
/* RS485 传感器数量. */
#define SENSOR_SUM 8
#define WAVE_SUM 4
#define POSITION_SUM 3
#define USART_BUF_SIZE 1088
#define DEBUG_DATA_SIZE 1024
#define UPDATE_DATA_SIZE DEBUG_DATA_SIZE
#define FLASH_LOG_BUF_LEN 256
#define FD_BUF_LEN 256
#define FLASH_LOG_DATA_LEN 248
#define MONITOR_ADCi_NOTIFY_OK 0x101
#define MONITOR_ADC_NOTIFY_OK 0x102
#define MONITOR_SEN_NOTIFY_OK 0x201
#define COM_WDG_COM 0x0001
#define COM_WDG_ADC 0x0002
#define COM_WDG_CLI 0x0004
#define COM_WDG_WIR 0x0008
#define COM_WDG_DAU 0x0010
#define COM_WDG_GPS 0x0020
#define CSG_CIPHERTEXT_LEN 4
#define CSG_PASSWD_LEN 4
#define BIT00 (0x01)
#define BIT01 (0x02)
#define BIT02 (0x04)
#define BIT03 (0x08)
#define BIT04 (0x10)
#define BIT05 (0x20)
#define BIT06 (0x40)
#define BIT07 (0x80)
#define BIT08 (0x0100)
#define BIT09 (0x0200)
#define BIT10 (0x0400)
#define BIT11 (0x0800)
#define BIT12 (0x1000)
#define BIT13 (0x2000)
#define BIT14 (0x4000)
#define BIT15 (0x8000)
#define BIT16 (0x00010000)
#define BIT17 (0x00020000)
#define BIT18 (0x00040000)
#define BIT19 (0x00080000)
#define BIT20 (0x00100000)
#define BIT21 (0x00200000)
#define BIT22 (0x00400000)
#define BIT23 (0x00800000)
#define BIT24 (0x01000000)
#define BIT25 (0x02000000)
#define BIT26 (0x04000000)
#define BIT27 (0x08000000)
#define BIT28 (0x10000000)
#define BIT29 (0x20000000)
#define BIT30 (0x40000000)
#define BIT31 (0x80000000)
#define DEV_CAPABILITY_LEN 16
#define DEV_CAPABILITY_BIT_LEN 128
#define DEV_PASSWORD_LEN 16
#define DEV_COMPILE_TIME_LEN 32
#define DEV_VERSION_STR_LEN 32
#define DEV_NAME_LEN 128
#define DEV_RESET_INFO_NUM 10
#define DEV_APN_LEN 16
#define DEV_APN_LEN_LONG 64
#define DEV_CONFIG_SIZE 1024
#define DEV_RECORD_SIZE 512
/* Exported types ------------------------------------------------------------*/
/* debug模块号. */
typedef enum
{
DBG_M_ADC = 0,
DBG_M_4G,
DBG_M_RS485_SEN,
DBG_M_RS485_DEBUG,
DBG_M_DAU,
DBG_M_DAU_TXRX,
DBG_M_GPS,
DBG_M_COUNT
} DBG_MODULE_E;
/* debug命令字. */
typedef enum
{
DBG_CMD_ON = 0,
DBG_CMD_OFF,
DBG_CMD_OFF_ALL,
} DBG_CMD_E;
/* 公共监控任务标志. */
typedef enum
{
COM_SYS_SAVE_CONFIG = 0,
COM_SYS_SAVE_RECORD,
COM_SYS_SAVE_INFO,
COM_SYS_RESET,
COM_SYS_SHUTDOWN,
} COM_SYS_FLAG_E;
/* 命令类型. */
enum DEBUG_CMD_TYPE
{
DEBUG_CT_REQUEST = 1,
DEBUG_CT_REPLY = 2,
DEBUG_CT_PRV_REQUEST = 121,
DEBUG_CT_PRV_REPLY = 122,
};
/* 共有命令字. */
enum DEBUG_CMD
{
DEBUG_C_CONTACT = 1,
DEBUG_C_DEV_INFO_SET = 2,
DEBUG_C_RESET = 3,
DEBUG_C_DEFAULT = 4,
DEBUG_C_UPDATE_APP = 5,
DEBUG_C_UPDATE_IAP = 6,
DEBUG_C_DEV_CONFIG = 7,
DEBUG_C_DEV_CONFIG_SET = 8,
DEBUG_C_UPDATE_APP_RT = 9,
DEBUG_C_KEEPALIVE = 10,
DEBUG_C_TIME = 11
};
/* 私有命令字. */
enum DEBUG_CM_CMD
{
DEBUG_PRV_REALDATA = 1,
DEBUG_PRV_POWER = 2,
DEBUG_PRV_DEFECT = 3,
DEBUG_PRV_REALDATA_FUALT = 4,
DEBUG_PRV_POWER_FAULT = 5,
DEBUG_PRV_FAULT = 6,
DEBUG_PRV_ADJ_INFO = 7,
DEBUG_PRV_ADJ_INFO_SET = 8,
DEBUG_PRV_ADJ_AUTO = 9,
DEBUG_PRV_DEV_STATE = 10,
DEBUG_PRV_WAVE_COL = 11,
DEBUG_PRV_WAVE_CAL = 12,
DEBUG_PRV_WAVE_MAX = 13,
DEBUG_PRV_LOG = 14,
DEBUG_PRV_HISTORY_DATA = 15,
DEBUG_PRV_ADJ_MANUAL = 16,
DEBUG_PRV_CSG_CONFIG = 17,
DEBUG_PRV_CSG_CONFIG_SET = 18,
DEBUG_PRV_POSITION_WAVE = 19,
DEBUG_PRV_POSITION = 20
};
/* . */
typedef enum
{
ADC_ENERGY_AUTO = 0,
ADC_ENERGY_NORMAL,
ADC_ENERGY_SLEEP,
ADC_ENERGY_SLEEP_FORCE,
ADC_ENERGY_CNT
} ADC_ENERGY_E;
enum WaveStateE
{
WAVE_STATE_IDLE = 0,
WAVE_STATE_START,
WAVE_STATE_WAIT,
WAVE_STATE_READ,
WAVE_STATE_STOP,
WAVE_STATE_ADC_ERROR,
WAVE_STATE_TIMEOUT,
WAVE_STATE_COMPLETION = 255
};
//Q_ENUM(WaveStateE);
/* 状态机状态. */
enum WlStateE
{
WL_STATE_SOFT = 0,
WL_STATE_AT_ATE,
WL_STATE_AT_QICSGP,
WL_STATE_AT_QIACT,
WL_STATE_AT_CSQ,
WL_STATE_AT_QICFGTS,
WL_STATE_AT_QICFGWT,
WL_STATE_AT_QIOPEN,
WL_STATE_WAKEUP = 128,
WL_STATE_REALDATA,
WL_STATE_PWR_FRE,
WL_STATE_UPDATE,
WL_STATE_UPDATE_RT,
WL_STATE_WAVE,
WL_STATE_WAVE_MAX,
WL_STATE_KEEPALIVE,
WL_STATE_END = 255
};
//Q_ENUM(WlStateE);
typedef struct
{
uint16_t len;
uint8_t dev_type_m;
uint8_t dev_type_s;
uint32_t dev_id;
uint8_t cmd_type;
uint8_t cmd;
uint16_t pkt_id;
uint8_t reserve[8];
} proto_head_t;
typedef struct
{
uint32_t index;
uint32_t len;
} mul_head_t;
typedef struct
{
/* 设备信息. 36byte */
uint8_t typeM;
uint8_t typeS;
uint8_t mac[6];
uint32_t id;
uint8_t ip[4];
uint8_t ipMask[4];
uint8_t ipGw[4];
uint8_t serverIp[4];
uint8_t wirelessServerIp[4];
uint16_t serverPort;
uint16_t wirelessServerPort;
/* 版本信息. 224byte */
uint8_t bootVersion[DEV_VERSION_STR_LEN];
uint8_t bootCompile_time[DEV_COMPILE_TIME_LEN];
uint8_t imgVersion[DEV_VERSION_STR_LEN];
uint8_t imgCompile_time[DEV_VERSION_STR_LEN];
uint8_t hardwareVersion[DEV_VERSION_STR_LEN];
uint8_t fpgaVersion[DEV_COMPILE_TIME_LEN];
uint8_t factoryTime[DEV_COMPILE_TIME_LEN];
/* 设备其他信息. 128byte */
uint8_t name[DEV_NAME_LEN];
uint8_t csgId[8];
uint16_t csgVersion;
uint8_t csgCard[6];
} devInfo;
/* RS485 调试通讯协议配置信息. */
typedef struct
{
/* 设备配置. 12byte */
uint16_t flag;
uint8_t energyMode;
uint8_t isVoltageCol;
uint8_t sensor_id[SENSOR_SUM];
uint16_t collectInterval;
uint16_t waveInterval;
uint16_t collectThreshold;
uint16_t waveThreshold;
uint8_t mainCable;
uint8_t normalSleep;
uint8_t isTempCol;
uint8_t isWaveCol;
uint8_t APN[DEV_APN_LEN];
//uint8_t APN_long[DEV_APN_LEN_LONG];
} devConfig;
/* 南网配置信息. */
typedef struct
{
uint8_t passwd[CSG_PASSWD_LEN];
uint8_t beatInterval;
uint8_t resetTime[3];
uint16_t collectInterval;
uint16_t sleepTime;
uint16_t onlineTime;
uint8_t reserve[2];
uint8_t ciphertext[CSG_CIPHERTEXT_LEN]; // 实时数据认证密文.
} csgConfig_t;
/* 实时数据信息. */
typedef struct
{
int16_t temperature; // 设备温度, 单位: 0.1℃.
uint16_t vbat; // 电池电压, 单位: mv.
int16_t CSQ; // 4G 信号质量 > -51dBm 统一显示 -51dBm, < -113 dBm 为无信号.
uint16_t vin; // 工作电压, 单位: mv.
uint32_t elec[CFG_ADC_CH_CNT]; // 通道电流有效值 mA.
uint16_t vsc; // 超级电容电压, 单位: mv.
int16_t sen_temp[SENSOR_SUM]; // 传感器温度: 单位: 0.1℃.
uint16_t senX[SENSOR_SUM]; // 传感器震动 x 轴.
uint16_t senY[SENSOR_SUM]; // 传感器震动 y 轴.
uint16_t senZ[SENSOR_SUM]; // 传感器震动 z 轴.
uint8_t energyMode; // 节能模式.
uint8_t senShort; // 传感器是否短路, 0 没有短路, 1 短路.
uint8_t senValid[SENSOR_SUM]; // 传感器数据是否有效, 0 - 无效, 1 - 有效.
} realData_t;
/* 设备状态信息. */
typedef struct
{
uint8_t energyMode; // 节能模式.
uint8_t isAdcCollect; // ADC 采集完成.
uint8_t isAdcUp; // ADC 上传完成.
uint8_t AdciCnt; // ADCi 错误计数.
uint8_t AdciState; // ADCi 状态.
uint8_t AdcCnt; // ADC 错误计数.
uint8_t AdcState; // ADC 状态.
uint8_t waveState; // 高频录波状态.
uint32_t waveTime; // 高频录波开始时间.
uint8_t waveStart; // 高频录波完成.
uint8_t waveUpStart; // 高频录波上传完成.
uint16_t waveIdx; // 高频录波续传索引.
uint8_t waveRt; // 高频录波结果.
uint8_t waveForce; // 是否强制录波.
uint8_t wlState; // 4G 状态.
uint8_t wlCnt; // 4G 错误计数.
uint16_t wlWaveIdx; // 4G 上传录波文件索引.
uint8_t isWlUpdate; // 4G 升级.
uint8_t isAdcthr; // 是否超过工频阈值.
uint8_t forceSleepUp; // 强制睡眠报文是否上传.
uint8_t isBatCharge; // 电池充电状态.
uint16_t waveAdj; // 高频校准系数.
int16_t waveMin; // 高频采样最大值.
int16_t waveMax; // 高频采样最小值.
uint32_t sysTime; // 系统运行时间.
uint16_t scMax; // 超级电容最大值.
uint16_t scMin; // 超级电容最小值.
uint32_t scMaxTime; // 超级电容最大值时间.
uint32_t scMinTime; // 超级电容最小值时间.
uint32_t scUpTime; // 超级电容充电时间.
uint32_t scDownTime; // 超级电容放电时间.
} devState;
/* 校准参数信息. */
typedef struct
{
uint16_t ADCRatio[DAU_PORT_POWER_CNT]; // 变比
uint32_t ADCBase_elec[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT]; // 分段点(1A/2A/5A/10A/30A)
uint16_t ADCAdj[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT]; // 斜率(校准系数)
float ADCBase[DAU_PORT_POWER_CNT][DAU_POWER_ADJ_CNT]; // 采样值(对应分段点的1/2/5/10/30)
uint16_t vin;
uint16_t vin_adj;
uint8_t ADC_turns[DAU_PORT_POWER_CNT]; // 匝数
} dev_adj_t;
/* 校准命令信息. */
typedef struct
{
uint8_t chSelecet;
uint8_t isVoltageSel;
uint8_t manualIndex;
uint8_t reserve[1];
} adjSet;
/* 高频校准信息. */
typedef struct
{
/* 高频校准. 4 */
uint16_t param;
uint8_t reserve[2];
} waveParam_t;
/* Note: 必须保证这个结构体的大小是可以被flash扇区大小整除的,比如128,256... */
typedef struct
{
uint64_t id;
uint8_t data[FLASH_LOG_DATA_LEN];
} falsh_log_t;
/* Note: 必须保证这个结构体的大小是可以被flash扇区大小整除的,比如128,256... */
typedef struct
{
uint64_t id;
uint32_t run_time; // 时间, 单位 s
int16_t temperature; // 设备温度, 单位: 0.1℃
uint16_t vin; // 工作电压, 单位: mv
uint16_t vbat; // 电池电压, 单位: mv
uint16_t vsc; // 超级电容电压, 单位: mv
uint16_t defect[4]; // 缺陷电流最大值 mA
uint32_t elec[DAU_PORT_POWER_CNT]; // 通道电流有效值 mA
uint8_t col_flag; // DAU 采集标志位
uint8_t reserve[3]; // Reserve
} fd_data_t;
/* Exported macro ------------------------------------------------------------*/
/* dev_config flag 类型号. */
enum DevConfigFlag
{
DEV_FLAG_CLI = 0, // 是否开启命令行模式.
DEV_FLAG_ADJ, // 是否开启校准模式.
DEV_FLAG_FACTORY // 工厂持续采样模式.
};
/* bitmap操作. */
#define MONITOR_BITMAP_SET(t, b) ((t) |= 1 << (b))
#define MONITOR_BITMAP_RESET(t, b) ((t) &= ~(1 << (b)))
#define IS_MONITOR_BIT_SET(t, b) ((t) & (1 << b))
//QByteArray data
#define HexPrint(func, packet, len) \
do{\
QByteArray data((const char *)packet, len); \
QString hexString; \
qDebug() << func << ":\n"; \
for (int i = 0; i < data.size(); i++) { \
hexString += QString("%1 ").arg((quint8)data.at(i), 2, 16, QChar('0')); \
} \
qDebug() << hexString; \
}while (0);
/* Extern global variables ---------------------------------------------------*/
/* Extern functions ----------------------------------------------------------*/
extern uint32_t crc32_update(uint32_t crc, char* buf, uint32_t len);
extern void crc32_table_init(void);
extern uint32_t crc32(void const *buf, uint32_t byte_count);
extern uint32_t crc32_update(uint32_t crc, char* buf, uint32_t len);
extern uint16_t crc16(uint8_t *data, uint16_t size);
int32_t stringToChar(QString str, char *buf, uint32_t len);
void printHexArray(const char *msg, const char *array, int length);
#endif
/******************* (C) COPYRIGHT LandPower ***** END OF FILE ****************/