15
for( int pin = FIRST_PIN; pin < FIRST_PIN + NUM_CHANNELS; pin++ ) {
16
pinMode( pin, OUTPUT );
17
digitalWrite( pin, LOW );
22
static signed long calculate_duration( unsigned long then, unsigned long now )
24
// does it look like now has overflowed (and wrapped)?
25
if( now < then && now < ( ULONG_MAX / 2 ) && then > ( ULONG_MAX / 2 ) )
26
return now + ( ULONG_MAX - then );
28
// else, calculate duration
34
void Motors::update_channels( int channels[] )
36
static int event = NUM_CHANNELS * 2;
37
unsigned long now = micros();
38
static unsigned long frame_start = now - FRAME_DURATION;
39
static unsigned long next_event_at;
41
if( now >= next_event_at )
44
digitalWrite( FIRST_PIN + ( event / 2 ), ( event & 1 )? LOW : HIGH );
47
if( ++event >= NUM_CHANNELS * 2 ) {
49
frame_start += FRAME_DURATION;
52
// calculate the time that the next event will occur
53
next_event_at = frame_start + ( event / 2 ) * CHANNEL_INTERVAL;
55
next_event_at += MIN_PULSE_WIDTH + channels[ event / 2 ] *
56
( MAX_PULSE_WIDTH - MIN_PULSE_WIDTH ) / MAX_CHANNEL_VALUE;
58
// Serial.print( event / 2 );
59
// Serial.print( ( event & 1 )? 'v' : '^' );
60
// Serial.print( " " );
61
// Serial.println( next_event_at );
64
unsigned long width = MIN_PULSE_WIDTH +
65
(unsigned long)channels[ event / 2 ] *
66
( MAX_PULSE_WIDTH - MIN_PULSE_WIDTH ) / MAX_CHANNEL_VALUE;
67
Serial.print( channels[ event / 2 ] );
69
Serial.println( width );