7 changed files with 323 additions and 0 deletions
@ -0,0 +1,160 @@ |
|||||||
|
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
#include <AP_BoardLED.h> |
||||||
|
|
||||||
|
extern const AP_HAL::HAL& hal; |
||||||
|
|
||||||
|
// static private variable instantiation
|
||||||
|
uint16_t AP_BoardLED::_counter; |
||||||
|
|
||||||
|
void AP_BoardLED::init(void) |
||||||
|
{ |
||||||
|
// update LEDs as often as needed
|
||||||
|
hal.scheduler->register_timer_process( AP_BoardLED::_update );
|
||||||
|
|
||||||
|
// setup the main LEDs as outputs
|
||||||
|
hal.gpio->pinMode(HAL_GPIO_A_LED_PIN, GPIO_OUTPUT); |
||||||
|
hal.gpio->pinMode(HAL_GPIO_B_LED_PIN, GPIO_OUTPUT); |
||||||
|
hal.gpio->pinMode(HAL_GPIO_C_LED_PIN, GPIO_OUTPUT); |
||||||
|
} |
||||||
|
|
||||||
|
void AP_BoardLED::_update(uint32_t now) |
||||||
|
{ |
||||||
|
_counter++; |
||||||
|
|
||||||
|
// we never want to update LEDs at a higher than 16Hz rate
|
||||||
|
if (_counter & 0x3F) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// counter2 used to drop frequency down to 16hz
|
||||||
|
uint8_t counter2 = _counter >> 6; |
||||||
|
|
||||||
|
// initialising
|
||||||
|
if (notify.flags.initialising) { |
||||||
|
// blink LEDs A and C at 8Hz (full cycle) during initialisation
|
||||||
|
if (counter2 & 1) { |
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_ON); |
||||||
|
hal.gpio->write(HAL_GPIO_C_LED_PIN, HAL_GPIO_LED_OFF); |
||||||
|
} else { |
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_OFF); |
||||||
|
hal.gpio->write(HAL_GPIO_C_LED_PIN, HAL_GPIO_LED_ON); |
||||||
|
} |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// save trim
|
||||||
|
if (notify.flags.save_trim) { |
||||||
|
static uint8_t save_trim_counter = 0; |
||||||
|
if ((counter2 & 0x2) == 0) { |
||||||
|
save_trim_counter++; |
||||||
|
} |
||||||
|
switch(save_trim_counter) { |
||||||
|
case 0: |
||||||
|
hal.gpio->write(HAL_GPIO_C_LED_PIN, HAL_GPIO_LED_OFF); |
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_ON); |
||||||
|
break; |
||||||
|
|
||||||
|
case 1: |
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_OFF); |
||||||
|
hal.gpio->write(HAL_GPIO_B_LED_PIN, HAL_GPIO_LED_ON); |
||||||
|
break; |
||||||
|
|
||||||
|
case 2: |
||||||
|
hal.gpio->write(HAL_GPIO_B_LED_PIN, HAL_GPIO_LED_OFF); |
||||||
|
hal.gpio->write(HAL_GPIO_C_LED_PIN, HAL_GPIO_LED_ON); |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
save_trim_counter = -1; |
||||||
|
} |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// arming light
|
||||||
|
static uint8_t arm_counter = 0; |
||||||
|
if (notify.flags.armed) { |
||||||
|
// red led solid
|
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_ON); |
||||||
|
}else{ |
||||||
|
if ((counter2 & 0x2) == 0) { |
||||||
|
arm_counter++; |
||||||
|
} |
||||||
|
if (notify.flags.pre_arm_check) { |
||||||
|
// passed pre-arm checks so slower single flash
|
||||||
|
switch(arm_counter) { |
||||||
|
case 0: |
||||||
|
case 1: |
||||||
|
case 2: |
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_ON); |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
case 4: |
||||||
|
case 5: |
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_OFF); |
||||||
|
break; |
||||||
|
default: |
||||||
|
// reset counter to restart the sequence
|
||||||
|
arm_counter = -1; |
||||||
|
break; |
||||||
|
} |
||||||
|
// disarmed and passing pre-arm checks, blink at about 2hz
|
||||||
|
//if ((counter2 & 0x7) == 0) {
|
||||||
|
// hal.gpio->toggle(HAL_GPIO_A_LED_PIN);
|
||||||
|
//}
|
||||||
|
}else{ |
||||||
|
// disarmed and failing pre-arm checks, double blink
|
||||||
|
//if (counter2 & 0x4) {
|
||||||
|
// hal.gpio->toggle(HAL_GPIO_A_LED_PIN);
|
||||||
|
//}
|
||||||
|
// failed pre-arm checks so double flash
|
||||||
|
switch(arm_counter) { |
||||||
|
case 0: |
||||||
|
case 1: |
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_ON); |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_OFF); |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
case 4: |
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_ON); |
||||||
|
break; |
||||||
|
case 5: |
||||||
|
case 6: |
||||||
|
hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_OFF); |
||||||
|
break; |
||||||
|
default: |
||||||
|
arm_counter = -1; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// gps light
|
||||||
|
switch (notify.flags.gps_status) { |
||||||
|
case 0: |
||||||
|
// no GPS attached
|
||||||
|
hal.gpio->write(HAL_GPIO_C_LED_PIN, HAL_GPIO_LED_OFF); |
||||||
|
break; |
||||||
|
|
||||||
|
case 1: |
||||||
|
// GPS attached but no lock, blink at 4Hz
|
||||||
|
if ((counter2 & 0x3) == 0) { |
||||||
|
hal.gpio->toggle(HAL_GPIO_C_LED_PIN); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 2: |
||||||
|
// GPS attached but 2D lock, blink more slowly (around 2Hz)
|
||||||
|
if ((counter2 & 0x7) == 0) { |
||||||
|
hal.gpio->toggle(HAL_GPIO_C_LED_PIN); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 3: |
||||||
|
// GPS attached but 2D lock, blink more slowly (around 2Hz)
|
||||||
|
hal.gpio->write(HAL_GPIO_C_LED_PIN, HAL_GPIO_LED_ON); |
||||||
|
break;
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,60 @@ |
|||||||
|
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
#ifndef __AP_HAL_BOARDLED_H__ |
||||||
|
#define __AP_HAL_BOARDLED_H__ |
||||||
|
|
||||||
|
#include <AP_Common.h> |
||||||
|
#include <AP_HAL.h> |
||||||
|
#include <AP_Notify.h> |
||||||
|
|
||||||
|
#define HIGH 1 |
||||||
|
#define LOW 0 |
||||||
|
|
||||||
|
#if CONFIG_HAL_BOARD == HAL_BOARD_APM1 |
||||||
|
# define HAL_GPIO_A_LED_PIN 37 |
||||||
|
# define HAL_GPIO_B_LED_PIN 36 |
||||||
|
# define HAL_GPIO_C_LED_PIN 35 |
||||||
|
# define HAL_GPIO_LED_ON HIGH |
||||||
|
# define HAL_GPIO_LED_OFF LOW |
||||||
|
#elif CONFIG_HAL_BOARD == HAL_BOARD_APM2 |
||||||
|
# define HAL_GPIO_A_LED_PIN 27 |
||||||
|
# define HAL_GPIO_B_LED_PIN 26 |
||||||
|
# define HAL_GPIO_C_LED_PIN 25 |
||||||
|
# define HAL_GPIO_LED_ON LOW |
||||||
|
# define HAL_GPIO_LED_OFF HIGH |
||||||
|
#elif CONFIG_HAL_BOARD == HAL_BOARD_AVR_SITL |
||||||
|
# define HAL_GPIO_A_LED_PIN 27 |
||||||
|
# define HAL_GPIO_B_LED_PIN 26 |
||||||
|
# define HAL_GPIO_C_LED_PIN 25 |
||||||
|
# define HAL_GPIO_LED_ON LOW |
||||||
|
# define HAL_GPIO_LED_OFF HIGH |
||||||
|
#elif CONFIG_HAL_BOARD == HAL_BOARD_PX4 |
||||||
|
# define HAL_GPIO_A_LED_PIN 27 |
||||||
|
# define HAL_GPIO_B_LED_PIN 26 |
||||||
|
# define HAL_GPIO_C_LED_PIN 25 |
||||||
|
# define HAL_GPIO_LED_ON LOW |
||||||
|
# define HAL_GPIO_LED_OFF HIGH |
||||||
|
#elif CONFIG_HAL_BOARD == HAL_BOARD_SMACCM |
||||||
|
// XXX these are just copied, may not make sense
|
||||||
|
# define HAL_GPIO_A_LED_PIN 27 |
||||||
|
# define HAL_GPIO_B_LED_PIN 26 |
||||||
|
# define HAL_GPIO_C_LED_PIN 25 |
||||||
|
# define HAL_GPIO_LED_ON LOW |
||||||
|
# define HAL_GPIO_LED_OFF HIGH |
||||||
|
#endif |
||||||
|
|
||||||
|
class AP_BoardLED |
||||||
|
{ |
||||||
|
public: |
||||||
|
// initialise the LED driver
|
||||||
|
void init(void); |
||||||
|
|
||||||
|
private: |
||||||
|
// private methods
|
||||||
|
static void _update(uint32_t now); |
||||||
|
|
||||||
|
// private member variables
|
||||||
|
static uint16_t _counter; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // __AP_HAL_BOARDLED_H__
|
@ -0,0 +1,8 @@ |
|||||||
|
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||||
|
#include <AP_Notify.h> |
||||||
|
|
||||||
|
AP_Notify notify; |
||||||
|
/// Constructor
|
||||||
|
//AP_Notify::AP_Notify()
|
||||||
|
//{
|
||||||
|
//}
|
@ -0,0 +1,55 @@ |
|||||||
|
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
#ifndef __AP_NOTIFY_H__ |
||||||
|
#define __AP_NOTIFY_H__ |
||||||
|
|
||||||
|
#include <AP_Common.h> |
||||||
|
|
||||||
|
class AP_Notify |
||||||
|
{ |
||||||
|
public: |
||||||
|
|
||||||
|
/// notify_type - bitmask of notification types
|
||||||
|
struct notify_type { |
||||||
|
uint16_t initialising : 1; // 1 if initialising and copter should not be moved
|
||||||
|
uint16_t gps_status : 2; // 0 = no gps, 1 = no lock, 2 = 2d lock, 3 = 3d lock
|
||||||
|
uint16_t armed : 1; // 0 = disarmed, 1 = armed
|
||||||
|
uint16_t pre_arm_check : 1; // 0 = failing checks, 1 = passed
|
||||||
|
uint16_t save_trim : 1; // 1 if gathering trim data
|
||||||
|
uint16_t esc_calibration: 1; // 1 if calibrating escs
|
||||||
|
} flags; |
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
//Notify();
|
||||||
|
|
||||||
|
/// To-Do: potential notifications to add
|
||||||
|
|
||||||
|
/// flight_mode
|
||||||
|
/// void flight_mode(uint8_t mode) = 0;
|
||||||
|
|
||||||
|
/// throttle failsafe
|
||||||
|
/// void fs_throttle(bool uint8_t); // 0 if throttle failsafe is cleared, 1 if activated
|
||||||
|
/// void fs_battery(bool uint8_t); // 1 if battery voltage is low or consumed amps close to battery capacity, 0 if cleared
|
||||||
|
/// void fs_gps(bool uint8_t); // 1 if we've lost gps lock and it is required for our current flightmode, 0 if cleared
|
||||||
|
/// void fs_gcs(bool uint8_t); // 1 if we've lost contact with the gcs and it is required for our current flightmode or pilot input method, 0 if cleared
|
||||||
|
/// void fence_breach(bool uint8_t); // fence type breached or 0 if cleared
|
||||||
|
|
||||||
|
/// switch_aux1(uint8_t state); // 0 if aux switch is off, 1 if in middle, 2 if high
|
||||||
|
/// switch_aux2(uint8_t state); // 0 if aux switch is off, 1 if in middle, 2 if high
|
||||||
|
|
||||||
|
/// reached_waypoint(); // called after we reach a waypoint
|
||||||
|
|
||||||
|
/// error(uint8_t subsystem_id, uint8_t error_code); // general error reporting
|
||||||
|
|
||||||
|
/// objects that we expect to create:
|
||||||
|
/// apm2, px4 leds
|
||||||
|
/// copter leds
|
||||||
|
/// blinkm
|
||||||
|
/// buzzer
|
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
// declare a static instance so that it can be accessed easily from anywhere
|
||||||
|
extern AP_Notify notify; |
||||||
|
|
||||||
|
#endif // __AP_NOTIFY_H__
|
@ -0,0 +1,39 @@ |
|||||||
|
/* |
||||||
|
* Example of AC_Notify library . |
||||||
|
* DIYDrones.com |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <AP_Common.h> |
||||||
|
#include <AP_Progmem.h> |
||||||
|
#include <AP_Math.h> // ArduPilot Mega Vector/Matrix math Library |
||||||
|
#include <AP_Param.h> |
||||||
|
#include <AP_HAL.h> |
||||||
|
#include <AP_HAL_AVR.h> |
||||||
|
#include <AP_Notify.h> // Notify library |
||||||
|
#include <AP_BoardLED.h> // Board LED library |
||||||
|
|
||||||
|
const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER; |
||||||
|
|
||||||
|
// create board led object |
||||||
|
AP_BoardLED board_led; |
||||||
|
|
||||||
|
void setup() |
||||||
|
{ |
||||||
|
hal.console->println("AP_Notify library test"); |
||||||
|
|
||||||
|
// initialise the board leds |
||||||
|
board_led.init(); |
||||||
|
|
||||||
|
// turn on initialising notification |
||||||
|
//notify.flags.initialising = true; |
||||||
|
notify.flags.gps_status = 1; |
||||||
|
notify.flags.armed = 1; |
||||||
|
notify.flags.pre_arm_check = 1; |
||||||
|
} |
||||||
|
|
||||||
|
void loop() |
||||||
|
{ |
||||||
|
hal.scheduler->delay(1000); |
||||||
|
} |
||||||
|
|
||||||
|
AP_HAL_MAIN(); |
@ -0,0 +1 @@ |
|||||||
|
include ../../../../mk/apm.mk |
Loading…
Reference in new issue