#include "sdcard_test.h"
sdcb_t sd_cb;
sdcfg_t sdcfg;
sdfunc_t sdfunc;
void sd_set_fs_sdcb_addr( sdcb_t* ptr);

//AT(.com_text.sdio.init)
//void sd_gpio_init(u8 type)
//{
//    gpio_init_typedef gpio_init_structure;
//
//    if(type == 0) {
//        gpio_init_structure.gpio_pin = GPIO_PIN_6;//SD_CLK PE6
//        gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
//        gpio_init_structure.gpio_fen = GPIO_FEN_PER;
//        gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
//        gpio_init(GPIOE_REG, &gpio_init_structure);
//        gpio_init_structure.gpio_pin = GPIO_PIN_5 | GPIO_PIN_7;//SD_CMD PE5 SD_DAT PE7
//        gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
//        gpio_init_structure.gpio_pupd = GPIO_PUPD_UP;
//        gpio_init(GPIOE_REG, &gpio_init_structure);
//        gpio_init_structure.gpio_pin = GPIO_PIN_4;//SD_DET PE4
//        gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
//        gpio_init_structure.gpio_fen = GPIO_FEN_GPIO;
//        gpio_init_structure.gpio_pupd = GPIO_PUPD_UP;
//        gpio_init(GPIOE_REG, &gpio_init_structure);
//        gpio_func_mapping(SD0_MAP_G3);
//    }
//}

/*使用PA5/6/7*/
AT(.com_text.sdio.init)
void sd_gpio_init(u8 type)
{
    gpio_init_typedef gpio_init_structure;

    if(type == 0) {
        gpio_init_structure.gpio_pin = GPIO_PIN_6;//SD_CLK PE6
        gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
        gpio_init_structure.gpio_fen = GPIO_FEN_PER;
        gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
        gpio_init(GPIOA_REG, &gpio_init_structure);

        gpio_init_structure.gpio_pin = GPIO_PIN_5 | GPIO_PIN_7;//SD_CMD PE5 SD_DAT PE7
        gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
        gpio_init_structure.gpio_pupd = GPIO_PUPD_UP;
        gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
        gpio_init(GPIOA_REG, &gpio_init_structure);

        gpio_init_structure.gpio_pin = GPIO_PIN_4;//SD_DET PE4
        gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
        gpio_init_structure.gpio_fen = GPIO_FEN_GPIO;
        gpio_init_structure.gpio_pupd = GPIO_PUPD_UP;
        gpio_init(GPIOE_REG, &gpio_init_structure);

        gpio_func_mapping(SD0_MAP_G1);
    }
}

//Check whether SD card is online - low level is lost state, high level is online mode - if used, change according to DET pin
//bool sdcard_is_online(void)
//{
//    if (gpio_read_bit(GPIOE_REG, GPIO_PIN_4) == SET){
//        return 1;
//    }
//    else{
//        return 0;
//    }
//}

void sd_disk_init(void)
{
    sdcfg_init(&sdcfg);
    sdfunc_init(&sdfunc);
    memset(&sd_cb.card, 0, sizeof(sdcard_t));
    sdfunc.port_init = sd_gpio_init;
    sdfunc.port_init(0);    // hardware initialization
    sd_cb.card.online = 1;//sdcard_is_online(); Always online by default
    sd_cb.sdcfg = &sdcfg;
    sd_cb.sdfunc = &sdfunc;
    sd_set_fs_sdcb_addr(&sd_cb);
    sd_init(&sd_cb);

    fs_var_init();
    fsdisk_callback_init(0);    // Mount filesystems
}


/* Declare functions */
u32 get_sd_cid_flag(void);// Get the CID
char* test_name="02.txt";

void sd_disk_run(void)
{
    printf("get_sd_cid_flag:%x\n",get_sd_cid_flag());
    printf("get_sdcard_capacity:%d\n",sd_cb.card.capacity);     // Get SD card capacity
    printf("get_sdcard_capacity:%d MB\n",sd_cb.card.capacity/2048);// Get the SD card capacity ( MB )

    printf("/***************write start****************/\n");
    if(fs_mount()){
        printf("fs ok\n");
        char buf_1[512];
        memset(buf_1,'B',512);
        fs_create_time_modi(2024,4,25,04,30,12);    // Set file time, only one document can exist at the same time
        int res = fs_open(test_name,FA_WRITE|FA_CREATE_NEW); // Set the name of the file to be writable and new (unwrite if second)
        if(res == FR_OK){
            res = fs_write(buf_1,512);      //write
            if(res == FR_OK) printf("write ok\n");
            else printf("write flash\n");
            fs_close();
            sd0_stop(1);
        }
    }
    else printf("TF NO！\n");

    delay_ms(1000);

    printf("/***************read start****************/\n");
    u32 read_len=0;
    char buf_2[512];
    if(fs_mount()){
        printf("fs ok\n");
        int read = fs_open(test_name,FA_READ); // Set the name of the read file to be readable
        if(read == FR_OK){
            read = fs_lseek(0,0);  // Read from the beginning of the file
            printf("read %d\n",read);
            read = fs_read(buf_2,512,&read_len);
            if(read == FR_OK) printf("read ok\n");
            else printf("read flash\n");
            printf("read %d\n",read_len);
            for(int i= 0;i<read_len;i++)
            {
                printf("%c",buf_2[i]);
            }
            printf("\n");
        }

        fs_close();
        sd0_stop(1);
    }
    else printf("TF NO！\n");
}

//获得文件的大小
u32 sd_file_size(char *filename)
{
    u32 read_len;
    if(fs_mount())
    {
        int read = fs_open(filename,FA_READ); // Set the name of the read file to be readable
        if(read == FR_OK)
        {
           read_len = fs_get_file_size();
        }
        fs_close();
        sd0_stop(1);
        return read_len;
    }
    else printf("TF NO！\n");
}
