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
 |