// 同步模块，信号收发
// 杭州秒寻科技有限公司
// 周涛
// 2023-11-20
// 注意：这部分代码为厂家提供，没做修改

#include "includes.h"

static SYNC_RXTX_STATUS_MANAGE_T g_Sync_stRxTxStatusManage = {0}; // 模块状态管理结构
const static uint8 gSync_abySendData[2] = {0x55, 0x55};

// 查询模块工作模式

// 发送信号
uint8 sync_rxtx_send_signal()
{
    uint8 byFlag = 0;

    // 清空tx fifo
    sync_rxtx_clear_tx_fifo();

    // 将数据写入tx fifo
    driverapp_sync_write_bytes(SYNC_BURST_WRITE_FIFO, gSync_abySendData, 0x02);

    // TODO切换至to tx状态(这里会出现随机时延，导致发送周期间存在一些差异)
    byFlag = sync_switch_work_status(SYNC_STATUS_GO_TX, SYNC_STATUS_TX);
    if (!byFlag)
    {
        return 0;
    }

    return 1;
}

// 数据发送完成-后处理
uint8 sync_rxtx_send_signal_over()
{
    uint8 byFlag = 0;

    sync_rxtx_clear_tx_int_flag(); // 清除发送中断标志

    // 发送数据前状态准备，最后切换至tfs状态，以缩短切换至tx状态的时间
    byFlag = sync_pre_send_data();
    if (!byFlag)
    {
        return 0;
    }

    return 1;
}

// 开启数据接收
uint8 sync_rxtx_ready_receive_signal()
{
    uint8 byFlag = 0;

    // 清空接收fifo
    byFlag = sync_rxtx_clear_rx_fifo();
    if (!byFlag)
    {
        return 0;
    }

    // 切换芯片状态 go ready
    byFlag = sync_switch_work_status(SYNC_STATUS_GO_READY, SYNC_STATUS_READY);
    if (!byFlag)
    {
        return 0;
    }

    // 切换芯片状态 go rx
    byFlag = sync_switch_work_status(SYNC_STATUS_GO_RX, SYNC_STATUS_RX);
    if (!byFlag)
    {
        return 0;
    }

    return 1;
}

// 数据接收完成-后向处理
uint8 sync_rxtx_ready_receive_signal_over()
{
    uint8 byFlag = 0;

    // 切换芯片状态 go sleep
    byFlag = sync_switch_work_status(SYNC_STATUS_GO_SLEEP, SYNC_STATUS_SLEEP);
    if (!byFlag)
    {
        return 0;
    }

    // 切换芯片状态 go ready
    byFlag = sync_switch_work_status(SYNC_STATUS_GO_READY, SYNC_STATUS_READY);
    if (!byFlag)
    {
        return 0;
    }

    // 清空接收fifo
    byFlag = sync_rxtx_clear_rx_fifo();
    if (!byFlag)
    {
        return 0;
    }

    // 清除中断
    byFlag = sync_rxtx_clear_rx_int_flag();
    if (!byFlag)
    {
        return 0;
    }

    // 切换芯片状态 go rx
    byFlag = sync_switch_work_status(SYNC_STATUS_GO_RX, SYNC_STATUS_RX);
    if (!byFlag)
    {
        return 0;
    }

    return 1;
}

// 清空接收缓存
uint8 sync_rxtx_clear_rx_fifo()
{
    return sync_rewrite_reg(0x1B, 0x02, 0x02);
}

// 清空发送缓存
uint8 sync_rxtx_clear_tx_fifo()
{
    return sync_rewrite_reg(0x1B, 0x01, 0x01);
}

// 清除接收中断标志
uint8 sync_rxtx_clear_rx_int_flag()
{
    uint8 byMask = 0x01 << 3;
    return sync_rewrite_reg(0x19, 0x08, byMask);
}

// 清除发送中断标志
uint8 sync_rxtx_clear_tx_int_flag()
{
    uint8 byMask = 0x01 << 0;
    return sync_rewrite_reg(0x18, 0x01, byMask);
}

// 更新接收告警状态
// byValue:告警状态
void sync_rxtx_update_rx_alarm(uint8 byValue)
{
    g_Sync_stRxTxStatusManage.byReceiveAlarm = byValue;
}

// 更新发送告警状态
// byValue:告警状态
void sync_rxtx_update_tx_alarm(uint8 byValue)
{
    g_Sync_stRxTxStatusManage.bySendAlarm = byValue;
}

// 查询接收告警
uint8 sync_rxtx_query_rx_alarm()
{
    return g_Sync_stRxTxStatusManage.byReceiveAlarm;
}

// 查询发送告警
uint8 sync_rxtx_query_tx_alarm()
{
    return g_Sync_stRxTxStatusManage.bySendAlarm;
}

// 更新接收成标识位
// byValue:状态
void sync_rxtx_update_rx_cplt_flag(uint8 byValue)
{
    g_Sync_stRxTxStatusManage.byRxCplt = byValue;
}

// 更新发送完成标识位
// byValue:状态
void sync_rxtx_update_tx_cplt_flag(uint8 byValue)
{
    g_Sync_stRxTxStatusManage.byTxCplt = byValue;
}

// 查询接收完成标识位
uint8 sync_rxtx_query_rx_cplt_flag()
{
    return g_Sync_stRxTxStatusManage.byRxCplt;
}

// 查询发送完成标识位
uint8 sync_rxtx_query_tx_cplt_flag()
{
    return g_Sync_stRxTxStatusManage.byTxCplt;
}