#include "app_calibration.h"     
#include "mx_log.h"

/* 最简移植模板*/

// 接收上位机下发的数据处理函数
void process_rx(void)
{
	uint8_t rx_chunk[64];
	uint16_t recv_len = 0;
	
	//如果是串口通信，则在串口接收到数据的地方，调用mozen_protocol_receive_byte 喂入字节流
	//recv_len = usart_rx_recv(USART_3_TR, rx_chunk, sizeof(rx_chunk));
	
	//如果是usb cdc 通信，则在usb cdc 接收到数据的地方，调用mozen_protocol_receive_byte 喂入字节流
	//recv_len = usbcdc_rx_recv(rx_chunk, sizeof(rx_chunk));
	
	for(uint16_t i = 0; i < recv_len; i++) {
		mozen_protocol_receive_byte(rx_chunk[i]);
	}

}

//新协议需要调用的发送函数，需要外部自己实现一下函数定义
static int mozen_tx(const uint8_t *frame, uint16_t len)
{
    if ((frame == NULL) || (len == 0U)) {
        return -1;
    }

	//这里替换具体项目平台的发送函数，例如：
    // usart_dma_send_data(USART_0_TR, (uint8_t *)frame, len);
    return 0;
}

typedef struct 
{
	 uint16_t adc_channel_cache[AX_BUF_NUM];
	 uint16_t g_sensor_raw_value[AX_NUM];
	 uint16_t g_sensor_ref_value[AX_NUM];
	 uint16_t sensor1_resi_output[AX_NUM];
	 uint16_t sensor1_display_output[AX_NUM];
	 uint16_t sensor1_voltage[AX_NUM][AY_NUM];
} Hc4051AdcValue;
Hc4051AdcValue temp_adc_value;

int main(void)
{
	//项目中的外设初始化
	//... 
	
	/*Step 1 */
	//把这三个函数放在外设初始化之后，然后设置一下发送回调，
    mozen_protocol_set_tx(mozen_tx);
    mozen_protocol_init();
	app_calibration_reset_init();
	
	uint16_t count_ay = 0;
	
	while(1)
	{

		/*Step 2 处理上位机下发的数据，内部调用mozen_protocol_receive_byte会解析协议 */
		process_rx();

		scan_y(&temp_adc_value, count_ay); // scan_y 就是熟悉的正扫反扫的函数
		count_ay++;
		if (count_ay >= AY_NUM) {	//扫完一帧
			count_ay = 0;

			/*Step 3 将原始帧数据传入，返回标定后二维结果。 */
			uint16_t (*cailed_sensor_data)[MT_AY_NUM];
			cailed_sensor_data = process_calibration_frame(temp_adc_value.sensor1_voltage);
			
			// 预留给外部算法扩展: 可在此处继续处理 cailed_sensor_data 比如拿到cailed_sensor_data 做抗蠕变等其他算法
			//...
			
			//发走
			send_sensor_frame(cailed_sensor_data);
		}
	}
}

