#include "modbus_register_map.h"
#include "parameter.h"
#include "i2c_mcu.h"
#include "freertos/FreeRTOS.h"
#include "freertos/timers.h"
#include "modbus_rtu_slave.h"
#include "../programme_library/programme_app.h"

rs485_register_struct rs485_register_array[] = {
    {0, GetOnOff, SetOnOff}, // 开关机，0:关机，1：开机
    {1, GetSetRoomTemp, SetSetRoomTemp}, // 设定温度
    {2, GetFanSpeed, SetFanSpeed}, // 风速，0：自动 ，1:低风，2：中风，3：高风
    {3, GetWorkMode, SetWorkMode}, // 模式，0：自动 ，1：制冷  ，2：制热 ，3：通风
    {4, GetKeyLock, SetKeyLock}, // 按键锁，0：未启用，1：启用
    {5, GetSleepMode, SetSleepMode}, // 睡眠模式，0：未启用，1：启用
    {6, GetRoomTemp, NULL}, // 房间温度，0~50℃
    {7, GetRoomHum, NULL}, // 房间湿度，0~99%，FF：无湿度功能
    {8, GetExSensorTemp, NULL}, // 外置传感器温度，0~70℃，FF：无外置传感器功能
    {9, GetRoomCardStatus, NULL}, // 房卡状态，0：未插卡，1：已插卡，FF：无房卡功能
    {10, GetAlarm, NULL}, // 故障报警
    {11, GetAddress, SetAddress}, // 通讯地址
    {12, GetBaudRate, SetBaudRate}, // 波特率
    {13, GetTempCalibration, SetTempCalibration}, // 温度校正
    {14, GetSetTempUpper, SetSetTempUpper}, // 设定温度上限
    {15, GetSetTemplower, SetSetTemplower}, // 设定温度下限
    {16, GetPowerOffMemory, SetPowerOffMemory}, // 断电记忆，0：OFF，1：ON
    {17, GetFanDelayOff, SetFanDelayOff}, // 风机延时关闭（秒）
    {18, GetFanStateWithHV, SetFanStateWithHV}, // 制热风机联动，0：OFF，1：ON
    {19, GetFanStateWithCV, SetFanStateWithCV}, // 制冷风机联动，0：OFF，1：ON
    {20, GetValveStartDelay, SetValveStartDelay}, // 阀门输出延时（分钟）
    {21, GetPipeOption, SetPipeOption}, // 2&4管制选择，0：2管制，1：4管制
    {22, GetSystemMode, SetSystemMode}, // 模式选择，0：CO，1：CO&HE
    {23, GetExInput, SetExInput}, // 外部输入，0：无效，1：外置，2：房卡
    {24, GetEcoHeat, SetEcoHeat}, // 无房卡制热节能温度
    {25, GetEcoCool, SetEcoCool}, // 无房卡制冷节能温度
    {26, GetProgramOption, SetProgramOption}, // 编程选型，0：无编程或定时，1：定时开关机，2：编程开
    {27, GetTempUnit, SetTempUnit}, // 温度单位，0：℃，1：℉
    {28, NULL/*GetProportionalBand*/, NULL/*SetProportionalBand*/}, // 阀门比例带（℃）
    {29, NULL/*GetMinValveOpen*/, NULL/*SetMinValveOpen*/}, // 阀门最小开度电压
    {30, NULL/*GetValveInterval*/, NULL/*SetValveInterval*/}, // 阀门动作间隔时间（秒）
    {31, NULL/*GetMaxFanVoltage*/, NULL/*SetMaxFanVoltage*/}, // 最大风速电压
    {32, NULL/*GetMinFanVoltage*/, NULL/*SetMinFanVoltage*/}, // 最小风速电压
    {33, NULL/*GetHighFanVoltage*/, NULL/*SetHighFanVoltage*/}, // 高风档电压
    {34, NULL/*GetMedFanVoltage*/, NULL/*SetMedFanVoltage*/}, // 中风档电压
    {35, NULL/*GetLowFanVoltage*/, NULL/*SetLowFanVoltage*/}, // 低风档电压
};

// 寄存器总数：36个
const int rs485_register_count = 36;

