You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
855 B
52 lines
855 B
/* |
|
RC input emulation |
|
Code by Andrew Tridgell November 2011 |
|
*/ |
|
|
|
#ifndef _SITL_RC_H |
|
#define _SITL_RC_H |
|
|
|
struct RC_ICR4 { |
|
uint16_t channels[9]; // 9th channel is sync |
|
uint32_t value; |
|
uint8_t idx; |
|
|
|
RC_ICR4() { |
|
// constructor |
|
channels[0] = channels[1] = channels[3] = 1500; |
|
channels[4] = channels[7] = 1800; |
|
channels[2] = channels[5] = channels[6] = 1000; |
|
channels[8] = 4500; // sync |
|
idx = 0; |
|
} |
|
|
|
/* |
|
read from ICR4 fetches next channel |
|
*/ |
|
operator int() { |
|
value += channels[idx++]*2; |
|
if (idx == 9) { |
|
idx = 0; |
|
} |
|
value = value % 40000; |
|
return (uint16_t)value; |
|
} |
|
|
|
|
|
/* |
|
ignore rate assignment for now (needed for apm2 |
|
emulation) |
|
*/ |
|
RC_ICR4& operator=(uint16_t rate) { |
|
return *this; |
|
} |
|
|
|
/* |
|
interface to set a channel value from SITL |
|
*/ |
|
void set(uint8_t i, uint16_t v) { |
|
channels[i] = v; |
|
} |
|
}; |
|
|
|
#endif
|
|
|