Kevin Abraham
/
MobileArcade
Platform controller for the Mobile Arcade project
Diff: main.cpp
- Revision:
- 2:774edcf60939
- Parent:
- 1:113469a23547
- Child:
- 3:7e5233f883c7
--- a/main.cpp Tue Dec 11 06:34:25 2018 +0000 +++ b/main.cpp Tue Dec 11 14:44:55 2018 +0000 @@ -23,6 +23,9 @@ #define GAME_START 51 #define NUM_GAME 19 +#define COLOR_GAME_MENU CRGB(1, 1, 1) +#define COLOR_GAME_GAME CRGB(0, 1, 2) + #define COLOR_HEADLIGHT_DIM CRGB(8, 8, 8) #define COLOR_HEADLIGHT_ON CRGB(32, 32, 32) #define COLOR_FOGLIGHT CRGB(64, 64, 0) @@ -32,7 +35,6 @@ #define COLOR_REVERSE CRGB(64, 64, 64) #define COLOR_UNDERGLOW CRGB(0, 16, 0) -#define COLOR_GAME CRGB(0, 2, 3) #define COLOR_BLINKER CRGB(128, 32, 0) #define BLINK_DELAY 0.5 @@ -44,12 +46,17 @@ #define UNDERGLOW 16 #define HEADLIGHT 32 #define BRAKELIGHT 64 -uint8_t lights = FOGLIGHT | UNDERGLOW | BRAKELIGHT; +uint8_t lights = 0; CRGB l_leds[NUM_LEDS]; CRGB r_leds[NUM_LEDS]; -CRGB gameColor = COLOR_GAME; +int numGame = 0; + +CRGB gameColor = COLOR_GAME_MENU; +int gamePwmNum = 1; +int gamePwmDen = 4; +int gamePwmMax = 8; SPI l_strip(p5, p6, p7); SPI r_strip(p11, p12, p13); @@ -63,9 +70,46 @@ Serial bt(p28, p27); // Bluefruit RX, TX Serial pc(USBTX, USBRX); +Thread pcThread; Thread btThread; Thread blinkerThread; +void pc_thread() { + for(;;) { + while (!pc.readable()) wait(0.1); + switch (pc.getc()) { + case 's': + // Switch to game + while(pc.getc() != '\n'); // Flush rest of command + while (gamePwmNum != 1) wait(0.01); // Wait for dim before switch + gameColor = COLOR_GAME_GAME; + break; + case 'e': + // Switch to menu + while(pc.getc() != '\n'); // Flush rest of command + while (gamePwmNum != 1) wait(0.01); // Wait for dim before switch + gameColor = COLOR_GAME_MENU; + break; + case 'b': + // Starting up + while (numGame < NUM_GAME) { + numGame++; + wait(0.05); + } + lights = FOGLIGHT | UNDERGLOW | BRAKELIGHT; + break; + case 'h': + // Shutting down + lights = 0; + while (numGame > 0) { + numGame--; + wait(0.05); + } + break; + } + } +} + void bt_thread() { char bnum = 0; char bhit = 0; @@ -128,7 +172,7 @@ while (!(lights & (BLINKER_L | BLINKER_R))) { wait(0.1); } - + if (lights & BLINKER_L) { fill_solid(&(l_leds[HEAD_BLINKER_START]), NUM_HEAD_BLINKER, COLOR_BLINKER); fill_solid(&(l_leds[TAIL_BLINKER_START]), NUM_TAIL_BLINKER, COLOR_BLINKER); @@ -138,7 +182,7 @@ fill_solid(&(r_leds[TAIL_BLINKER_START]), NUM_TAIL_BLINKER, COLOR_BLINKER); } wait(BLINK_DELAY); - + if (l_leds[HEAD_BLINKER_START] == COLOR_BLINKER) { fill_solid(&(l_leds[HEAD_BLINKER_START]), NUM_HEAD_BLINKER, CRGB::Black); fill_solid(&(l_leds[TAIL_BLINKER_START]), NUM_TAIL_BLINKER, CRGB::Black); @@ -154,7 +198,7 @@ // main() runs in its own thread in the OS int main() { - // Jack up the frequency + // Jack up the SPI frequency l_strip.frequency(4000000); r_strip.frequency(4000000); @@ -165,16 +209,13 @@ APA102_write(r_strip, r_leds, NUM_LEDS); // Start threads + pcThread.start(pc_thread); btThread.start(bt_thread); blinkerThread.start(blinker_thread); int ctr = 0; bool up = true; - int gamePwmNum = 1; - int gamePwmDen = 4; - int gamePwmMax = 8; - for(;;) { if (ctr % (gamePwmDen * 7) == 0) { gamePwmNum += up ? 1 : -1; @@ -186,33 +227,46 @@ } } - fill_solid(&(l_leds[HEAD_LIGHT_START]), NUM_HEAD_LIGHT, lights & HEADLIGHT ? COLOR_HEADLIGHT_ON : COLOR_HEADLIGHT_DIM); - fill_solid(&(r_leds[HEAD_LIGHT_START]), NUM_HEAD_LIGHT, lights & HEADLIGHT ? COLOR_HEADLIGHT_ON : COLOR_HEADLIGHT_DIM); + if (lights) { - if (!(lights & BLINKER_L)) { - fill_solid(&(l_leds[HEAD_BLINKER_START]), NUM_HEAD_BLINKER, lights & HEADLIGHT ? COLOR_HEADLIGHT_ON : COLOR_HEADLIGHT_DIM); - fill_solid(&(l_leds[TAIL_BLINKER_START]), NUM_TAIL_BLINKER, lights & BRAKELIGHT ? COLOR_BRAKELIGHT : COLOR_TAILLIGHT); - } - - if (!(lights & BLINKER_R)) { - fill_solid(&(r_leds[HEAD_BLINKER_START]), NUM_HEAD_BLINKER, lights & HEADLIGHT ? COLOR_HEADLIGHT_ON : COLOR_HEADLIGHT_DIM); - fill_solid(&(r_leds[TAIL_BLINKER_START]), NUM_TAIL_BLINKER, lights & BRAKELIGHT ? COLOR_BRAKELIGHT : COLOR_TAILLIGHT); + fill_solid(&(l_leds[HEAD_LIGHT_START]), NUM_HEAD_LIGHT, lights & HEADLIGHT ? COLOR_HEADLIGHT_ON : COLOR_HEADLIGHT_DIM); + fill_solid(&(r_leds[HEAD_LIGHT_START]), NUM_HEAD_LIGHT, lights & HEADLIGHT ? COLOR_HEADLIGHT_ON : COLOR_HEADLIGHT_DIM); + + if (!(lights & BLINKER_L)) { + fill_solid(&(l_leds[HEAD_BLINKER_START]), NUM_HEAD_BLINKER, lights & HEADLIGHT ? COLOR_HEADLIGHT_ON : COLOR_HEADLIGHT_DIM); + fill_solid(&(l_leds[TAIL_BLINKER_START]), NUM_TAIL_BLINKER, lights & BRAKELIGHT ? COLOR_BRAKELIGHT : COLOR_TAILLIGHT); + } + + if (!(lights & BLINKER_R)) { + fill_solid(&(r_leds[HEAD_BLINKER_START]), NUM_HEAD_BLINKER, lights & HEADLIGHT ? COLOR_HEADLIGHT_ON : COLOR_HEADLIGHT_DIM); + fill_solid(&(r_leds[TAIL_BLINKER_START]), NUM_TAIL_BLINKER, lights & BRAKELIGHT ? COLOR_BRAKELIGHT : COLOR_TAILLIGHT); + } + + fill_solid(&(l_leds[HEAD_FOG_START]), NUM_HEAD_FOG, lights & FOGLIGHT ? COLOR_FOGLIGHT : CRGB::Black); + fill_solid(&(r_leds[HEAD_FOG_START]), NUM_HEAD_FOG, lights & FOGLIGHT ? COLOR_FOGLIGHT : CRGB::Black); + + fill_solid(&(l_leds[GLOW_START]), NUM_GLOW, lights & UNDERGLOW ? COLOR_UNDERGLOW : CRGB::Black); + fill_solid(&(r_leds[GLOW_START]), NUM_GLOW, lights & UNDERGLOW ? COLOR_UNDERGLOW : CRGB::Black); + + fill_solid(&(l_leds[TAIL_REVERSE_START]), NUM_TAIL_REVERSE, lights & REVERSE ? COLOR_REVERSE : + lights & BRAKELIGHT ? COLOR_BRAKELIGHT : COLOR_TAILLIGHT); + fill_solid(&(r_leds[TAIL_REVERSE_START]), NUM_TAIL_REVERSE, lights & REVERSE ? COLOR_REVERSE : + lights & BRAKELIGHT ? COLOR_BRAKELIGHT : COLOR_TAILLIGHT); + + } else { + + fill_solid(&(l_leds[0]), NUM_LEDS, CRGB::Black); + fill_solid(&(r_leds[0]), NUM_LEDS, CRGB::Black); + } - - fill_solid(&(l_leds[HEAD_FOG_START]), NUM_HEAD_FOG, lights & FOGLIGHT ? COLOR_FOGLIGHT : CRGB::Black); - fill_solid(&(r_leds[HEAD_FOG_START]), NUM_HEAD_FOG, lights & FOGLIGHT ? COLOR_FOGLIGHT : CRGB::Black); - - fill_solid(&(l_leds[GLOW_START]), NUM_GLOW, lights & UNDERGLOW ? COLOR_UNDERGLOW : CRGB::Black); - fill_solid(&(r_leds[GLOW_START]), NUM_GLOW, lights & UNDERGLOW ? COLOR_UNDERGLOW : CRGB::Black); - - fill_solid(&(l_leds[TAIL_REVERSE_START]), NUM_TAIL_REVERSE, lights & REVERSE ? COLOR_REVERSE : - lights & BRAKELIGHT ? COLOR_BRAKELIGHT : COLOR_TAILLIGHT); - fill_solid(&(r_leds[TAIL_REVERSE_START]), NUM_TAIL_REVERSE, lights & REVERSE ? COLOR_REVERSE : - lights & BRAKELIGHT ? COLOR_BRAKELIGHT : COLOR_TAILLIGHT); double scaleFactor = ceil((double) gamePwmNum / gamePwmDen); - fill_solid(&(l_leds[GAME_START]), NUM_GAME, (ctr % gamePwmDen) < (gamePwmNum / scaleFactor) ? gameColor * scaleFactor : CRGB::Black); - fill_solid(&(r_leds[GAME_START]), NUM_GAME, (ctr % gamePwmDen) < (gamePwmNum / scaleFactor) ? gameColor * scaleFactor : CRGB::Black); + if (numGame != NUM_GAME) { + fill_solid(&(l_leds[GAME_START]), NUM_GAME, CRGB::Black); + fill_solid(&(r_leds[GAME_START]), NUM_GAME, CRGB::Black); + } + fill_solid(&(l_leds[GAME_START]), numGame, (ctr % gamePwmDen) < (gamePwmNum / scaleFactor) ? gameColor * scaleFactor : CRGB::Black); + fill_solid(&(r_leds[GAME_START]), numGame, (ctr % gamePwmDen) < (gamePwmNum / scaleFactor) ? gameColor * scaleFactor : CRGB::Black); ctr++; APA102_write(l_strip, l_leds, NUM_LEDS);