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 /*
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 }