see https://developer.mbed.org/users/okini3939/notebook/graphic-poi/
Dependencies: IAP RAM_DISK USBDevice mbed
file.cpp@2:d50445fa62da, 2016-12-01 (annotated)
- 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?
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 | //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 | } |