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

Dependencies:   IAP RAM_DISK USBDevice mbed

Committer:
okini3939
Date:
Thu Dec 01 06:31:12 2016 +0000
Revision:
2:d50445fa62da
Parent:
0:49512863ec9b
fix padding bmp;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:49512863ec9b 1 #include "mbed.h"
okini3939 0:49512863ec9b 2 #include "USBMSD_Ram.h"
okini3939 0:49512863ec9b 3 #include "IAP.h"
okini3939 0:49512863ec9b 4 #include "file.h"
okini3939 0:49512863ec9b 5
okini3939 0:49512863ec9b 6 //USBMSD_Ram msd;
okini3939 0:49512863ec9b 7 IAP iap;
okini3939 0:49512863ec9b 8 extern DigitalOut led;
okini3939 0:49512863ec9b 9
okini3939 0:49512863ec9b 10 int parseSector = 0;
okini3939 0:49512863ec9b 11 int modeBmp = 0;
okini3939 0:49512863ec9b 12 int filesize;
okini3939 0:49512863ec9b 13 int count = 0;
okini3939 0:49512863ec9b 14 int sector = 0;
okini3939 0:49512863ec9b 15
okini3939 2:d50445fa62da 16 int parseBmp (const uint8_t *buf, int len) {
okini3939 0:49512863ec9b 17 int i, n = 0;
okini3939 0:49512863ec9b 18
okini3939 0:49512863ec9b 19 if (modeBmp == 0) {
okini3939 0:49512863ec9b 20 struct BmpHeader *header = (struct BmpHeader *)buf;
okini3939 0:49512863ec9b 21 if (header->magic[0] != 'B' || header->magic[1] != 'M') return -1;
okini3939 0:49512863ec9b 22 filesize = header->size;
okini3939 0:49512863ec9b 23 if (header->header_size != 40) return -1;
okini3939 0:49512863ec9b 24 DBG(" %d %d %d %d\r\n", filesize, header->width, header->height, header->bits);
okini3939 0:49512863ec9b 25 if (header->compression != 0 || header->ncolours != 0) return -1;
okini3939 0:49512863ec9b 26 if (header->size >= 4096 || header->bits != 24) return -1;
okini3939 0:49512863ec9b 27
okini3939 0:49512863ec9b 28 __disable_irq();
okini3939 0:49512863ec9b 29 iap.prepare(FLASH_SECTOR + sector, FLASH_SECTOR + sector);
okini3939 0:49512863ec9b 30 iap.erase(FLASH_SECTOR + sector, FLASH_SECTOR + sector);
okini3939 0:49512863ec9b 31 __enable_irq();
okini3939 0:49512863ec9b 32 count = 0;
okini3939 0:49512863ec9b 33 modeBmp = 1;
okini3939 0:49512863ec9b 34 }
okini3939 0:49512863ec9b 35
okini3939 0:49512863ec9b 36 if (modeBmp) {
okini3939 0:49512863ec9b 37 led = 0;
okini3939 0:49512863ec9b 38 __disable_irq();
okini3939 0:49512863ec9b 39 iap.prepare(FLASH_SECTOR + sector, FLASH_SECTOR + sector);
okini3939 2:d50445fa62da 40 iap.write((char*)buf, sector_start_adress[FLASH_SECTOR + sector] + 512 * count, len);
okini3939 0:49512863ec9b 41 __enable_irq();
okini3939 2:d50445fa62da 42 count += len / 512;
okini3939 2:d50445fa62da 43 filesize -= len;
okini3939 0:49512863ec9b 44
okini3939 0:49512863ec9b 45 if (filesize <= 0 || count >= (FLASH_SECTOR_SIZE / 512)) {
okini3939 0:49512863ec9b 46 modeBmp = 0;
okini3939 0:49512863ec9b 47 led = 1;
okini3939 0:49512863ec9b 48 sector ++;
okini3939 0:49512863ec9b 49 if (sector >= MAX_SECTOR) {
okini3939 0:49512863ec9b 50 sector = 0;
okini3939 0:49512863ec9b 51 }
okini3939 0:49512863ec9b 52 return -1;
okini3939 0:49512863ec9b 53 }
okini3939 0:49512863ec9b 54 }
okini3939 0:49512863ec9b 55 return 0;
okini3939 0:49512863ec9b 56 }
okini3939 0:49512863ec9b 57
okini3939 2:d50445fa62da 58 void parseFat(int sector, const uint8_t *buf, int len) {
okini3939 0:49512863ec9b 59 int i;
okini3939 0:49512863ec9b 60
okini3939 0:49512863ec9b 61 if (sector == 2) {
okini3939 0:49512863ec9b 62 // root dir
okini3939 0:49512863ec9b 63 struct FatInfo *fat = (struct FatInfo *)buf;
okini3939 0:49512863ec9b 64 parseSector = 0;
okini3939 0:49512863ec9b 65 for (i = 0; i < 16; i ++) {
okini3939 0:49512863ec9b 66 if (fat[i].Name[0] == 0) break;
okini3939 0:49512863ec9b 67 if (fat[i].Name[0] != 0xe5 && fat[i].Name[8] == 'B' && fat[i].Name[9] == 'M' && fat[i].Name[10] == 'P') {
okini3939 0:49512863ec9b 68 parseSector = (fat[i].FstClusHI<<16) || fat[i].FstClusLO;
okini3939 0:49512863ec9b 69 break;
okini3939 0:49512863ec9b 70 }
okini3939 0:49512863ec9b 71 }
okini3939 0:49512863ec9b 72 } else
okini3939 0:49512863ec9b 73 if (sector > 2) {
okini3939 0:49512863ec9b 74 // data
okini3939 0:49512863ec9b 75 if (parseSector && sector >= parseSector) {
okini3939 2:d50445fa62da 76 if (parseBmp(buf, len)) {
okini3939 0:49512863ec9b 77 parseSector = 0;
okini3939 0:49512863ec9b 78 }
okini3939 0:49512863ec9b 79 } else {
okini3939 0:49512863ec9b 80 parseSector = 0;
okini3939 0:49512863ec9b 81 }
okini3939 0:49512863ec9b 82 }
okini3939 0:49512863ec9b 83 }
okini3939 0:49512863ec9b 84
okini3939 0:49512863ec9b 85 char *getPicture (int n) {
okini3939 0:49512863ec9b 86 char *p = sector_start_adress[FLASH_SECTOR + n];
okini3939 0:49512863ec9b 87 if (p[0] == 'B' && p[1] == 'M') {
okini3939 0:49512863ec9b 88 return p;
okini3939 0:49512863ec9b 89 }
okini3939 0:49512863ec9b 90 return NULL;
okini3939 0:49512863ec9b 91 }
okini3939 0:49512863ec9b 92
okini3939 0:49512863ec9b 93 void workMsd () {
okini3939 0:49512863ec9b 94 USBMSD_Ram msd;
okini3939 0:49512863ec9b 95
okini3939 0:49512863ec9b 96 msd.parseFat = &parseFat;
okini3939 0:49512863ec9b 97
okini3939 0:49512863ec9b 98 for (;;) {
okini3939 0:49512863ec9b 99 led = 1;
okini3939 0:49512863ec9b 100 wait(1);
okini3939 0:49512863ec9b 101 }
okini3939 0:49512863ec9b 102 }