/**
 * @brief 幻尔科技Hiwonder--八路巡线传感器通信及数据处理库
 *
 * @author ZhiYuan (Gilbert@hiwonder.com)
 * @date 25-06-30
 * @version 1.0
 *
 * @copyright Copyright (c) 2023
 */
 
#ifndef __LINEFOLLOWERLERAN8CH_H_
#define __LINEFOLLOWERLERAN8CH_H_


#define SENSOR_SUM 8  //传感器通道数
/*======================================================IIC通信部分宏定义===========================================*/
#define LineFollowerLearn8CH_I2C_ADDR 0x5D //传感器I2C地址

#define SensorStateReg      (5u)  //传感器全通道状态数据寄存器地址

#define SensorAnalogReg_ch1     (6u)   //传感器通道1模拟值寄存器,读2Byte数据，低位在前，高位在后
#define SensorAnalogReg_ch2     (8u) 	 //传感器通道2模拟值寄存器,读2Byte数据，低位在前，高位在后
#define SensorAnalogReg_ch3     (10u)  //传感器通道3模拟值寄存器,读2Byte数据，低位在前，高位在后
#define SensorAnalogReg_ch4     (12u)  //传感器通道4模拟值寄存器,读2Byte数据，低位在前，高位在后
#define SensorAnalogReg_ch5     (14u)  //传感器通道5模拟值寄存器,读2Byte数据，低位在前，高位在后
#define SensorAnalogReg_ch6     (16u)  //传感器通道6模拟值寄存器,读2Byte数据，低位在前，高位在后
#define SensorAnalogReg_ch7     (18u)  //传感器通道7模拟值寄存器,读2Byte数据，低位在前，高位在后
#define SensorAnalogReg_ch8     (20u)  //传感器通道8模拟值寄存器,读2Byte数据，低位在前，高位在后

#define SensorThresholdReg_ch1  (22u)  //传感器通道1阈值寄存器,读2Byte数据，低位在前，高位在后
#define SensorThresholdReg_ch2  (24u)  //传感器通道2阈值寄存器,读2Byte数据，低位在前，高位在后
#define SensorThresholdReg_ch3  (26u)  //传感器通道3阈值寄存器,读2Byte数据，低位在前，高位在后
#define SensorThresholdReg_ch4  (28u)  //传感器通道4阈值寄存器,读2Byte数据，低位在前，高位在后
#define SensorThresholdReg_ch5  (30u)  //传感器通道5阈值寄存器,读2Byte数据，低位在前，高位在后
#define SensorThresholdReg_ch6  (32u)  //传感器通道6阈值寄存器,读2Byte数据，低位在前，高位在后
#define SensorThresholdReg_ch7  (34u)  //传感器通道7阈值寄存器,读2Byte数据，低位在前，高位在后
#define SensorThresholdReg_ch8  (36u)  //传感器通道8阈值寄存器,读2Byte数据，低位在前，高位在后

/*======================================================UART通信部分宏定义===========================================*/

/*初始化需要发送指令配置运行模式(掉电不保存)，配置指令：
	0：手动模式；1：自动发送电平值；2：自动发送模拟值；3：自动发送阈值*/
	
/*运行模式配置后无法重新配置，如果需要更换模式需要复位后重新初始化*/
#define manual_mode                       0
#define Transmit_SensorState_auto_mode    1
#define Transmit_AnalogValue_auto_mode    2
#define Transmit_ThresholdValue_auto_mode 3

/*手动模式下，发送如下类型指令，模块返回对应数据
	1：返回电平值(返回1Byte数据)；2：读取模拟值(按串口协议返回)；3：读取阈值(按串口协议返回)*/
#define Transmit_SensorState       1
#define Transmit_AnalogValue       2
#define Transmit_ThresholdValue    3

#define Frame_HEAD_1                      0x55     //帧头1
#define Frame_HEAD_2                      0xAA     //帧头2

/*串口解析命令帧状态机*/
#define unpack_FrameHEAD_1                1        //获取帧头1
#define unpack_FrameHEAD_2                2        //获取帧头2
#define unpack_FrameCMD                   3        //获取模式类型
#define unpack_FrameLength                4        //获取帧参数长度
#define unpack_FrameData                  5        //获取全部参数
#define unpack_FrameCheck                 6        //校验数据有效性

#define Frame_length_Max                  21  /*完整的一帧命令，从帧头到帧尾校验位的全部字节长度*/

/*串口通信协议
帧头(2字节)	  指令	                  数据长度(1字节)	            Data0	      Data1	      Data2	      Data3	      DataN	 校验
0x55  0xAA	  "主控发过来的读取指令"	"有效数据长度，不含本字节"	参数1低8位	参数1高8位	参数2低8位	参数2高8位	参数N	 除去帧头2字节其他加起来取反
*/

/* 八路巡线传感器结构体 */
typedef struct{
	unsigned char StateReg_OriginData;                    //从传感器收到的通道状态原始数据（低八位在前，高八位在后）
	unsigned char state_all_ch[8];                        //通道状态（每一个元素代表一个通道）
	
	unsigned char SensorAnalogReg_OriginData[16];         //从传感器收到的通道模拟量原始数据（低八位在前，高八位在后）
	unsigned short AnalogVoltage_all_ch[8];               //通道模拟量（每一个元素代表一个通道）
	
	unsigned char SensorThresholdReg_OriginData[16];      //从传感器收到的通道阈值原始数据（低八位在前，高八位在后） 
	unsigned short ThresholdVoltage_all_ch[8];            //通道阈值（每一个元素代表一个通道）
	
	unsigned char RX_state_machine;                       //串口数据帧解析状态机（只用于阈值、模拟量的解析）
	unsigned char Work_mode;                              //工作模式
	unsigned char sub_work_mode_InManual;                 //手动模式子模式
	unsigned char DataLength_Receive;                     //串口数据帧的参数长度
	char uart_rx_buffer[21];                              //串口数据缓冲区
	char uart_rx_buffer_index;                            //串口数据缓冲区索引（数组下标）
	unsigned char Data_usable;                            //串口数据获取解析成功标志位
	
}linefollower_8ch;

void LineFollowerLearn8CH_IIC_init();
void LineFollowerLearn8CH_UART_init(linefollower_8ch *obj , int mode);

void detect_state_all_channel_IIC(linefollower_8ch *obj);
void get_AnalogVoltage_all_channel_IIC(linefollower_8ch *obj);
void get_ThresholdValue_all_channel_IIC(linefollower_8ch *obj);

void Change_TransmitData_In_Mode_manual(int mode);
unsigned char Check_Code(unsigned char *buf);
void uart_FrameUnpack(linefollower_8ch *obj, unsigned char dat);

int detect_state_all_channel_UART(linefollower_8ch *obj);
int get_AnalogVoltage_all_channel_UART(linefollower_8ch *obj);
int get_ThresholdValue_all_channel_UART(linefollower_8ch *obj);

//void serial_read_write_control(unsigned char new_state);

extern linefollower_8ch linefollower;

#endif