237 lines
6.7 KiB
C
237 lines
6.7 KiB
C
/* USER CODE BEGIN Header */
|
||
/**
|
||
******************************************************************************
|
||
* @file : fm33lg0xx_queue.h
|
||
* @brief : 消息队列头文件
|
||
* @version : 1.0
|
||
* @changelog : version 1.0 初始版本 2025.11.13
|
||
******************************************************************************
|
||
* @attention
|
||
*
|
||
* Copyright (c) 2025 Yuwell Software Danyang.Jiangsu.China
|
||
* THIS SOFTWARE is licensed under the Mulan PSL v1.
|
||
* can use this software according to the terms and conditions of the Mulan PSL v1.
|
||
* You may obtain a copy of Mulan PSL v1 at:
|
||
* http://license.coscl.org.cn/MulanPSL
|
||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
|
||
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
|
||
* PURPOSE.
|
||
* See the Mulan PSL v1 for more details.
|
||
*
|
||
******************************************************************************
|
||
*/
|
||
/* USER CODE END Header */
|
||
|
||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||
#ifndef __FM33_QUEUE_H
|
||
#define __FM33_QUEUE_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
|
||
|
||
#include <stdint.h>
|
||
#include "fm33lg0xx_fl.h"
|
||
/* 增加对Malloc函数的支持 */
|
||
#include "stdlib.h"
|
||
|
||
|
||
#define NETCODE_E1_CALIB (0x0B)
|
||
#define NETCODE_E2_CALIB (0x0C)
|
||
#define NETCODE_E4_CALIB (0x05)
|
||
#define NETCODE_E7_CALIB (0x0D)
|
||
|
||
#define NETCODE_PRESS (0x01)
|
||
#define NETCODE_O2 (0x02)
|
||
#define NETCODE_TEMP_PRESS (0x03)
|
||
#define NETCODE_ELEC (0x06)
|
||
|
||
|
||
#define QUEUE_LEN_MAX (20)
|
||
|
||
#define PROGREMA_DEBUG_MODE (1)
|
||
|
||
|
||
|
||
/************************** 结构体定义 *************************/
|
||
// 标识当前传输的数据种类
|
||
typedef enum
|
||
{
|
||
MSG_TYPE_OXYGEN_SENSOR, // 氧传感器数据(浓度、流量)
|
||
MSG_TYPE_HOUR_SAVE, // 累时数据存储消息(小时)
|
||
MSG_TYPE_MINUTE_SAVE, // 累时数据存储消息(分钟)
|
||
MSG_TYPE_CURRENT_TIME, // 本次开机的累时数据
|
||
MSG_TYPE_TIME_SEND, // 累时数据公布
|
||
MSG_TYPE_AD_SAMPLING, // AD采样数据(压缩机电流、NTC、储气罐压、网电压等)
|
||
MSG_TYPE_AD_BOUNDARY_SEND, // EEPROM上电后取出当前记录的
|
||
MSG_TYPE_AD_BOUNDARY_SAVE, // 标定时将边界值储存到EEPROM
|
||
MSG_TYPE_OXG_STM, // 用于记录当前系统状态的状态机
|
||
MSG_TYPE_CARLIB_SAVE, // 用于记录当前报警边界值
|
||
MSG_TYPE_FILTER_SERVER, // 过滤器更换及清洁相关数据
|
||
MSG_TYPE_FILTER_TIME_SAVE, // 对过滤器更换时间进行存储
|
||
|
||
MSG_TYPE_MAX // 消息类型总数(用于边界检查)
|
||
} MsgType;
|
||
|
||
//
|
||
|
||
// 需要传输的氧传感器数据
|
||
typedef struct
|
||
{
|
||
uint16_t concentration; // 氧气浓度(例如:210 表示21%)
|
||
uint16_t flow_rate; // 氧气流量(例如:50 表示5L/min)
|
||
} OxygenSensorData;
|
||
|
||
|
||
// 累时数据存储消息:当前小时、分钟(用于记录设备运行时间)
|
||
typedef struct
|
||
{
|
||
uint32_t hour; // 当前小时(0-19999)
|
||
uint32_t minute; // 当前分钟(0-59)
|
||
uint32_t second; // (自开机运行的秒数)
|
||
} HourMeterData;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
uint16_t adc_elec_value;
|
||
uint16_t adc_ntc_value;
|
||
uint16_t adc_press_value;
|
||
uint16_t adc_220v_value;
|
||
|
||
uint32_t voltage_elec;
|
||
uint32_t voltage_ntc;
|
||
uint32_t voltage_press;
|
||
uint32_t voltage_220v;
|
||
|
||
uint16_t real_press; // 压力真实值,单位kpa
|
||
uint16_t real_ntc; // 温度真实值,单位℃
|
||
uint16_t real_220V; // 网电压真实值,单位VAC
|
||
uint16_t real_elec; // 当前电流真实值 单位mA
|
||
|
||
} ADSampleData;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
uint16_t elec_low_boundary;
|
||
uint16_t elec_high_boundary;
|
||
uint16_t ntc_low_boundary;
|
||
uint16_t ntc_high_boundary;
|
||
uint16_t press_low_boundary;
|
||
uint16_t press_high_boundary;
|
||
uint16_t net220v_low_boundary;
|
||
uint16_t net220v_high_boundary;
|
||
uint8_t save_index; // 选择当前往EEPROM写入哪个边界
|
||
} ADBoundary;
|
||
|
||
|
||
/* 定义制氧机的状态机 */
|
||
typedef enum
|
||
{
|
||
|
||
STM_INIT,
|
||
STM_NOM,
|
||
STM_ERROR_SHOUNTDOWN, // 机器发生报警并停机 E1-E5,LL
|
||
STM_ERROR_NONE_STOP, // 机器发生报警但是不停机状态 E7与浓度低于83.5时
|
||
STM_CARLIB, // 检测到进入到标定状态
|
||
STM_DEBUG, // 调试模式
|
||
}OXG_STM;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
OXG_STM oxg_stm;
|
||
uint16_t data; // 用于枚举状态机当前处于的子状态
|
||
|
||
} StateMachine;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t netcode;
|
||
uint16_t boundary;
|
||
|
||
} CarlibSaveData;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
uint32_t last_clean_filter_hours;
|
||
uint32_t last_replace_filter_hours;
|
||
|
||
bool clean_filter_time_need_stored; // 标记是否需要存储当前的清理滤芯时间
|
||
bool replace_filter_time_need_stored; // 标记当前是否需要存储更换滤芯时间
|
||
|
||
} FilterServer;
|
||
|
||
|
||
typedef union
|
||
{
|
||
OxygenSensorData oxygen; // 氧传感器数据
|
||
HourMeterData hour_meter; // 累时数据
|
||
ADSampleData adc_data;
|
||
ADBoundary adc_boundary; // AD采样阈值数据 初始上电时从EEPROM中取出 存入到故障检测任务中
|
||
StateMachine state_machine; // 记录当前系统状态机
|
||
CarlibSaveData carlib_data; // 用于保存的校准数据
|
||
FilterServer filter_server; // 用于记录是否需要更换/清洁滤芯
|
||
// 等等。。。。
|
||
}MsgData;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
MsgType type; // 消息类型(必须优先设置,用于解析MsgData)
|
||
MsgData data; // 消息具体数据(根据type解析对应字段)
|
||
} MsgQueueItem;
|
||
|
||
|
||
/* 消息队列节点结构体 */
|
||
typedef struct QueueNode {
|
||
|
||
MsgQueueItem item; // 消息帧子项 用于存储接收到的消息
|
||
struct QueueNode* next; // 结构体节点指针 用于指向下一个节点位置
|
||
|
||
} QueueNode;
|
||
|
||
|
||
/* 消息队列结构 */
|
||
typedef struct {
|
||
|
||
QueueNode* front; // 队头指针 用于指向消息队列的头部
|
||
QueueNode* rear; // 队尾指针 用于指向消息队列的尾部
|
||
uint32_t length; // 队列当前长度 记录当前队列中消息节点数量方便调试
|
||
} MessageQueue;
|
||
|
||
|
||
|
||
/* 外部数据导出 */
|
||
extern MessageQueue global_queue;
|
||
|
||
|
||
|
||
// 供外部使用的函数
|
||
void init_queue(MessageQueue *queue); // 消息队列初始化
|
||
bool is_queue_empty(MessageQueue* queue);
|
||
void insert_queue_node_in_head(MessageQueue* queue, MsgQueueItem frame);
|
||
bool remove_queue_node_in_head(MessageQueue* queue, MsgQueueItem* out_item);
|
||
bool remove_queue_node_by_type(MessageQueue* queue, MsgType target_type, MsgQueueItem* out_item);
|
||
bool peek_queue_node_by_type(MessageQueue* queue, MsgType target_type, MsgQueueItem* out_item);
|
||
bool modify_or_add_queue_node_by_type(MessageQueue* queue, MsgType target_type, MsgQueueItem new_data);
|
||
bool has_queue_node_of_type(MessageQueue* queue, MsgType target_type);
|
||
uint32_t count_queue_node_by_type(MessageQueue* queue, MsgType target_type);
|
||
void clear_queue(MessageQueue* queue);
|
||
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* __FM33_QUEUE_H */
|
||
|
||
/************************ (C) COPYRIGHT Yuwell *****END OF FILE****/
|
||
|