StateChart for behavior of FlippityFlappity in presentation. Behavior here is predictable and deterministic.

Dependencies:   MMA8451Q Multi_WS2811_Demo TSI mbed

Committer:
ryanfeng
Date:
Mon Apr 06 20:29:33 2015 +0000
Revision:
0:8f759cbfc3c9
Demo Code for presentation

Who changed what in which revision?

UserRevisionLine numberNew 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