/* * File_Handling_RTOS.c * * Created on: 14-May-2020 * Author: Controllerstech */ #include #include "stm32f7xx_hal.h" #define UART USART1 /* =============================>>>>>>>> NO CHANGES AFTER THIS LINE =====================================>>>>>>> */ FATFS fs; // file system FIL fil; // File FILINFO fno; extern FRESULT fresult; // result extern unsigned long sizeoffile; UINT br, bw; // File read/write count /**** capacity related *****/ FATFS *pfs; DWORD fre_clust; uint32_t total, free_space; void Send_Uart (char *string) { //HAL_UART_Transmit(UART, (uint8_t *)string, strlen (string), HAL_MAX_DELAY); } int Mount_SD (const TCHAR* path) { fresult = f_mount(&fs, path, 1); if (fresult != FR_OK) return 1; else return 0; } int Unmount_SD (const TCHAR* path) { fresult = f_mount(NULL, path, 1); if (fresult == FR_OK) return 0;//Send_Uart ("SD CARD UNMOUNTED successfully...\n\n\n"); return 1;//else Send_Uart("ERROR!!! in UNMOUNTING SD CARD\n\n\n"); } /* Start node to be scanned (***also used as work area***) */ FRESULT Scan_SD (char* pat) { DIR dir; UINT i; char *path = malloc(20*sizeof (char)); sprintf (path, "%s",pat); fresult = f_opendir(&dir, path); /* Open the directory */ if (fresult == FR_OK) { for (;;) { fresult = f_readdir(&dir, &fno); /* Read a directory item */ if (fresult != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */ if (fno.fattrib & AM_DIR) /* It is a directory */ { if (!(strcmp ("SYSTEM~1", fno.fname))) continue; char *buf = malloc(30*sizeof(char)); sprintf (buf, "Dir: %s\r\n", fno.fname); Send_Uart(buf); free(buf); i = strlen(path); sprintf(&path[i], "/%s", fno.fname); fresult = Scan_SD(path); /* Enter the directory */ if (fresult != FR_OK) break; path[i] = 0; } else { /* It is a file. */ char *buf = malloc(30*sizeof(char)); sprintf(buf,"File: %s/%s\n", path, fno.fname); Send_Uart(buf); free(buf); } } f_closedir(&dir); } free(path); return fresult; } /* Only supports removing files from home directory */ FRESULT Format_SD (void) { DIR dir; char *path = malloc(20*sizeof (char)); sprintf (path, "%s","/"); fresult = f_opendir(&dir, path); /* Open the directory */ if (fresult == FR_OK) { for (;;) { fresult = f_readdir(&dir, &fno); /* Read a directory item */ if (fresult != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */ if (fno.fattrib & AM_DIR) /* It is a directory */ { if (!(strcmp ("SYSTEM~1", fno.fname))) continue; fresult = f_unlink(fno.fname); if (fresult == FR_DENIED) continue; } else { /* It is a file. */ fresult = f_unlink(fno.fname); } } f_closedir(&dir); } free(path); return fresult; } FRESULT Write_File (char *name, char *data) { /**** check whether the file exists or not ****/ fresult = f_stat (name, &fno); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! *%s* does not exists\n\n", name); //Send_Uart (buf); free(buf); return fresult; } else { /* Create a file with read write access and open it */ fresult = f_open(&fil, name, FA_OPEN_EXISTING | FA_WRITE); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in opening file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); return fresult; } else { fresult = f_write(&fil, data, strlen(data), &bw); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d while writing to the FILE *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); } /* Close file */ fresult = f_close(&fil); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in closing file *%s* after writing it\n\n", fresult, name); //Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "File *%s* is WRITTEN and CLOSED successfully\n", name); //Send_Uart(buf); free(buf); } } return fresult; } } FRESULT Write_File_byte (char *name, uint8_t *data, unsigned int bytesize) { /**** check whether the file exists or not ****/ fresult = f_stat (name, &fno); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! *%s* does not exists\n\n", name); //Send_Uart (buf); free(buf); return fresult; } else { /* Create a file with read write access and open it */ fresult = f_open(&fil, name, FA_OPEN_EXISTING | FA_WRITE); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in opening file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); return fresult; } else { fresult = f_write(&fil, data, bytesize, &bw); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d while writing to the FILE *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); } /* Close file */ fresult = f_close(&fil); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in closing file *%s* after writing it\n\n", fresult, name); //Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "File *%s* is WRITTEN and CLOSED successfully\n", name); //Send_Uart(buf); free(buf); } } return fresult; } } FRESULT Read_File (char *name) { /**** check whether the file exists or not ****/ fresult = f_stat (name, &fno); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); sprintf (buf, "ERRROR!!! *%s* does not exists\n\n", name); Send_Uart (buf); free(buf); return fresult; } else { /* Open file to read */ fresult = f_open(&fil, name, FA_READ); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); sprintf (buf, "ERROR!!! No. %d in opening file *%s*\n\n", fresult, name); Send_Uart(buf); free(buf); return fresult; } /* Read data from the file * see the function details for the arguments */ char *buffer = malloc(sizeof(f_size(&fil))); fresult = f_read (&fil, buffer, f_size(&fil), &br); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); free(buffer); sprintf (buf, "ERROR!!! No. %d in reading file *%s*\n\n", fresult, name); Send_Uart(buffer); free(buf); } else { Send_Uart(buffer); free(buffer); /* Close file */ fresult = f_close(&fil); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); sprintf (buf, "ERROR!!! No. %d in closing file *%s*\n\n", fresult, name); Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); sprintf (buf, "File *%s* CLOSED successfully\n", name); Send_Uart(buf); free(buf); } } return fresult; } } FRESULT Seek_Read_File (char *name, uint8_t *data, unsigned int bytesize, unsigned long goto_label) { /**** check whether the file exists or not ****/ fresult = f_stat (name, &fno); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); sprintf (buf, "ERRROR!!! *%s* does not exists\n\n", name); //Send_Uart (buf); free(buf); return fresult; } else { /* Open file to read */ fresult = f_open(&fil, name, FA_READ); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); sprintf (buf, "ERROR!!! No. %d in opening file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); return fresult; } /* Read data from the file * see the function details for the arguments */ //char *buffer = malloc(sizeof(f_size(&fil))); fresult = f_lseek (&fil, goto_label); /* Move file pointer of the file object */ if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //free(buffer); sprintf (buf, "ERROR!!! Can't seek the file: *%s*\n\n", name); //Send_Uart(buffer); free(buf); return fresult; } fresult = f_read (&fil, data, bytesize, &br); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //free(buffer); sprintf (buf, "ERROR!!! No. %d in reading file *%s*\n\n", fresult, name); //Send_Uart(buffer); free(buf); } else { //Send_Uart(buffer); //free(buffer); if (goto_label==0)//Set size of file in first 4 bytes { sizeoffile = f_size(&fil); data[0] = (uint8_t) (sizeoffile&0xff); data[1] = (uint8_t) ((sizeoffile>>8)&0xff); data[2] = (uint8_t) ((sizeoffile>>16)&0xff); data[3] = (uint8_t) ((sizeoffile>>24)&0xff); } /* Close file */ fresult = f_close(&fil); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); sprintf (buf, "ERROR!!! No. %d in closing file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); sprintf (buf, "File *%s* CLOSED successfully\n", name); //Send_Uart(buf); free(buf); } } return fresult; } } FRESULT Create_File (char *name) { fresult = f_stat (name, &fno); if (fresult == FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! *%s* already exists!!!!\n use Update_File \n\n",name); //Send_Uart(buf); free(buf); return fresult; } else { fresult = f_open(&fil, name, FA_CREATE_ALWAYS|FA_READ|FA_WRITE); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in creating file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); return fresult; } else { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "*%s* created successfully\n Now use Write_File to write data\n",name); //Send_Uart(buf); free(buf); } fresult = f_close(&fil); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR No. %d in closing file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "File *%s* CLOSED successfully\n", name); //Send_Uart(buf); free(buf); } } return fresult; } FRESULT Update_File (char *name, char *data) { /**** check whether the file exists or not ****/ fresult = f_stat (name, &fno); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! *%s* does not exists\n\n", name); //Send_Uart (buf); free(buf); return fresult; } else { /* Create a file with read write access and open it */ fresult = f_open(&fil, name, FA_OPEN_APPEND | FA_WRITE); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in opening file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); return fresult; } /* Writing text */ fresult = f_write(&fil, data, strlen (data), &bw); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in writing file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "*%s* UPDATED successfully\n", name); //Send_Uart(buf); free(buf); } /* Close file */ fresult = f_close(&fil); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in closing file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "File *%s* CLOSED successfully\n", name); //Send_Uart(buf); free(buf); } } return fresult; } FRESULT Remove_File (char *name) { /**** check whether the file exists or not ****/ fresult = f_stat (name, &fno); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); sprintf (buf, "ERROR!!! *%s* does not exists\n\n", name); Send_Uart (buf); free(buf); return fresult; } else { fresult = f_unlink (name); if (fresult == FR_OK) { char *buf = malloc(100*sizeof(char)); sprintf (buf, "*%s* has been removed successfully\n", name); Send_Uart (buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); sprintf (buf, "ERROR No. %d in removing *%s*\n\n",fresult, name); Send_Uart (buf); free(buf); } } return fresult; } FRESULT Create_Dir (char *name) { fresult = f_mkdir(name); if (fresult == FR_OK) { char *buf = malloc(100*sizeof(char)); sprintf (buf, "*%s* has been created successfully\n", name); Send_Uart (buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); sprintf (buf, "ERROR No. %d in creating directory *%s*\n\n", fresult,name); Send_Uart(buf); free(buf); } return fresult; } void Check_SD_Space (void) { /* Check free space */ f_getfree("", &fre_clust, &pfs); total = (uint32_t)((pfs->n_fatent - 2) * pfs->csize * 0.5); char *buf = malloc(30*sizeof(char)); sprintf (buf, "SD CARD Total Size: \t%lu\n",total); Send_Uart(buf); free(buf); free_space = (uint32_t)(fre_clust * pfs->csize * 0.5); buf = malloc(30*sizeof(char)); sprintf (buf, "SD CARD Free Space: \t%lu\n",free_space); Send_Uart(buf); free(buf); } FRESULT Update_File_float (char *name, float *data, unsigned int bytesize) { /**** check whether the file exists or not ****/ fresult = f_stat (name, &fno); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! *%s* does not exists\n\n", name); //Send_Uart (buf); free(buf); return fresult; } else { /* Create a file with read write access and open it */ fresult = f_open(&fil, name, FA_OPEN_APPEND | FA_WRITE); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in opening file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); return fresult; } /* Writing text */ fresult = f_write(&fil, data, bytesize, &bw); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in writing file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "*%s* UPDATED successfully\n", name); //Send_Uart(buf); free(buf); } /* Close file */ fresult = f_close(&fil); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in closing file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "File *%s* CLOSED successfully\n", name); //Send_Uart(buf); free(buf); } } return fresult; } FRESULT Update_File_byte (char *name, uint8_t *data, unsigned int bytesize) { /**** check whether the file exists or not ****/ fresult = f_stat (name, &fno); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! *%s* does not exists\n\n", name); //Send_Uart (buf); free(buf); return fresult; } else { /* Create a file with read write access and open it */ fresult = f_open(&fil, name, FA_OPEN_APPEND | FA_WRITE); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in opening file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); return fresult; } /* Writing text */ fresult = f_write(&fil, data, bytesize, &bw); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in writing file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "*%s* UPDATED successfully\n", name); //Send_Uart(buf); free(buf); } /* Close file */ fresult = f_close(&fil); if (fresult != FR_OK) { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "ERROR!!! No. %d in closing file *%s*\n\n", fresult, name); //Send_Uart(buf); free(buf); } else { char *buf = malloc(100*sizeof(char)); //sprintf (buf, "File *%s* CLOSED successfully\n", name); //Send_Uart(buf); free(buf); } } return fresult; }