mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-12 19:10:32 +03:00
Fix virtualled (#14276)
This commit is contained in:
parent
0b4b1123cd
commit
99e8dd8840
5 changed files with 52 additions and 57 deletions
|
@ -5096,7 +5096,9 @@ const cliResourceValue_t resourceTable[] = {
|
|||
DEFW( OWNER_I2C_SCL, PG_I2C_CONFIG, i2cConfig_t, ioTagScl, I2CDEV_COUNT ),
|
||||
DEFW( OWNER_I2C_SDA, PG_I2C_CONFIG, i2cConfig_t, ioTagSda, I2CDEV_COUNT ),
|
||||
#endif
|
||||
DEFA( OWNER_LED, PG_STATUS_LED_CONFIG, statusLedConfig_t, ioTags[0], STATUS_LED_NUMBER ),
|
||||
#if !defined(USE_VIRTUAL_LED)
|
||||
DEFA( OWNER_LED, PG_STATUS_LED_CONFIG, statusLedConfig_t, ioTags[0], STATUS_LED_COUNT ),
|
||||
#endif
|
||||
#ifdef USE_SPEKTRUM_BIND
|
||||
DEFS( OWNER_RX_BIND, PG_RX_CONFIG, rxConfig_t, spektrum_bind_pin_override_ioTag ),
|
||||
DEFS( OWNER_RX_BIND_PLUG, PG_RX_CONFIG, rxConfig_t, spektrum_bind_plug_ioTag ),
|
||||
|
|
|
@ -1749,7 +1749,9 @@ const clivalue_t valueTable[] = {
|
|||
{ "frsky_spi_a1_source", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_RX_FRSKY_SPI_A1_SOURCE }, PG_RX_CC2500_SPI_CONFIG, offsetof(rxCc2500SpiConfig_t, a1Source) },
|
||||
{ "cc2500_spi_chip_detect", VAR_UINT8 | HARDWARE_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_RX_CC2500_SPI_CONFIG, offsetof(rxCc2500SpiConfig_t, chipDetectEnabled) },
|
||||
#endif
|
||||
{ "led_inversion", VAR_UINT8 | HARDWARE_VALUE, .config.minmaxUnsigned = { 0, ((1 << STATUS_LED_NUMBER) - 1) }, PG_STATUS_LED_CONFIG, offsetof(statusLedConfig_t, inversion) },
|
||||
#if !defined(USE_VIRTUAL_LED)
|
||||
{ "led_inversion", VAR_UINT8 | HARDWARE_VALUE, .config.minmaxUnsigned = { 0, ((1 << STATUS_LED_COUNT) - 1) }, PG_STATUS_LED_CONFIG, offsetof(statusLedConfig_t, inversion) },
|
||||
#endif
|
||||
#ifdef USE_DASHBOARD
|
||||
{ "dashboard_i2c_bus", VAR_UINT8 | HARDWARE_VALUE, .config.minmaxUnsigned = { 0, I2CDEV_COUNT }, PG_DASHBOARD_CONFIG, offsetof(dashboardConfig_t, device) },
|
||||
{ "dashboard_i2c_addr", VAR_UINT8 | HARDWARE_VALUE, .config.minmaxUnsigned = { I2C_ADDR7_MIN, I2C_ADDR7_MAX }, PG_DASHBOARD_CONFIG, offsetof(dashboardConfig_t, address) },
|
||||
|
|
|
@ -27,32 +27,26 @@
|
|||
|
||||
#include "light_led.h"
|
||||
|
||||
#if !(defined(UNIT_TEST) || defined(USE_VIRTUAL_LED))
|
||||
#if !defined(USE_VIRTUAL_LED)
|
||||
|
||||
PG_REGISTER_WITH_RESET_FN(statusLedConfig_t, statusLedConfig, PG_STATUS_LED_CONFIG, 0);
|
||||
|
||||
static IO_t leds[STATUS_LED_NUMBER];
|
||||
static IO_t leds[STATUS_LED_COUNT];
|
||||
static uint8_t ledInversion = 0;
|
||||
|
||||
#ifndef LED0_PIN
|
||||
#define LED0_PIN NONE
|
||||
PG_REGISTER_WITH_RESET_TEMPLATE(statusLedConfig_t, statusLedConfig, PG_STATUS_LED_CONFIG, 0);
|
||||
|
||||
PG_RESET_TEMPLATE(statusLedConfig_t, statusLedConfig,
|
||||
.ioTags = {
|
||||
#if STATUS_LED_COUNT > 0 && defined(LED0_PIN)
|
||||
[0] = IO_TAG(LED0_PIN),
|
||||
#endif
|
||||
|
||||
#ifndef LED1_PIN
|
||||
#define LED1_PIN NONE
|
||||
#if STATUS_LED_COUNT > 1 && defined(LED1_PIN)
|
||||
[1] = IO_TAG(LED1_PIN),
|
||||
#endif
|
||||
|
||||
#ifndef LED2_PIN
|
||||
#define LED2_PIN NONE
|
||||
#if STATUS_LED_COUNT > 2 && defined(LED2_PIN)
|
||||
[2] = IO_TAG(LED2_PIN),
|
||||
#endif
|
||||
|
||||
void pgResetFn_statusLedConfig(statusLedConfig_t *statusLedConfig)
|
||||
{
|
||||
statusLedConfig->ioTags[0] = IO_TAG(LED0_PIN);
|
||||
statusLedConfig->ioTags[1] = IO_TAG(LED1_PIN);
|
||||
statusLedConfig->ioTags[2] = IO_TAG(LED2_PIN);
|
||||
|
||||
statusLedConfig->inversion = 0
|
||||
},
|
||||
.inversion = 0
|
||||
#ifdef LED0_INVERTED
|
||||
| BIT(0)
|
||||
#endif
|
||||
|
@ -62,35 +56,37 @@ void pgResetFn_statusLedConfig(statusLedConfig_t *statusLedConfig)
|
|||
#ifdef LED2_INVERTED
|
||||
| BIT(2)
|
||||
#endif
|
||||
;
|
||||
}
|
||||
,
|
||||
);
|
||||
|
||||
void ledInit(const statusLedConfig_t *statusLedConfig)
|
||||
{
|
||||
ledInversion = statusLedConfig->inversion;
|
||||
for (int i = 0; i < STATUS_LED_NUMBER; i++) {
|
||||
if (statusLedConfig->ioTags[i]) {
|
||||
leds[i] = IOGetByTag(statusLedConfig->ioTags[i]);
|
||||
for (int i = 0; i < (int)ARRAYLEN(leds); i++) {
|
||||
leds[i] = IOGetByTag(statusLedConfig->ioTags[i]);
|
||||
if (leds[i]) {
|
||||
IOInit(leds[i], OWNER_LED, RESOURCE_INDEX(i));
|
||||
IOConfigGPIO(leds[i], IOCFG_OUT_PP);
|
||||
} else {
|
||||
leds[i] = IO_NONE;
|
||||
}
|
||||
ledSet(i, false);
|
||||
}
|
||||
|
||||
LED0_OFF;
|
||||
LED1_OFF;
|
||||
LED2_OFF;
|
||||
}
|
||||
|
||||
void ledToggle(int led)
|
||||
{
|
||||
if (led < 0 || led >= (int)ARRAYLEN(leds)) {
|
||||
return;
|
||||
}
|
||||
IOToggle(leds[led]);
|
||||
}
|
||||
|
||||
void ledSet(int led, bool on)
|
||||
{
|
||||
const bool inverted = (1 << (led)) & ledInversion;
|
||||
if (led < 0 || led >= (int)ARRAYLEN(leds)) {
|
||||
return;
|
||||
}
|
||||
const bool inverted = ledInversion & (1 << led);
|
||||
IOWrite(leds[led], on ? inverted : !inverted);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -24,31 +24,9 @@
|
|||
#include "drivers/io_types.h"
|
||||
#include "common/utils.h"
|
||||
|
||||
#define STATUS_LED_NUMBER 3
|
||||
|
||||
typedef struct statusLedConfig_s {
|
||||
ioTag_t ioTags[STATUS_LED_NUMBER];
|
||||
uint8_t inversion;
|
||||
} statusLedConfig_t;
|
||||
#define STATUS_LED_COUNT 3
|
||||
|
||||
// Helpful macros
|
||||
#if defined(UNIT_TEST) || defined(USE_VIRTUAL_LED)
|
||||
|
||||
#define LED0_TOGGLE NOOP
|
||||
#define LED0_OFF NOOP
|
||||
#define LED0_ON NOOP
|
||||
|
||||
#define LED1_TOGGLE NOOP
|
||||
#define LED1_OFF NOOP
|
||||
#define LED1_ON NOOP
|
||||
|
||||
#define LED2_TOGGLE NOOP
|
||||
#define LED2_OFF NOOP
|
||||
#define LED2_ON NOOP
|
||||
|
||||
#else
|
||||
|
||||
PG_DECLARE(statusLedConfig_t, statusLedConfig);
|
||||
|
||||
#define LED0_TOGGLE ledToggle(0)
|
||||
#define LED0_OFF ledSet(0, false)
|
||||
|
@ -62,6 +40,22 @@ PG_DECLARE(statusLedConfig_t, statusLedConfig);
|
|||
#define LED2_OFF ledSet(2, false)
|
||||
#define LED2_ON ledSet(2, true)
|
||||
|
||||
// use dummy functions for unittest
|
||||
#if defined(USE_VIRTUAL_LED)
|
||||
|
||||
// ledInit is missing intentionally
|
||||
static inline void ledToggle(int led) { UNUSED(led); }
|
||||
static inline void ledSet(int led, bool state) { UNUSED(led); UNUSED(state); }
|
||||
|
||||
#else
|
||||
|
||||
typedef struct statusLedConfig_s {
|
||||
ioTag_t ioTags[STATUS_LED_COUNT];
|
||||
uint8_t inversion;
|
||||
} statusLedConfig_t;
|
||||
|
||||
PG_DECLARE(statusLedConfig_t, statusLedConfig);
|
||||
|
||||
void ledInit(const statusLedConfig_t *statusLedConfig);
|
||||
void ledToggle(int led);
|
||||
void ledSet(int led, bool state);
|
||||
|
|
|
@ -58,6 +58,7 @@
|
|||
#define USE_LED_STRIP_STATUS_MODE
|
||||
#define USE_SERVOS
|
||||
#define USE_TRANSPONDER
|
||||
#define USE_VIRTUAL_LED
|
||||
#define USE_VCP
|
||||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue