102 lines
3.1 KiB
C
102 lines
3.1 KiB
C
|
/*
|
||
|
* @Date: 2025-07-18 08:53:16
|
||
|
* @Author: mypx
|
||
|
* @LastEditors: mypx mypx_coder@163.com
|
||
|
* @LastEditTime: 2025-09-24 16:11:11
|
||
|
* @FilePath: pm_common.h
|
||
|
* @Description:
|
||
|
* Copyright (c) 2025 by mypx, All Rights Reserved.
|
||
|
*/
|
||
|
#ifndef __PM_COMMON__
|
||
|
#define __PM_COMMON__
|
||
|
#include "bsp_encoder.h"
|
||
|
#include "pm_board.h"
|
||
|
#include <rtthread.h>
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#define DATA_PROCESS_STACK_SIZE (3 * 1024)
|
||
|
#define DATA_PROCESS_PRIORITY 10
|
||
|
#define HMI_THREAD_STACK_SIZE 2048
|
||
|
#define HMI_THREAD_PRIORITY 9
|
||
|
|
||
|
#define TEC_CONTROL_THREAD_PRIORITY 25
|
||
|
#define TEC_CONTROL_THREAD_STACK_SIZE 2048
|
||
|
#define TEC_CONTROL_THREAD_TIMESLICE 5
|
||
|
|
||
|
#define TEMP_SAMPLE_THREAD_PRIORITY 5
|
||
|
#define TEMP_SAMPLE_THREAD_STACK_SIZE 2048
|
||
|
#define TEMP_SAMPLE_THREAD_TIMESLICE 5
|
||
|
|
||
|
#define PM_EVT_QUEUE_FULL (1 << 0)
|
||
|
#define PM_EVT_ENCODER_TO_TARGET (1 << 1)
|
||
|
|
||
|
|
||
|
extern struct rt_event pm_event;
|
||
|
extern uint32_t encoder_cpr;
|
||
|
|
||
|
// device exception code
|
||
|
#define PM_EXCEPTION_NONE (0x00)
|
||
|
#define PM_EXCEPTION_TEMPERATURE (1 << 0)
|
||
|
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
PM_PREPARE_STATE = 0, // 初始化状态
|
||
|
PM_IDLE_STATE, // 空闲状态
|
||
|
PM_CALI_STATE, // 校准状态
|
||
|
PM_READY_STATE, // 准备就绪
|
||
|
PM_MEAS_STATE, // 测量中
|
||
|
|
||
|
// TODO:删除下面的状态
|
||
|
RUNNING_STATE_PROCESSING, // 数据处理
|
||
|
RUNNING_STATE_FINISHED, // 测量完成
|
||
|
RUNNING_STATE_ERROR // 错误状态
|
||
|
} PmRunningState;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
PM_MEAS_NORMAL_Mode = 0, // normal working state, should manual click start measure button
|
||
|
PM_MEAS_AUTO_Mode, // auto working state, not need click start measure button
|
||
|
PM_MEAS_TEST_Mode, // factory test state
|
||
|
} PmMeasMode;
|
||
|
|
||
|
typedef int32_t (*mb_read_t)(uint8_t *buf, uint16_t count, int32_t byte_timeout_ms, void *arg);
|
||
|
typedef int32_t (*mb_write_t)(const uint8_t *buf, uint16_t count, int32_t byte_timeout_ms, void *arg);
|
||
|
|
||
|
double get_real_time_angle_degree(void);
|
||
|
|
||
|
rt_uint32_t convert_encoder_angle_rpm_to_to_time(double angle, float m_rpm);
|
||
|
|
||
|
/**
|
||
|
* @brief Correct specific rotation for temperature using linear coefficient
|
||
|
* @param specific_rotation_ref Specific rotation at reference temperature (°)
|
||
|
* @param tref Reference temperature (°C)
|
||
|
* @param temp Target temperature (°C)
|
||
|
* @param temp_coeff Temperature coefficient (° per °C)
|
||
|
* @return Corrected specific rotation at target temperature (°)
|
||
|
*/
|
||
|
float pm_correct_specific_rotation_temperature(float specific_rotation_ref, float tref, float temp, float temp_coeff);
|
||
|
|
||
|
/**
|
||
|
* @brief Convert concentration from g/100mL to g/mL
|
||
|
* @param conc_g_per_100ml Concentration in g/100mL
|
||
|
* @return Concentration in g/mL
|
||
|
*/
|
||
|
float pm_convert_g_per_100ml_to_g_per_ml(float conc_g_per_100ml);
|
||
|
|
||
|
/**
|
||
|
* @brief Convert concentration from g/100mL to mol/L
|
||
|
* @param conc_g_per_100ml Concentration in g/100mL
|
||
|
* @param molar_mass_g_per_mol Molar mass of solute in g/mol
|
||
|
* @return Concentration in mol/L
|
||
|
*/
|
||
|
float pm_convert_g_per_100ml_to_molar(float conc_g_per_100ml, float molar_mass_g_per_mol);
|
||
|
|
||
|
/**
|
||
|
* @brief Angle conversion helpers
|
||
|
*/
|
||
|
float pm_deg_to_rad(float deg);
|
||
|
float pm_rad_to_deg(float rad);
|
||
|
|
||
|
#endif
|