#include <string.h>
#include <stdint.h>
#include <kernel/dpl/DebugP.h>
#include <kernel/dpl/ClockP.h>
#include <drivers/fsi.h>
#include "ti_drivers_config.h"
#include "ti_drivers_open_close.h"

#define FSI_APP_LOOP_COUNT              (50U)
#define FSI_APP_FRAME_DATA_WORD_SIZE    (16U)

uint16_t gRxBufData[FSI_APP_FRAME_DATA_WORD_SIZE];
uint16_t gTxBufData[FSI_APP_FRAME_DATA_WORD_SIZE];

/* main.c에서 호출하는 이름과 똑같이 맞춥니다. */
void fsi_board_a_master_main(void *args)
{
    int32_t status;
    Drivers_open();

    DebugP_log("[FSI A] Master Polling Mode Started (2-Lane, 50MHz)\r\n");

    uint32_t rxBase = CONFIG_FSI_RX0_BASE_ADDR;
    uint32_t txBase = CONFIG_FSI_TX0_BASE_ADDR;

    /* 1. FSI 초기화: 2-Lane 및 외부 통신 설정 */
    FSI_setRxDataWidth(rxBase, FSI_DATA_WIDTH_2_LANE);
    FSI_setTxDataWidth(txBase, FSI_DATA_WIDTH_2_LANE);
    FSI_disableRxInternalLoopback(rxBase);

    /* 2. 동기화를 위해 Slave(보드 B)가 준비될 시간을 줍니다. */
    DebugP_log("[FSI A] Waiting 2 seconds for Slave...\r\n");
    ClockP_sleep(2);

    /* 3. 메인 루프 (50회) */
    for(uint32_t loop = 1; loop <= FSI_APP_LOOP_COUNT; loop++)
    {
        for(int i = 0; i < 16; i++) gTxBufData[i] = 0xA000 + loop + i;

        DebugP_log("\r\n--- Loop [%d/50] ---\r\n", loop);
        
        /* [TX] 데이터 송신 (Polling 모드) */
        DebugP_log("  [A][TX Data]: 0x%04X ...\r\n", gTxBufData[0]);
        status = FSI_Tx_hld(gFsiTxHandle[CONFIG_FSI_TX0], gTxBufData, NULL, 0U);
        DebugP_assert(status == SystemP_SUCCESS);

        /* [RX] 데이터 수신 대기 (상대방 데이터를 받을 때까지 Blocking) */
        status = FSI_Rx_hld(gFsiRxHandle[CONFIG_FSI_RX0], gRxBufData, NULL, 0U);
        
        if(status == SystemP_SUCCESS) {
            DebugP_log("  [A][RX Data]: ");
            for(int i = 0; i < 16; i++) DebugP_log("0x%04X ", gRxBufData[i]);
            DebugP_log("\r\n");
        }

        FSI_setRxBufferPtr(rxBase, 0U);
        ClockP_usleep(100000); 
    }
    
    DebugP_log("\r\n[FSI A] All Tests Passed.\r\n");
    Drivers_close();
}