@@ -26,6 +26,17 @@ void Devlpr::tick()
2626 microsSinceEMG = 0L ;
2727 // NOTE just a best effort to run on time
2828 }
29+ // //////////////
30+ // Flex Check //
31+ // //////////////
32+ // accrue micros on the micros since last check
33+ microsSinceFlexCheck += microsDelta;
34+ // check if enough time has passed to check for a flex
35+ if (microsSinceFlexCheck >= MICROS_SCHED_FLEX) {
36+ flexCheck (currMicros);
37+ // and update micros since
38+ microsSinceFlexCheck = 0L ;
39+ }
2940 // //////////////////////////
3041 // User Function Schedule //
3142 // //////////////////////////
@@ -113,6 +124,16 @@ int Devlpr::scheduleFunction(void (*f)(Devlpr *d), unsigned int millisPer)
113124 return (numFuncs - 1 );
114125}
115126
127+ void Devlpr::setFlexCallback (void (*f)(Devlpr *d), float threshMult,
128+ unsigned int millisCooldown)
129+ {
130+ // set the callback
131+ onFlexFunc = f;
132+ // and the parameters
133+ flexThreshMultiple = threshMult;
134+ flexCooldownMicros = millisCooldown * 1000L ;
135+ }
136+
116137void Devlpr::readEMG ()
117138{
118139 // want bufInd to sit on the most recent value until tick
@@ -129,3 +150,22 @@ void Devlpr::readEMG()
129150 // now replace
130151 buf[bufInd] = emgVal;
131152}
153+
154+ void Devlpr::flexCheck (unsigned long currMicros)
155+ {
156+ // to check cooldown
157+ unsigned long microsDelta = currMicros - prevFlexMicros;
158+ // the actual flex check
159+ unsigned int peakToPeakThresh = prevPeakToPeak * flexThreshMultiple;
160+ unsigned int currPeakToPeak = windowPeakToPeakAmplitude ();
161+ // need an attached function, cooldown passed, and a peak change
162+ if (onFlexFunc && microsDelta >= flexCooldownMicros &&
163+ currPeakToPeak >= peakToPeakThresh) {
164+ // hit the callback
165+ onFlexFunc (this );
166+ // and update the previous confirmed flex
167+ prevFlexMicros = currMicros;
168+ }
169+ // need to update the current peak-to-peak for next time
170+ prevPeakToPeak = currPeakToPeak;
171+ }
0 commit comments