// 获取开关机状态
int16_t GetOnOff(void) {
    return (int16_t)GetOnOffState();
}

// 设置开关机状态
void SetOnOff(int16_t data) {
    SetOnOffState((uint16_t)data);
}

// 获取设定温度
int16_t GetSetRoomTemp(void) {
    return (int16_t)(GetSetPoint() * 10);
}

// 设置设定温度（房卡节能控制：房卡不在位时拒绝设置；通风模式下拒绝设置）
void SetSetRoomTemp(int16_t data) {
    // 通风模式下拒绝温度设置
    if (GetWork_mode() == 3) {
        // 通风模式(3)，拒绝温度设置
        return;
    }
    
    // 房卡节能控制：当房卡不在位时，拒绝温度设置
    int roomcard_status = get_roomcard_detect();
    if (roomcard_status == 0) {
        // 房卡不在位，拒绝温度设置，保持节能温度
        return;
    }
    
    // 房卡在位或无房卡功能，且非通风模式，允许正常设置温度
    SetSetPoint((float)data / 10.0);
}

// 获取风速
int16_t GetFanSpeed(void) {
    return GetFan_speed();
}

// 设置风速
void SetFanSpeed(int16_t data) {
    SetFan_speed(data);
}

// 获取工作模式
int16_t GetWorkMode(void) {
    return GetWork_mode();
}

// 设置工作模式
void SetWorkMode(int16_t data) {
    SetWork_mode(data);
}

// 获取按键锁
int16_t GetKeyLock(void) {
    return GetKey_Lock();
}

// 设置按键锁
void SetKeyLock(int16_t data) {
    SetKey_Lock(data);
}

// 获取SleepMode
int16_t GetSleepMode(void) {
    if(programme_state_get(GetProgram_option()) == 1 && GetProgram_option() == 0) {
        return 1;
    }
    if(programme_state_get(GetProgram_option()) == 0 && GetProgram_option() == 0) {
        return 0;
    }
    return 0;  // 默认返回0
}

// 设置SleepMode
void SetSleepMode(int16_t data) {
    /*预留*/
    //SetSleep_mode(data);
}

// 获取房间温度（根据External_Input参数决定）
int16_t GetRoomTemp(void) {
    // 先检查External_Input参数是否为1
    int ex_input = GetExternal_Input();
    if (ex_input == 1) {
        return 0xFFFF;  // 为1时返回0xFFFF表示使用外置传感器，内置温度无效
    }
    
    // External_Input不为1时，获取温度显示值并乘以10转换为整数
    float temp = get_temp_disp();
    return (int16_t)(temp * 10);
}

// 获取RoomHum（预留/未实现）
int16_t GetRoomHum(void) {
    return 0xFFFF;
}

// 获取外置传感器温度（根据External_Input参数决定）
int16_t GetExSensorTemp(void) {
    // 先检查External_Input参数是否为1
    int ex_input = GetExternal_Input();
    if (ex_input != 1) {
        return 0xFFFF;  // 不为1时返回0xFFFF表示无外置传感器功能
    }
    
    // External_Input为1时，获取温度显示值并乘以10转换为整数
    float temp = get_temp_disp();
    return (int16_t)(temp * 10);
}

// 获取房卡状态
int16_t GetRoomCardStatus(void) {
    return (int16_t)get_roomcard_detect();
}

// 获取故障报警
int16_t GetAlarm(void) {
    return get_fault_code();
}

int16_t GetAddress(void) { return (int16_t)GetRS485_address(); }

void SetAddress(int16_t data) { SetRS485_address(data); }

int16_t GetBaudRate(void) { return (int16_t)GetBaud_rate(); }

void SetBaudRate(int16_t data) { 
    SetBaud_rate(data); 
    // 立即重新配置UART，使新波特率生效
    //modbus_rtu_slave_reconfigure_baud_rate();
}

int16_t GetTempCalibration(void) { 
    // 获取float值并乘以10返回
    return (int16_t)(GetTemp_calibration() * 10);
}

