// 同步模块
// 杭州秒寻科技有限公司
// 周涛
// 2024-3-17

#include "includes.h"

// 定义一个全局变量，保存参数
static SAVE_SYNC_T g_stSaveSyncParam = {0};

// 模块初始化
void wmm_sync_init()
{
    SYS_MEMSET(&g_stSaveSyncParam, 0, sizeof(SAVE_SYNC_T));
    wmm_sync_set_param_with_default_data();
}

// 初始化默认参数
void wmm_sync_set_param_with_default_data()
{
    SYS_MEMSET(&g_stSaveSyncParam, 0, sizeof(SAVE_SYNC_T));

    g_stSaveSyncParam.byCarrierId = 30;
    g_stSaveSyncParam.byRxSyncWordId = 1;
    g_stSaveSyncParam.byCarrierGap = 250;
    g_stSaveSyncParam.wRssi = -128;

    g_stSaveSyncParam.byTxFlag = 1; // 关闭
    g_stSaveSyncParam.byTxCarrierId = 34;
    g_stSaveSyncParam.byTxSyncWordId = 2;
    g_stSaveSyncParam.byTxPower = 17;
}

// 基于flash中的数据配置设备参数
void wmm_sync_set_param_with_flash_data(uint8 *pbyData)
{
    SYS_MEMCPY((void *)&g_stSaveSyncParam, (void *)pbyData, sizeof(SAVE_SYNC_T));
}

// 向外暴露参数，方便其他模块使用参数
SAVE_SYNC_T *wmm_sync_query_param()
{
    return (SAVE_SYNC_T *)(&g_stSaveSyncParam);
}

// 查询参数
// wCommand:  查询命令，pstLtv：当前监控对象
uint8 wmm_sync_query(uint16 wCommand, uint8 *pbyLtv)
{
    LTV_T *pstLtv = (LTV_T *)pbyLtv;
    uint16 wLen = pstLtv->wLen - 4; // 净荷长度
    int16 wRssiValue = 0;

    switch (wCommand)
    {
    case ORDER_SYNC_FREQ_OFFSET: // 载波间隔
        SYS_MEMCPY(pstLtv->abyData, &g_stSaveSyncParam.byCarrierGap, wLen);
        break;
    case ORDER_SYNC_CENTER_FREQ: // 接收载波ID
        SYS_MEMCPY(pstLtv->abyData, &g_stSaveSyncParam.byCarrierId, wLen);
        break;
    case ORDER_SYNC_RX_SYNC_WORD: // 接收同步字
        SYS_MEMCPY(pstLtv->abyData, &g_stSaveSyncParam.byRxSyncWordId, wLen);
        break;
    case ORDER_SYNC_RSSI:               // 接收电平
        wRssiValue = sync_query_rssi(); // 查询接收电平
        g_stSaveSyncParam.wRssi = wRssiValue;
        SYS_MEMCPY(pstLtv->abyData, &g_stSaveSyncParam.wRssi, wLen);
        break;
    case ORDER_SYNC_TX_FLAG: // 发射标识符
        SYS_MEMCPY(pstLtv->abyData, &g_stSaveSyncParam.byTxFlag, wLen);
        break;
    case ORDER_SYNC_TX_CENTER_FREQ: // 发射载波ID
        SYS_MEMCPY(pstLtv->abyData, &g_stSaveSyncParam.byTxCarrierId, wLen);
        break;
    case ORDER_SYNC_TX_SYNC_WORD: // 发射同步字
        SYS_MEMCPY(pstLtv->abyData, &g_stSaveSyncParam.byTxSyncWordId, wLen);
        break;
    case ORDER_SYNC_TX_POWER: // 发射功率
        SYS_MEMCPY(pstLtv->abyData, &g_stSaveSyncParam.byTxPower, wLen);
        break;

    default:
        break;
    }

    return 0;
}

// 配置参数
// wCommand:  查询命令，pstLtv：当前监控对象
uint8 wmm_sync_config(uint16 wCommand, uint8 *pbyLtv)
{
    LTV_T *pstLtv = (LTV_T *)pbyLtv;
    uint16 wLen = pstLtv->wLen - 4; // 净荷长度

    switch (wCommand)
    {
    case ORDER_SYNC_FREQ_OFFSET: // 载波间隔
        SYS_MEMCPY(&g_stSaveSyncParam.byCarrierGap, pstLtv->abyData, wLen);
        break;
    case ORDER_SYNC_CENTER_FREQ: // 接收载波ID
        SYS_MEMCPY(&g_stSaveSyncParam.byCarrierId, pstLtv->abyData, wLen);
        break;
    case ORDER_SYNC_RX_SYNC_WORD: // 接收同步字
        SYS_MEMCPY(&g_stSaveSyncParam.byRxSyncWordId, pstLtv->abyData, wLen);
        sync_set_rx_sync_word(g_stSaveSyncParam.byRxSyncWordId);                  // 配置接收同步字
        exti_cal_audio_signal_send_delay_times(g_stSaveSyncParam.byRxSyncWordId); // 计算音频信号延迟次数
        break;
    case ORDER_SYNC_RSSI: // 接收电平
        break;
    case ORDER_SYNC_TX_FLAG: // 发射标识符
        SYS_MEMCPY(&g_stSaveSyncParam.byTxFlag, pstLtv->abyData, wLen);
        exti_save_sync_signal_forward_flag(g_stSaveSyncParam.byTxFlag);
        break;
    case ORDER_SYNC_TX_CENTER_FREQ: // 发射载波ID
        SYS_MEMCPY(&g_stSaveSyncParam.byTxCarrierId, pstLtv->abyData, wLen);
        break;
    case ORDER_SYNC_TX_SYNC_WORD: // 发射同步字
        SYS_MEMCPY(&g_stSaveSyncParam.byTxSyncWordId, pstLtv->abyData, wLen);
        synctx_set_sync_word(g_stSaveSyncParam.byTxSyncWordId); // 配置发射同步字
        break;
    case ORDER_SYNC_TX_POWER: // 发射功率
        SYS_MEMCPY(&g_stSaveSyncParam.byTxPower, pstLtv->abyData, wLen);
        break;

    default:
        break;
    }

    return 1;
}