13
static int channels_[ NUM_MOTORS ];
16
12
void Motors::setup()
19
for( int pin = FIRST_PIN; pin < FIRST_PIN + NUM_MOTORS; pin++ ) {
15
for( int pin = FIRST_PIN; pin < FIRST_PIN + NUM_CHANNELS; pin++ ) {
20
16
pinMode( pin, OUTPUT );
21
17
digitalWrite( pin, LOW );
24
// reset channel values
25
for( int a = 0; a < NUM_MOTORS; a++ )
30
void Motors::set_values( int channel_values[] )
32
for( int a = 0; a < NUM_MOTORS; a++ )
33
channels_[ a ] = channel_values[ a ];
39
static int event = NUM_MOTORS * 2;
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;
40
37
unsigned long now = micros();
41
38
static unsigned long frame_start = now - FRAME_DURATION;
42
static unsigned long next_event_at = 0;
39
static unsigned long next_event_at;
44
41
if( now >= next_event_at )
47
if( event < NUM_MOTORS * 2 )
48
digitalWrite( FIRST_PIN + ( event / 2 ),
49
( event & 1 )? LOW : HIGH );
44
digitalWrite( FIRST_PIN + ( event / 2 ), ( event & 1 )? LOW : HIGH );
51
46
// move to next event
52
if( ++event >= NUM_MOTORS * 2 ) {
47
if( ++event >= NUM_CHANNELS * 2 ) {
54
49
frame_start += FRAME_DURATION;
57
52
// calculate the time that the next event will occur
58
53
next_event_at = frame_start + ( event / 2 ) * CHANNEL_INTERVAL;
60
next_event_at += MIN_PULSE_WIDTH + channels_[ event / 2 ] *
61
( MAX_PULSE_WIDTH - MIN_PULSE_WIDTH ) / MAX_CHANNEL_VALUE;
63
// Serial.print( event / 2 );
64
// Serial.print( ( event & 1 )? 'v' : '^' );
65
// Serial.print( " " );
66
// Serial.println( next_event_at );
69
// unsigned long width = MIN_PULSE_WIDTH +
70
// (unsigned long)channels_[ event / 2 ] *
71
// ( MAX_PULSE_WIDTH - MIN_PULSE_WIDTH ) / MAX_CHANNEL_VALUE;
72
// Serial.print( channels_[ event / 2 ] );
73
// Serial.print( " " );
74
// Serial.println( width );
78
// else, if an event is coming up soon, sleep and service the event to make
79
// sure that no other code runs and blocks us!
82
long delay = calculate_duration( now, next_event_at );
86
delayMicroseconds( delay - 20 );
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 );