Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: PololuLedStrip mbed
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 }
Generated on Tue Jul 19 2022 02:43:48 by
1.7.2