#include "hostBusIdleDetection.h"

static TimerHandle_t J0_485_Swtmr = NULL;
static TimerHandle_t J2_485_Swtmr = NULL;
static TimerHandle_t J4_485_Swtmr = NULL;
static TimerHandle_t J6_485_Swtmr = NULL;

static void J0_485_tmrCallback(void* parameter);
static void J2_485_tmrCallback(void* parameter);
static void J4_485_tmrCallback(void* parameter);
static void J6_485_tmrCallback(void* parameter);

// 创建二值信号量
SemaphoreHandle_t J0_IDLESemaphore = NULL;
SemaphoreHandle_t J2_IDLESemaphore = NULL;
SemaphoreHandle_t J4_IDLESemaphore = NULL;
SemaphoreHandle_t J6_IDLESemaphore = NULL;

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

void hostIdleInit(void)
{
    J0_485_Swtmr = xTimerCreate((const char*)"J0Timer",
                                softwareDelay,              //延时
                                (UBaseType_t )pdFALSE,      //单次模式 
                                (void *)1,                  //为每个计时器分配一个索引的唯一ID
                                (TimerCallbackFunction_t)J0_485_tmrCallback);   //回调函数
    
    J2_485_Swtmr = xTimerCreate((const char*)"J2Timer",
                                softwareDelay,
                                (UBaseType_t )pdFALSE,
                                (void *)2,
                                (TimerCallbackFunction_t)J2_485_tmrCallback);
                                
    J4_485_Swtmr = xTimerCreate((const char*)"J4Timer",
                                softwareDelay,
                                (UBaseType_t )pdFALSE,
                                (void *)2,
                                (TimerCallbackFunction_t)J4_485_tmrCallback);
                                
    J6_485_Swtmr = xTimerCreate((const char*)"J6Timer",
                                softwareDelay,
                                (UBaseType_t )pdFALSE,
                                (void *)2,
                                (TimerCallbackFunction_t)J6_485_tmrCallback);

    J0_IDLESemaphore = xSemaphoreCreateBinary();
    xSemaphoreGive(J0_IDLESemaphore);
    J2_IDLESemaphore = xSemaphoreCreateBinary();
    xSemaphoreGive(J2_IDLESemaphore);
    J4_IDLESemaphore = xSemaphoreCreateBinary();
    xSemaphoreGive(J4_IDLESemaphore);
    J6_IDLESemaphore = xSemaphoreCreateBinary();
    xSemaphoreGive(J6_IDLESemaphore);
}

void J0_485_tmrCallback(void* parameter)
{
    xSemaphoreGiveFromISR(J0_IDLESemaphore, 0);
}
void J2_485_tmrCallback(void* parameter)
{
    xSemaphoreGiveFromISR(J2_IDLESemaphore, 0);
}
void J4_485_tmrCallback(void* parameter)
{
    xSemaphoreGiveFromISR(J4_IDLESemaphore, 0);
}
void J6_485_tmrCallback(void* parameter)
{
    xSemaphoreGiveFromISR(J6_IDLESemaphore, 0);
}

/*
 * @brief   空闲中断内容
 * @param   
 * @retval
 *
 */
void J0_485_IN_IDLE(void)
{
    xTimerStartFromISR(J0_485_Swtmr, 0);
}
void J2_485_IN_IDLE(void)
{
    xTimerStartFromISR(J2_485_Swtmr, 0);
}
void J4_485_IN_IDLE(void)
{
    xTimerStartFromISR(J4_485_Swtmr, 0);
}
void J6_485_IN_IDLE(void)
{
    xTimerStartFromISR(J6_485_Swtmr, 0);
}

/*
 * @brief   空闲中断后,第一次进入接收中断内容
 * @param   
 * @retval
 *
 */
void J0_485_IN_RXNE(void)
{
    xTimerStopFromISR(J0_485_Swtmr, 0);
    xSemaphoreTakeFromISR(J0_IDLESemaphore, 0);
}
void J2_485_IN_RXNE(void)
{
    xTimerStopFromISR(J2_485_Swtmr, 0);
    xSemaphoreTakeFromISR(J2_IDLESemaphore, 0);
}
void J4_485_IN_RXNE(void)
{
    xTimerStopFromISR(J4_485_Swtmr, 0);
    xSemaphoreTakeFromISR(J4_IDLESemaphore, 0);
}
void J6_485_IN_RXNE(void)
{
    xTimerStopFromISR(J6_485_Swtmr, 0);
    xSemaphoreTakeFromISR(J6_IDLESemaphore, 0);
}