|
|
@ -15,16 +15,62 @@ extern const AP_HAL::HAL& hal; |
|
|
|
|
|
|
|
|
|
|
|
using namespace Linux; |
|
|
|
using namespace Linux; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// This is a prototype code for RC input decoding on Raspberry Pi.
|
|
|
|
|
|
|
|
// It uses pigpio daemon to sample GPIOs over DMA with 1 microsecond resolution.
|
|
|
|
|
|
|
|
// This code should be rewritten to configure DMA GPIO sampling without pigpio.
|
|
|
|
|
|
|
|
|
|
|
|
void LinuxRCInput_Navio::init(void*) |
|
|
|
void LinuxRCInput_Navio::init(void*) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// To be added
|
|
|
|
curtick = 0; |
|
|
|
|
|
|
|
prevtick = 0; |
|
|
|
|
|
|
|
width_s0 = 0; |
|
|
|
|
|
|
|
width_s1 = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Kills pigpio daemon in case it was run with wrong parameters
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
system("killall pigpiod -q"); |
|
|
|
|
|
|
|
hal.scheduler->delay(1000); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Starts pigpio daemon with 1 microsecond sampling resolution
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
system("pigpiod -s 1"); |
|
|
|
|
|
|
|
hal.scheduler->delay(1000); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Configures pigpiod to send GPIO change notifications to /dev/pigpio0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
system("pigs NO NB 0 0x10"); |
|
|
|
|
|
|
|
hal.scheduler->delay(1000); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Configures /dev/pigpio0 for non-blocking read
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pigpio = open("/dev/pigpio0", O_RDONLY); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (pigpio == -1) |
|
|
|
|
|
|
|
hal.scheduler->panic("No pigpio interface for RCInput"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void LinuxRCInput_Navio::_timer_tick() |
|
|
|
void LinuxRCInput_Navio::_timer_tick() |
|
|
|
{ |
|
|
|
{ |
|
|
|
// To be added
|
|
|
|
while (true) { |
|
|
|
|
|
|
|
int bytesAvailable; |
|
|
|
|
|
|
|
ioctl(pigpio, FIONREAD, &bytesAvailable); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (bytesAvailable >= 12) |
|
|
|
|
|
|
|
::read(pigpio, reinterpret_cast<uint8_t*>(&gpioReport), 12); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
prevtick = curtick; |
|
|
|
|
|
|
|
curtick = gpioReport.tick; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (((gpioReport.level >> 4) & 0x01) == 0) { |
|
|
|
|
|
|
|
width_s0 = curtick - prevtick;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
width_s1 = curtick - prevtick; |
|
|
|
|
|
|
|
_process_rc_pulse(width_s0, width_s1); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#endif // CONFIG_HAL_BOARD_SUBTYPE
|
|
|
|
#endif // CONFIG_HAL_BOARD_SUBTYPE
|
|
|
|