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
ryanfeng 0:8f759cbfc3c9 3 #include "WS2811.h"
ryanfeng 0:8f759cbfc3c9 4 #include "Colors.h"
ryanfeng 0:8f759cbfc3c9 5
ryanfeng 0:8f759cbfc3c9 6 #include <cmath>
ryanfeng 0:8f759cbfc3c9 7 #include <statechart.h>
ryanfeng 0:8f759cbfc3c9 8
ryanfeng 0:8f759cbfc3c9 9 /* TODO LIST
ryanfeng 0:8f759cbfc3c9 10 [!] FSM for behavior
ryanfeng 0:8f759cbfc3c9 11 [!] Simplify FSM for practicality
ryanfeng 0:8f759cbfc3c9 12 [!] Write State Transitions
ryanfeng 0:8f759cbfc3c9 13 [!] Validate Transitions
ryanfeng 0:8f759cbfc3c9 14 [!] Validate Speeds, Accels
ryanfeng 0:8f759cbfc3c9 15 [!] Write State Actions
ryanfeng 0:8f759cbfc3c9 16 [!] Test LOOK_LEFT action
ryanfeng 0:8f759cbfc3c9 17 [!] Test LOOK_RIGHT action
ryanfeng 0:8f759cbfc3c9 18 [!] Test FLOP action
ryanfeng 0:8f759cbfc3c9 19 [ ] Test WALK action
ryanfeng 0:8f759cbfc3c9 20 [!] Test FLAP action
ryanfeng 0:8f759cbfc3c9 21 */
ryanfeng 0:8f759cbfc3c9 22
ryanfeng 0:8f759cbfc3c9 23 void Statechart::fishStatechart(int netTime, int capNum, int prox, float* xyz, Serial& maestro, WS2811& lightStrip1, WS2811& lightStrip2, float battery) {
ryanfeng 0:8f759cbfc3c9 24 static actState_t actState = REST;
ryanfeng 0:8f759cbfc3c9 25 static emoState_t emoState = HAPPY;
ryanfeng 0:8f759cbfc3c9 26 static int timeAtManeuverStart = 0;
ryanfeng 0:8f759cbfc3c9 27
ryanfeng 0:8f759cbfc3c9 28 /*
ryanfeng 0:8f759cbfc3c9 29 // IMPORTANT: NEVER RUN THE LIPO BATTERIES BELOW 80% OF THEIR MAX CAPACITY
ryanfeng 0:8f759cbfc3c9 30 if( actState != BATTERY_LOW && battery < 0.57 ) {
ryanfeng 0:8f759cbfc3c9 31 actState = BATTERY_LOW;
ryanfeng 0:8f759cbfc3c9 32 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 33 }*/
ryanfeng 0:8f759cbfc3c9 34
ryanfeng 0:8f759cbfc3c9 35 bool cap[12] = {false,false,false,
ryanfeng 0:8f759cbfc3c9 36 false,false,false,
ryanfeng 0:8f759cbfc3c9 37 false,false,false,
ryanfeng 0:8f759cbfc3c9 38 false,false,false};
ryanfeng 0:8f759cbfc3c9 39 int i;
ryanfeng 0:8f759cbfc3c9 40 int temp = capNum;
ryanfeng 0:8f759cbfc3c9 41 bool touched = false;
ryanfeng 0:8f759cbfc3c9 42 for (i=0; i<12; i++) {
ryanfeng 0:8f759cbfc3c9 43 if (((temp>>i)&0x01)==1) {
ryanfeng 0:8f759cbfc3c9 44 cap[i] = true;
ryanfeng 0:8f759cbfc3c9 45 touched = true;
ryanfeng 0:8f759cbfc3c9 46 }
ryanfeng 0:8f759cbfc3c9 47 }
ryanfeng 0:8f759cbfc3c9 48
ryanfeng 0:8f759cbfc3c9 49 bool trans = (( rand() % 100 ) == 0);
ryanfeng 0:8f759cbfc3c9 50 int randNum;
ryanfeng 0:8f759cbfc3c9 51 uint16_t p0, p1, p2;
ryanfeng 0:8f759cbfc3c9 52
ryanfeng 0:8f759cbfc3c9 53 // state transitions
ryanfeng 0:8f759cbfc3c9 54 switch(actState) {
ryanfeng 0:8f759cbfc3c9 55 case REST:
ryanfeng 0:8f759cbfc3c9 56 switch(emoState) {
ryanfeng 0:8f759cbfc3c9 57 case CURIOUS:
ryanfeng 0:8f759cbfc3c9 58 //if touched REST & HAPPY
ryanfeng 0:8f759cbfc3c9 59 if( touched ) {
ryanfeng 0:8f759cbfc3c9 60 emoState = HAPPY;
ryanfeng 0:8f759cbfc3c9 61 }
ryanfeng 0:8f759cbfc3c9 62 //LOOK_LEFT, LOOK_RIGHT
ryanfeng 0:8f759cbfc3c9 63 else if( trans ) {
ryanfeng 0:8f759cbfc3c9 64 randNum = rand() % 2;
ryanfeng 0:8f759cbfc3c9 65 if( randNum == 0 ) {
ryanfeng 0:8f759cbfc3c9 66 actState = LOOK_LEFT;
ryanfeng 0:8f759cbfc3c9 67 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 68 } else if( randNum == 1 ) {
ryanfeng 0:8f759cbfc3c9 69 actState = LOOK_RIGHT;
ryanfeng 0:8f759cbfc3c9 70 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 71 }
ryanfeng 0:8f759cbfc3c9 72 }
ryanfeng 0:8f759cbfc3c9 73 break;
ryanfeng 0:8f759cbfc3c9 74 case MAD:
ryanfeng 0:8f759cbfc3c9 75 //if touched back LOOK_LEFT
ryanfeng 0:8f759cbfc3c9 76 if( cap[6] || cap[9] ) {
ryanfeng 0:8f759cbfc3c9 77 actState = LOOK_LEFT;
ryanfeng 0:8f759cbfc3c9 78 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 79 }
ryanfeng 0:8f759cbfc3c9 80 //if touched front LOOK_RIGHT
ryanfeng 0:8f759cbfc3c9 81 else if( cap[7] || cap[10] ) {
ryanfeng 0:8f759cbfc3c9 82 actState = LOOK_RIGHT;
ryanfeng 0:8f759cbfc3c9 83 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 84 }
ryanfeng 0:8f759cbfc3c9 85 //FLAP
ryanfeng 0:8f759cbfc3c9 86 else if( cap[0] || cap[1] || cap[2] || cap[3] || cap[4] || cap[5] ) {
ryanfeng 0:8f759cbfc3c9 87 actState = FLAP;
ryanfeng 0:8f759cbfc3c9 88 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 89 }
ryanfeng 0:8f759cbfc3c9 90 break;
ryanfeng 0:8f759cbfc3c9 91 case HAPPY:
ryanfeng 0:8f759cbfc3c9 92 //if touched FLAP
ryanfeng 0:8f759cbfc3c9 93 if( cap[6] || cap[7] || cap[9] || cap[10] ) {
ryanfeng 0:8f759cbfc3c9 94 actState = FLAP;
ryanfeng 0:8f759cbfc3c9 95 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 96 }
ryanfeng 0:8f759cbfc3c9 97 //REST & MAD
ryanfeng 0:8f759cbfc3c9 98 else if( cap[0] || cap[1] || cap[2] || cap[3] || cap[4] || cap[5] ) {
ryanfeng 0:8f759cbfc3c9 99 emoState = MAD;
ryanfeng 0:8f759cbfc3c9 100 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 101 }
ryanfeng 0:8f759cbfc3c9 102 break;
ryanfeng 0:8f759cbfc3c9 103 case SAD:
ryanfeng 0:8f759cbfc3c9 104 //FLOP
ryanfeng 0:8f759cbfc3c9 105 if( cap[6] || cap[7] || cap[9] || cap[10] ) {
ryanfeng 0:8f759cbfc3c9 106 actState = FLOP;
ryanfeng 0:8f759cbfc3c9 107 } else if( cap[0] || cap[1] || cap[2] || cap[3] || cap[4] || cap[5] ) {
ryanfeng 0:8f759cbfc3c9 108 actState = FLAP;
ryanfeng 0:8f759cbfc3c9 109 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 110 }
ryanfeng 0:8f759cbfc3c9 111 break;
ryanfeng 0:8f759cbfc3c9 112 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 113 break; //case REST:
ryanfeng 0:8f759cbfc3c9 114 case LOOK_LEFT:
ryanfeng 0:8f759cbfc3c9 115 switch(emoState) {
ryanfeng 0:8f759cbfc3c9 116 case CURIOUS:
ryanfeng 0:8f759cbfc3c9 117 //REST
ryanfeng 0:8f759cbfc3c9 118 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 119 actState = REST;
ryanfeng 0:8f759cbfc3c9 120 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 121 }
ryanfeng 0:8f759cbfc3c9 122 break;
ryanfeng 0:8f759cbfc3c9 123 case MAD: //HEY
ryanfeng 0:8f759cbfc3c9 124 //REST
ryanfeng 0:8f759cbfc3c9 125 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 126 actState = REST;
ryanfeng 0:8f759cbfc3c9 127 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 128 }
ryanfeng 0:8f759cbfc3c9 129 break;
ryanfeng 0:8f759cbfc3c9 130 case HAPPY:
ryanfeng 0:8f759cbfc3c9 131 //
ryanfeng 0:8f759cbfc3c9 132 break;
ryanfeng 0:8f759cbfc3c9 133 case SAD:
ryanfeng 0:8f759cbfc3c9 134 //
ryanfeng 0:8f759cbfc3c9 135 break;
ryanfeng 0:8f759cbfc3c9 136 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 137 break; //case LOOK_LEFT:
ryanfeng 0:8f759cbfc3c9 138 case LOOK_RIGHT:
ryanfeng 0:8f759cbfc3c9 139 switch(emoState) {
ryanfeng 0:8f759cbfc3c9 140 case CURIOUS:
ryanfeng 0:8f759cbfc3c9 141 //REST
ryanfeng 0:8f759cbfc3c9 142 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 143 actState = REST;
ryanfeng 0:8f759cbfc3c9 144 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 145 }
ryanfeng 0:8f759cbfc3c9 146 break;
ryanfeng 0:8f759cbfc3c9 147 case MAD: //HEY
ryanfeng 0:8f759cbfc3c9 148 //REST
ryanfeng 0:8f759cbfc3c9 149 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 150 actState = REST;
ryanfeng 0:8f759cbfc3c9 151 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 152 }
ryanfeng 0:8f759cbfc3c9 153 break;
ryanfeng 0:8f759cbfc3c9 154 case HAPPY:
ryanfeng 0:8f759cbfc3c9 155 //
ryanfeng 0:8f759cbfc3c9 156 break;
ryanfeng 0:8f759cbfc3c9 157 case SAD:
ryanfeng 0:8f759cbfc3c9 158 //
ryanfeng 0:8f759cbfc3c9 159 break;
ryanfeng 0:8f759cbfc3c9 160 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 161 break; //case LOOK_RIGHT:
ryanfeng 0:8f759cbfc3c9 162 case FLOP:
ryanfeng 0:8f759cbfc3c9 163 switch(emoState) {
ryanfeng 0:8f759cbfc3c9 164 case CURIOUS:
ryanfeng 0:8f759cbfc3c9 165 //
ryanfeng 0:8f759cbfc3c9 166 break;
ryanfeng 0:8f759cbfc3c9 167 case MAD:
ryanfeng 0:8f759cbfc3c9 168 //
ryanfeng 0:8f759cbfc3c9 169 break;
ryanfeng 0:8f759cbfc3c9 170 case HAPPY:
ryanfeng 0:8f759cbfc3c9 171 //
ryanfeng 0:8f759cbfc3c9 172 break;
ryanfeng 0:8f759cbfc3c9 173 case SAD:
ryanfeng 0:8f759cbfc3c9 174 //REST
ryanfeng 0:8f759cbfc3c9 175 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 176 actState = REST;
ryanfeng 0:8f759cbfc3c9 177 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 178 }
ryanfeng 0:8f759cbfc3c9 179 break;
ryanfeng 0:8f759cbfc3c9 180 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 181 break; //case FLOP:
ryanfeng 0:8f759cbfc3c9 182 case WALK:
ryanfeng 0:8f759cbfc3c9 183 switch(emoState) {
ryanfeng 0:8f759cbfc3c9 184 case CURIOUS:
ryanfeng 0:8f759cbfc3c9 185 //
ryanfeng 0:8f759cbfc3c9 186 break;
ryanfeng 0:8f759cbfc3c9 187 case MAD:
ryanfeng 0:8f759cbfc3c9 188 //
ryanfeng 0:8f759cbfc3c9 189 break;
ryanfeng 0:8f759cbfc3c9 190 case HAPPY:
ryanfeng 0:8f759cbfc3c9 191 //
ryanfeng 0:8f759cbfc3c9 192 break;
ryanfeng 0:8f759cbfc3c9 193 case SAD:
ryanfeng 0:8f759cbfc3c9 194 //
ryanfeng 0:8f759cbfc3c9 195 break;
ryanfeng 0:8f759cbfc3c9 196 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 197 break; //case WALK:
ryanfeng 0:8f759cbfc3c9 198 case FLAP:
ryanfeng 0:8f759cbfc3c9 199 switch(emoState) {
ryanfeng 0:8f759cbfc3c9 200 case CURIOUS:
ryanfeng 0:8f759cbfc3c9 201 //
ryanfeng 0:8f759cbfc3c9 202 break;
ryanfeng 0:8f759cbfc3c9 203 case MAD: //Tantrum
ryanfeng 0:8f759cbfc3c9 204 //if touched REST & HAPPY
ryanfeng 0:8f759cbfc3c9 205 if( touched ) {
ryanfeng 0:8f759cbfc3c9 206 actState = REST;
ryanfeng 0:8f759cbfc3c9 207 emoState = SAD;
ryanfeng 0:8f759cbfc3c9 208 }
ryanfeng 0:8f759cbfc3c9 209 break;
ryanfeng 0:8f759cbfc3c9 210 case HAPPY:
ryanfeng 0:8f759cbfc3c9 211 //REST
ryanfeng 0:8f759cbfc3c9 212 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 213 actState = REST;
ryanfeng 0:8f759cbfc3c9 214 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 215 }
ryanfeng 0:8f759cbfc3c9 216 break;
ryanfeng 0:8f759cbfc3c9 217 case SAD: //Sleep
ryanfeng 0:8f759cbfc3c9 218 //if touched REST & HAPPY
ryanfeng 0:8f759cbfc3c9 219 if( touched ) {
ryanfeng 0:8f759cbfc3c9 220 actState = REST;
ryanfeng 0:8f759cbfc3c9 221 emoState = CURIOUS;
ryanfeng 0:8f759cbfc3c9 222 timeAtManeuverStart = netTime;
ryanfeng 0:8f759cbfc3c9 223 }
ryanfeng 0:8f759cbfc3c9 224 break;
ryanfeng 0:8f759cbfc3c9 225 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 226 break; //case FLAP:
ryanfeng 0:8f759cbfc3c9 227 case BATTERY_LOW:
ryanfeng 0:8f759cbfc3c9 228 break;
ryanfeng 0:8f759cbfc3c9 229 } //switch(actState) {
ryanfeng 0:8f759cbfc3c9 230
ryanfeng 0:8f759cbfc3c9 231 // define what states do
ryanfeng 0:8f759cbfc3c9 232 switch(actState){
ryanfeng 0:8f759cbfc3c9 233 case REST:
ryanfeng 0:8f759cbfc3c9 234 switch( emoState ) {
ryanfeng 0:8f759cbfc3c9 235 case CURIOUS:
ryanfeng 0:8f759cbfc3c9 236 showSomeRainbow(lightStrip1, 0.5, 0.77, 1.0, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000)));
ryanfeng 0:8f759cbfc3c9 237 showSomeRainbow(lightStrip2, 0.5, 0.77, 1.0, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000)));
ryanfeng 0:8f759cbfc3c9 238 setServoValue(maestro, 1, 50, 50, 50);
ryanfeng 0:8f759cbfc3c9 239 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 240 p0 = 6200;
ryanfeng 0:8f759cbfc3c9 241 p1 = 6200;
ryanfeng 0:8f759cbfc3c9 242 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 243 break;
ryanfeng 0:8f759cbfc3c9 244 case MAD:
ryanfeng 0:8f759cbfc3c9 245 if( (netTime - timeAtManeuverStart) % 4000 < 2000 ) {
ryanfeng 0:8f759cbfc3c9 246 showSolidColorBright(lightStrip1, 255, 0, 0, 0.5);
ryanfeng 0:8f759cbfc3c9 247 showSolidColorBright(lightStrip2, 255, 0, 0, 0.5);
ryanfeng 0:8f759cbfc3c9 248 } else {
ryanfeng 0:8f759cbfc3c9 249 showSolidColorBright(lightStrip1, 255, 0, 0, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/2000)));
ryanfeng 0:8f759cbfc3c9 250 showSolidColorBright(lightStrip2, 255, 0, 0, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/2000)));
ryanfeng 0:8f759cbfc3c9 251 }
ryanfeng 0:8f759cbfc3c9 252 setServoValue(maestro, 1, 60, 60, 60);
ryanfeng 0:8f759cbfc3c9 253 setServoValue(maestro, 2, 30, 30, 30);
ryanfeng 0:8f759cbfc3c9 254 p0 = 6200;
ryanfeng 0:8f759cbfc3c9 255 p1 = 6200;
ryanfeng 0:8f759cbfc3c9 256 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 257 break;
ryanfeng 0:8f759cbfc3c9 258 case HAPPY:
ryanfeng 0:8f759cbfc3c9 259 showRainbow(lightStrip1, 1.0, MINBRITE + (MAXBRITE - MINBRITE) * abs(xyz[0]), 0.5 + 0.5 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000));
ryanfeng 0:8f759cbfc3c9 260 showRainbow(lightStrip2, 1.0, MINBRITE + (MAXBRITE - MINBRITE) * abs(xyz[1]), 0.5 + 0.5 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000));
ryanfeng 0:8f759cbfc3c9 261 setServoValue(maestro, 1, 100, 100, 100);
ryanfeng 0:8f759cbfc3c9 262 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 263 p0 = 6200;
ryanfeng 0:8f759cbfc3c9 264 p1 = 6200;
ryanfeng 0:8f759cbfc3c9 265 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 266 break;
ryanfeng 0:8f759cbfc3c9 267 case SAD:
ryanfeng 0:8f759cbfc3c9 268 if( (netTime - timeAtManeuverStart) % 4000 < 2000 ) {
ryanfeng 0:8f759cbfc3c9 269 showSolidColorBright(lightStrip1, 0, 0, 255, 0.2);
ryanfeng 0:8f759cbfc3c9 270 showSolidColorBright(lightStrip2, 0, 0, 255, 0.2);
ryanfeng 0:8f759cbfc3c9 271 } else {
ryanfeng 0:8f759cbfc3c9 272 showSolidColorBright(lightStrip1, 0, 0, 255, (float)(0.35 - 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/2000)));
ryanfeng 0:8f759cbfc3c9 273 showSolidColorBright(lightStrip2, 0, 0, 255, (float)(0.35 - 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/2000)));
ryanfeng 0:8f759cbfc3c9 274 }
ryanfeng 0:8f759cbfc3c9 275 setServoValue(maestro, 1, 20, 20, 20);
ryanfeng 0:8f759cbfc3c9 276 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 277 p0 = 6200;
ryanfeng 0:8f759cbfc3c9 278 p1 = 6200;
ryanfeng 0:8f759cbfc3c9 279 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 280 break;
ryanfeng 0:8f759cbfc3c9 281 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 282 WS2811::startDMA();
ryanfeng 0:8f759cbfc3c9 283 setServoValue(maestro, 0, p0, p1, p2);
ryanfeng 0:8f759cbfc3c9 284 break; //case REST:
ryanfeng 0:8f759cbfc3c9 285 case LOOK_LEFT:
ryanfeng 0:8f759cbfc3c9 286 switch( emoState ) {
ryanfeng 0:8f759cbfc3c9 287 case CURIOUS: //Search >.>
ryanfeng 0:8f759cbfc3c9 288 showSomeRainbow(lightStrip1, 0.5, 0.77, 1.0, (float)(0.4 + 0.1 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/1000)));
ryanfeng 0:8f759cbfc3c9 289 showSomeRainbow(lightStrip2, 0.5, 0.77, 1.0, (float)(0.3 + 0.1 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/1000)));
ryanfeng 0:8f759cbfc3c9 290 setServoValue(maestro, 1, 50, 50, 50);
ryanfeng 0:8f759cbfc3c9 291 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 292 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 293 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 294 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 295 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 296 } else {
ryanfeng 0:8f759cbfc3c9 297 p0 = 3000;
ryanfeng 0:8f759cbfc3c9 298 p1 = 8000;
ryanfeng 0:8f759cbfc3c9 299 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 300 }
ryanfeng 0:8f759cbfc3c9 301 break;
ryanfeng 0:8f759cbfc3c9 302 case MAD: //HEY >:(
ryanfeng 0:8f759cbfc3c9 303 showSolidColorBright(lightStrip1, 128, 0, 0, 0.5 - abs((float)(0.3 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/1000))));
ryanfeng 0:8f759cbfc3c9 304 showSolidColorBright(lightStrip2, 128, 0, 0, 0.5 - abs((float)(0.3 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/1000))));
ryanfeng 0:8f759cbfc3c9 305 setServoValue(maestro, 1, 100, 100, 100);
ryanfeng 0:8f759cbfc3c9 306 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 307 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 308 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 309 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 310 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 311 } else {
ryanfeng 0:8f759cbfc3c9 312 p0 = 3000;
ryanfeng 0:8f759cbfc3c9 313 p1 = 8000;
ryanfeng 0:8f759cbfc3c9 314 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 315 }
ryanfeng 0:8f759cbfc3c9 316 break;
ryanfeng 0:8f759cbfc3c9 317 case HAPPY: //Nudge '.^
ryanfeng 0:8f759cbfc3c9 318 showSolidColorBright(lightStrip1, 190, 53, 232, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/1500)));
ryanfeng 0:8f759cbfc3c9 319 showSolidColorBright(lightStrip2, 190, 53, 232, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/1500)));
ryanfeng 0:8f759cbfc3c9 320 setServoValue(maestro, 1, 70, 70, 70);
ryanfeng 0:8f759cbfc3c9 321 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 322 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 323 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 324 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 325 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 326 } else {
ryanfeng 0:8f759cbfc3c9 327 p0 = 3000;
ryanfeng 0:8f759cbfc3c9 328 p1 = 8000;
ryanfeng 0:8f759cbfc3c9 329 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 330 }
ryanfeng 0:8f759cbfc3c9 331 break;
ryanfeng 0:8f759cbfc3c9 332 case SAD: //Unreachable state O.O
ryanfeng 0:8f759cbfc3c9 333 showSolidColor(lightStrip1, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 334 showSolidColor(lightStrip2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 335 setServoValue(maestro, 1, 10, 10, 10);
ryanfeng 0:8f759cbfc3c9 336 setServoValue(maestro, 2, 10, 10, 10);
ryanfeng 0:8f759cbfc3c9 337 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 338 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 339 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 340 break;
ryanfeng 0:8f759cbfc3c9 341 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 342 WS2811::startDMA();
ryanfeng 0:8f759cbfc3c9 343 setServoValue(maestro, 0, p0, p1, p2);
ryanfeng 0:8f759cbfc3c9 344 break; //case LOOK_LEFT:
ryanfeng 0:8f759cbfc3c9 345 case LOOK_RIGHT:
ryanfeng 0:8f759cbfc3c9 346 switch( emoState ) {
ryanfeng 0:8f759cbfc3c9 347 case CURIOUS: //Search <.<
ryanfeng 0:8f759cbfc3c9 348 showSomeRainbow(lightStrip1, 0.5, 0.77, 1.0, (float)(0.4 + 0.1 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/1000)));
ryanfeng 0:8f759cbfc3c9 349 showSomeRainbow(lightStrip2, 0.5, 0.77, 1.0, (float)(0.3 + 0.1 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/1000)));
ryanfeng 0:8f759cbfc3c9 350 setServoValue(maestro, 1, 50, 50, 50);
ryanfeng 0:8f759cbfc3c9 351 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 352 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 353 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 354 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 355 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 356 } else {
ryanfeng 0:8f759cbfc3c9 357 p0 = 5000;
ryanfeng 0:8f759cbfc3c9 358 p1 = 10000;
ryanfeng 0:8f759cbfc3c9 359 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 360 }
ryanfeng 0:8f759cbfc3c9 361 break;
ryanfeng 0:8f759cbfc3c9 362 case MAD: //HEY >:(
ryanfeng 0:8f759cbfc3c9 363 showSolidColorBright(lightStrip1, 128, 0, 0, 0.5 - abs((float)(0.3 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/1000))));
ryanfeng 0:8f759cbfc3c9 364 showSolidColorBright(lightStrip2, 128, 0, 0, 0.5 - abs((float)(0.3 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/1000))));
ryanfeng 0:8f759cbfc3c9 365 setServoValue(maestro, 1, 120, 120, 120);
ryanfeng 0:8f759cbfc3c9 366 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 367 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 368 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 369 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 370 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 371 } else {
ryanfeng 0:8f759cbfc3c9 372 p0 = 5000;
ryanfeng 0:8f759cbfc3c9 373 p1 = 10000;
ryanfeng 0:8f759cbfc3c9 374 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 375 }
ryanfeng 0:8f759cbfc3c9 376 break;
ryanfeng 0:8f759cbfc3c9 377 case HAPPY: //Nudge '.^
ryanfeng 0:8f759cbfc3c9 378 showSolidColorBright(lightStrip1, 190, 53, 232, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/1500)));
ryanfeng 0:8f759cbfc3c9 379 showSolidColorBright(lightStrip2, 190, 53, 232, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/1500)));
ryanfeng 0:8f759cbfc3c9 380 setServoValue(maestro, 1, 70, 70, 70);
ryanfeng 0:8f759cbfc3c9 381 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 382 if( netTime - timeAtManeuverStart > 3000 ) {
ryanfeng 0:8f759cbfc3c9 383 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 384 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 385 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 386 } else {
ryanfeng 0:8f759cbfc3c9 387 p0 = 5000;
ryanfeng 0:8f759cbfc3c9 388 p1 = 10000;
ryanfeng 0:8f759cbfc3c9 389 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 390 }
ryanfeng 0:8f759cbfc3c9 391 break;
ryanfeng 0:8f759cbfc3c9 392 case SAD: //Unreachable state O.O
ryanfeng 0:8f759cbfc3c9 393 showSolidColor(lightStrip1, 255, 255, 255);
ryanfeng 0:8f759cbfc3c9 394 showSolidColor(lightStrip2, 255, 255, 255);
ryanfeng 0:8f759cbfc3c9 395 setServoValue(maestro, 1, 10, 10, 10);
ryanfeng 0:8f759cbfc3c9 396 setServoValue(maestro, 2, 10, 10, 10);
ryanfeng 0:8f759cbfc3c9 397 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 398 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 399 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 400 break;
ryanfeng 0:8f759cbfc3c9 401 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 402 WS2811::startDMA();
ryanfeng 0:8f759cbfc3c9 403 setServoValue(maestro, 0, p0, p1, p2);
ryanfeng 0:8f759cbfc3c9 404 break; //case LOOK_RIGHT
ryanfeng 0:8f759cbfc3c9 405 case FLOP:
ryanfeng 0:8f759cbfc3c9 406 switch( emoState ) {
ryanfeng 0:8f759cbfc3c9 407 case CURIOUS: //Unreachable state O.O
ryanfeng 0:8f759cbfc3c9 408 showSolidColor(lightStrip1, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 409 showSolidColor(lightStrip2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 410 setServoValue(maestro, 1, 50, 50, 50);
ryanfeng 0:8f759cbfc3c9 411 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 412 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 413 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 414 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 415 break;
ryanfeng 0:8f759cbfc3c9 416 case MAD: //Unreachable state O.O
ryanfeng 0:8f759cbfc3c9 417 showSolidColor(lightStrip1, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 418 showSolidColor(lightStrip2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 419 setServoValue(maestro, 1, 50, 50, 50);
ryanfeng 0:8f759cbfc3c9 420 setServoValue(maestro, 2, 50, 50, 50);
ryanfeng 0:8f759cbfc3c9 421 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 422 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 423 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 424 break;
ryanfeng 0:8f759cbfc3c9 425 case HAPPY: //Hey! :D
ryanfeng 0:8f759cbfc3c9 426 if( (netTime - timeAtManeuverStart) % 4000 < 2000 ) {
ryanfeng 0:8f759cbfc3c9 427 showRainbow(lightStrip1, 1.0, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/500)), abs(xyz[0]));
ryanfeng 0:8f759cbfc3c9 428 showRainbow(lightStrip2, 1.0, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/500)), abs(xyz[1]));
ryanfeng 0:8f759cbfc3c9 429 } else {
ryanfeng 0:8f759cbfc3c9 430 showRainbow(lightStrip1, 1.0, 0.2, abs(xyz[0]));
ryanfeng 0:8f759cbfc3c9 431 showRainbow(lightStrip2, 1.0, 0.2, abs(xyz[1]));
ryanfeng 0:8f759cbfc3c9 432 }
ryanfeng 0:8f759cbfc3c9 433 setServoValue(maestro, 1, 80, 80, 80);
ryanfeng 0:8f759cbfc3c9 434 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 435 p0 = 4000;
ryanfeng 0:8f759cbfc3c9 436 if( (netTime - timeAtManeuverStart) % 4000 > 2000 ) {
ryanfeng 0:8f759cbfc3c9 437 p1 = 6200;
ryanfeng 0:8f759cbfc3c9 438 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 439 } else {
ryanfeng 0:8f759cbfc3c9 440 p1 = 2500;
ryanfeng 0:8f759cbfc3c9 441 p2 = 2500;
ryanfeng 0:8f759cbfc3c9 442 }
ryanfeng 0:8f759cbfc3c9 443 break;
ryanfeng 0:8f759cbfc3c9 444 case SAD: //Sigh... :/
ryanfeng 0:8f759cbfc3c9 445 showSolidColorBright(lightStrip1, 19, 6, 128, (float)(0.35 + 0.15 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/3000)));
ryanfeng 0:8f759cbfc3c9 446 showSolidColorBright(lightStrip2, 19, 6, 128, (float)(0.35 + 0.15 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/3000)));
ryanfeng 0:8f759cbfc3c9 447 setServoValue(maestro, 1, 20, 20, 20);
ryanfeng 0:8f759cbfc3c9 448 setServoValue(maestro, 2, 10, 10, 10);
ryanfeng 0:8f759cbfc3c9 449 p0 = 4000;
ryanfeng 0:8f759cbfc3c9 450 if( (netTime - timeAtManeuverStart) % 4000 > 1000 ) {
ryanfeng 0:8f759cbfc3c9 451 p1 = 6200;
ryanfeng 0:8f759cbfc3c9 452 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 453 } else {
ryanfeng 0:8f759cbfc3c9 454 p1 = 2500;
ryanfeng 0:8f759cbfc3c9 455 p2 = 2500;
ryanfeng 0:8f759cbfc3c9 456 }
ryanfeng 0:8f759cbfc3c9 457 break;
ryanfeng 0:8f759cbfc3c9 458 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 459 WS2811::startDMA();
ryanfeng 0:8f759cbfc3c9 460 setServoValue(maestro, 0, p0, p1, p2);
ryanfeng 0:8f759cbfc3c9 461 break; //case FLOP:
ryanfeng 0:8f759cbfc3c9 462 case WALK:
ryanfeng 0:8f759cbfc3c9 463 switch( emoState ) {
ryanfeng 0:8f759cbfc3c9 464 case CURIOUS: //Search o.o
ryanfeng 0:8f759cbfc3c9 465 if( (netTime - timeAtManeuverStart) % 3000 > 2000 ) {
ryanfeng 0:8f759cbfc3c9 466 showSomeRainbow(lightStrip1, 0.45 + 0.05 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000), 0.82 + 0.05 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000), 1.0, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000)));
ryanfeng 0:8f759cbfc3c9 467 showSomeRainbow(lightStrip2, 0.45 + 0.05 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000), 0.82 + 0.05 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000), 1.0, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000)));
ryanfeng 0:8f759cbfc3c9 468 } else {
ryanfeng 0:8f759cbfc3c9 469 showSomeRainbow(lightStrip1, 0.5, 0.77, 1.0, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000)));
ryanfeng 0:8f759cbfc3c9 470 showSomeRainbow(lightStrip2, 0.5, 0.77, 1.0, (float)(0.35 + 0.15 * cos(2*PI*(double)(netTime - timeAtManeuverStart)/3000)));
ryanfeng 0:8f759cbfc3c9 471 }
ryanfeng 0:8f759cbfc3c9 472 setServoValue(maestro, 1, 70, 70, 70);
ryanfeng 0:8f759cbfc3c9 473 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 474 if( (netTime - timeAtManeuverStart) % 1000 < 100 ) {
ryanfeng 0:8f759cbfc3c9 475 p0 = 4500;
ryanfeng 0:8f759cbfc3c9 476 p1 = 2000;
ryanfeng 0:8f759cbfc3c9 477 p2 = 3500;
ryanfeng 0:8f759cbfc3c9 478 } else if( (netTime - timeAtManeuverStart) % 1000 < 200 ) {
ryanfeng 0:8f759cbfc3c9 479 p0 = 6200;
ryanfeng 0:8f759cbfc3c9 480 p1 = 3500;
ryanfeng 0:8f759cbfc3c9 481 p2 = 2500;
ryanfeng 0:8f759cbfc3c9 482 } else if( (netTime - timeAtManeuverStart) % 1000 < 300 ) {
ryanfeng 0:8f759cbfc3c9 483 p0 = 10000;
ryanfeng 0:8f759cbfc3c9 484 p1 = 5500;
ryanfeng 0:8f759cbfc3c9 485 p2 = 3500;
ryanfeng 0:8f759cbfc3c9 486 } else if( (netTime - timeAtManeuverStart) % 1000 < 400 ) {
ryanfeng 0:8f759cbfc3c9 487 p0 = 10000;
ryanfeng 0:8f759cbfc3c9 488 p1 = 6500;
ryanfeng 0:8f759cbfc3c9 489 p2 = 4000;
ryanfeng 0:8f759cbfc3c9 490 } else if( (netTime - timeAtManeuverStart) % 1000 < 550 ) {
ryanfeng 0:8f759cbfc3c9 491 p0 = 10000;
ryanfeng 0:8f759cbfc3c9 492 p1 = 7000;
ryanfeng 0:8f759cbfc3c9 493 p2 = 5000;
ryanfeng 0:8f759cbfc3c9 494 } else if( (netTime - timeAtManeuverStart) % 1000 < 700 ) {
ryanfeng 0:8f759cbfc3c9 495 p0 = 6200;
ryanfeng 0:8f759cbfc3c9 496 p1 = 6200;
ryanfeng 0:8f759cbfc3c9 497 p2 = 6200;
ryanfeng 0:8f759cbfc3c9 498 } else if( (netTime - timeAtManeuverStart) % 1000 < 850 ) {
ryanfeng 0:8f759cbfc3c9 499 p0 = 5500;
ryanfeng 0:8f759cbfc3c9 500 p1 = 4500;
ryanfeng 0:8f759cbfc3c9 501 p2 = 4500;
ryanfeng 0:8f759cbfc3c9 502 } else if( (netTime - timeAtManeuverStart) % 1000 < 1000 ) {
ryanfeng 0:8f759cbfc3c9 503 p0 = 5000;
ryanfeng 0:8f759cbfc3c9 504 p1 = 4000;
ryanfeng 0:8f759cbfc3c9 505 p2 = 4000;
ryanfeng 0:8f759cbfc3c9 506 }
ryanfeng 0:8f759cbfc3c9 507 break;
ryanfeng 0:8f759cbfc3c9 508 case MAD: //Unreachable state O.O
ryanfeng 0:8f759cbfc3c9 509 showSolidColor(lightStrip1, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 510 showSolidColor(lightStrip2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 511 setServoValue(maestro, 1, 50, 50, 50);
ryanfeng 0:8f759cbfc3c9 512 setServoValue(maestro, 2, 50, 50, 50);
ryanfeng 0:8f759cbfc3c9 513 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 514 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 515 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 516 setServoValue(maestro, 0, 6000, 6000, 6000);
ryanfeng 0:8f759cbfc3c9 517 break;
ryanfeng 0:8f759cbfc3c9 518 case HAPPY: //Chase XD
ryanfeng 0:8f759cbfc3c9 519 showRainbow(lightStrip1, 1.0, 0.5, (float)((netTime - timeAtManeuverStart) % 500) / 500.0);
ryanfeng 0:8f759cbfc3c9 520 showRainbow(lightStrip2, 1.0, 0.5, (float)((netTime - timeAtManeuverStart) % 500) / 500.0);
ryanfeng 0:8f759cbfc3c9 521 setServoValue(maestro, 1, 100, 100, 100);
ryanfeng 0:8f759cbfc3c9 522 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 523 p0 = (int)(7000 + 3000 * (0.5 * cos(8*PI*(double)(netTime - timeAtManeuverStart)/5000 + 0*2*PI/3)));
ryanfeng 0:8f759cbfc3c9 524 p1 = (int)(5000 - 3000 * (0.5 * cos(8*PI*(double)(netTime - timeAtManeuverStart)/5000 + 1*2*PI/3)));
ryanfeng 0:8f759cbfc3c9 525 p2 = (int)(7000 + 3000 * (0.5 * cos(8*PI*(double)(netTime - timeAtManeuverStart)/5000 + 2*2*PI/3)));
ryanfeng 0:8f759cbfc3c9 526 break;
ryanfeng 0:8f759cbfc3c9 527 case SAD: //Unreachable state O.O
ryanfeng 0:8f759cbfc3c9 528 showSolidColor(lightStrip1, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 529 showSolidColor(lightStrip2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 530 setServoValue(maestro, 1, 10, 10, 10);
ryanfeng 0:8f759cbfc3c9 531 setServoValue(maestro, 2, 10, 10, 10);
ryanfeng 0:8f759cbfc3c9 532 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 533 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 534 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 535 break;
ryanfeng 0:8f759cbfc3c9 536 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 537 WS2811::startDMA();
ryanfeng 0:8f759cbfc3c9 538 setServoValue(maestro, 0, p0, p1, p2);
ryanfeng 0:8f759cbfc3c9 539 break; //case WALK:
ryanfeng 0:8f759cbfc3c9 540 case FLAP:
ryanfeng 0:8f759cbfc3c9 541 switch( emoState ) {
ryanfeng 0:8f759cbfc3c9 542 case CURIOUS: //Unreachable state O.O
ryanfeng 0:8f759cbfc3c9 543 showSolidColor(lightStrip1, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 544 showSolidColor(lightStrip2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 545 setServoValue(maestro, 1, 50, 50, 50);
ryanfeng 0:8f759cbfc3c9 546 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 547 p0 = 6000;
ryanfeng 0:8f759cbfc3c9 548 p1 = 6000;
ryanfeng 0:8f759cbfc3c9 549 p2 = 6000;
ryanfeng 0:8f759cbfc3c9 550 break;
ryanfeng 0:8f759cbfc3c9 551 case MAD: //Tantrum >:X
ryanfeng 0:8f759cbfc3c9 552 showSolidColorBright(lightStrip1, 153, 0, 0, (float)(0.35 + 0.15 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/750)));
ryanfeng 0:8f759cbfc3c9 553 showSolidColorBright(lightStrip2, 153, 0, 0, (float)(0.35 + 0.15 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/750)));
ryanfeng 0:8f759cbfc3c9 554 setServoValue(maestro, 1, 100, 100, 100);
ryanfeng 0:8f759cbfc3c9 555 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 556 p0 = 4000;
ryanfeng 0:8f759cbfc3c9 557 p1 = 6200 - 7400 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/750);
ryanfeng 0:8f759cbfc3c9 558 p2 = 6200 - 7400 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/750);
ryanfeng 0:8f759cbfc3c9 559 break;
ryanfeng 0:8f759cbfc3c9 560 case HAPPY: //Laugh ^.^
ryanfeng 0:8f759cbfc3c9 561 showRainbow(lightStrip1, 1.0, 0.35, (float)((netTime - timeAtManeuverStart) % 1000) / 1000.0);
ryanfeng 0:8f759cbfc3c9 562 showRainbow(lightStrip2, 1.0, 0.35, (float)((netTime - timeAtManeuverStart) % 1000) / 1000.0);
ryanfeng 0:8f759cbfc3c9 563 setServoValue(maestro, 1, 100, 100, 100);
ryanfeng 0:8f759cbfc3c9 564 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 565 p0 = 4000;
ryanfeng 0:8f759cbfc3c9 566 p1 = 6200;
ryanfeng 0:8f759cbfc3c9 567 p2 = 3600 - 800 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/500);
ryanfeng 0:8f759cbfc3c9 568 break;
ryanfeng 0:8f759cbfc3c9 569 case SAD: //Sleep -_-
ryanfeng 0:8f759cbfc3c9 570 showSolidColorBright(lightStrip1, 19, 6, 128, (float)(0.35 + 0.15 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/3000)));
ryanfeng 0:8f759cbfc3c9 571 showSolidColorBright(lightStrip2, 19, 6, 128, (float)(0.35 + 0.15 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/3000)));
ryanfeng 0:8f759cbfc3c9 572 setServoValue(maestro, 1, 20, 20, 20);
ryanfeng 0:8f759cbfc3c9 573 setServoValue(maestro, 2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 574 p0 = 4000;
ryanfeng 0:8f759cbfc3c9 575 p1 = 6500;
ryanfeng 0:8f759cbfc3c9 576 p2 = 3200 - 1600 * sin(2*PI*(double)(netTime - timeAtManeuverStart)/3000);
ryanfeng 0:8f759cbfc3c9 577 break;
ryanfeng 0:8f759cbfc3c9 578 } //switch(emoState) {
ryanfeng 0:8f759cbfc3c9 579 WS2811::startDMA();
ryanfeng 0:8f759cbfc3c9 580 setServoValue(maestro, 0, p0, p1, p2);
ryanfeng 0:8f759cbfc3c9 581 break; //case FLAP:
ryanfeng 0:8f759cbfc3c9 582 case BATTERY_LOW:
ryanfeng 0:8f759cbfc3c9 583 if( (netTime - timeAtManeuverStart) % 1000 > 500 ) {
ryanfeng 0:8f759cbfc3c9 584 showSolidColor(lightStrip1, 255, 0, 0);
ryanfeng 0:8f759cbfc3c9 585 showSolidColor(lightStrip2, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 586 } else {
ryanfeng 0:8f759cbfc3c9 587 showSolidColor(lightStrip1, 0, 0, 0);
ryanfeng 0:8f759cbfc3c9 588 showSolidColor(lightStrip2, 255, 0, 0);
ryanfeng 0:8f759cbfc3c9 589 }
ryanfeng 0:8f759cbfc3c9 590 WS2811::startDMA();
ryanfeng 0:8f759cbfc3c9 591 break;
ryanfeng 0:8f759cbfc3c9 592 } //switch(actState) {
ryanfeng 0:8f759cbfc3c9 593 } //void Statechart::fishStateChart
ryanfeng 0:8f759cbfc3c9 594
ryanfeng 0:8f759cbfc3c9 595 // @brief sets different colors in each of the LEDs of a strip
ryanfeng 0:8f759cbfc3c9 596 // @param strip the light strip
ryanfeng 0:8f759cbfc3c9 597 // @param sat saturation, 0.0 - 1.0
ryanfeng 0:8f759cbfc3c9 598 // @param brite brightness, 0.0 - 1.0
ryanfeng 0:8f759cbfc3c9 599 // @param hueShift shift, 0.0 - 1.0 is equivalent to 0 - 360 degrees
ryanfeng 0:8f759cbfc3c9 600 void Statechart::showRainbow(WS2811 &strip, float sat, float brite, float hueShift)
ryanfeng 0:8f759cbfc3c9 601 {
ryanfeng 0:8f759cbfc3c9 602 unsigned nLEDs = strip.numPixels();
ryanfeng 0:8f759cbfc3c9 603 for (unsigned i = 0; i < nLEDs; i++) {
ryanfeng 0:8f759cbfc3c9 604 uint8_t r, g, b;
ryanfeng 0:8f759cbfc3c9 605 float hue = ((float)i / (float)nLEDs) + hueShift;
ryanfeng 0:8f759cbfc3c9 606 HSBtoRGB(hue, sat, brite, &r, &g, &b);
ryanfeng 0:8f759cbfc3c9 607 strip.setPixelColor(i, r, g, b);
ryanfeng 0:8f759cbfc3c9 608 }
ryanfeng 0:8f759cbfc3c9 609 strip.show();
ryanfeng 0:8f759cbfc3c9 610 }
ryanfeng 0:8f759cbfc3c9 611
ryanfeng 0:8f759cbfc3c9 612 void Statechart::showSolidColor(WS2811 &strip, uint8_t r, uint8_t g, uint8_t b)
ryanfeng 0:8f759cbfc3c9 613 {
ryanfeng 0:8f759cbfc3c9 614 unsigned nLEDs = strip.numPixels();
ryanfeng 0:8f759cbfc3c9 615 for (unsigned i = 0; i < nLEDs; i++) {
ryanfeng 0:8f759cbfc3c9 616 strip.setPixelColor(i, r, g, b);
ryanfeng 0:8f759cbfc3c9 617 }
ryanfeng 0:8f759cbfc3c9 618 strip.show();
ryanfeng 0:8f759cbfc3c9 619 }
ryanfeng 0:8f759cbfc3c9 620
ryanfeng 0:8f759cbfc3c9 621
ryanfeng 0:8f759cbfc3c9 622 //showSolidColorBright(lightStrip1, 0, 0, 255, (float)(0.35 + 0.15 * sin(2*PI * (double)currTime / 1000)));
ryanfeng 0:8f759cbfc3c9 623 //showSolidColorBright(lightStrip2, 0, 0, 255, (float)(0.35 + 0.15 * sin(2*PI * (double)currTime / 1000)));
ryanfeng 0:8f759cbfc3c9 624 //WS2811::startDMA();
ryanfeng 0:8f759cbfc3c9 625 void Statechart::showSolidColorBright(WS2811 &strip, uint8_t r, uint8_t g, uint8_t b, float newBrite)
ryanfeng 0:8f759cbfc3c9 626 {
ryanfeng 0:8f759cbfc3c9 627 unsigned nLEDs = strip.numPixels();
ryanfeng 0:8f759cbfc3c9 628 for (unsigned i = 0; i < nLEDs; i++) {
ryanfeng 0:8f759cbfc3c9 629 float hsbVals[3];
ryanfeng 0:8f759cbfc3c9 630 RGBtoHSB(r, g, b, hsbVals);
ryanfeng 0:8f759cbfc3c9 631 HSBtoRGB(hsbVals[0], hsbVals[1], newBrite, &r, &g, &b);
ryanfeng 0:8f759cbfc3c9 632 strip.setPixelColor(i, r, g, b);
ryanfeng 0:8f759cbfc3c9 633 }
ryanfeng 0:8f759cbfc3c9 634 strip.show();
ryanfeng 0:8f759cbfc3c9 635 }
ryanfeng 0:8f759cbfc3c9 636
ryanfeng 0:8f759cbfc3c9 637 void Statechart::showSomeRainbow(WS2811 &strip, float hueLow, float hueHigh, float sat, float brite)
ryanfeng 0:8f759cbfc3c9 638 {
ryanfeng 0:8f759cbfc3c9 639 unsigned nLEDs = strip.numPixels();
ryanfeng 0:8f759cbfc3c9 640 for (unsigned i = 0; i < nLEDs; i++) {
ryanfeng 0:8f759cbfc3c9 641 uint8_t r, g, b;
ryanfeng 0:8f759cbfc3c9 642 float hue = hueLow + (hueHigh - hueLow) * ((float)i / (float)nLEDs);
ryanfeng 0:8f759cbfc3c9 643 HSBtoRGB(hue, sat, brite, &r, &g, &b);
ryanfeng 0:8f759cbfc3c9 644 strip.setPixelColor(i, r, g, b);
ryanfeng 0:8f759cbfc3c9 645 }
ryanfeng 0:8f759cbfc3c9 646 strip.show();
ryanfeng 0:8f759cbfc3c9 647 }
ryanfeng 0:8f759cbfc3c9 648
ryanfeng 0:8f759cbfc3c9 649 /*
ryanfeng 0:8f759cbfc3c9 650 Set Servo Value for:
ryanfeng 0:8f759cbfc3c9 651 Servo Position: index = 0
ryanfeng 0:8f759cbfc3c9 652 Position is in quarter usec.
ryanfeng 0:8f759cbfc3c9 653 Neutral ~ 6200
ryanfeng 0:8f759cbfc3c9 654 Servo Speed: index = 1
ryanfeng 0:8f759cbfc3c9 655 Speed is quarter usec / ten msec.
ryanfeng 0:8f759cbfc3c9 656 Unlimited Speed = 0
ryanfeng 0:8f759cbfc3c9 657 Servo Accel: index = 2
ryanfeng 0:8f759cbfc3c9 658 Accel is quarter usec / ten msec / eighty msec.
ryanfeng 0:8f759cbfc3c9 659 Unlimited Accel = 0
ryanfeng 0:8f759cbfc3c9 660 */
ryanfeng 0:8f759cbfc3c9 661 void Statechart::setServoValue(Serial &maestro, int index, uint16_t x0, uint16_t x1, uint16_t x2) {
ryanfeng 0:8f759cbfc3c9 662 uint8_t cmd;
ryanfeng 0:8f759cbfc3c9 663 if( index == 0 ) {
ryanfeng 0:8f759cbfc3c9 664 cmd = 0x04;
ryanfeng 0:8f759cbfc3c9 665 } else if( index == 1 ) {
ryanfeng 0:8f759cbfc3c9 666 cmd = 0x07;
ryanfeng 0:8f759cbfc3c9 667 } else if( index == 2 ) {
ryanfeng 0:8f759cbfc3c9 668 cmd = 0x09;
ryanfeng 0:8f759cbfc3c9 669 } else {
ryanfeng 0:8f759cbfc3c9 670 return;
ryanfeng 0:8f759cbfc3c9 671 }
ryanfeng 0:8f759cbfc3c9 672
ryanfeng 0:8f759cbfc3c9 673 uint8_t top7;
ryanfeng 0:8f759cbfc3c9 674 uint8_t bottom7;
ryanfeng 0:8f759cbfc3c9 675
ryanfeng 0:8f759cbfc3c9 676 bottom7 = x0 & 0x7F;
ryanfeng 0:8f759cbfc3c9 677 top7 = (x0 & 0x3F80) >> 7;
ryanfeng 0:8f759cbfc3c9 678
ryanfeng 0:8f759cbfc3c9 679 maestro.putc(0xAA);
ryanfeng 0:8f759cbfc3c9 680 maestro.putc(0x0C);
ryanfeng 0:8f759cbfc3c9 681 maestro.putc(cmd);
ryanfeng 0:8f759cbfc3c9 682 maestro.putc(0x00);
ryanfeng 0:8f759cbfc3c9 683 maestro.putc(bottom7);
ryanfeng 0:8f759cbfc3c9 684 maestro.putc(top7);
ryanfeng 0:8f759cbfc3c9 685
ryanfeng 0:8f759cbfc3c9 686 bottom7 = x1 & 0x7F;
ryanfeng 0:8f759cbfc3c9 687 top7 = (x1 & 0x3F80) >> 7;
ryanfeng 0:8f759cbfc3c9 688
ryanfeng 0:8f759cbfc3c9 689 maestro.putc(0xAA);
ryanfeng 0:8f759cbfc3c9 690 maestro.putc(0x0C);
ryanfeng 0:8f759cbfc3c9 691 maestro.putc(cmd);
ryanfeng 0:8f759cbfc3c9 692 maestro.putc(0x01);
ryanfeng 0:8f759cbfc3c9 693 maestro.putc(bottom7);
ryanfeng 0:8f759cbfc3c9 694 maestro.putc(top7);
ryanfeng 0:8f759cbfc3c9 695
ryanfeng 0:8f759cbfc3c9 696 bottom7 = x2 & 0x7F;
ryanfeng 0:8f759cbfc3c9 697 top7 = (x2 & 0x3F80) >> 7;
ryanfeng 0:8f759cbfc3c9 698
ryanfeng 0:8f759cbfc3c9 699 maestro.putc(0xAA);
ryanfeng 0:8f759cbfc3c9 700 maestro.putc(0x0C);
ryanfeng 0:8f759cbfc3c9 701 maestro.putc(cmd);
ryanfeng 0:8f759cbfc3c9 702 maestro.putc(0x02);
ryanfeng 0:8f759cbfc3c9 703 maestro.putc(bottom7);
ryanfeng 0:8f759cbfc3c9 704 maestro.putc(top7);
ryanfeng 0:8f759cbfc3c9 705 }