#pragma once

#include "device.h"
#include "../led_strip/led_strip.h"
#include "key.h"
#include "protocol/p_protocol.h"
#include "protocol/resend_protl.h"
#include "protocol/stmisp.h"
#include "ota_u.h"
#include "tool.h"
#include "ring_buffer.h"
#include "../../config/app_config.h"

#define FC_ADDRESS "0x08000000"
#define DATA_HANDLE_BUFFER_SIZE 4096

#define RF_OFF_COLOR RGB_COLOR_NONE                             //关闭射频灯的颜色指示
#define WIFI_AP_COLOR RGB_COLOR_WHITE                           //连接WIFI AP模式指示
#define WIFI_STA_COLOR RGB_COLOR_PURPLE                         //连接WIFI STA模式指示
#define BLE_COLOR RGB_COLOR_GREEN                               //连接BLE模式指示
#define NO_CONNECT_COLOR_BLE_AP RGB_COLOR_GREEN_WHITE           //未连接模式指示BLE+AP
#define NO_CONNECT_COLOR_BLE_STA RGB_COLOR_GREEN_PURPLE         //未连接模式指示BLE+STA
typedef enum
{
    DATA_HANDLE_IDLE = 0,
    DATA_HANDLE_OTA_DATA,
    DATA_HANDLE_OTA_DATA_END,
    DATA_HANDLE_ISP_DATA,
    DATA_HANDLE_ISP_DATA_END
}data_handle_e;
typedef enum
{
    SERTRF_ERROR_NONE = 0,
    SERTRF_ERROR_OTA_INIT = 10,                 // ota初始化失败
    SERTRF_ERROR_OTA_DATA,                      // ota数据传输异常
    SERTRF_ERROR_OTA_END,                       // ota 结束异常

    SERTRF_ERROR_FC_ISP_UART_TYPE = 30,         // 飞控ISP 无法识别其协议
    SERTRF_ERROR_FC_ISP_UART_DATA,              // 飞控ISP 无法收到其数据
    SERTRF_ERROR_FC_ISP_SYNC,                   // 飞控ISP 无法与ISP建立连接，需判断BOOT键是否有效
}sertrf_error_code_e;
typedef struct __attribute__((packed))
{
    data_handle_e task_state;

    uint16_t sertrf_error_code;
}sertrf_mode_status_t;
typedef struct 
{
    device_t device;
    // 任务
    os_thread_t embedded_thread;    //处理飞控接收
    os_thread_t pc_thread;          //处理app接收
    os_thread_t task_thread;        //处理其他任务
    os_thread_t app_thread;         //处理app任务
    os_thread_t data_handle_thread; //数据处理任务

    sertrf_mode_status_t mode_status;
    // ota
    ota_u_t otau;

    //自定义协议
    resend_device_t resend_device;
    SemaphoreHandle_t resend_read_mutex;
    
    //STMISP协议
    stmisp_device_t stmisp_device;
    
    // 环形buff
    RingBuffer data_handle_buffer;
    uint32_t fc_address;

    // efuse MAC 地址
    uint8_t efuse_mac[6];
    uint8_t efuse_mac_encrypt[6];

    // 记录错误信息
    protocol_status_e fc_protocol_status; //飞控连接端的协议状态

    // 判断是否使用强刷固件
    uint8_t force_update;
}sertrf_t;

typedef struct __attribute__((packed))
{
    char ble_name[32];
    char wifi_ap_ssid[32];
    char wifi_ap_password[32];
    char wifi_sta_ssid[32];
    char wifi_sta_password[32];
    uint8_t efuse_mac_encrypt[6];
}sertrf_stauct_t;
/**
 * @brief 模块初始化
*/
void sertrf_init(void);

/**
 * @brief 模块启动
*/
void sertrf_start(void);

/**
 * @brief 模块停止
*/
void sertrf_stop(void);

/**
 * @brief 射频模块开关
 */
void sertrf_rf_switch(uint8_t on);

/**
 * @brief 模块数据查看
*/
void sertrf_status(void);

/**
 * @brief embedded thread
*/
void embedded_thread(void* arg);

/**
 * @brief pc thread
*/
void pc_thread(void* arg);
/**
 * @brief app thread
 */
void app_thread(void* arg);
/**
 * @brief task thread
 */
void task_thread(void* arg);
/**
 * @brief data handle thread
 */
void data_handle_thread(void* arg);

/**
 * @brief 根据连接状态显示不同的颜色
 * 
 * @param connect 连接状态
*/
void pc_link_rgb_color(device_t* device);

int app_send_error_code(uint8_t error_code);


