From 14613996783195b0a823a13972a3662279fe2506 Mon Sep 17 00:00:00 2001
From: schneider <schneider@blinkenlichts.net>
Date: Wed, 17 Jul 2019 19:40:47 +0200
Subject: [PATCH] feat(ff13): add some util functions

---
 lib/ff13/meson.build    |   2 +
 lib/ff13/util/fs_util.c | 106 ++++++++++++++++++++++++++++++++++++++++
 lib/ff13/util/fs_util.h |  24 +++++++++
 3 files changed, 132 insertions(+)
 create mode 100644 lib/ff13/util/fs_util.c
 create mode 100644 lib/ff13/util/fs_util.h

diff --git a/lib/ff13/meson.build b/lib/ff13/meson.build
index 48a26349..6336bf28 100644
--- a/lib/ff13/meson.build
+++ b/lib/ff13/meson.build
@@ -1,5 +1,6 @@
 includes = include_directories(
   './Source/',
+  './util/',
 )
 
 sources = files(
@@ -7,6 +8,7 @@ sources = files(
   './Source/ff.c',
   './Source/ffsystem.c',
   './Source/ffunicode.c',
+  './util/fs_util.c',
 )
 
 lib = static_library(
diff --git a/lib/ff13/util/fs_util.c b/lib/ff13/util/fs_util.c
new file mode 100644
index 00000000..54a9f6d4
--- /dev/null
+++ b/lib/ff13/util/fs_util.c
@@ -0,0 +1,106 @@
+#include <fs_util.h>
+#include <ff.h>
+#include <stdint.h>
+#include <string.h>
+
+FATFS FatFs;          /* File system object for logical drive */
+FS_USAGE FsUsage;
+
+
+int fs_info(FATFS *fs)
+{
+    memcpy(fs, &FatFs, sizeof(FATFS));
+    return 0;
+}
+int fs_usage(FATFS *fs, FS_USAGE *fs_usage)
+{
+    FRESULT res;
+    DWORD tot_clust, fre_clust, sec_size;
+
+    res = f_getfree("/", &fre_clust, &fs);
+    if(res != FR_OK)
+        return -res;
+
+    // sectore size = sectors per cluster *  sector size
+#if FF_MAX_SS == FF_MIN_SS
+    sec_size = fs->csize * FF_MAX_SS;
+#else
+    sec_size = fs->csize * fs.ssize;
+#endif
+
+    // total/free sectors * sectore size
+    tot_clust = fs->n_fatent - 2;
+    fs_usage->total = tot_clust * sec_size; //FatFs.ssize;
+    fs_usage->free = fre_clust * sec_size; //FatFs.ssize;
+
+    return 0;
+}
+
+int fs_read_file(char * filename, void * data, int len){
+    FIL file;
+    UINT readbytes;
+    int res;
+
+    res=f_open(&file, filename, FA_OPEN_EXISTING|FA_READ);
+    if(res){
+        return -1;
+    };
+
+    res = f_read(&file, data, len, &readbytes);
+    if(res){
+        return -1;
+    };
+
+    f_close(&file);
+
+	return readbytes;
+}
+
+int fs_read_text_file(char * filename, char * data, int len){
+    int readbytes;
+
+    if(len<1) return -1;
+    readbytes=fs_read_file(filename,data,len-1);
+    if(readbytes<0){
+        data[0]=0;
+        return readbytes;
+    };
+    data[readbytes]=0;
+    while(readbytes>0 && data[readbytes-1]<0x20){
+        data[--readbytes]=0;
+    };
+    return readbytes;
+}
+
+
+int fs_write_file(char * filename, const void * data, int len){
+    FIL file;
+    UINT writebytes;
+    int res;
+
+	res=f_open(&file, filename, FA_CREATE_ALWAYS|FA_WRITE);
+    if(res){
+        return -res;
+    };
+
+    res = f_write(&file, data, len, &writebytes);
+    if(res){
+        return -res;
+    };
+    f_close(&file);
+
+	return writebytes;
+}
+
+int fs_get_file_size(char * filename){
+    FILINFO finfo;
+    int res;
+
+    /// XXX: Untested
+    res=f_stat(filename, &finfo);
+    if(res){
+        return -1;
+    }
+
+    return finfo.fsize;
+}
diff --git a/lib/ff13/util/fs_util.h b/lib/ff13/util/fs_util.h
new file mode 100644
index 00000000..0d8bbeb4
--- /dev/null
+++ b/lib/ff13/util/fs_util.h
@@ -0,0 +1,24 @@
+#ifndef _FS_UTIL_H
+#define _FS_UTIL_H 1
+
+#include <ff.h>
+
+#define FLEN 13
+
+typedef struct {
+    DWORD total;
+    DWORD free;
+} FS_USAGE;
+
+void fsInit(void);
+void fsReInit(void);
+
+int fsInfo(FATFS *fs);
+int fsUsage(FATFS *fs, FS_USAGE *fs_usage);
+int readFile(char * filename, void * data, int len);
+int readTextFile(char * filename, char * data, int len);
+int writeFile(char * filename, const void * data, int len);
+int getFileSize(char * filename);
+const char* f_get_rc_string (FRESULT rc);
+
+#endif /* _FS_UTIL_H */
-- 
GitLab