#ifndef I2C_MCU_H
#define I2C_MCU_H

#include "esp_err.h"
#include <stdint.h>
#include <math.h>

#define MCU_I2C_ADDR 0x33

// 初始化I2C主机
esp_err_t i2c_mcu_init(void);

// 向MCU写入6字节数据包
esp_err_t i2c_mcu_write(const uint8_t *data);

// 从MCU读取6字节数据包
esp_err_t i2c_mcu_read(uint8_t *data);

// 写后读操作（先写6字节，再读6字节）
esp_err_t i2c_mcu_write_read(uint8_t *write_data, uint8_t *read_data);

// 驱动MCU蜂鸣器响一声
int i2c_mcu_beep(void);

// 获取NTC1温度（单位：摄氏度），fault为1表示故障，0表示正常
float i2c_mcu_get_ntc1_temp(int *fault);
// 获取NTC2温度（单位：摄氏度），fault为1表示故障，0表示正常
float i2c_mcu_get_ntc2_temp(int *fault);
// NTC温度换算核心函数
int GetTemp(uint16_t adc_value, uint8_t ntc_num);

// 设置背光亮度（百分比），供lvgl调用
int i2c_mcu_set_backlight(uint8_t led_pwm);

// WiFi使能控制，en=1高电平使能，en=0低电平去使能
int i2c_mcu_wifi_en(uint8_t en);

// 继电器K1控制，on=1接通继电器，on=0断开继电器
int i2c_mcu_relay_K1(uint8_t on);

// 继电器K2控制，on=1接通继电器，on=0断开继电器
int i2c_mcu_relay_K2(uint8_t on);

// 继电器K3控制，on=1接通继电器，on=0断开继电器
int i2c_mcu_relay_K3(uint8_t on);

int i2c_mcu_relay_K4(uint8_t on);

int i2c_mcu_relay_K5(uint8_t on);

// 风阀百分比控制，pid为0~100百分比
int i2c_mcu_ao1(uint8_t pid_ao1);

// 热阀百分比控制，pid为0~100百分比
int i2c_mcu_ao2(uint8_t pid_ao2);

// 冷阀百分比控制，pid为0~100百分比
int i2c_mcu_ao3(uint8_t pid_ao3);

/**
 * @brief 获取用于显示的温度值和错误码，支持校准、补偿、单位转换和范围限制
 * @param[out] temp_disp 返回显示温度（float*，保留1位小数）
 * @param[out] fault_code 返回错误码（int*，0=无故障，1=ntc1故障，2=ntc2故障）
 * @return 0=正常，1=ntc1故障，2=ntc2故障
 */
int temp_display(float *temp_disp, int *fault_code);

/**
 * @brief 获取温度显示值（s_temp_disp的getter）
 */
float get_temp_disp(void);

/**
 * @brief 获取温度故障码（s_fault_code的getter）
 */
int get_fault_code(void);

/**
 * @brief 设置蜂鸣器开关状态
 * @param onoff 0=关闭蜂鸣器，1=开启蜂鸣器
 */
void set_beep_onoff(uint8_t onoff);

/**
 * @brief 获取蜂鸣器开关状态
 * @return 0=蜂鸣器关闭，1=蜂鸣器开启
 */
uint8_t get_beep_onoff(void);

/**
 * @brief 房卡检测函数，通过NTC2通道的ADC原始值判断房卡在位状态
 * @details 通过获取NTC2通道的原始ADC值来判断房卡状态：
 *          - ADC > 0x03FF (1023)：房卡不在位（返回0）
 *          - ADC < 100：房卡在位（返回1）
 *          - 其他情况：保持上次状态
 *          - 当GetExternal_Input()!=2时，返回0xFF
 * @return int 房卡状态：1=在位，0=不在位，-1=通信失败
 */
int check_roomcard(void);

/**
 * @brief 获取房卡检测状态
 * @return int 房卡状态：1=在位，0=不在位，0xFF=无房卡功能
 */
int get_roomcard_detect(void);

#endif // I2C_MCU_H 