
#include "driverlib.h"
#include "device.h"

#include <sdspi/sdspi.h>
#include <sdspi/SDFatFS.h>
#include <stdlib.h>
#include <string.h>

uint16_t SDFatFS_config_count = 1;
SDFatFS_Object sdfatfsObject;

#define SD_SPI_BASE      SPID_BASE
#define SD_CS_GPIO       94
#define SD_BITRATE       1000000U
#define SD_DATAWIDTH     8U

SDSPI_Object sdspiObject = {
    .spiHandle = SD_SPI_BASE,
    .spiCsGpioIndex = SD_CS_GPIO
};

SDFatFS_Object *SDFatFS_config[] = { &sdfatfsObject };
SDSPI_Handle sdspiHandle = &sdspiObject;

#define DRIVE_NUM 0
#define STR_(n) #n
#define STR(n)  STR_(n)

const char outputfile[] = STR(DRIVE_NUM) ":hello.txt";
const char textarray[]  = "hi nima\r\n";

FIL dst;
FRESULT fresult;
unsigned int bytesWritten = 0U;


static void initSPI(void)
{

    EALLOW;

    // Enable SPID peripheral clock - seems to be essential to make it through f_open
    HWREG(CPUSYS_BASE + SYSCTL_O_PCLKCR8) |= (1UL << 3);

    EDIS;

    // SPI

    SPI_disableModule(SPID_BASE);

    SPI_setConfig(SPID_BASE,
                  DEVICE_LSPCLK_FREQ,
                  SPI_PROT_POL0PHA1,
                  SPI_MODE_CONTROLLER,
                  1000000,
                  8);

    SPI_setPTESignalPolarity(SPID_BASE, SPI_PTE_ACTIVE_LOW);
    SPI_disableLoopback(SPID_BASE);
    SPI_setEmulationMode(SPID_BASE, SPI_EMULATION_STOP_AFTER_TRANSMIT);
    SPI_enableFIFO(SPID_BASE);
    SPI_enableModule(SPID_BASE);
    GPIO_writePin(94, 1);

}

void main(void)
{

    // 0.5 second delay
    DEVICE_DELAY_US(500000);

    Device_init();

    #define SYNC_FLAG 0x0001
    IPC_sync(IPC_CPU2_L_CPU1_R, SYNC_FLAG);

    // Init SPI
    initSPI();

    SDFatFS_init();
    SDFatFS_Handle handle = SDFatFS_open(sdspiHandle, DRIVE_NUM);
        if(handle == NULL)
        {
            ESTOP0;
            while(1)
            {
            }
        }


    // Turn off led
    GPIO_writePin(13, 1);
    DEVICE_DELAY_US(250000);


    volatile FRESULT openResult;
    openResult = f_open(&dst, outputfile, FA_CREATE_ALWAYS | FA_WRITE);
    if(openResult != FR_OK)
       {
           ESTOP0;
           while(1)
           {
           }
       }


    fresult = f_write(&dst, textarray, (UINT)strlen(textarray), &bytesWritten);
    if((fresult != FR_OK) || (bytesWritten != (unsigned int)strlen(textarray)))
    {
        ESTOP0;
        while(1)
        {
        }
    }



    fresult = f_sync(&dst);
    if(fresult != FR_OK)
    {
        ESTOP0;
        while(1)
        {
        }
    }

    fresult = f_close(&dst);
    if(fresult != FR_OK)
    {
        ESTOP0;
        while(1)
        {
        }
    }

    SDFatFS_close(handle);




    ESTOP0;

    while(1)
    {
    }
}

int32_t fatfs_getFatTime(void)
{
    return 0x4A210000;
}

void GPIO_init(void) {}
void SPI_init(void) {}

