/*
*Copyright ,2023 , NANOCHAP
*File name:   MIAN.C          
*Author:      
*Version:     V1.0 
*Date:        2023-11-                  	
*Description:   定时器电刺激综合测试（TIMER0 + 电刺激）
*Function List: 
   
History: 
1.V1.0
Date:          
Author: 
Modification: 初版

*/  
#include "my_header.h"
#include "ENS1_MTP.h"
#include "ENS1_CLOCK.h"
#include "ENS1_UART.h"
#include "ENS1_TIMER.h"
#include "ENS1_GPIO.h"
#include "ENS1_WAVEGEN.h"

// CRC-16-CCITT-FALSE计算函数
uint16_t CalculateCRC16_CCITT_FALSE(uint8_t *data, uint16_t length)
{
    uint16_t crc = 0xFFFF;  // 初始值为0xFFFF
    for(uint16_t i = 0; i < length; i++)
    {
        crc ^= (uint16_t)(data[i] << 8);  // 高字节先处理
        for(uint8_t j = 0; j < 8; j++)
        {
            if(crc & 0x8000)
            {
                crc = (crc << 1) ^ 0x1021;  // 多项式0x1021
            }
            else
            {
                crc = crc << 1;
            }
        }
    }
    return crc;
}


// UART数据接收函数 - 轮询方式
void UART_ReceiveData(void)
{
	// 检查接收FIFO并读取所有可用的数据
	while(!UART_RX_FIFO_EMPTY(CMSDK_UART1))
	{
		uint8_t received_data = READ_UART_RCVBuff(CMSDK_UART1);  // 读取接收数据
		if(uart_rx_count < sizeof(uart_rx_buffer))  // 防止缓冲区溢出
		{
			uart_rx_buffer[uart_rx_count] = received_data;
			uart_rx_count++;
			uart_data_ready = 1;  // 设置数据就绪标志
		}
		else
		{
			// 缓冲区溢出处理
			uart_rx_count = 0;  // 重置计数器
			break;
		}
	}
}

// 增强的中断接收函数
void UART_ReceiveDataFromISR(void)
{
	if(!UART_RX_FIFO_EMPTY(CMSDK_UART1))
	{
		uint8_t received_data = READ_UART_RCVBuff(CMSDK_UART1);
		if(uart_rx_count < sizeof(uart_rx_buffer))
		{
			uart_rx_buffer[uart_rx_count] = received_data;
			uart_rx_count++;
			// 注意：在中断中不建议使用printf，只设置标志
			uart_data_ready = 1;
		}
	}
}

// UART数据发送函数（可选的）
void UART_SendData(uint8_t data)
{
	if(!UART_TX_FIFO_FULL(CMSDK_UART1))  // 如果发送FIFO未满
	{
		WRITE_UART_THRBuff(CMSDK_UART1, data);
	}
}

// UART数据包解析函数
uint8_t ParseUART_EMS_Packet(uint8_t *data, uint16_t length, UART_EMS_Packet_t *packet)
{   
    // 解析数据包（注意字节序）
    packet->function_code = (data[1] << 8) | data[0];      // 小端序
    packet->data_length = (data[3] << 8) | data[2];
    packet->switch_type = data[4];
    packet->intensity = data[5];
    packet->frequency = (data[7] << 8) | data[6];
    packet->duration = (data[9] << 8) | data[8];
    packet->rest_time = (data[11] << 8) | data[10];
    packet->silent_time = (data[13] << 8) | data[12];
    packet->ramp_up_time = data[14];
    packet->hold_time = data[15];
    packet->ramp_down_time = data[16];
    packet->crc16 = (data[18] << 8) | data[17];
  
    // CRC-16-CCITT-FALSE校验（对前17字节进行校验，不包括CRC本身）
    uint16_t calculated_crc = CalculateCRC16_CCITT_FALSE(data, 17);
    /*if(calculated_crc != packet->crc16)
    {
        return 0;
    }*/
    
    // 功能码检查
    
    return 1;  // 解析成功
}

// 根据UART数据包更新电刺激配置
void UpdateEMS_ConfigFromUART(UART_EMS_Packet_t *packet)
{
    // 检查开关状态
    if(packet->switch_type == 0x00)
    {
        EMS_Stop();
        return;
    }
    
    // 检查电刺激类型 (0x10~0x1F)
    if(packet->switch_type < 0x10 || packet->switch_type > 0x1F)
    {
        return;
    }
    
    // 创建新的电刺激配置
    EMS_Config_TypeDef new_config = {
        .frequency = packet->frequency,
        .duration = packet->duration,
        .intensity = packet->intensity,
        .rest_time = packet->rest_time,
        .silent_time = packet->silent_time,
        .ramp_up_time = packet->ramp_up_time,
        .hold_time = packet->hold_time,
        .ramp_down_time = packet->ramp_down_time,
        .enable_ramp = 1  // 启用渐进控制
    };
    

    printf("0x%02X\n", packet->switch_type);
    printf("%d\n", packet->intensity);
    printf("%d\n", packet->frequency);
    printf("%d\n", packet->duration);
    printf("%d\n", packet->rest_time);
    printf("%d\n", packet->silent_time);
    printf("%d\n", packet->ramp_up_time);
    printf("%d\n", packet->hold_time);
    printf("%d\n", packet->ramp_down_time);

    // 应用新配置
    EMS_Configure(&new_config);
    
    // 启动电刺激
    EMS_Start();

}

int main(){
	// 初始化系统
	MTP_init();
	ClockInit();
	
	// 初始化GPIO19用于定时器指示
	GPIO_IO_Init(GPIO_19, OUTPUT, GPIO_OType_PP, GPIO_NOPULL, OUTPUT_FAST, PDRV_4mA, ENABLE);
	GPIO_Output(GPIO_19, LOW_LEVEL);
	
	// 初始化UART
    UART_Init(CMSDK_UART1, &UART1_Init);
    UART_ITConfig(CMSDK_UART1, &UART1_ITSet);
	
	// 配置电刺激参数
	EMS_Configure(&ems_config);
//	 初始化时间管理器
	Time_Manager_Init();
	// 初始化定时器（在wavegen_Init之前）
	TIMER0_Init(1);
	
	// 初始化波形生成器（电刺激）- 必须先初始化
	wavegen_Init();
	// 启动电刺激
	EMS_Start();

	while(1)
	{  
	}

}
