Platform controller for the Mobile Arcade project

Dependencies:   APA102 Motor

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);