Listens for instructions over serial and controls some NeoPixels.

Dependencies:   NeoStrip SerialDriver mbed-rtos mbed

Committer:
rossng
Date:
Sun Jan 31 05:32:51 2016 +0000
Revision:
6:795411948a6f
Parent:
5:522612e4b18d
Initial public version

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 6:795411948a6f 40 set_mode(flat);
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 6:795411948a6f 53 wait(0.1);
rossng 6:795411948a6f 54 rpi.putc('\x3A');
rossng 5:522612e4b18d 55 pc.printf("MBED: sent ack after receiving %c\r\n", c);
rossng 5:522612e4b18d 56
rossng 5:522612e4b18d 57
rossng 5:522612e4b18d 58 switch (c) {
rossng 5:522612e4b18d 59 case 'a':
rossng 5:522612e4b18d 60 pc.printf("MBED: switching to spin mode\r\n");
rossng 5:522612e4b18d 61 set_mode(spin);
rossng 5:522612e4b18d 62 break;
rossng 5:522612e4b18d 63 case 'b':
rossng 5:522612e4b18d 64 pc.printf("MBED: switching to flat mode\r\n");
rossng 5:522612e4b18d 65 set_mode(flat);
rossng 5:522612e4b18d 66 break;
rossng 5:522612e4b18d 67 }
rossng 0:0513e7187b87 68 }
rossng 0:0513e7187b87 69 }
rossng 0:0513e7187b87 70
rossng 5:522612e4b18d 71 void set_mode(Mode m) {
rossng 5:522612e4b18d 72 mode = m;
rossng 5:522612e4b18d 73
rossng 5:522612e4b18d 74 switch (mode) {
rossng 5:522612e4b18d 75 case spin:
rossng 5:522612e4b18d 76 t.detach();
rossng 5:522612e4b18d 77 t.attach(&spin_update, 0.05);
rossng 5:522612e4b18d 78 break;
rossng 5:522612e4b18d 79 case flat:
rossng 5:522612e4b18d 80 t.detach();
rossng 5:522612e4b18d 81 t.attach(&flat_update, 0.05);
rossng 5:522612e4b18d 82 break;
rossng 5:522612e4b18d 83 }
rossng 5:522612e4b18d 84 }
rossng 0:0513e7187b87 85
rossng 5:522612e4b18d 86 void set_leds(int to) {
rossng 5:522612e4b18d 87 led1 = led2 = led3 = led4 = to;
rossng 2:868c8a43e4b7 88 }
rossng 2:868c8a43e4b7 89
rossng 4:cea8cd2c44e4 90 void set_pattern(NeoStrip strip, uint8_t r, uint8_t g, uint8_t b) {
rossng 4:cea8cd2c44e4 91 strip.setBrightness(0.05);
rossng 4:cea8cd2c44e4 92 //strip.setPixels(0, N, gt_img);
rossng 4:cea8cd2c44e4 93 for (int p = 0; p < 64; p++) {
rossng 4:cea8cd2c44e4 94 strip.setPixel(p, r, g, b);
rossng 4:cea8cd2c44e4 95 }
rossng 2:868c8a43e4b7 96 strip.write();
rossng 4:cea8cd2c44e4 97 }
rossng 4:cea8cd2c44e4 98
rossng 5:522612e4b18d 99 void spin_update() {
rossng 4:cea8cd2c44e4 100 strip.setBrightness(0.05);
rossng 4:cea8cd2c44e4 101 // update ring
rossng 4:cea8cd2c44e4 102 strip.setPixel(NUM_INDIVIDUALS + ring_position, 255, 255, 255);
rossng 4:cea8cd2c44e4 103 ring_position = (ring_position + 1) % NUM_RING;
rossng 4:cea8cd2c44e4 104 strip.setPixel(NUM_INDIVIDUALS + ring_position, 255, 0, 0);
rossng 4:cea8cd2c44e4 105
rossng 4:cea8cd2c44e4 106 // update grid
rossng 4:cea8cd2c44e4 107 for (int i = grid_col; i < NUM_GRID; i += NUM_COLUMNS) {
rossng 4:cea8cd2c44e4 108 strip.setPixel(NUM_INDIVIDUALS + NUM_RING + i, 255, 255, 255);
rossng 4:cea8cd2c44e4 109 }
rossng 4:cea8cd2c44e4 110 grid_col = (grid_col + 1) % NUM_COLUMNS;
rossng 4:cea8cd2c44e4 111
rossng 4:cea8cd2c44e4 112 for (int i = grid_col; i < NUM_GRID; i += NUM_COLUMNS) {
rossng 4:cea8cd2c44e4 113 strip.setPixel(NUM_INDIVIDUALS + NUM_RING + i, 255, 0, 0);
rossng 4:cea8cd2c44e4 114 }
rossng 4:cea8cd2c44e4 115
rossng 4:cea8cd2c44e4 116 strip.write();
rossng 5:522612e4b18d 117 }
rossng 5:522612e4b18d 118
rossng 5:522612e4b18d 119 void flat_update() {
rossng 5:522612e4b18d 120 strip.setBrightness(0.05);
rossng 5:522612e4b18d 121
rossng 5:522612e4b18d 122 for (int i = 0; i < NUM_INDIVIDUALS + NUM_RING + NUM_GRID; i++) {
rossng 5:522612e4b18d 123 strip.setPixel(i, 255, 0, 0);
rossng 5:522612e4b18d 124 }
rossng 5:522612e4b18d 125
rossng 5:522612e4b18d 126 strip.write();
rossng 0:0513e7187b87 127 }