#include "busIdleDetection.h"


#ifdef RS485BUSIDLE1
#include "uart_dev.h"

/* 通过软件定时器的方式来完成 */
static TimerHandle_t J1_485_Swtmr = NULL;
static TimerHandle_t J2_485_Swtmr = NULL;
static TimerHandle_t J3_485_Swtmr = NULL;
static TimerHandle_t J4_485_Swtmr = NULL;
static TimerHandle_t J5_0_485_Swtmr = NULL;

static void J1_485_tmrCallback(void* parameter);
static void J2_485_tmrCallback(void* parameter);
static void J3_485_tmrCallback(void* parameter);
static void J4_485_tmrCallback(void* parameter);
static void J5_0_485_tmrCallback(void* parameter);

#define softwareDelay (30 / (1000 / configTICK_RATE_HZ))

/*
 * @brief   初始化所有的软件定时器
 * @param   
 * @retval
 *
 */
void softwareTimeInit(void)
{
    J1_485_Swtmr = xTimerCreate((const char*)"J1Timer",
                                softwareDelay,              //延时
                                (UBaseType_t )pdFALSE,      //单次模式 
                                (void *)1,                  //为每个计时器分配一个索引的唯一ID
                                (TimerCallbackFunction_t)J1_485_tmrCallback);   //回调函数

    J2_485_Swtmr = xTimerCreate((const char*)"J2Timer",
                                softwareDelay,
                                (UBaseType_t )pdFALSE,
                                (void *)2,
                                (TimerCallbackFunction_t)J2_485_tmrCallback);
                                
    J3_485_Swtmr = xTimerCreate((const char*)"J3Timer",
                                softwareDelay,
                                (UBaseType_t )pdFALSE,
                                (void *)3,
                                (TimerCallbackFunction_t)J3_485_tmrCallback);
                                
    J4_485_Swtmr = xTimerCreate((const char*)"J4Timer",
                                softwareDelay,
                                (UBaseType_t )pdFALSE,
                                (void *)4,
                                (TimerCallbackFunction_t)J4_485_tmrCallback);
                                
    J5_0_485_Swtmr = xTimerCreate((const char*)"J5_0Timer",
                                softwareDelay,
                                (UBaseType_t )pdFALSE,
                                (void *)5,
                                (TimerCallbackFunction_t)J5_0_485_tmrCallback);
}

void J1_485_tmrCallback(void* parameter)
{
    setBUSIDLEFlag(g_J1_uart6_handle, 0);
}

void J2_485_tmrCallback(void* parameter)
{
    setBUSIDLEFlag(g_J2_uart7_handle, 0);
}

void J3_485_tmrCallback(void* parameter)
{
    setBUSIDLEFlag(g_J3_usart2_handle, 0);
}

void J4_485_tmrCallback(void* parameter)
{
    setBUSIDLEFlag(g_J4_uart8_handle, 0);
}

void J5_0_485_tmrCallback(void* parameter)
{
    setBUSIDLEFlag(g_J5_0_usart3_handle, 0);
}

/*
 * @brief   J1_485空闲中断内容
 * @param   
 * @retval
 *
 */
void J1_485_IN_IDLE(void)
{
    xTimerStartFromISR(J1_485_Swtmr, 0);
}

/*
 * @brief   J2_485空闲中断内容
 * @param   
 * @retval
 *
 */
void J2_485_IN_IDLE(void)
{
    xTimerStartFromISR(J2_485_Swtmr, 0);
}

/*
 * @brief   J3_485空闲中断内容
 * @param   
 * @retval
 *
 */
void J3_485_IN_IDLE(void)
{
    xTimerStartFromISR(J3_485_Swtmr, 0);
}

/*
 * @brief   J4_485空闲中断内容
 * @param   
 * @retval
 *
 */
void J4_485_IN_IDLE(void)
{
    xTimerStartFromISR(J4_485_Swtmr, 0);
}

/*
 * @brief   J5_0_485空闲中断内容
 * @param   
 * @retval
 *
 */
void J5_0_485_IN_IDLE(void)
{
    xTimerStartFromISR(J5_0_485_Swtmr, 0);
}

/*
 * @brief   J1_485空闲中断后,第一次进入接收中断内容
 * @param   
 * @retval
 *
 */
void J1_485_IN_RXNE(void)
{
    xTimerStopFromISR(J1_485_Swtmr, 0);
}

/*
 * @brief   J2_485空闲中断后,第一次进入接收中断内容
 * @param   
 * @retval
 *
 */
void J2_485_IN_RXNE(void)
{
    xTimerStopFromISR(J2_485_Swtmr, 0);
}

/*
 * @brief   J3_485空闲中断后,第一次进入接收中断内容
 * @param   
 * @retval
 *
 */
void J3_485_IN_RXNE(void)
{
    xTimerStopFromISR(J3_485_Swtmr, 0);
}

/*
 * @brief   J4_485空闲中断后,第一次进入接收中断内容
 * @param   
 * @retval
 *
 */
void J4_485_IN_RXNE(void)
{
    xTimerStopFromISR(J4_485_Swtmr, 0);
}

/*
 * @brief   J5_0_485空闲中断后,第一次进入接收中断内容
 * @param   
 * @retval
 *
 */
void J5_0_485_IN_RXNE(void)
{
    xTimerStopFromISR(J5_0_485_Swtmr, 0);
}
#endif

/*
 * @brief   得到串口能否发送
 * @param   
 * @retval  0 能发送
            1 不能发送
            0xFF 错误
 */
uint8_t getRs485State(device_handle device)
{
#ifdef RS485BUSIDLE1
#ifdef UARTINTERRUPTSEND
    return (getUartSendState(device) || getBUSIDLEFlag(device));
#endif
#endif
}

uint8_t getUartState(device_handle device)
{
#ifdef UARTINTERRUPTSEND
    return getUartSendState(device);
#endif
}