@@ -59,6 +59,7 @@ int iPupilFactor = 42;
59
59
uint32_t boopSum = 0 ,
60
60
boopSumFiltered = 0 ;
61
61
bool booped = false ;
62
+ bool eyelidsClosed = false ;
62
63
bool eyelidsWide = false ;
63
64
int fixate = 7 ;
64
65
uint8_t lightSensorFailCount = 0 ;
@@ -136,24 +137,36 @@ uint32_t availableRAM(void) {
136
137
137
138
// USER CALLABLE FUNCTIONS
138
139
140
+ // Start a blink.
141
+ void eyesBlink () {
142
+ Serial.println (" eyesBlink()" );
143
+ timeToNextBlink = 0 ;
144
+ }
145
+
139
146
// Force the booped flag to be set true.
140
147
void eyesBoop () {
141
148
Serial.println (" eyesBoop()" );
142
149
boopSum = 99999 ;
143
150
}
144
151
152
+ // Close eyelids.
153
+ void eyesClose () {
154
+ Serial.println (" eyesClose()" );
155
+ eyelidsClosed = true ;
156
+ }
157
+
158
+ // Return the eyes to normal random movement.
159
+ void eyesNormal () {
160
+ // Serial.println("eyesNormal()");
161
+ moveEyesRandomly = true ;
162
+ }
163
+
145
164
// Open eyelids wide.
146
165
void eyesWide () {
147
166
Serial.println (" eyesWide()" );
148
167
eyelidsWide = true ;
149
168
}
150
169
151
- // Start a blink.
152
- void eyesBlink () {
153
- Serial.println (" eyesBlink()" );
154
- timeToNextBlink = 0 ;
155
- }
156
-
157
170
// Force the eyes to a position on the screen.
158
171
void eyesToCorner (float x, float y, bool immediate) {
159
172
moveEyesRandomly = false ;
@@ -163,12 +176,6 @@ void eyesToCorner(float x, float y, bool immediate) {
163
176
eyeMoveDuration = 0 ;
164
177
}
165
178
166
- // Return the eyes to normal random movement.
167
- void eyesNormal () {
168
- // Serial.println("eyesNormal()");
169
- moveEyesRandomly = true ;
170
- }
171
-
172
179
173
180
// SETUP FUNCTION - CALLED ONCE AT PROGRAM START ---------------------------
174
181
@@ -594,24 +601,31 @@ void loop() {
594
601
iy = (int )map2screen (mapRadius - eye[eyeNum].eyeY ) + (DISPLAY_SIZE/2 ); // on screen
595
602
iy += irisRadius * trackFactor;
596
603
if (eyeNum & 1 ) ix = DISPLAY_SIZE - 1 - ix; // Flip for right eye
597
- if (iy > upperOpen[ix] ) {
604
+ if (eyelidsWide ) {
598
605
uq = 1.0 ;
599
- } else if (iy < upperClosed[ix]) {
600
- uq = 0.0 ;
601
- } else {
602
- uq = (float )(iy - upperClosed[ix]) / (float )(upperOpen[ix] - upperClosed[ix]);
603
- }
604
- if (booped || eyelidsWide) {
606
+ lq = 1.0 ;
607
+ } else if (booped) {
605
608
uq = 0.9 ;
606
609
lq = 0.7 ;
607
610
} else {
611
+ if (iy > upperOpen[ix]) {
612
+ uq = 1.0 ;
613
+ } else if (iy < upperClosed[ix]) {
614
+ uq = 0.0 ;
615
+ } else {
616
+ uq = (float )(iy - upperClosed[ix]) / (float )(upperOpen[ix] - upperClosed[ix]);
617
+ }
608
618
lq = 1.0 - uq;
609
619
}
610
620
} else {
611
621
// If no tracking, eye is FULLY OPEN when not blinking
612
622
uq = 1.0 ;
613
623
lq = 1.0 ;
614
624
}
625
+ if (eyelidsClosed) {
626
+ uq = 0.0 ;
627
+ lq = 0.0 ;
628
+ }
615
629
// Dampen eyelid movements slightly
616
630
// SAVE upper & lower lid factors per eye,
617
631
// they need to stay consistent across frame
@@ -661,8 +675,9 @@ void loop() {
661
675
boopSum = 0 ;
662
676
}
663
677
664
- // Once per frame (of eye #1), reset eyelidsWide...
665
- if ((eyeNum == 1 ) && (eyelidsWide)) {
678
+ // Once per frame (of eye #1), reset eyelid states...
679
+ if (eyeNum == 1 ) {
680
+ eyelidsClosed = false ;
666
681
eyelidsWide = false ;
667
682
}
668
683
0 commit comments