David Knight / Mbed 2 deprecated lichtspiel

Dependencies:   PololuLedStrip mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers lichtspiel.cpp Source File

lichtspiel.cpp

00001 #include "mbed.h"
00002 #include "EffectPlugs.h"
00003 #include "Effects.h"
00004 #include "InteractionTimeout.h"
00005 #include "LEDs.h"
00006 #include "Rotary.h"
00007 #include "Pulser.h"
00008 #include "board.h"
00009 
00010 //#define DEV
00011 
00012 #ifdef DEV
00013 static const uint16_t INTERACTION_TIMEOUT_SECONDS = 60;
00014 #define DEBUG(...); pc.printf(__VA_ARGS__);
00015 #else
00016 static const uint16_t INTERACTION_TIMEOUT_SECONDS = 180;
00017 #define DEBUG(...);
00018 #endif
00019 
00020 
00021 bool standBy = false;
00022 uint8_t lastButtonState[NUM_BUTTONS] = {1,1,1,1,1};
00023 bool buttonIsUpdatingLED[NUM_BUTTONS] = {false,false,false,false,false};
00024 
00025 // Generated with Ruby: (0..255).map{|i| (64 + (256 - 64) / 256.0 * i).round }.join(',')
00026 uint8_t mapS[256] = {
00027   64,65,66,66,67,68,69,69,70,71,72,72,73,74,75,75,
00028   76,77,78,78,79,80,81,81,82,83,84,84,85,86,87,87,
00029   88,89,90,90,91,92,93,93,94,95,96,96,97,98,99,99,
00030   100,101,102,102,103,104,105,105,106,107,108,108,
00031   109,110,111,111,112,113,114,114,115,116,117,117,
00032   118,119,120,120,121,122,123,123,124,125,126,126,
00033   127,128,129,129,130,131,132,132,133,134,135,135,
00034   136,137,138,138,139,140,141,141,142,143,144,144,
00035   145,146,147,147,148,149,150,150,151,152,153,153,
00036   154,155,156,156,157,158,159,159,160,161,162,162,
00037   163,164,165,165,166,167,168,168,169,170,171,171,
00038   172,173,174,174,175,176,177,177,178,179,180,180,
00039   181,182,183,183,184,185,186,186,187,188,189,189,
00040   190,191,192,192,193,194,195,195,196,197,198,198,
00041   199,200,201,201,202,203,204,204,205,206,207,207,
00042   208,209,210,210,211,212,213,213,214,215,216,216,
00043   217,218,219,219,220,221,222,222,223,224,225,225,
00044   226,227,228,228,229,230,231,231,232,233,234,234,
00045   235,236,237,237,238,239,240,240,241,242,243,243,
00046   244,245,246,246,247,248,249,249,250,251,252,252,253,254,255,255
00047 };
00048 
00049 // Generated with Ruby: (0..255).map{|i| (i / 2.0 + 48).round }.join(',')
00050 uint8_t mapV[256] = {
00051   32,33,33,34,34,35,36,36,37,37,38,39,39,40,40,41,
00052   42,42,43,43,44,45,45,46,46,47,48,48,49,50,50,51,
00053   51,52,53,53,54,54,55,56,56,57,57,58,59,59,60,60,
00054   61,62,62,63,63,64,65,65,66,66,67,68,68,69,69,70,
00055   71,71,72,72,73,74,74,75,75,76,77,77,78,78,79,80,
00056   80,81,82,82,83,83,84,85,85,86,86,87,88,88,89,89,
00057   90,91,91,92,92,93,94,94,95,95,96,97,97,98,98,99,
00058   100,100,101,101,102,103,103,104,104,105,106,106,
00059   107,107,108,109,109,110,110,111,112,112,113,114,
00060   114,115,115,116,117,117,118,118,119,120,120,121,
00061   121,122,123,123,124,124,125,126,126,127,127,128,
00062   129,129,130,130,131,132,132,133,133,134,135,135,
00063   136,136,137,138,138,139,139,140,141,141,142,142,
00064   143,144,144,145,146,146,147,147,148,149,149,150,
00065   150,151,152,152,153,153,154,155,155,156,156,157,
00066   158,158,159,159,160,161,161,162,162,163,164,164,
00067   165,165,166,167,167,168,168,169,170,170,171,171,
00068   172,173,173,174,174,175,176,176,177,178,178,179,
00069   179,180,181,181,182,182,183,184,184,185,185,186
00070 };
00071 
00072 uint8_t lastH, lastS, lastV, lastEffect;
00073 
00074 DigitalInOut effectsPins[NUM_EFFECT_PLUGS] = {DigitalInOut(EFFECT_PLUGS_PINS[0]),
00075                                                 DigitalInOut(EFFECT_PLUGS_PINS[1]),
00076                                                 DigitalInOut(EFFECT_PLUGS_PINS[2]),
00077                                                 DigitalInOut(EFFECT_PLUGS_PINS[3])};
00078 
00079 DigitalIn buttons[NUM_BUTTONS] = {DigitalIn(BUTTON_PINS[0], PullUp),
00080                                     DigitalIn(BUTTON_PINS[1], PullUp),
00081                                     DigitalIn(BUTTON_PINS[2], PullUp),
00082                                     DigitalIn(BUTTON_PINS[3], PullUp),
00083                                     DigitalIn(BUTTON_PINS[4], PullUp)};
00084 
00085 InteractionTimeout interactionTimeout(INTERACTION_TIMEOUT_SECONDS);
00086 Rotary rotary(ROTARY_PIN_A, ROTARY_PIN_B);
00087 Rotary::Action action;
00088 LEDs leds(LEDS_MAIN_STRIP_PIN, LEDS_SINGLE_STRIP_PIN);
00089 Pulser standBySwitchPulser(STANDBY_BUTTON_LED_PIN);
00090 EffectPlugs effectPlugs(4, effectsPins);
00091 Effects effects(&leds);
00092 
00093 DigitalIn StdbyButton(STANDBY_BUTTON_PIN, PullUp);
00094 AnalogIn ainH(ANALOG_H_IN_PIN);
00095 AnalogIn ainS(ANALOG_S_IN_PIN);
00096 AnalogIn ainV(ANALOG_V_IN_PIN);
00097 Serial pc(USBTX, USBRX);
00098 
00099 void setup() {
00100   DEBUG("INIT");
00101   
00102   lastH = 0;
00103   lastS = 0;
00104   lastV = 0;
00105   lastEffect = 0;
00106   leds.off();
00107 }
00108 
00109 bool buttonPressed(uint8_t index) {
00110   uint8_t state = buttons[index].read();
00111   if (state == 0 && lastButtonState[index] == 1) {
00112     lastButtonState[index] = 0;
00113     return true;
00114   };
00115   lastButtonState[index] = state;
00116   return false;
00117 }
00118 
00119 bool buttonDown(uint8_t index) {
00120   uint8_t state = buttons[index].read();
00121   return state == 0;
00122 }
00123 
00124 bool standByButtonPressed() {
00125   static uint8_t lastState;
00126   uint8_t state = StdbyButton.read();
00127   if (state == 0 && lastState == 1) {
00128     lastState = 0;
00129     return true;
00130   }
00131   lastState = state;
00132   return false;
00133 }
00134 
00135 void enterStandBy() {
00136   standBySwitchPulser.off(); // Turn off pulser while writing LED state to EEPROM.
00137   leds.saveStateToEEPROM();
00138   leds.off();
00139   standBy = true;
00140 }
00141 
00142 void leaveStandBy() {
00143   leds.loadStateFromEEPROM();
00144   standBySwitchPulser.steady();
00145   standBy = false;
00146   interactionTimeout.reset();
00147 }
00148 
00149 void dev_loop()
00150 {
00151     static uint8_t old_h = 0, old_s = 0, old_v = 0;
00152     
00153     uint8_t h = ainH.read_u16() >> 8;
00154     uint8_t s = ainS.read_u16() >> 8;
00155     uint8_t v = ainV.read_u16() >> 8;
00156     
00157     if (h != old_h)
00158     {
00159         DEBUG("\r\nH: %u", h);
00160         old_h = h;
00161     }
00162     
00163     if (s != old_s)
00164     {
00165         DEBUG("\r\nS: %u", s);
00166         old_s = s;
00167     }
00168     
00169     if (v != old_v)
00170     {
00171         DEBUG("\r\nV: %u", v);
00172         old_v = v;
00173     }
00174     
00175     
00176     for (uint8_t i = 0; i < NUM_BUTTONS; i++) 
00177     {
00178         if (buttonPressed(i)) 
00179         {
00180             DEBUG("\r\nButton %u Pressed", i);
00181         }
00182         
00183         if (buttonDown(i)) 
00184         {
00185             DEBUG("\r\nButton %u Down", i);
00186         }
00187     }
00188     
00189     static uint8_t old_connection = 0;
00190     
00191     uint8_t connection = effectPlugs.pluggedConnection();
00192     
00193     if (connection != old_connection)
00194     {
00195         DEBUG("Connection %u made", connection);
00196         old_connection = connection;
00197     }    
00198     
00199     action = rotary.read();
00200     
00201     if (action != Rotary::NONE)
00202     {
00203         DEBUG("Rotary action: %u", action);
00204     }
00205     
00206     static uint8_t hue = 0;
00207     
00208     leds.updateSingleLED(hue++, 127, 127);
00209     effects.doEffect(2, Rotary::NONE);
00210     
00211     wait_ms(10);
00212 }
00213 
00214 void loop() 
00215 {
00216     if (standBy) 
00217     {
00218         standBySwitchPulser.pulse();
00219    
00220         if (standByButtonPressed()) 
00221         {
00222             leaveStandBy();
00223             return;
00224         }
00225 
00226         Rotary::Action act = rotary.read();
00227 
00228         if ((act == Rotary::LEFT) || (act == Rotary::RIGHT))
00229         {
00230             leaveStandBy();
00231             return;
00232         }
00233         
00234         for (uint8_t i = 0; i < NUM_BUTTONS; i++) 
00235         {
00236             if (buttonPressed(i)) 
00237             {
00238                 leaveStandBy();
00239                 return;
00240             }
00241         }
00242         
00243         if (lastEffect != effectPlugs.pluggedConnection())
00244         {
00245             leaveStandBy();
00246             return;
00247         }
00248     } 
00249     else 
00250     {
00251         uint8_t h = ainH.read_u16() >> 8;
00252         uint8_t s = (ainS.read_u16() >> 8);
00253         uint8_t v = (ainV.read_u16() >> 8);
00254         leds.updateSingleLED(h, mapS[s], mapV[v]);
00255         
00256         if (abs(h - lastH) > 2 || abs(s - lastS) > 2 || abs(v - lastV) > 2) 
00257         {
00258             interactionTimeout.reset();
00259             lastH = h;
00260             lastS = s;
00261             lastV = v;
00262         }
00263     
00264         for (uint8_t i = 0; i < NUM_BUTTONS; i++) 
00265         {
00266             if (buttonPressed(i)) 
00267                 buttonIsUpdatingLED[i] = !leds.isStripLEDOn(i);
00268           
00269             if (buttonDown(i)) 
00270             {
00271                 if (buttonIsUpdatingLED[i]) 
00272                 {
00273                     leds.updateStripLED(i, h, mapS[s], mapV[v]);
00274                 } 
00275                 else 
00276                 {
00277                     leds.turnOffStripLED(i);
00278                 }
00279                 
00280                 interactionTimeout.reset();
00281             }
00282         }
00283     
00284         uint8_t chosenEffect = effectPlugs.pluggedConnection();
00285         
00286         if (lastEffect != chosenEffect)
00287         {
00288             lastEffect = chosenEffect;
00289         }
00290         
00291         action = rotary.read();
00292         if (chosenEffect) 
00293         {
00294             effects.doEffect(chosenEffect, action);
00295         } 
00296         else 
00297         {
00298             effects.noEffect();
00299             switch (action) 
00300             {
00301                 case Rotary::LEFT:
00302                     leds.scrollStripToLeft();
00303                 break;
00304             
00305                 case Rotary::RIGHT:
00306                     leds.scrollStripToRight();
00307                 break;
00308             
00309                 default:
00310                 break;
00311             }
00312         }
00313         
00314         if (action != Rotary::NONE) 
00315             interactionTimeout.reset();
00316     
00317         if (interactionTimeout.timedOut()) 
00318             enterStandBy();
00319     }
00320 }
00321 
00322 int main(void)
00323 {
00324     setup();
00325     
00326     while (1)
00327     {
00328         #ifdef DEV
00329         dev_loop();
00330         #else
00331         loop();
00332         #endif
00333     }
00334     
00335     return 0;
00336 }