HAL_Linux: add prototype RCInput code for Navio

This commit is contained in:
Mikhail Avkhimenia 2014-10-28 17:37:25 +03:00 committed by Andrew Tridgell
parent ef420a2544
commit 6f993fe64a
2 changed files with 62 additions and 3 deletions

View File

@ -15,16 +15,62 @@ extern const AP_HAL::HAL& hal;
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*)
{
// 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()
{
// 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

View File

@ -12,7 +12,20 @@ public:
void _timer_tick(void);
private:
int pigpio;
struct gpioReport_t
{
uint16_t seqno;
uint16_t flags;
uint32_t tick;
uint32_t level;
} gpioReport;
int curtick;
int prevtick;
uint16_t width_s0;
uint16_t width_s1;
};
#endif // __AP_HAL_LINUX_RCINPUT_NAVIO_H__