Listens for instructions over serial and controls some NeoPixels.

Dependencies:   NeoStrip SerialDriver mbed-rtos mbed

Committer:
rossng
Date:
Sun Jan 31 04:31:33 2016 +0000
Revision:
5:522612e4b18d
Parent:
4:cea8cd2c44e4
Child:
6:795411948a6f
mode-switchable LEDs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rossng 0:0513e7187b87 1 #include "mbed.h"
rossng 0:0513e7187b87 2 #include "SerialDriver.h"
rossng 2:868c8a43e4b7 3 #include "NeoStrip.h"
rossng 2:868c8a43e4b7 4 #include "gt.h"
rossng 0:0513e7187b87 5
rossng 4:cea8cd2c44e4 6 #define NUM_INDIVIDUALS 7
rossng 4:cea8cd2c44e4 7 #define NUM_RING 16
rossng 4:cea8cd2c44e4 8 #define NUM_GRID 40
rossng 4:cea8cd2c44e4 9 #define NUM_ROWS 5
rossng 4:cea8cd2c44e4 10 #define NUM_COLUMNS 8
rossng 2:868c8a43e4b7 11
rossng 1:6feb61c0e4a1 12 SerialDriver rpi(p9, p10);
rossng 1:6feb61c0e4a1 13 SerialDriver pc(USBTX, USBRX);
rossng 5:522612e4b18d 14 DigitalOut led1(LED1);
rossng 5:522612e4b18d 15 DigitalOut led2(LED2);
rossng 5:522612e4b18d 16 DigitalOut led3(LED3);
rossng 5:522612e4b18d 17 DigitalOut led4(LED4);
rossng 4:cea8cd2c44e4 18 NeoStrip strip(p18, NUM_INDIVIDUALS + NUM_RING + NUM_GRID);
rossng 4:cea8cd2c44e4 19 Ticker t;
rossng 4:cea8cd2c44e4 20
rossng 5:522612e4b18d 21 enum Mode { spin, flat };
rossng 5:522612e4b18d 22 Mode mode = spin;
rossng 5:522612e4b18d 23
rossng 4:cea8cd2c44e4 24 int ring_position = 0;
rossng 4:cea8cd2c44e4 25 int grid_col = 0;
rossng 0:0513e7187b87 26
rossng 5:522612e4b18d 27 void set_leds(int to);
rossng 4:cea8cd2c44e4 28 void set_pattern(NeoStrip strip, uint8_t r, uint8_t g, uint8_t b);
rossng 5:522612e4b18d 29 void spin_update();
rossng 5:522612e4b18d 30 void flat_update();
rossng 5:522612e4b18d 31 void set_mode(Mode m);
rossng 0:0513e7187b87 32
rossng 2:868c8a43e4b7 33 int main() {
rossng 5:522612e4b18d 34 pc.baud(115200);
rossng 5:522612e4b18d 35 rpi.baud(115200);
rossng 4:cea8cd2c44e4 36 pc.printf("MBED: startup\r\n");
rossng 4:cea8cd2c44e4 37
rossng 5:522612e4b18d 38 //set_pattern(strip, 255, 255, 255);
rossng 5:522612e4b18d 39
rossng 5:522612e4b18d 40 set_mode(spin);
rossng 2:868c8a43e4b7 41
rossng 5:522612e4b18d 42 //char* line_buffer = (char*) malloc(100*sizeof(char));
rossng 0:0513e7187b87 43
rossng 5:522612e4b18d 44 while (1) {
rossng 5:522612e4b18d 45 char c = rpi.getc();
rossng 5:522612e4b18d 46
rossng 5:522612e4b18d 47 while (c != '\x02') {
rossng 5:522612e4b18d 48 c = rpi.getc();
rossng 5:522612e4b18d 49 }
rossng 5:522612e4b18d 50
rossng 5:522612e4b18d 51 c = rpi.getc(); // get actual mode message
rossng 5:522612e4b18d 52
rossng 5:522612e4b18d 53 rpi.putc('\x06');
rossng 5:522612e4b18d 54 pc.printf("MBED: sent ack after receiving %c\r\n", c);
rossng 5:522612e4b18d 55
rossng 5:522612e4b18d 56
rossng 5:522612e4b18d 57 switch (c) {
rossng 5:522612e4b18d 58 case 'a':
rossng 5:522612e4b18d 59 pc.printf("MBED: switching to spin mode\r\n");
rossng 5:522612e4b18d 60 set_mode(spin);
rossng 5:522612e4b18d 61 break;
rossng 5:522612e4b18d 62 case 'b':
rossng 5:522612e4b18d 63 pc.printf("MBED: switching to flat mode\r\n");
rossng 5:522612e4b18d 64 set_mode(flat);
rossng 5:522612e4b18d 65 break;
rossng 5:522612e4b18d 66 }
rossng 0:0513e7187b87 67 }
rossng 0:0513e7187b87 68 }
rossng 0:0513e7187b87 69
rossng 5:522612e4b18d 70 void set_mode(Mode m) {
rossng 5:522612e4b18d 71 mode = m;
rossng 5:522612e4b18d 72
rossng 5:522612e4b18d 73 switch (mode) {
rossng 5:522612e4b18d 74 case spin:
rossng 5:522612e4b18d 75 t.detach();
rossng 5:522612e4b18d 76 t.attach(&spin_update, 0.05);
rossng 5:522612e4b18d 77 break;
rossng 5:522612e4b18d 78 case flat:
rossng 5:522612e4b18d 79 t.detach();
rossng 5:522612e4b18d 80 t.attach(&flat_update, 0.05);
rossng 5:522612e4b18d 81 break;
rossng 5:522612e4b18d 82 }
rossng 5:522612e4b18d 83 }
rossng 0:0513e7187b87 84
rossng 5:522612e4b18d 85 void set_leds(int to) {
rossng 5:522612e4b18d 86 led1 = led2 = led3 = led4 = to;
rossng 2:868c8a43e4b7 87 }
rossng 2:868c8a43e4b7 88
rossng 4:cea8cd2c44e4 89 void set_pattern(NeoStrip strip, uint8_t r, uint8_t g, uint8_t b) {
rossng 4:cea8cd2c44e4 90 strip.setBrightness(0.05);
rossng 4:cea8cd2c44e4 91 //strip.setPixels(0, N, gt_img);
rossng 4:cea8cd2c44e4 92 for (int p = 0; p < 64; p++) {
rossng 4:cea8cd2c44e4 93 strip.setPixel(p, r, g, b);
rossng 4:cea8cd2c44e4 94 }
rossng 2:868c8a43e4b7 95 strip.write();
rossng 4:cea8cd2c44e4 96 }
rossng 4:cea8cd2c44e4 97
rossng 5:522612e4b18d 98 void spin_update() {
rossng 4:cea8cd2c44e4 99 strip.setBrightness(0.05);
rossng 4:cea8cd2c44e4 100 // update ring
rossng 4:cea8cd2c44e4 101 strip.setPixel(NUM_INDIVIDUALS + ring_position, 255, 255, 255);
rossng 4:cea8cd2c44e4 102 ring_position = (ring_position + 1) % NUM_RING;
rossng 4:cea8cd2c44e4 103 strip.setPixel(NUM_INDIVIDUALS + ring_position, 255, 0, 0);
rossng 4:cea8cd2c44e4 104
rossng 4:cea8cd2c44e4 105 // update grid
rossng 4:cea8cd2c44e4 106 for (int i = grid_col; i < NUM_GRID; i += NUM_COLUMNS) {
rossng 4:cea8cd2c44e4 107 strip.setPixel(NUM_INDIVIDUALS + NUM_RING + i, 255, 255, 255);
rossng 4:cea8cd2c44e4 108 }
rossng 4:cea8cd2c44e4 109 grid_col = (grid_col + 1) % NUM_COLUMNS;
rossng 4:cea8cd2c44e4 110
rossng 4:cea8cd2c44e4 111 for (int i = grid_col; i < NUM_GRID; i += NUM_COLUMNS) {
rossng 4:cea8cd2c44e4 112 strip.setPixel(NUM_INDIVIDUALS + NUM_RING + i, 255, 0, 0);
rossng 4:cea8cd2c44e4 113 }
rossng 4:cea8cd2c44e4 114
rossng 4:cea8cd2c44e4 115 strip.write();
rossng 5:522612e4b18d 116 }
rossng 5:522612e4b18d 117
rossng 5:522612e4b18d 118 void flat_update() {
rossng 5:522612e4b18d 119 strip.setBrightness(0.05);
rossng 5:522612e4b18d 120
rossng 5:522612e4b18d 121 for (int i = 0; i < NUM_INDIVIDUALS + NUM_RING + NUM_GRID; i++) {
rossng 5:522612e4b18d 122 strip.setPixel(i, 255, 0, 0);
rossng 5:522612e4b18d 123 }
rossng 5:522612e4b18d 124
rossng 5:522612e4b18d 125 strip.write();
rossng 0:0513e7187b87 126 }