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:
parent
1388c3ee82
commit
daa0afcd39
6 changed files with 33 additions and 47 deletions
|
@ -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)])
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue