#ifndef __APP_MATH_INFO_H
#define __APP_MATH_INFO_H
#include "at32a423.h"
#include "at32a423_clock.h"
#include "systick.h"
#include "sysconfig.h"
#include "main.h"

#include "bsp_flash.h"

#include "bsp_uart.h"

#include "string.h"
#include "stdint.h"

#include "mx_frame_core.h"
#include "mx_serial.h"
#include "cali_process.h"
#include "resi_math_lib.h"

#define CALI_POINT_NUM 									3
#define SINGLE_MATH_CALI_PARAMS_PARAMS_SECTOR_SIZE 1 // flash大小
#define ARRAY_RESI_INIT_PARAMS_LEN      6 //单片机返回给上位机的数据信息

// 显示相关默认值
#define DEFAULT_MIN_DISPLAY_VALUE 		0       // 默认最小显示值
#define DEFAULT_MAX_DISPLAY_VALUE 		255     // 默认最大显示值
#define MAX_ADC_VALUE 								4095	// ADC最大采样值（12位ADC）

// 电阻初始化默认值
#define DEFAULT_MIN_RESI_INIT_VALUE 	2100	// 默认最小电阻初始值
#define DEFAULT_MAX_RESI_INIT_VALUE   25000	// 默认最大电阻初始值
#define DEFAULT_DIVID_RESI_VALUE  		2700	// 默认电阻分压值



#define MAX_BUF_SIZE  (CALI_POINT_NUM * AX_NUM * AY_NUM)


#define ARRAY_RESI_INIT_PARAMS_ADDRS  0x0800B800

// 帧头标识（用于串口数据帧同步）
#define HEAD 													0xA55A

// 传输类型和命令定义（用于区分不同功能的串口帧）
#define ARRAY_RESI_INIT_TRAN_TYPE     0x04  // 电阻阵列初始化传输类型
#define ARRAY_RESI_VALUE_RETURN_CMD  	0x2F  // 电阻值返回命令
#define INIT_RESI_WRITE_CMD 					0x3F  // 初始化电阻写入命令
#define INIT_RESI_SAVE_CMD  					0x3D  // 初始化电阻保存命令
#define INIT_RESI_CLEAR_CMD          	0x1A  // 初始化电阻清除命令

#define SINGLE_RESI_CALI_TRAN_TYPE   	0x03  // 单个电阻校准传输类型
#define SINGLE_CALI_RESI_WRITE_CMD    0x3F  // 单个校准电阻写入命令
#define SINGLE_CALI_RESI_SAVE_CMD		0x3D  // 单个校准电阻保存命令
#define CALI_RESI_VALUE_RETURN_CMD    0x2F  // 校准电阻值返回命令
#define SINGLE_CALI_RESI_CLEAR_CMD    0x1A  // 单个校准电阻清除命令



extern uint8_t  array_resi_init_params_read_buf[MAX_BUF_SIZE];
extern uint8_t  array_resi_init_params_write_buf[MAX_BUF_SIZE];

extern uint8_t  array_resi_cali_params_write_buf[MAX_BUF_SIZE];
extern uint8_t  array_resi_cali_params_read_buf[MAX_BUF_SIZE];

extern  uint8_t success_protocal[ARRAY_RESI_INIT_PARAMS_LEN];
extern  uint8_t fail_protocal[ARRAY_RESI_INIT_PARAMS_LEN];

//extern uint8_t success_protocal[ARRAY_RESI_INIT_PARAMS_LEN];
//extern uint8_t fail_protocal[ARRAY_RESI_INIT_PARAMS_LEN];

extern uint8_t frame_state;//电阻阵列指令帧状态
extern uint8_t cali_frame_state;//单个电阻校准指令帧状态

// 电阻阵列初始化模式枚举（用于标识初始化状态）
typedef enum{
		STATE = 0x73,  // 状态模式（0x73是's'的ASCII码）
		DATA = 0x64,   // 数据模式（0x64是'd'的ASCII码）
}ARRAY_RESI_INIT_MODE_TYPE_T;

// 电阻阵列校准模式枚举（用于标识校准状态）
typedef enum{
		CALI_SUCCESS = 0x01,  // 校准成功
		CALI_FAIL = 0x02,     // 校准失败
		CALI_INIT = 0x00,     // 校准初始状态
		CALI_RETURN = 0x4F,   // 校准返回（0x4F是'O'的ASCII码）
}ARRAY_RESI_CALI_MODE_TYPE_T;



// 电阻阵列校准数据返回帧结构
typedef struct{
	uint16_t sof;                       // 帧头
	uint8_t tran_type;                  // 传输类型
	uint16_t len;                       // 数据长度
	uint8_t mode;                       // 校准模式
	uint8_t cali_params[3 * AX_NUM * AY_NUM];  // 校准参数（3个点×X轴×Y轴）
	uint16_t checksum;                  // 校验和
}ARRAY_RESI_CALI_DATA_RETURN_SERIAL_FRAME_T;

// 函数声明：设置电阻阵列初始化模式
void set_array_resi_init_mode_type(ARRAY_RESI_INIT_MODE_TYPE_T state);
// 函数声明：获取电阻阵列初始化模式
ARRAY_RESI_INIT_MODE_TYPE_T get_resi_array_init_mode_type(void);

// 函数声明：返回电阻阵列初始化信息
uint8_t return_array_resi_init_info(void *buf);

void set_array_resi_cali_mode_type(ARRAY_RESI_CALI_MODE_TYPE_T state);

ARRAY_RESI_CALI_MODE_TYPE_T get_resi_array_cali_mode_type(void);

uint8_t array_resi_params_write(mx_frame_struct *buf);
uint8_t array_resi_params_save(void *buf);
uint8_t clear_array_init_info(void *buf);
void    math_resi_array_cali_write(void *buf);
void    math_resi_array_cali_save(void *buf);
uint8_t cali_params_clear(void *buf);        // ← 头文件是 void，源文件写成 uint8_t
void cali_params_return(void *buf);

#endif
