66 lines
2.7 KiB
C++
66 lines
2.7 KiB
C++
|
#if 1 // Change to 0 to disable this code (must enable ONE user*.cpp only!)
|
||
|
|
||
|
// This file provides a crude way to "drop in" user code to the eyes,
|
||
|
// allowing concurrent operations without having to maintain a bunch of
|
||
|
// special derivatives of the eye code (which is still undergoing a lot
|
||
|
// of development). Just replace the source code contents of THIS TAB ONLY,
|
||
|
// compile and upload to board. Shouldn't need to modify other eye code.
|
||
|
|
||
|
// User globals can go here, recommend declaring as static, e.g.:
|
||
|
// static int foo = 42;
|
||
|
|
||
|
// Called once near the end of the setup() function.
|
||
|
void user_setup(void) {
|
||
|
}
|
||
|
|
||
|
// Called periodically during eye animation. This is invoked in the
|
||
|
// interval before starting drawing on the last eye so it won't exacerbate
|
||
|
// visible tearing in eye rendering.
|
||
|
// This function BLOCKS, it does NOT multitask with the eye animation code,
|
||
|
// and performance here will have a direct impact on overall refresh rates,
|
||
|
// so keep it simple. Avoid loops (e.g. if animating something like a servo
|
||
|
// or NeoPixels in response to some trigger) and instead rely on state
|
||
|
// machines or similar. Additionally, calls to this function are NOT time-
|
||
|
// constant -- eye rendering time can vary frame to frame, so animation or
|
||
|
// other over-time operations won't look very good using simple +/-
|
||
|
// increments, it's better to use millis() or micros() and work
|
||
|
// algebraically with elapsed times instead.
|
||
|
void user_loop(void) {
|
||
|
/*
|
||
|
Suppose we have a global bool "animating" (meaning something is in
|
||
|
motion) and global uint32_t's "startTime" (the initial time at which
|
||
|
something triggered movement) and "transitionTime" (the total time
|
||
|
over which movement should occur, expressed in microseconds).
|
||
|
Maybe it's servos, maybe NeoPixels, or something different altogether.
|
||
|
This function might resemble something like (pseudocode):
|
||
|
|
||
|
if(!animating) {
|
||
|
Not in motion, check sensor for trigger...
|
||
|
if(read some sensor) {
|
||
|
Motion is triggered! Record startTime, set transition
|
||
|
to 1.5 seconds and set animating flag:
|
||
|
startTime = micros();
|
||
|
transitionTime = 1500000;
|
||
|
animating = true;
|
||
|
No motion actually takes place yet, that will begin on
|
||
|
the next pass through this function.
|
||
|
}
|
||
|
} else {
|
||
|
Currently in motion, ignore trigger and move things instead...
|
||
|
uint32_t elapsed = millis() - startTime;
|
||
|
if(elapsed < transitionTime) {
|
||
|
Part way through motion...how far along?
|
||
|
float ratio = (float)elapsed / (float)transitionTime;
|
||
|
Do something here based on ratio, 0.0 = start, 1.0 = end
|
||
|
} else {
|
||
|
End of motion reached.
|
||
|
Take whatever steps here to move into final position (1.0),
|
||
|
and then clear the "animating" flag:
|
||
|
animating = false;
|
||
|
}
|
||
|
}
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
#endif // 0
|