void SetTempCalibration(int16_t data) { 
    // 限制输入范围为-50~50
    //if (data < -50) data = -50;
    //if (data > 50) data = 50;
    // 转换为float并除以10后传递给底层函数
    SetTemp_calibration((float)data / 10.0);
}

int16_t GetSetTempUpper(void) { return (int16_t)(GetSet_upper_temperature_limit() * 10); }

void SetSetTempUpper(int16_t data) { SetSet_upper_temperature_limit(data / 10); }

int16_t GetSetTemplower(void) { return (int16_t)(GetSet_lower_temperature_limit() * 10); }

void SetSetTemplower(int16_t data) { SetSet_lower_temperature_limit(data / 10); }

int16_t GetPowerOffMemory(void) { return (int16_t)GetPower_off_memory(); }

void SetPowerOffMemory(int16_t data) { SetPower_off_memory(data); }

int16_t GetFanDelayOff(void) { return (int16_t)GetFan_delay_off(); }

void SetFanDelayOff(int16_t data) { SetFan_delay_off(data); }

int16_t GetFanStateWithHV(void) { return (int16_t)GetFan_state_with_heat_valve(); }

void SetFanStateWithHV(int16_t data) { SetFan_state_with_heat_valve(data); }

int16_t GetFanStateWithCV(void) { return (int16_t)GetFan_state_with_cool_valve(); }

void SetFanStateWithCV(int16_t data) { SetFan_state_with_cool_valve(data); }

int16_t GetValveStartDelay(void) { return (int16_t)GetValve_start_delay(); }

void SetValveStartDelay(int16_t data) { /* 预留/未实现 */}

int16_t GetPipeOption(void) { return (int16_t)GetPipe_option(); }

void SetPipeOption(int16_t data) { SetPipe_option(data); }

int16_t GetSystemMode(void) { return (int16_t)GetSystem_mode(); }

void SetSystemMode(int16_t data) { SetSystem_mode(data); }

int16_t GetExInput(void) { return (int16_t)GetExternal_Input(); }

void SetExInput(int16_t data) { SetExternal_Input(data); }

int16_t GetEcoHeat(void) { return (int16_t)(GetECO_Heat() * 10); }

void SetEcoHeat(int16_t data) { SetECO_Heat(data / 10); }

int16_t GetEcoCool(void) { return (int16_t)(GetECO_Cool() * 10); }

void SetEcoCool(int16_t data) { SetECO_Cool(data / 10); }

int16_t GetProgramOption(void) { return (int16_t)GetProgram_option(); }

void SetProgramOption(int16_t data) { SetProgram_option(data); }

int16_t GetTempUnit(void) { return (int16_t)Gettemperature_unit(); }

void SetTempUnit(int16_t data) { Settemperature_unit(data); }

int16_t GetProportionalBand(void) { return (int16_t)GetProportional_band(); }

void SetProportionalBand(int16_t data) { SetProportional_band(data); }

int16_t GetMinValveOpen(void) { return (int16_t)GetMin_Valve_Open(); }

void SetMinValveOpen(int16_t data) { SetMin_Valve_Open(data); }

int16_t GetValveInterval(void) { return (int16_t)GetValve_Interval(); }

void SetValveInterval(int16_t data) { SetValve_Interval(data); }

int16_t GetMaxFanVoltage(void) { return (int16_t)GetMax_Fan_Voltage(); }

void SetMaxFanVoltage(int16_t data) { SetMax_Fan_Voltage(data); }

int16_t GetMinFanVoltage(void) { return (int16_t)GetMin_Fan_Voltage(); }

void SetMinFanVoltage(int16_t data) { SetMin_Fan_Voltage(data); }

int16_t GetHighFanVoltage(void) { return (int16_t)GetHigh_Fan_Voltage(); }

void SetHighFanVoltage(int16_t data) { SetHigh_Fan_Voltage(data); }

int16_t GetMedFanVoltage(void) { return (int16_t)GetMed_Fan_Voltage(); }

void SetMedFanVoltage(int16_t data) { SetMed_Fan_Voltage(data); }

int16_t GetLowFanVoltage(void) { return (int16_t)GetLow_Fan_Voltage(); }

void SetLowFanVoltage(int16_t data) { SetLow_Fan_Voltage(data); }

