see https://developer.mbed.org/users/okini3939/notebook/graphic-poi/

Dependencies:   IAP RAM_DISK USBDevice mbed

Revision:
0:49512863ec9b
Child:
2:d50445fa62da
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/file.cpp	Thu Dec 01 01:58:40 2016 +0000
@@ -0,0 +1,104 @@
+#include "mbed.h"
+#include "USBMSD_Ram.h"
+#include "IAP.h"
+#include "file.h"
+
+//http://www.umekkii.jp/data/computer/file_format/bitmap.cgi
+
+//USBMSD_Ram msd;
+IAP iap;
+extern DigitalOut led;
+
+int parseSector = 0;
+int modeBmp = 0;
+int filesize;
+int count = 0;
+int sector = 0;
+
+int parseBmp (const uint8_t *buf) {
+    int i, n = 0;
+
+    if (modeBmp == 0) {
+        struct BmpHeader *header = (struct BmpHeader *)buf;
+        if (header->magic[0] != 'B' || header->magic[1] != 'M') return -1;
+        filesize = header->size;
+        if (header->header_size != 40) return -1;
+        DBG(" %d %d %d %d\r\n", filesize, header->width, header->height, header->bits);
+        if (header->compression != 0 || header->ncolours != 0) return -1;
+        if (header->size >= 4096 || header->bits != 24) return -1;
+
+        __disable_irq();
+        iap.prepare(FLASH_SECTOR + sector, FLASH_SECTOR + sector);
+        iap.erase(FLASH_SECTOR + sector, FLASH_SECTOR + sector);
+        __enable_irq();
+        count = 0;
+        modeBmp = 1;
+    }
+    
+    if (modeBmp) {
+        led = 0;
+        __disable_irq();
+        iap.prepare(FLASH_SECTOR + sector, FLASH_SECTOR + sector);
+        iap.write((char*)buf, sector_start_adress[FLASH_SECTOR + sector] + 512 * count, 512);
+        __enable_irq();
+        count ++;
+        filesize -= 512;
+
+        if (filesize <= 0 || count >= (FLASH_SECTOR_SIZE / 512)) {
+            modeBmp = 0;
+            led = 1;
+            sector ++;
+            if (sector >= MAX_SECTOR) {
+                sector = 0;
+            }
+            return -1;
+        }
+    }
+    return 0;
+}
+
+void parseFat(int sector, const uint8_t *buf) {
+    int i;
+
+    if (sector == 2) {
+        // root dir
+        struct FatInfo *fat = (struct FatInfo *)buf;
+        parseSector = 0;
+        for (i = 0; i < 16; i ++) {
+            if (fat[i].Name[0] == 0) break;
+            if (fat[i].Name[0] != 0xe5 && fat[i].Name[8] == 'B' && fat[i].Name[9] == 'M' && fat[i].Name[10] == 'P') {
+                parseSector = (fat[i].FstClusHI<<16) || fat[i].FstClusLO;
+                break;
+            }
+        }
+    } else
+    if (sector > 2) {
+        // data
+        if (parseSector && sector >= parseSector) {
+            if (parseBmp(buf)) {
+                parseSector = 0;
+            }
+        } else {
+            parseSector = 0;
+        }
+    }
+}
+
+char *getPicture (int n) {
+    char *p = sector_start_adress[FLASH_SECTOR + n];
+    if (p[0] == 'B' && p[1] == 'M') {
+        return p;
+    }
+    return NULL;
+}
+
+void workMsd () {
+    USBMSD_Ram msd;
+
+    msd.parseFat = &parseFat;
+
+    for (;;) {
+        led = 1;
+        wait(1);
+    }
+}