1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-15 20:35:33 +03:00

Initial making of LEDs configurable

This commit is contained in:
blckmn 2017-06-17 16:47:38 +10:00
parent 1388c3ee82
commit daa0afcd39
6 changed files with 33 additions and 47 deletions

View file

@ -20,6 +20,8 @@
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#define NOOP do {} while (0)
#define ARRAYLEN(x) (sizeof(x) / sizeof((x)[0])) #define ARRAYLEN(x) (sizeof(x) / sizeof((x)[0]))
#define ARRAYEND(x) (&(x)[ARRAYLEN(x)]) #define ARRAYEND(x) (&(x)[ARRAYLEN(x)])

View file

@ -22,19 +22,15 @@
#include "light_led.h" #include "light_led.h"
static IO_t leds[LED_NUMBER]; static IO_t leds[STATUS_LED_NUMBER];
static uint8_t ledPolarity = 0; static uint8_t ledInversion = 0;
void ledInit(const statusLedConfig_t *statusLedConfig) void ledInit(const statusLedConfig_t *statusLedConfig)
{ {
LED0_OFF; ledInversion = statusLedConfig->inversion;
LED1_OFF; for (int i = 0; i < STATUS_LED_NUMBER; i++) {
LED2_OFF; if (statusLedConfig->ioTags[i]) {
leds[i] = IOGetByTag(statusLedConfig->ioTags[i]);
ledPolarity = statusLedConfig->polarity;
for (int i = 0; i < LED_NUMBER; i++) {
if (statusLedConfig->ledTags[i]) {
leds[i] = IOGetByTag(statusLedConfig->ledTags[i]);
IOInit(leds[i], OWNER_LED, RESOURCE_INDEX(i)); IOInit(leds[i], OWNER_LED, RESOURCE_INDEX(i));
IOConfigGPIO(leds[i], IOCFG_OUT_PP); IOConfigGPIO(leds[i], IOCFG_OUT_PP);
} else { } else {
@ -54,6 +50,6 @@ void ledToggle(int led)
void ledSet(int led, bool on) void ledSet(int led, bool on)
{ {
const bool inverted = (1 << (led)) & ledPolarity; const bool inverted = (1 << (led)) & ledInversion;
IOWrite(leds[led], on ? inverted : !inverted); IOWrite(leds[led], on ? inverted : !inverted);
} }

View file

@ -19,46 +19,29 @@
#include "config/parameter_group.h" #include "config/parameter_group.h"
#include "drivers/io_types.h" #include "drivers/io_types.h"
#include "common/utils.h"
#define LED_NUMBER 3 #define STATUS_LED_NUMBER 3
typedef struct statusLedConfig_s { typedef struct statusLedConfig_s {
ioTag_t ledTags[LED_NUMBER]; ioTag_t ioTags[STATUS_LED_NUMBER];
uint8_t polarity; uint8_t inversion;
} statusLedConfig_t; } statusLedConfig_t;
PG_DECLARE(statusLedConfig_t, statusLedConfig); PG_DECLARE(statusLedConfig_t, statusLedConfig);
// Helpful macros // Helpful macros
#ifdef LED0 #define LED0_TOGGLE ledToggle(0)
# define LED0_TOGGLE ledToggle(0) #define LED0_OFF ledSet(0, false)
# define LED0_OFF ledSet(0, false) #define LED0_ON ledSet(0, true)
# define LED0_ON ledSet(0, true)
#else
# define LED0_TOGGLE do {} while(0)
# define LED0_OFF do {} while(0)
# define LED0_ON do {} while(0)
#endif
#ifdef LED1 #define LED1_TOGGLE ledToggle(1)
# define LED1_TOGGLE ledToggle(1) #define LED1_OFF ledSet(1, false)
# define LED1_OFF ledSet(1, false) #define LED1_ON ledSet(1, true)
# define LED1_ON ledSet(1, true)
#else
# define LED1_TOGGLE do {} while(0)
# define LED1_OFF do {} while(0)
# define LED1_ON do {} while(0)
#endif
#ifdef LED2 #define LED2_TOGGLE ledToggle(2)
# define LED2_TOGGLE ledToggle(2) #define LED2_OFF ledSet(2, false)
# define LED2_OFF ledSet(2, false) #define LED2_ON ledSet(2, true)
# define LED2_ON ledSet(2, true)
#else
# define LED2_TOGGLE do {} while(0)
# define LED2_OFF do {} while(0)
# define LED2_ON do {} while(0)
#endif
void ledInit(const statusLedConfig_t *statusLedConfig); void ledInit(const statusLedConfig_t *statusLedConfig);
void ledToggle(int led); void ledToggle(int led);

View file

@ -74,6 +74,7 @@ extern uint8_t __config_end;
#include "drivers/time.h" #include "drivers/time.h"
#include "drivers/timer.h" #include "drivers/timer.h"
#include "drivers/vcd.h" #include "drivers/vcd.h"
#include "drivers/light_led.h"
#include "fc/settings.h" #include "fc/settings.h"
#include "fc/cli.h" #include "fc/cli.h"
@ -2755,6 +2756,7 @@ const cliResourceValue_t resourceTable[] = {
{ OWNER_I2C_SCL, PG_I2C_CONFIG, offsetof(i2cConfig_t, ioTagScl[0]), I2CDEV_COUNT }, { OWNER_I2C_SCL, PG_I2C_CONFIG, offsetof(i2cConfig_t, ioTagScl[0]), I2CDEV_COUNT },
{ OWNER_I2C_SDA, PG_I2C_CONFIG, offsetof(i2cConfig_t, ioTagSda[0]), I2CDEV_COUNT }, { OWNER_I2C_SDA, PG_I2C_CONFIG, offsetof(i2cConfig_t, ioTagSda[0]), I2CDEV_COUNT },
#endif #endif
{ OWNER_LED, PG_STATUS_LED_CONFIG, offsetof(statusLedConfig_t, ioTags[0]), STATUS_LED_NUMBER },
}; };
static ioTag_t *getIoTag(const cliResourceValue_t value, uint8_t index) static ioTag_t *getIoTag(const cliResourceValue_t value, uint8_t index)

View file

@ -257,21 +257,21 @@ void pgResetFn_pwmConfig(pwmConfig_t *pwmConfig)
void pgResetFn_statusLedConfig(statusLedConfig_t *statusLedConfig) void pgResetFn_statusLedConfig(statusLedConfig_t *statusLedConfig)
{ {
for (int i = 0; i < LED_NUMBER; i++) { for (int i = 0; i < STATUS_LED_NUMBER; i++) {
statusLedConfig->ledTags[i] = IO_TAG_NONE; statusLedConfig->ioTags[i] = IO_TAG_NONE;
} }
#ifdef LED0 #ifdef LED0
statusLedConfig->ledTags[0] = IO_TAG(LED0); statusLedConfig->ioTags[0] = IO_TAG(LED0);
#endif #endif
#ifdef LED1 #ifdef LED1
statusLedConfig->ledTags[1] = IO_TAG(LED1); statusLedConfig->ioTags[1] = IO_TAG(LED1);
#endif #endif
#ifdef LED2 #ifdef LED2
statusLedConfig->ledTags[2] = IO_TAG(LED2); statusLedConfig->ioTags[2] = IO_TAG(LED2);
#endif #endif
statusLedConfig->polarity = 0 statusLedConfig->inversion = 0
#ifdef LED0_INVERTED #ifdef LED0_INVERTED
| BIT(0) | BIT(0)
#endif #endif

View file

@ -36,6 +36,8 @@
#include "config/parameter_group.h" #include "config/parameter_group.h"
#include "config/parameter_group_ids.h" #include "config/parameter_group_ids.h"
#include "drivers/light_led.h"
#include "fc/config.h" #include "fc/config.h"
#include "fc/controlrate_profile.h" #include "fc/controlrate_profile.h"
#include "fc/fc_core.h" #include "fc/fc_core.h"
@ -713,6 +715,7 @@ const clivalue_t valueTable[] = {
#ifdef USE_ESC_SENSOR #ifdef USE_ESC_SENSOR
{ "esc_sensor_halfduplex", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_ESC_SENSOR_CONFIG, offsetof(escSensorConfig_t, halfDuplex) }, { "esc_sensor_halfduplex", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_ESC_SENSOR_CONFIG, offsetof(escSensorConfig_t, halfDuplex) },
#endif #endif
{ "led_inversion", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, 255 }, PG_STATUS_LED_CONFIG, offsetof(statusLedConfig_t, inversion) },
}; };
const uint16_t valueTableEntryCount = ARRAYLEN(valueTable); const uint16_t valueTableEntryCount = ARRAYLEN(valueTable);