see https://developer.mbed.org/users/okini3939/notebook/graphic-poi/
Dependencies: IAP RAM_DISK USBDevice mbed
file.cpp@0:49512863ec9b, 2016-12-01 (annotated)
- Committer:
- okini3939
- Date:
- Thu Dec 01 01:58:40 2016 +0000
- Revision:
- 0:49512863ec9b
- Child:
- 2:d50445fa62da
1st build
Who changed what in which revision?
User | Revision | Line number | New 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 | //http://www.umekkii.jp/data/computer/file_format/bitmap.cgi |
okini3939 | 0:49512863ec9b | 7 | |
okini3939 | 0:49512863ec9b | 8 | //USBMSD_Ram msd; |
okini3939 | 0:49512863ec9b | 9 | IAP iap; |
okini3939 | 0:49512863ec9b | 10 | extern DigitalOut led; |
okini3939 | 0:49512863ec9b | 11 | |
okini3939 | 0:49512863ec9b | 12 | int parseSector = 0; |
okini3939 | 0:49512863ec9b | 13 | int modeBmp = 0; |
okini3939 | 0:49512863ec9b | 14 | int filesize; |
okini3939 | 0:49512863ec9b | 15 | int count = 0; |
okini3939 | 0:49512863ec9b | 16 | int sector = 0; |
okini3939 | 0:49512863ec9b | 17 | |
okini3939 | 0:49512863ec9b | 18 | int parseBmp (const uint8_t *buf) { |
okini3939 | 0:49512863ec9b | 19 | int i, n = 0; |
okini3939 | 0:49512863ec9b | 20 | |
okini3939 | 0:49512863ec9b | 21 | if (modeBmp == 0) { |
okini3939 | 0:49512863ec9b | 22 | struct BmpHeader *header = (struct BmpHeader *)buf; |
okini3939 | 0:49512863ec9b | 23 | if (header->magic[0] != 'B' || header->magic[1] != 'M') return -1; |
okini3939 | 0:49512863ec9b | 24 | filesize = header->size; |
okini3939 | 0:49512863ec9b | 25 | if (header->header_size != 40) return -1; |
okini3939 | 0:49512863ec9b | 26 | DBG(" %d %d %d %d\r\n", filesize, header->width, header->height, header->bits); |
okini3939 | 0:49512863ec9b | 27 | if (header->compression != 0 || header->ncolours != 0) return -1; |
okini3939 | 0:49512863ec9b | 28 | if (header->size >= 4096 || header->bits != 24) return -1; |
okini3939 | 0:49512863ec9b | 29 | |
okini3939 | 0:49512863ec9b | 30 | __disable_irq(); |
okini3939 | 0:49512863ec9b | 31 | iap.prepare(FLASH_SECTOR + sector, FLASH_SECTOR + sector); |
okini3939 | 0:49512863ec9b | 32 | iap.erase(FLASH_SECTOR + sector, FLASH_SECTOR + sector); |
okini3939 | 0:49512863ec9b | 33 | __enable_irq(); |
okini3939 | 0:49512863ec9b | 34 | count = 0; |
okini3939 | 0:49512863ec9b | 35 | modeBmp = 1; |
okini3939 | 0:49512863ec9b | 36 | } |
okini3939 | 0:49512863ec9b | 37 | |
okini3939 | 0:49512863ec9b | 38 | if (modeBmp) { |
okini3939 | 0:49512863ec9b | 39 | led = 0; |
okini3939 | 0:49512863ec9b | 40 | __disable_irq(); |
okini3939 | 0:49512863ec9b | 41 | iap.prepare(FLASH_SECTOR + sector, FLASH_SECTOR + sector); |
okini3939 | 0:49512863ec9b | 42 | iap.write((char*)buf, sector_start_adress[FLASH_SECTOR + sector] + 512 * count, 512); |
okini3939 | 0:49512863ec9b | 43 | __enable_irq(); |
okini3939 | 0:49512863ec9b | 44 | count ++; |
okini3939 | 0:49512863ec9b | 45 | filesize -= 512; |
okini3939 | 0:49512863ec9b | 46 | |
okini3939 | 0:49512863ec9b | 47 | if (filesize <= 0 || count >= (FLASH_SECTOR_SIZE / 512)) { |
okini3939 | 0:49512863ec9b | 48 | modeBmp = 0; |
okini3939 | 0:49512863ec9b | 49 | led = 1; |
okini3939 | 0:49512863ec9b | 50 | sector ++; |
okini3939 | 0:49512863ec9b | 51 | if (sector >= MAX_SECTOR) { |
okini3939 | 0:49512863ec9b | 52 | sector = 0; |
okini3939 | 0:49512863ec9b | 53 | } |
okini3939 | 0:49512863ec9b | 54 | return -1; |
okini3939 | 0:49512863ec9b | 55 | } |
okini3939 | 0:49512863ec9b | 56 | } |
okini3939 | 0:49512863ec9b | 57 | return 0; |
okini3939 | 0:49512863ec9b | 58 | } |
okini3939 | 0:49512863ec9b | 59 | |
okini3939 | 0:49512863ec9b | 60 | void parseFat(int sector, const uint8_t *buf) { |
okini3939 | 0:49512863ec9b | 61 | int i; |
okini3939 | 0:49512863ec9b | 62 | |
okini3939 | 0:49512863ec9b | 63 | if (sector == 2) { |
okini3939 | 0:49512863ec9b | 64 | // root dir |
okini3939 | 0:49512863ec9b | 65 | struct FatInfo *fat = (struct FatInfo *)buf; |
okini3939 | 0:49512863ec9b | 66 | parseSector = 0; |
okini3939 | 0:49512863ec9b | 67 | for (i = 0; i < 16; i ++) { |
okini3939 | 0:49512863ec9b | 68 | if (fat[i].Name[0] == 0) break; |
okini3939 | 0:49512863ec9b | 69 | if (fat[i].Name[0] != 0xe5 && fat[i].Name[8] == 'B' && fat[i].Name[9] == 'M' && fat[i].Name[10] == 'P') { |
okini3939 | 0:49512863ec9b | 70 | parseSector = (fat[i].FstClusHI<<16) || fat[i].FstClusLO; |
okini3939 | 0:49512863ec9b | 71 | break; |
okini3939 | 0:49512863ec9b | 72 | } |
okini3939 | 0:49512863ec9b | 73 | } |
okini3939 | 0:49512863ec9b | 74 | } else |
okini3939 | 0:49512863ec9b | 75 | if (sector > 2) { |
okini3939 | 0:49512863ec9b | 76 | // data |
okini3939 | 0:49512863ec9b | 77 | if (parseSector && sector >= parseSector) { |
okini3939 | 0:49512863ec9b | 78 | if (parseBmp(buf)) { |
okini3939 | 0:49512863ec9b | 79 | parseSector = 0; |
okini3939 | 0:49512863ec9b | 80 | } |
okini3939 | 0:49512863ec9b | 81 | } else { |
okini3939 | 0:49512863ec9b | 82 | parseSector = 0; |
okini3939 | 0:49512863ec9b | 83 | } |
okini3939 | 0:49512863ec9b | 84 | } |
okini3939 | 0:49512863ec9b | 85 | } |
okini3939 | 0:49512863ec9b | 86 | |
okini3939 | 0:49512863ec9b | 87 | char *getPicture (int n) { |
okini3939 | 0:49512863ec9b | 88 | char *p = sector_start_adress[FLASH_SECTOR + n]; |
okini3939 | 0:49512863ec9b | 89 | if (p[0] == 'B' && p[1] == 'M') { |
okini3939 | 0:49512863ec9b | 90 | return p; |
okini3939 | 0:49512863ec9b | 91 | } |
okini3939 | 0:49512863ec9b | 92 | return NULL; |
okini3939 | 0:49512863ec9b | 93 | } |
okini3939 | 0:49512863ec9b | 94 | |
okini3939 | 0:49512863ec9b | 95 | void workMsd () { |
okini3939 | 0:49512863ec9b | 96 | USBMSD_Ram msd; |
okini3939 | 0:49512863ec9b | 97 | |
okini3939 | 0:49512863ec9b | 98 | msd.parseFat = &parseFat; |
okini3939 | 0:49512863ec9b | 99 | |
okini3939 | 0:49512863ec9b | 100 | for (;;) { |
okini3939 | 0:49512863ec9b | 101 | led = 1; |
okini3939 | 0:49512863ec9b | 102 | wait(1); |
okini3939 | 0:49512863ec9b | 103 | } |
okini3939 | 0:49512863ec9b | 104 | } |