StateChart defining behavior for FlippityFlappity project

Dependencies:   MMA8451Q Multi_WS2811 TSI mbed

Committer:
ryanfeng
Date:
Mon Apr 06 20:27:47 2015 +0000
Revision:
0:e72b30045834
Original StateChart for FlippityFlappity.  Find presentation statechart in FishStateChartDemo

Who changed what in which revision?

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