current_v/Inc/fm33lg0xx_queue.h

237 lines
6.7 KiB
C
Raw Normal View History

2025-12-31 08:21:43 +08:00
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : fm33lg0xx_queue.h
* @brief : <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
* @version : 1.0
* @changelog : version 1.0 <EFBFBD><EFBFBD>ʼ<EFBFBD> 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"
/* <20><><EFBFBD>Ӷ<EFBFBD>Malloc<6F><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7> */
#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)
/************************** <20><EFBFBD><EFBFBD><E5B6A8> *************************/
// <20><>ʶ<EFBFBD><CAB6>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef enum
{
MSG_TYPE_OXYGEN_SENSOR, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>Ũ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MSG_TYPE_HOUR_SAVE, // <20><>ʱ<EFBFBD><CAB1><EFBFBD>ݴ洢<DDB4><E6B4A2>Ϣ<EFBFBD><CFA2>Сʱ<D0A1><CAB1>
MSG_TYPE_MINUTE_SAVE, // <20><>ʱ<EFBFBD><CAB1><EFBFBD>ݴ洢<DDB4><E6B4A2>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
MSG_TYPE_CURRENT_TIME, // <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
MSG_TYPE_TIME_SEND, // <20><>ʱ<EFBFBD><CAB1><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD>
MSG_TYPE_AD_SAMPLING, // AD<41><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NTC<54><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>ȣ<EFBFBD>
MSG_TYPE_AD_BOUNDARY_SEND, // EEPROM<4F>ϵ<EFBFBD><CFB5><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>¼<EFBFBD><C2BC>
MSG_TYPE_AD_BOUNDARY_SAVE, // <20>궨ʱ<EAB6A8><CAB1><EFBFBD>߽<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>浽EEPROM
MSG_TYPE_OXG_STM, // <20><><EFBFBD>ڼ<EFBFBD>¼<EFBFBD><C2BC>ǰϵͳ״̬<D7B4><CCAC>״̬<D7B4><CCAC>
MSG_TYPE_CARLIB_SAVE, // <20><><EFBFBD>ڼ<EFBFBD>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD>ֵ
MSG_TYPE_FILTER_SERVER, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MSG_TYPE_FILTER_TIME_SAVE, // <20>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>д洢
MSG_TYPE_MAX // <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ߽<DAB1><DFBD><EFBFBD><EFBFBD>
} MsgType;
//
// <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint16_t concentration; // <20><><EFBFBD><EFBFBD>Ũ<EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD>磺210 <20><>ʾ21%<25><>
uint16_t flow_rate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>磺50 <20><>ʾ5L/min<69><6E>
} OxygenSensorData;
// <20><>ʱ<EFBFBD><CAB1><EFBFBD>ݴ洢<DDB4><E6B4A2>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ǰСʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD>ڼ<EFBFBD>¼<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ʱ<EFBFBD>
typedef struct
{
uint32_t hour; // <20><>ǰСʱ<D0A1><CAB1>0-19999<39><39>
uint32_t minute; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ӣ<EFBFBD>0-59<35><39>
uint32_t second; // <20><><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} 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; // ѹ<><D1B9><EFBFBD><EFBFBD>ʵֵ<CAB5><D6B5><EFBFBD><EFBFBD>λkpa
uint16_t real_ntc; // <20><EFBFBD><C2B6><EFBFBD>ʵֵ<CAB5><D6B5><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
uint16_t real_220V; // <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ʵֵ<CAB5><D6B5><EFBFBD><EFBFBD>λVAC
uint16_t real_elec; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵֵ <20><>λ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; // ѡ<><D1A1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>EEPROMд<4D><D0B4><EFBFBD>ĸ<EFBFBD><C4B8>߽<EFBFBD>
} ADBoundary;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC> */
typedef enum
{
STM_INIT,
STM_NOM,
STM_ERROR_SHOUNTDOWN, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3> E1-E5,LL
STM_ERROR_NONE_STOP, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD>ͣ<EFBFBD><CDA3>״̬ E7<45><37>Ũ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>83.5ʱ
STM_CARLIB, // <20><><EFBFBD><EFBFBD><E2B5BD><EFBFBD><EFBFBD>궨״̬
STM_DEBUG, // <20><><EFBFBD><EFBFBD>ģʽ
}OXG_STM;
typedef struct
{
OXG_STM oxg_stm;
uint16_t data; // <20><><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>״̬
} 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; // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><EFBFBD><E6B4A2>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оʱ<D0BE><CAB1>
bool replace_filter_time_need_stored; // <20><><EFBFBD>ǵ<EFBFBD>ǰ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оʱ<D0BE><CAB1>
} FilterServer;
typedef union
{
OxygenSensorData oxygen; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HourMeterData hour_meter; // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
ADSampleData adc_data;
ADBoundary adc_boundary; // AD<41><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD>ϵ<EFBFBD>ʱ<EFBFBD><CAB1>EEPROM<4F><4D>ȡ<EFBFBD><C8A1> <20><><EFBFBD><EFBFBD><EBB5BD><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
StateMachine state_machine; // <20><>¼<EFBFBD><C2BC>ǰϵͳ״̬<D7B4><CCAC>
CarlibSaveData carlib_data; // <20><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD>У׼<D0A3><D7BC><EFBFBD><EFBFBD>
FilterServer filter_server; // <20><><EFBFBD>ڼ<EFBFBD>¼<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>о
// <20>ȵȡ<C8B5><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}MsgData;
typedef struct
{
MsgType type; // <20><>Ϣ<EFBFBD><CFA2><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>MsgData<74><61>
MsgData data; // <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>type<70><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ֶΣ<D6B6>
} MsgQueueItem;
/* <20><>Ϣ<EFBFBD><CFA2><EFBFBD>нڵ<D0BD><DAB5><EFBFBD><E1B9B9> */
typedef struct QueueNode {
MsgQueueItem item; // <20><>Ϣ֡<CFA2><D6A1><EFBFBD><EFBFBD> <20><><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ϣ
struct QueueNode* next; // <20><EFBFBD><E1B9B9><EFBFBD>ڵ<EFBFBD>ָ<EFBFBD><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>λ<EFBFBD><CEBB>
} QueueNode;
/* <20><>Ϣ<EFBFBD><CFA2><EFBFBD>нṹ */
typedef struct {
QueueNode* front; // <20><>ͷָ<CDB7><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>е<EFBFBD>ͷ<EFBFBD><CDB7>
QueueNode* rear; // <20><>βָ<CEB2><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>е<EFBFBD>β<EFBFBD><CEB2>
uint32_t length; // <20><><EFBFBD>е<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD> <20><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} MessageQueue;
/* <20>ⲿ<EFBFBD><E2B2BF><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD> */
extern MessageQueue global_queue;
// <20><><EFBFBD>ⲿʹ<E2B2BF>õĺ<C3B5><C4BA><EFBFBD>
void init_queue(MessageQueue *queue); // <20><>Ϣ<EFBFBD><CFA2><EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
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****/