Ardupilot2/libraries/AP_HAL_AVR/HAL_AVR_APM2_Class.cpp
Caio Marcelo de Oliveira Filho 2e464a53c2 AP_HAL: make code not depend on concrete HAL implementations
The switching between different AP_HAL was happening by giving different
definitions of AP_HAL_BOARD_DRIVER, and the programs would use it to
instantiate.

A program or library code would have to explicitly include (and depend)
on the concrete implementation of the HAL, even when using it only via
interface.

The proposed change move this dependency to be link time. There is a
AP_HAL::get_HAL() function that is used by the client code. Each
implementation of HAL provides its own definition of this function,
returning the appropriate concrete instance.

Since this replaces the job of AP_HAL_BOARD_DRIVER, the definition was
removed.

The static variables for PX4 and VRBRAIN were named differently to avoid
shadowing the extern symbol 'hal'.
2015-10-21 09:16:07 +11:00

94 lines
2.7 KiB
C++

#include <AP_HAL/AP_HAL.h>
/* To save linker space, we need to make sure the HAL_AVR_APM2 class
* is built iff we are building for HAL_BOARD_APM2. These defines must
* wrap the whole HAL_AVR_APM2 class declaration and definition. */
#if CONFIG_HAL_BOARD == HAL_BOARD_APM2
#include "AP_HAL_AVR.h"
#include "AP_HAL_AVR_private.h"
#include "HAL_AVR_APM2_Class.h"
using namespace AP_HAL;
using namespace AP_HAL_AVR;
AVRUARTDriverISRs(0);
AVRUARTDriverISRs(1);
AVRUARTDriverISRs(2);
AVRUARTDriverInstance(avrUart0Driver, 0);
AVRUARTDriverInstance(avrUart1Driver, 1);
AVRUARTDriverInstance(avrUart2Driver, 2);
static AVRSemaphore i2cSemaphore;
static AVRI2CDriver avrI2CDriver(&i2cSemaphore);
static APM2SPIDeviceManager apm2SPIDriver;
static AVRAnalogIn avrAnalogIn;
static AVREEPROMStorage avrEEPROMStorage;
static AVRGPIO avrGPIO;
static APM2RCInput apm2RCInput;
static APM2RCOutput apm2RCOutput;
static AVRScheduler avrScheduler;
static AVRUtil avrUtil;
static ISRRegistry isrRegistry;
HAL_AVR_APM2::HAL_AVR_APM2() :
AP_HAL::HAL(
&avrUart0Driver, /* phys UART0 -> uartA */
&avrUart1Driver, /* phys UART1 -> uartB */
&avrUart2Driver, /* phys UART2 -> uartC */
NULL, /* no uartD */
NULL, /* no uartE */
&avrI2CDriver,
NULL, /* only one i2c */
NULL, /* only one i2c */
&apm2SPIDriver,
&avrAnalogIn,
&avrEEPROMStorage,
&avrUart0Driver,
&avrGPIO,
&apm2RCInput,
&apm2RCOutput,
&avrScheduler,
&avrUtil )
{}
void HAL_AVR_APM2::init(int argc, char * const argv[]) const {
scheduler->init((void*)&isrRegistry);
/* uartA is the serial port used for the console, so lets make sure
* it is initialized at boot */
uartA->begin(115200, 128, 128);
/* The AVR RCInput drivers take an AP_HAL_AVR::ISRRegistry*
* as the init argument */
rcin->init((void*)&isrRegistry);
rcout->init(NULL);
spi->init(NULL);
i2c->begin();
i2c->setTimeout(100);
analogin->init(NULL);
/* Enable the pullups on the RX pins of the 3 UARTs This is important when
* the RX line is high-Z: capacitive coupling between input and output pins
* can cause bytes written to show up as an input. Occasionally this causes
* us to detect a phantom GPS by seeing our own outgoing config message.
* PE0 : RX0 (uartA)
* PD2 : RX1 (uartB)
* PH0 : RX2 (uartC)
*/
PORTE |= _BV(0);
PORTD |= _BV(2);
PORTH |= _BV(0);
};
const AP_HAL::HAL& AP_HAL::get_HAL() {
static const HAL_AVR_APM2 hal;
return hal;
}
#endif // CONFIG_HAL_BOARD == HAL_BOARD_APM2