StateChart for behavior of FlippityFlappity in presentation. Behavior here is predictable and deterministic.
Dependencies: MMA8451Q Multi_WS2811_Demo TSI mbed
main.cpp@0:8f759cbfc3c9, 2015-04-06 (annotated)
- Committer:
- ryanfeng
- Date:
- Mon Apr 06 20:29:33 2015 +0000
- Revision:
- 0:8f759cbfc3c9
Demo Code for presentation
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ryanfeng | 0:8f759cbfc3c9 | 1 | #include "mbed.h" |
ryanfeng | 0:8f759cbfc3c9 | 2 | #include "string" |
ryanfeng | 0:8f759cbfc3c9 | 3 | #include "list" |
ryanfeng | 0:8f759cbfc3c9 | 4 | #include "WS2811.h" |
ryanfeng | 0:8f759cbfc3c9 | 5 | #include "Colors.h" |
ryanfeng | 0:8f759cbfc3c9 | 6 | #include "TSISensor.h" |
ryanfeng | 0:8f759cbfc3c9 | 7 | #include "MMA8451Q.h" |
ryanfeng | 0:8f759cbfc3c9 | 8 | #include "mpr121.h" |
ryanfeng | 0:8f759cbfc3c9 | 9 | #include "statechart.h" |
ryanfeng | 0:8f759cbfc3c9 | 10 | |
ryanfeng | 0:8f759cbfc3c9 | 11 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
ryanfeng | 0:8f759cbfc3c9 | 12 | |
ryanfeng | 0:8f759cbfc3c9 | 13 | /*-----------------------------------------------------------------------*/ |
ryanfeng | 0:8f759cbfc3c9 | 14 | |
ryanfeng | 0:8f759cbfc3c9 | 15 | // Neopixel Setup |
ryanfeng | 0:8f759cbfc3c9 | 16 | unsigned const nLEDs = MAX_LEDS_PER_STRIP; // Defined in WS2811.h |
ryanfeng | 0:8f759cbfc3c9 | 17 | unsigned const DATA_OUT_PIN1 = 2; // PTD2 |
ryanfeng | 0:8f759cbfc3c9 | 18 | unsigned const DATA_OUT_PIN2 = 3; // PTD3 |
ryanfeng | 0:8f759cbfc3c9 | 19 | |
ryanfeng | 0:8f759cbfc3c9 | 20 | // Maestro Setup |
ryanfeng | 0:8f759cbfc3c9 | 21 | Serial maestro(USBTX,USBRX); |
ryanfeng | 0:8f759cbfc3c9 | 22 | |
ryanfeng | 0:8f759cbfc3c9 | 23 | // Timer Setup |
ryanfeng | 0:8f759cbfc3c9 | 24 | Timer timeRunning; |
ryanfeng | 0:8f759cbfc3c9 | 25 | |
ryanfeng | 0:8f759cbfc3c9 | 26 | // MPR121 Setup |
ryanfeng | 0:8f759cbfc3c9 | 27 | InterruptIn interrupt(D9); |
ryanfeng | 0:8f759cbfc3c9 | 28 | I2C i2c(D14, D15); |
ryanfeng | 0:8f759cbfc3c9 | 29 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); // constructor(i2c object, i2c address of the mpr121) |
ryanfeng | 0:8f759cbfc3c9 | 30 | int touch_val = 0; |
ryanfeng | 0:8f759cbfc3c9 | 31 | int prox_val = 0; |
ryanfeng | 0:8f759cbfc3c9 | 32 | |
ryanfeng | 0:8f759cbfc3c9 | 33 | // Accelerometer Setup |
ryanfeng | 0:8f759cbfc3c9 | 34 | MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); |
ryanfeng | 0:8f759cbfc3c9 | 35 | |
ryanfeng | 0:8f759cbfc3c9 | 36 | // Battery Read Setup |
ryanfeng | 0:8f759cbfc3c9 | 37 | AnalogIn battery(A1); |
ryanfeng | 0:8f759cbfc3c9 | 38 | |
ryanfeng | 0:8f759cbfc3c9 | 39 | /*-----------------------------------------------------------------------*/ |
ryanfeng | 0:8f759cbfc3c9 | 40 | |
ryanfeng | 0:8f759cbfc3c9 | 41 | void setToProxMode( bool prox ) { |
ryanfeng | 0:8f759cbfc3c9 | 42 | |
ryanfeng | 0:8f759cbfc3c9 | 43 | if( prox ) { // Proximity Mode Setup |
ryanfeng | 0:8f759cbfc3c9 | 44 | |
ryanfeng | 0:8f759cbfc3c9 | 45 | mpr121.setProximityMode(true); |
ryanfeng | 0:8f759cbfc3c9 | 46 | unsigned char mode = mpr121.read(ELE_CFG); // Get the current mode |
ryanfeng | 0:8f759cbfc3c9 | 47 | mpr121.write(ELE_CFG,0x00); // Put the MPR into setup mode |
ryanfeng | 0:8f759cbfc3c9 | 48 | mpr121.write(EPROXTTH, 0x00); // Write the new threshold |
ryanfeng | 0:8f759cbfc3c9 | 49 | mpr121.write(EPROXRTH, 0x00); |
ryanfeng | 0:8f759cbfc3c9 | 50 | mpr121.write(ELE_CFG, mode); //Restore the operating mode |
ryanfeng | 0:8f759cbfc3c9 | 51 | |
ryanfeng | 0:8f759cbfc3c9 | 52 | } else { // Touch Mode Setup |
ryanfeng | 0:8f759cbfc3c9 | 53 | |
ryanfeng | 0:8f759cbfc3c9 | 54 | mpr121.setProximityMode(false); |
ryanfeng | 0:8f759cbfc3c9 | 55 | unsigned char badTouch[12] = { 0x04, 0x04, 0x04, // Tail-side Body |
ryanfeng | 0:8f759cbfc3c9 | 56 | 0x04, 0x04, 0x04, // Tail-side End |
ryanfeng | 0:8f759cbfc3c9 | 57 | 0x07, 0x07, 0x07, // Head-side Body |
ryanfeng | 0:8f759cbfc3c9 | 58 | 0x05, 0x05, 0x05,}; // Head-side End |
ryanfeng | 0:8f759cbfc3c9 | 59 | |
ryanfeng | 0:8f759cbfc3c9 | 60 | unsigned char sweetRelease[12] = { 0x03, 0x03, 0x03, // Tail-side Body |
ryanfeng | 0:8f759cbfc3c9 | 61 | 0x03, 0x03, 0x03, // Tail-side End |
ryanfeng | 0:8f759cbfc3c9 | 62 | 0x02, 0x02, 0x02, // Head-side Body |
ryanfeng | 0:8f759cbfc3c9 | 63 | 0x02, 0x02, 0x02}; // Head-side End |
ryanfeng | 0:8f759cbfc3c9 | 64 | for( int i = 0; i < 12; i++ ) { |
ryanfeng | 0:8f759cbfc3c9 | 65 | mpr121.setElectrodeThreshold(i,badTouch[i],sweetRelease[i]); // Reset Touch Sensitivity |
ryanfeng | 0:8f759cbfc3c9 | 66 | } |
ryanfeng | 0:8f759cbfc3c9 | 67 | } |
ryanfeng | 0:8f759cbfc3c9 | 68 | } |
ryanfeng | 0:8f759cbfc3c9 | 69 | |
ryanfeng | 0:8f759cbfc3c9 | 70 | // Primary Interrupt Function for MPR121 |
ryanfeng | 0:8f759cbfc3c9 | 71 | void fallInterrupt() { |
ryanfeng | 0:8f759cbfc3c9 | 72 | touch_val = mpr121.read(0x00); |
ryanfeng | 0:8f759cbfc3c9 | 73 | touch_val += mpr121.read(0x01) << 8; |
ryanfeng | 0:8f759cbfc3c9 | 74 | } |
ryanfeng | 0:8f759cbfc3c9 | 75 | |
ryanfeng | 0:8f759cbfc3c9 | 76 | /*-----------------------------------------------------------------------*/ |
ryanfeng | 0:8f759cbfc3c9 | 77 | |
ryanfeng | 0:8f759cbfc3c9 | 78 | int main() { |
ryanfeng | 0:8f759cbfc3c9 | 79 | |
ryanfeng | 0:8f759cbfc3c9 | 80 | WS2811 lightStrip1(nLEDs, DATA_OUT_PIN1); |
ryanfeng | 0:8f759cbfc3c9 | 81 | WS2811 lightStrip2(nLEDs, DATA_OUT_PIN2); |
ryanfeng | 0:8f759cbfc3c9 | 82 | lightStrip1.begin(); |
ryanfeng | 0:8f759cbfc3c9 | 83 | lightStrip2.begin(); |
ryanfeng | 0:8f759cbfc3c9 | 84 | |
ryanfeng | 0:8f759cbfc3c9 | 85 | Statechart statechart; |
ryanfeng | 0:8f759cbfc3c9 | 86 | |
ryanfeng | 0:8f759cbfc3c9 | 87 | // Set to Touch Mode |
ryanfeng | 0:8f759cbfc3c9 | 88 | setToProxMode(false); |
ryanfeng | 0:8f759cbfc3c9 | 89 | |
ryanfeng | 0:8f759cbfc3c9 | 90 | // Start MPR121 Interrupts |
ryanfeng | 0:8f759cbfc3c9 | 91 | interrupt.fall(&fallInterrupt); |
ryanfeng | 0:8f759cbfc3c9 | 92 | interrupt.mode(PullUp); |
ryanfeng | 0:8f759cbfc3c9 | 93 | |
ryanfeng | 0:8f759cbfc3c9 | 94 | // Main Loop: Show Neopixels |
ryanfeng | 0:8f759cbfc3c9 | 95 | timeRunning.start(); |
ryanfeng | 0:8f759cbfc3c9 | 96 | float currTime; |
ryanfeng | 0:8f759cbfc3c9 | 97 | float xyz[3]; |
ryanfeng | 0:8f759cbfc3c9 | 98 | |
ryanfeng | 0:8f759cbfc3c9 | 99 | while(true) { |
ryanfeng | 0:8f759cbfc3c9 | 100 | currTime = timeRunning.read_ms(); |
ryanfeng | 0:8f759cbfc3c9 | 101 | acc.getAccAllAxis(xyz); |
ryanfeng | 0:8f759cbfc3c9 | 102 | |
ryanfeng | 0:8f759cbfc3c9 | 103 | statechart.fishStatechart(currTime, touch_val, prox_val, xyz, maestro, lightStrip1, lightStrip2, battery); |
ryanfeng | 0:8f759cbfc3c9 | 104 | } |
ryanfeng | 0:8f759cbfc3c9 | 105 | } |
ryanfeng | 0:8f759cbfc3c9 | 106 | |
ryanfeng | 0:8f759cbfc3c9 | 107 |