@@ -59,6 +59,7 @@ int iPupilFactor = 42;
59
59
uint32_t boopSum = 0 ,
60
60
boopSumFiltered = 0 ;
61
61
bool booped = false ;
62
+ bool eyelidsWide = false ;
62
63
int fixate = 7 ;
63
64
uint8_t lightSensorFailCount = 0 ;
64
65
@@ -136,14 +137,20 @@ uint32_t availableRAM(void) {
136
137
// USER CALLABLE FUNCTIONS
137
138
138
139
// Force the booped flag to be set true.
139
- void eyesWide () {
140
- // Serial.println("eyesWide ()");
140
+ void eyesBoop () {
141
+ Serial.println (" eyesBoop ()" );
141
142
boopSum = 99999 ;
142
143
}
143
144
145
+ // Open eyelids wide.
146
+ void eyesWide () {
147
+ Serial.println (" eyesWide()" );
148
+ eyelidsWide = true ;
149
+ }
150
+
144
151
// Start a blink.
145
152
void eyesBlink () {
146
- // Serial.println("eyesBlink()");
153
+ Serial.println (" eyesBlink()" );
147
154
timeToNextBlink = 0 ;
148
155
}
149
156
@@ -158,7 +165,7 @@ void eyesToCorner(float x, float y, bool immediate) {
158
165
159
166
// Return the eyes to normal random movement.
160
167
void eyesNormal () {
161
- // Serial.println("eyesNormal()");
168
+ // Serial.println("eyesNormal()");
162
169
moveEyesRandomly = true ;
163
170
}
164
171
@@ -508,24 +515,24 @@ void loop() {
508
515
// Eye movement
509
516
int32_t dt = t - eyeMoveStartTime; // uS elapsed since last eye event
510
517
if (eyeInMotion) { // Currently moving?
511
- if (dt >= eyeMoveDuration) { // Time up? Destination reached.
512
- eyeInMotion = false ; // Stop moving
518
+ if (dt >= eyeMoveDuration) { // Time up? Destination reached.
519
+ eyeInMotion = false ; // Stop moving
513
520
if (moveEyesRandomly) {
514
- eyeMoveDuration = random (10000 , 3000000 ); // 0.01-3 sec stop
515
- eyeMoveStartTime = t; // Save initial time of stop
521
+ eyeMoveDuration = random (10000 , 3000000 ); // 0.01-3 sec stop
522
+ eyeMoveStartTime = t; // Save initial time of stop
516
523
}
517
524
eyeX = eyeOldX = eyeNewX; // Save position
518
525
eyeY = eyeOldY = eyeNewY;
519
526
} else { // Move time's not yet fully elapsed -- interpolate position
520
527
float e = (float )dt / float (eyeMoveDuration); // 0.0 to 1.0 during move
521
528
e = 3 * e * e - 2 * e * e * e; // Easing function: 3*e^2-2*e^3 0.0 to 1.0
522
- eyeX = eyeOldX + (eyeNewX - eyeOldX) * e; // Interp X
523
- eyeY = eyeOldY + (eyeNewY - eyeOldY) * e; // and Y
529
+ eyeX = eyeOldX + (eyeNewX - eyeOldX) * e; // Interp X
530
+ eyeY = eyeOldY + (eyeNewY - eyeOldY) * e; // and Y
524
531
}
525
- } else { // Eye stopped
532
+ } else { // Eye stopped
526
533
eyeX = eyeOldX;
527
534
eyeY = eyeOldY;
528
- if (dt > eyeMoveDuration) { // Time up? Begin new move.
535
+ if (dt > eyeMoveDuration) { // Time up? Begin new move.
529
536
// r is the radius in X and Y that the eye can go, from (0,0) in the center.
530
537
float r = (float )mapDiameter - (float )DISPLAY_SIZE * M_PI_2; // radius of motion
531
538
r *= 0.6 ; // calibration constant
@@ -543,9 +550,9 @@ void loop() {
543
550
eyeNewY += mapRadius;
544
551
545
552
// Set the duration for this move, and start it going.
546
- eyeMoveDuration = random (83000 , 166000 ); // ~1/12 - ~1/6 sec
547
- eyeMoveStartTime = t; // Save initial time of move
548
- eyeInMotion = true ; // Start move on next frame
553
+ eyeMoveDuration = random (83000 , 166000 ); // ~1/12 - ~1/6 sec
554
+ eyeMoveStartTime = t; // Save initial time of move
555
+ eyeInMotion = true ; // Start move on next frame
549
556
}
550
557
}
551
558
@@ -594,7 +601,7 @@ void loop() {
594
601
} else {
595
602
uq = (float )(iy - upperClosed[ix]) / (float )(upperOpen[ix] - upperClosed[ix]);
596
603
}
597
- if (booped) {
604
+ if (booped || eyelidsWide ) {
598
605
uq = 0.9 ;
599
606
lq = 0.7 ;
600
607
} else {
@@ -642,7 +649,7 @@ void loop() {
642
649
// Once per frame (of eye #0), reset boopSum...
643
650
if ((eyeNum == 0 ) && (boopPin >= 0 )) {
644
651
boopSumFiltered = ((boopSumFiltered * 3 ) + boopSum) / 4 ;
645
- // Serial.printf("boopSum: %d, boopSumFiltered: %d, boopThreshold: %d, booped: %s\n", boopSum, boopSumFiltered, boopThreshold, (booped ? "true" : "false"));
652
+ // Serial.printf("boopSum: %d, boopSumFiltered: %d, boopThreshold: %d, booped: %s\n", boopSum, boopSumFiltered, boopThreshold, (booped ? "true" : "false"));
646
653
if (boopSumFiltered > boopThreshold) {
647
654
if (!booped) {
648
655
Serial.println (" BOOP!" );
@@ -654,6 +661,11 @@ void loop() {
654
661
boopSum = 0 ;
655
662
}
656
663
664
+ // Once per frame (of eye #1), reset eyelidsWide...
665
+ if ((eyeNum == 1 ) && (eyelidsWide)) {
666
+ eyelidsWide = false ;
667
+ }
668
+
657
669
float mins = (float )millis () / 60000.0 ;
658
670
if (eye[eyeNum].iris .iSpin ) {
659
671
// Spin works in fixed amount per frame (eyes may lose sync, but "wagon wheel" tricks work)
0 commit comments