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

Dependencies:   IAP RAM_DISK USBDevice mbed

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?

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 0:49512863ec9b 24 void dotsStar (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 0:49512863ec9b 44 void dotsStar_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 0:49512863ec9b 50 for (i = 0; i < LED_NUM * 4; i ++) {
okini3939 0:49512863ec9b 51 spi.write(0);
okini3939 0:49512863ec9b 52 }
okini3939 0:49512863ec9b 53 for (i = 0; i < 4; i ++) {
okini3939 0:49512863ec9b 54 spi.write(1);
okini3939 0:49512863ec9b 55 }
okini3939 0:49512863ec9b 56 }
okini3939 0:49512863ec9b 57
okini3939 0:49512863ec9b 58 void work () {
okini3939 0:49512863ec9b 59 int i, a, x, y;
okini3939 0:49512863ec9b 60 int led_buf[LED_NUM];
okini3939 0:49512863ec9b 61 int num = 0;
okini3939 0:49512863ec9b 62 char *buf = getPicture(num);
okini3939 0:49512863ec9b 63 struct BmpHeader *header = (struct BmpHeader *)buf;
okini3939 0:49512863ec9b 64
okini3939 0:49512863ec9b 65 if (buf == NULL) return;
okini3939 0:49512863ec9b 66 DBG(" %d: %08x\r\n", num, buf);
okini3939 0:49512863ec9b 67 y = 0;
okini3939 0:49512863ec9b 68 a = 0;
okini3939 0:49512863ec9b 69 for (;;) {
okini3939 0:49512863ec9b 70 for (x = 0; x < header->width; x ++) {
okini3939 0:49512863ec9b 71 if (x < LED_NUM) {
okini3939 0:49512863ec9b 72 led_buf[x] = (header->data[a] << 16) | (header->data[a + 1] << 8) | header->data[a + 2];
okini3939 0:49512863ec9b 73 }
okini3939 0:49512863ec9b 74 a += 3;
okini3939 0:49512863ec9b 75 }
okini3939 0:49512863ec9b 76 DBG("%d %d %d/%d\r\n", a, y, header->width, header->height);
okini3939 0:49512863ec9b 77 dotsStar(led_buf, header->width < LED_NUM ? header->width : LED_NUM);
okini3939 0:49512863ec9b 78 y ++;
okini3939 0:49512863ec9b 79 if (y >= header->height) {
okini3939 0:49512863ec9b 80 y = 0;
okini3939 0:49512863ec9b 81 a = 0;
okini3939 0:49512863ec9b 82 led = 0;
okini3939 0:49512863ec9b 83 }
okini3939 0:49512863ec9b 84
okini3939 0:49512863ec9b 85 for (i = 0; i < LED_WAIT; i ++) {
okini3939 0:49512863ec9b 86 if (button == 0) {
okini3939 0:49512863ec9b 87 led = 1;
okini3939 0:49512863ec9b 88 next:
okini3939 0:49512863ec9b 89 num ++;
okini3939 0:49512863ec9b 90 if (num >= MAX_SECTOR) {
okini3939 0:49512863ec9b 91 num = 0;
okini3939 0:49512863ec9b 92 }
okini3939 0:49512863ec9b 93 buf = getPicture(num);
okini3939 0:49512863ec9b 94 if (buf == NULL) goto next;
okini3939 0:49512863ec9b 95 header = (struct BmpHeader *)buf;
okini3939 0:49512863ec9b 96 DBG(" %d: %08x\r\n", num, buf);
okini3939 0:49512863ec9b 97 while (button == 0);
okini3939 0:49512863ec9b 98 }
okini3939 0:49512863ec9b 99 wait_ms(1);
okini3939 0:49512863ec9b 100 }
okini3939 0:49512863ec9b 101 }
okini3939 0:49512863ec9b 102 }
okini3939 0:49512863ec9b 103
okini3939 0:49512863ec9b 104 void demo () {
okini3939 0:49512863ec9b 105 int i, c;
okini3939 0:49512863ec9b 106 int color = 7;
okini3939 0:49512863ec9b 107 int led_buf[LED_NUM];
okini3939 0:49512863ec9b 108
okini3939 0:49512863ec9b 109 for (;;) {
okini3939 0:49512863ec9b 110 for (i = 0; i < LED_NUM; i ++) {
okini3939 0:49512863ec9b 111 c = ((i + color) % 7) + 1;
okini3939 0:49512863ec9b 112 led_buf[i] = (c & 4 ? 0xff0000 : 0) | (c & 2 ? 0xff00 : 0) | (c & 1 ? 0xff : 0);
okini3939 0:49512863ec9b 113 }
okini3939 0:49512863ec9b 114 dotsStar(led_buf, LED_NUM);
okini3939 0:49512863ec9b 115 led = !led;
okini3939 0:49512863ec9b 116
okini3939 0:49512863ec9b 117 wait_ms(500);
okini3939 0:49512863ec9b 118 color --;
okini3939 0:49512863ec9b 119 if (color <= 0) color = 7;
okini3939 0:49512863ec9b 120 }
okini3939 0:49512863ec9b 121 }
okini3939 0:49512863ec9b 122
okini3939 0:49512863ec9b 123 int main() {
okini3939 0:49512863ec9b 124
okini3939 0:49512863ec9b 125 LPC_SYSCON->BODCTRL = 0x12; // BOD Reset 2.4V
okini3939 0:49512863ec9b 126
okini3939 0:49512863ec9b 127 button.mode(PullUp);
okini3939 0:49512863ec9b 128 usb_vbus.mode(PullDown);
okini3939 0:49512863ec9b 129 #if defined(TARGET_LPC11U24)
okini3939 0:49512863ec9b 130 pc.baud(115200);
okini3939 0:49512863ec9b 131 #endif
okini3939 0:49512863ec9b 132 DBG("*** MSD\r\n");
okini3939 0:49512863ec9b 133
okini3939 0:49512863ec9b 134 wait_ms(10);
okini3939 0:49512863ec9b 135 spi.frequency(LED_FREQ);
okini3939 0:49512863ec9b 136 dotsStar_off();
okini3939 0:49512863ec9b 137
okini3939 0:49512863ec9b 138 if (usb_vbus) {
okini3939 0:49512863ec9b 139 DBG("usb\r\n");
okini3939 0:49512863ec9b 140 workMsd();
okini3939 0:49512863ec9b 141 }
okini3939 0:49512863ec9b 142
okini3939 0:49512863ec9b 143 DBG("work\r\n");
okini3939 0:49512863ec9b 144 work();
okini3939 0:49512863ec9b 145
okini3939 0:49512863ec9b 146 // demo
okini3939 0:49512863ec9b 147 DBG("demo\r\n");
okini3939 0:49512863ec9b 148 demo();
okini3939 0:49512863ec9b 149 }
okini3939 0:49512863ec9b 150
okini3939 0:49512863ec9b 151 extern "C" void HardFault_Handler() {
okini3939 0:49512863ec9b 152 for (;;) {
okini3939 0:49512863ec9b 153 led = !led;
okini3939 0:49512863ec9b 154 for (volatile int w = 0; w < 1000000; w ++);
okini3939 0:49512863ec9b 155 }
okini3939 0:49512863ec9b 156 }