[module] update bat_checker to allow configuration from GPIO

and not only LED
This commit is contained in:
Gautier Hattenberger
2016-03-25 23:35:48 +01:00
parent 8f73374c33
commit 1e35a83e43
2 changed files with 44 additions and 3 deletions
+14 -1
View File
@@ -2,9 +2,22 @@
<module name="bat_checker" dir="energy">
<doc>
<description>Battery checker module</description>
<description>
Battery checker module
When the battery voltage goes below the BAT_LOW level, this will toggle a GPIO/LED.
If the battery voltage is lower than BAT_CRITICAL level, the LED/GPIO stays ON.
The output signal can be connected to an actaul LED or a buzzer to indicated the end of battery to the user.
When a LED is used, define the LED number in your airframe with BAT_CHECKER_LED.
When a GPIO is used, define the GPIO port and pin in your airframe with BAT_CHECKER_GPIO.
You should at least use one of these two options.
</description>
<define name="BAT_CHECKER_DELAY" value="delay" description="number of seconds the battery voltage has to below LOW_BAT_LEVEL before warning signal is activated"/>
<define name="BAT_CHECKER_LED" value="X" description="led number to use for the warning signal"/>
<define name="BAT_CHECKER_GPIO" value="GPIOX,GPIOY" description="alternatively, a GPIO can be set instead of a LED (ex: GPIOA,GPIO5)"/>
<define name="BAT_CHECKER_GPIO_ON" value="gpio_set" description="tells if output signal is ON when GPIO is high or low"/>
<define name="BAT_CHECKER_GPIO_OFF" value="gpio_clear" description="tells if output signal is OFF when GPIO is high or low"/>
</doc>
<header>
<file name="bat_checker.h"/>
+30 -2
View File
@@ -31,28 +31,56 @@
#include "generated/airframe.h"
#include "generated/modules.h"
#include "subsystems/electrical.h"
#include "mcu_periph/gpio.h"
#include "led.h"
#ifndef BAT_CHECKER_LED
#error You must define BAT_CHECKER_LED in your airframe file.
#if (!defined BAT_CHECKER_GPIO && !defined BAT_CHECKER_LED)
#error You must define BAT_CHECKER_GPIO or BAT_CHECKER_LED in your airframe file.
#endif
// in case GPIO logic is inverted
#ifndef BAT_CHECKER_GPIO_ON
#define BAT_CHECKER_GPIO_ON gpio_set
#endif
#ifndef BAT_CHECKER_GPIO_OFF
#define BAT_CHECKER_GPIO_OFF gpio_clear
#endif
void init_bat_checker(void)
{
#ifdef BAT_CHECKER_LED
LED_INIT(BAT_CHECKER_LED);
LED_OFF(BAT_CHECKER_LED);
#endif
#ifdef BAT_CHECKER_GPIO
gpio_setup_output(BAT_CHECKER_GPIO);
#endif
}
void bat_checker_periodic(void)
{
if (electrical.bat_critical) {
#ifdef BAT_CHECKER_LED
LED_ON(BAT_CHECKER_LED);
#endif
#ifdef BAT_CHECKER_GPIO
BAT_CHECKER_GPIO_ON(BAT_CHECKER_GPIO);
#endif
} else if (electrical.bat_low) {
#ifdef BAT_CHECKER_LED
LED_TOGGLE(BAT_CHECKER_LED);
#endif
#ifdef BAT_CHECKER_GPIO
gpio_toggle(BAT_CHECKER_GPIO);
#endif
} else {
#ifdef BAT_CHECKER_LED
LED_OFF(BAT_CHECKER_LED);
#endif
#ifdef BAT_CHECKER_GPIO
BAT_CHECKER_GPIO_OFF(BAT_CHECKER_GPIO);
#endif
}
}