see https://developer.mbed.org/users/okini3939/notebook/graphic-poi/
Dependencies: IAP RAM_DISK USBDevice mbed
main.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 | /* |
okini3939 | 0:49512863ec9b | 2 | * Suga-koubou Graphic Poi Kit |
okini3939 | 0:49512863ec9b | 3 | * LPC11U35 (select EA LPC11U35 QuickStart Board) |
okini3939 | 0:49512863ec9b | 4 | * APA102 (Adafruit DotStar LED Strip) |
okini3939 | 0:49512863ec9b | 5 | */ |
okini3939 | 0:49512863ec9b | 6 | #include "mbed.h" |
okini3939 | 0:49512863ec9b | 7 | #include "file.h" |
okini3939 | 0:49512863ec9b | 8 | |
okini3939 | 0:49512863ec9b | 9 | #define LED_NUM 32 |
okini3939 | 0:49512863ec9b | 10 | #define LED_GLOBAL 31 // brightness 0-31 |
okini3939 | 0:49512863ec9b | 11 | #define LED_FREQ 500000 // spi |
okini3939 | 0:49512863ec9b | 12 | #define LED_WAIT 1 // *10ms |
okini3939 | 0:49512863ec9b | 13 | |
okini3939 | 0:49512863ec9b | 14 | #if defined(TARGET_LPC11U24) |
okini3939 | 0:49512863ec9b | 15 | Serial pc(USBTX, USBRX); |
okini3939 | 0:49512863ec9b | 16 | DigitalIn usb_vbus(p30); |
okini3939 | 0:49512863ec9b | 17 | #else |
okini3939 | 0:49512863ec9b | 18 | DigitalIn usb_vbus(P0_3); |
okini3939 | 0:49512863ec9b | 19 | #endif |
okini3939 | 0:49512863ec9b | 20 | DigitalOut led(LED1); |
okini3939 | 0:49512863ec9b | 21 | DigitalIn button(P0_1); |
okini3939 | 0:49512863ec9b | 22 | SPI spi(P0_21, P0_22, P1_15); |
okini3939 | 0:49512863ec9b | 23 | |
okini3939 | 2:d50445fa62da | 24 | void dotStar (int *buf, int num) { |
okini3939 | 0:49512863ec9b | 25 | int i; |
okini3939 | 0:49512863ec9b | 26 | |
okini3939 | 0:49512863ec9b | 27 | // start frame |
okini3939 | 0:49512863ec9b | 28 | for (i = 0; i < 4; i ++) { |
okini3939 | 0:49512863ec9b | 29 | spi.write(0); |
okini3939 | 0:49512863ec9b | 30 | } |
okini3939 | 0:49512863ec9b | 31 | // led frame |
okini3939 | 0:49512863ec9b | 32 | for (i = 0; i < num; i ++) { |
okini3939 | 0:49512863ec9b | 33 | spi.write((7<<5) | LED_GLOBAL); |
okini3939 | 0:49512863ec9b | 34 | spi.write((buf[i] >> 16) & 0xff); // B |
okini3939 | 0:49512863ec9b | 35 | spi.write((buf[i] >> 8) & 0xff); // G |
okini3939 | 0:49512863ec9b | 36 | spi.write(buf[i] & 0xff); // R |
okini3939 | 0:49512863ec9b | 37 | } |
okini3939 | 0:49512863ec9b | 38 | // end frame |
okini3939 | 0:49512863ec9b | 39 | for (i = 0; i < 4; i ++) { |
okini3939 | 0:49512863ec9b | 40 | spi.write(1); |
okini3939 | 0:49512863ec9b | 41 | } |
okini3939 | 0:49512863ec9b | 42 | } |
okini3939 | 0:49512863ec9b | 43 | |
okini3939 | 2:d50445fa62da | 44 | void dotStar_off () { |
okini3939 | 0:49512863ec9b | 45 | int i; |
okini3939 | 0:49512863ec9b | 46 | |
okini3939 | 0:49512863ec9b | 47 | for (i = 0; i < 4; i ++) { |
okini3939 | 0:49512863ec9b | 48 | spi.write(0); |
okini3939 | 0:49512863ec9b | 49 | } |
okini3939 | 2:d50445fa62da | 50 | for (i = 0; i < LED_NUM; i ++) { |
okini3939 | 2:d50445fa62da | 51 | spi.write((7<<5) | LED_GLOBAL); |
okini3939 | 2:d50445fa62da | 52 | spi.write(0); |
okini3939 | 2:d50445fa62da | 53 | spi.write(0); |
okini3939 | 0:49512863ec9b | 54 | spi.write(0); |
okini3939 | 0:49512863ec9b | 55 | } |
okini3939 | 0:49512863ec9b | 56 | for (i = 0; i < 4; i ++) { |
okini3939 | 0:49512863ec9b | 57 | spi.write(1); |
okini3939 | 0:49512863ec9b | 58 | } |
okini3939 | 0:49512863ec9b | 59 | } |
okini3939 | 0:49512863ec9b | 60 | |
okini3939 | 0:49512863ec9b | 61 | void work () { |
okini3939 | 0:49512863ec9b | 62 | int i, a, x, y; |
okini3939 | 0:49512863ec9b | 63 | int led_buf[LED_NUM]; |
okini3939 | 0:49512863ec9b | 64 | int num = 0; |
okini3939 | 0:49512863ec9b | 65 | char *buf = getPicture(num); |
okini3939 | 0:49512863ec9b | 66 | struct BmpHeader *header = (struct BmpHeader *)buf; |
okini3939 | 0:49512863ec9b | 67 | |
okini3939 | 0:49512863ec9b | 68 | if (buf == NULL) return; |
okini3939 | 0:49512863ec9b | 69 | DBG(" %d: %08x\r\n", num, buf); |
okini3939 | 0:49512863ec9b | 70 | y = 0; |
okini3939 | 0:49512863ec9b | 71 | a = 0; |
okini3939 | 0:49512863ec9b | 72 | for (;;) { |
okini3939 | 0:49512863ec9b | 73 | for (x = 0; x < header->width; x ++) { |
okini3939 | 0:49512863ec9b | 74 | if (x < LED_NUM) { |
okini3939 | 0:49512863ec9b | 75 | led_buf[x] = (header->data[a] << 16) | (header->data[a + 1] << 8) | header->data[a + 2]; |
okini3939 | 0:49512863ec9b | 76 | } |
okini3939 | 0:49512863ec9b | 77 | a += 3; |
okini3939 | 0:49512863ec9b | 78 | } |
okini3939 | 2:d50445fa62da | 79 | for (; x < LED_NUM; x ++) { |
okini3939 | 2:d50445fa62da | 80 | led_buf[x] = 0; |
okini3939 | 2:d50445fa62da | 81 | } |
okini3939 | 2:d50445fa62da | 82 | a = ((a + 3) / 4) * 4; // padding |
okini3939 | 0:49512863ec9b | 83 | DBG("%d %d %d/%d\r\n", a, y, header->width, header->height); |
okini3939 | 2:d50445fa62da | 84 | dotStar(led_buf, LED_NUM); |
okini3939 | 0:49512863ec9b | 85 | y ++; |
okini3939 | 0:49512863ec9b | 86 | if (y >= header->height) { |
okini3939 | 0:49512863ec9b | 87 | y = 0; |
okini3939 | 0:49512863ec9b | 88 | a = 0; |
okini3939 | 0:49512863ec9b | 89 | led = 0; |
okini3939 | 0:49512863ec9b | 90 | } |
okini3939 | 0:49512863ec9b | 91 | |
okini3939 | 0:49512863ec9b | 92 | for (i = 0; i < LED_WAIT; i ++) { |
okini3939 | 0:49512863ec9b | 93 | if (button == 0) { |
okini3939 | 0:49512863ec9b | 94 | led = 1; |
okini3939 | 0:49512863ec9b | 95 | next: |
okini3939 | 0:49512863ec9b | 96 | num ++; |
okini3939 | 0:49512863ec9b | 97 | if (num >= MAX_SECTOR) { |
okini3939 | 0:49512863ec9b | 98 | num = 0; |
okini3939 | 0:49512863ec9b | 99 | } |
okini3939 | 0:49512863ec9b | 100 | buf = getPicture(num); |
okini3939 | 0:49512863ec9b | 101 | if (buf == NULL) goto next; |
okini3939 | 0:49512863ec9b | 102 | header = (struct BmpHeader *)buf; |
okini3939 | 0:49512863ec9b | 103 | DBG(" %d: %08x\r\n", num, buf); |
okini3939 | 0:49512863ec9b | 104 | while (button == 0); |
okini3939 | 0:49512863ec9b | 105 | } |
okini3939 | 0:49512863ec9b | 106 | wait_ms(1); |
okini3939 | 0:49512863ec9b | 107 | } |
okini3939 | 0:49512863ec9b | 108 | } |
okini3939 | 0:49512863ec9b | 109 | } |
okini3939 | 0:49512863ec9b | 110 | |
okini3939 | 0:49512863ec9b | 111 | void demo () { |
okini3939 | 0:49512863ec9b | 112 | int i, c; |
okini3939 | 0:49512863ec9b | 113 | int color = 7; |
okini3939 | 0:49512863ec9b | 114 | int led_buf[LED_NUM]; |
okini3939 | 0:49512863ec9b | 115 | |
okini3939 | 0:49512863ec9b | 116 | for (;;) { |
okini3939 | 0:49512863ec9b | 117 | for (i = 0; i < LED_NUM; i ++) { |
okini3939 | 0:49512863ec9b | 118 | c = ((i + color) % 7) + 1; |
okini3939 | 0:49512863ec9b | 119 | led_buf[i] = (c & 4 ? 0xff0000 : 0) | (c & 2 ? 0xff00 : 0) | (c & 1 ? 0xff : 0); |
okini3939 | 0:49512863ec9b | 120 | } |
okini3939 | 2:d50445fa62da | 121 | dotStar(led_buf, LED_NUM); |
okini3939 | 0:49512863ec9b | 122 | led = !led; |
okini3939 | 0:49512863ec9b | 123 | |
okini3939 | 0:49512863ec9b | 124 | wait_ms(500); |
okini3939 | 0:49512863ec9b | 125 | color --; |
okini3939 | 0:49512863ec9b | 126 | if (color <= 0) color = 7; |
okini3939 | 0:49512863ec9b | 127 | } |
okini3939 | 0:49512863ec9b | 128 | } |
okini3939 | 0:49512863ec9b | 129 | |
okini3939 | 0:49512863ec9b | 130 | int main() { |
okini3939 | 0:49512863ec9b | 131 | |
okini3939 | 0:49512863ec9b | 132 | LPC_SYSCON->BODCTRL = 0x12; // BOD Reset 2.4V |
okini3939 | 0:49512863ec9b | 133 | |
okini3939 | 0:49512863ec9b | 134 | button.mode(PullUp); |
okini3939 | 0:49512863ec9b | 135 | usb_vbus.mode(PullDown); |
okini3939 | 0:49512863ec9b | 136 | #if defined(TARGET_LPC11U24) |
okini3939 | 0:49512863ec9b | 137 | pc.baud(115200); |
okini3939 | 0:49512863ec9b | 138 | #endif |
okini3939 | 0:49512863ec9b | 139 | DBG("*** MSD\r\n"); |
okini3939 | 0:49512863ec9b | 140 | |
okini3939 | 0:49512863ec9b | 141 | wait_ms(10); |
okini3939 | 0:49512863ec9b | 142 | spi.frequency(LED_FREQ); |
okini3939 | 2:d50445fa62da | 143 | dotStar_off(); |
okini3939 | 0:49512863ec9b | 144 | |
okini3939 | 0:49512863ec9b | 145 | if (usb_vbus) { |
okini3939 | 0:49512863ec9b | 146 | DBG("usb\r\n"); |
okini3939 | 0:49512863ec9b | 147 | workMsd(); |
okini3939 | 0:49512863ec9b | 148 | } |
okini3939 | 0:49512863ec9b | 149 | |
okini3939 | 0:49512863ec9b | 150 | DBG("work\r\n"); |
okini3939 | 0:49512863ec9b | 151 | work(); |
okini3939 | 0:49512863ec9b | 152 | |
okini3939 | 0:49512863ec9b | 153 | // demo |
okini3939 | 0:49512863ec9b | 154 | DBG("demo\r\n"); |
okini3939 | 0:49512863ec9b | 155 | demo(); |
okini3939 | 0:49512863ec9b | 156 | } |
okini3939 | 0:49512863ec9b | 157 | |
okini3939 | 0:49512863ec9b | 158 | extern "C" void HardFault_Handler() { |
okini3939 | 0:49512863ec9b | 159 | for (;;) { |
okini3939 | 0:49512863ec9b | 160 | led = !led; |
okini3939 | 0:49512863ec9b | 161 | for (volatile int w = 0; w < 1000000; w ++); |
okini3939 | 0:49512863ec9b | 162 | } |
okini3939 | 0:49512863ec9b | 163 | } |