mirror of
https://github.com/meshtastic/firmware.git
synced 2025-02-26 22:33:24 +00:00

Some checks are pending
CI / setup (check) (push) Waiting to run
CI / setup (esp32) (push) Waiting to run
CI / setup (esp32c3) (push) Waiting to run
CI / setup (esp32c6) (push) Waiting to run
CI / setup (esp32s3) (push) Waiting to run
CI / setup (nrf52840) (push) Waiting to run
CI / setup (rp2040) (push) Waiting to run
CI / setup (stm32) (push) Waiting to run
CI / check (push) Blocked by required conditions
CI / build-esp32 (push) Blocked by required conditions
CI / build-esp32-s3 (push) Blocked by required conditions
CI / build-esp32-c3 (push) Blocked by required conditions
CI / build-esp32-c6 (push) Blocked by required conditions
CI / build-nrf52 (push) Blocked by required conditions
CI / build-rpi2040 (push) Blocked by required conditions
CI / build-stm32 (push) Blocked by required conditions
CI / package-raspbian (push) Waiting to run
CI / package-raspbian-armv7l (push) Waiting to run
CI / package-native (push) Waiting to run
CI / after-checks (push) Blocked by required conditions
CI / gather-artifacts (esp32) (push) Blocked by required conditions
CI / gather-artifacts (esp32c3) (push) Blocked by required conditions
CI / gather-artifacts (esp32c6) (push) Blocked by required conditions
CI / gather-artifacts (esp32s3) (push) Blocked by required conditions
CI / gather-artifacts (nrf52840) (push) Blocked by required conditions
CI / gather-artifacts (rp2040) (push) Blocked by required conditions
CI / gather-artifacts (stm32) (push) Blocked by required conditions
CI / release-artifacts (push) Blocked by required conditions
CI / release-firmware (esp32) (push) Blocked by required conditions
CI / release-firmware (esp32c3) (push) Blocked by required conditions
CI / release-firmware (esp32c6) (push) Blocked by required conditions
CI / release-firmware (esp32s3) (push) Blocked by required conditions
CI / release-firmware (nrf52840) (push) Blocked by required conditions
CI / release-firmware (rp2040) (push) Blocked by required conditions
CI / release-firmware (stm32) (push) Blocked by required conditions
Flawfinder Scan / Flawfinder (push) Waiting to run
* Now with even fewer ings * Ye * Mo * QMA6100PSensor
186 lines
6.9 KiB
C++
186 lines
6.9 KiB
C++
#include "Observer.h"
|
|
#include "configuration.h"
|
|
|
|
#ifdef HAS_NCP5623
|
|
#include <graphics/RAKled.h>
|
|
NCP5623 rgb;
|
|
#endif
|
|
|
|
#ifdef HAS_NEOPIXEL
|
|
#include <graphics/NeoPixel.h>
|
|
Adafruit_NeoPixel pixels(NEOPIXEL_COUNT, NEOPIXEL_DATA, NEOPIXEL_TYPE);
|
|
#endif
|
|
|
|
#ifdef UNPHONE
|
|
#include "unPhone.h"
|
|
extern unPhone unphone;
|
|
#endif
|
|
|
|
namespace concurrency
|
|
{
|
|
class AmbientLightingThread : public concurrency::OSThread
|
|
{
|
|
public:
|
|
explicit AmbientLightingThread(ScanI2C::DeviceType type) : OSThread("AmbientLighting")
|
|
{
|
|
notifyDeepSleepObserver.observe(¬ifyDeepSleep); // Let us know when shutdown() is issued.
|
|
|
|
// Enables Ambient Lighting by default if conditions are meet.
|
|
#if defined(HAS_NCP5623) || defined(RGBLED_RED) || defined(HAS_NEOPIXEL) || defined(UNPHONE)
|
|
#ifdef ENABLE_AMBIENTLIGHTING
|
|
moduleConfig.ambient_lighting.led_state = true;
|
|
#endif
|
|
#endif
|
|
// Uncomment to test module
|
|
// moduleConfig.ambient_lighting.led_state = true;
|
|
// moduleConfig.ambient_lighting.current = 10;
|
|
// Default to a color based on our node number
|
|
// moduleConfig.ambient_lighting.red = (myNodeInfo.my_node_num & 0xFF0000) >> 16;
|
|
// moduleConfig.ambient_lighting.green = (myNodeInfo.my_node_num & 0x00FF00) >> 8;
|
|
// moduleConfig.ambient_lighting.blue = myNodeInfo.my_node_num & 0x0000FF;
|
|
|
|
#ifdef HAS_NCP5623
|
|
_type = type;
|
|
if (_type == ScanI2C::DeviceType::NONE) {
|
|
LOG_DEBUG("AmbientLighting Disable due to no RGB leds found on I2C bus");
|
|
disable();
|
|
return;
|
|
}
|
|
#endif
|
|
#if defined(HAS_NCP5623) || defined(RGBLED_RED) || defined(HAS_NEOPIXEL) || defined(UNPHONE)
|
|
if (!moduleConfig.ambient_lighting.led_state) {
|
|
LOG_DEBUG("AmbientLighting Disable due to moduleConfig.ambient_lighting.led_state OFF");
|
|
disable();
|
|
return;
|
|
}
|
|
LOG_DEBUG("AmbientLighting init");
|
|
#ifdef HAS_NCP5623
|
|
if (_type == ScanI2C::NCP5623) {
|
|
rgb.begin();
|
|
#endif
|
|
#ifdef RGBLED_RED
|
|
pinMode(RGBLED_RED, OUTPUT);
|
|
pinMode(RGBLED_GREEN, OUTPUT);
|
|
pinMode(RGBLED_BLUE, OUTPUT);
|
|
#endif
|
|
#ifdef HAS_NEOPIXEL
|
|
pixels.begin(); // Initialise the pixel(s)
|
|
pixels.clear(); // Set all pixel colors to 'off'
|
|
pixels.setBrightness(moduleConfig.ambient_lighting.current);
|
|
#endif
|
|
setLighting();
|
|
#endif
|
|
#ifdef HAS_NCP5623
|
|
}
|
|
#endif
|
|
}
|
|
|
|
protected:
|
|
int32_t runOnce() override
|
|
{
|
|
#if defined(HAS_NCP5623) || defined(RGBLED_RED) || defined(HAS_NEOPIXEL) || defined(UNPHONE)
|
|
#ifdef HAS_NCP5623
|
|
if (_type == ScanI2C::NCP5623 && moduleConfig.ambient_lighting.led_state) {
|
|
#endif
|
|
setLighting();
|
|
return 30000; // 30 seconds to reset from any animations that may have been running from Ext. Notification
|
|
#ifdef HAS_NCP5623
|
|
}
|
|
#endif
|
|
#endif
|
|
return disable();
|
|
}
|
|
|
|
// When shutdown() is issued, setLightingOff will be called.
|
|
CallbackObserver<AmbientLightingThread, void *> notifyDeepSleepObserver =
|
|
CallbackObserver<AmbientLightingThread, void *>(this, &AmbientLightingThread::setLightingOff);
|
|
|
|
private:
|
|
ScanI2C::DeviceType _type = ScanI2C::DeviceType::NONE;
|
|
|
|
// Turn RGB lighting off, is used in junction to shutdown()
|
|
int setLightingOff(void *unused)
|
|
{
|
|
#ifdef HAS_NCP5623
|
|
rgb.setCurrent(0);
|
|
rgb.setRed(0);
|
|
rgb.setGreen(0);
|
|
rgb.setBlue(0);
|
|
LOG_INFO("OFF: NCP5623 Ambient lighting");
|
|
#endif
|
|
#ifdef HAS_NEOPIXEL
|
|
pixels.clear();
|
|
pixels.show();
|
|
LOG_INFO("OFF: NeoPixel Ambient lighting");
|
|
#endif
|
|
#ifdef RGBLED_CA
|
|
analogWrite(RGBLED_RED, 255 - 0);
|
|
analogWrite(RGBLED_GREEN, 255 - 0);
|
|
analogWrite(RGBLED_BLUE, 255 - 0);
|
|
LOG_INFO("OFF: Ambient light RGB Common Anode");
|
|
#elif defined(RGBLED_RED)
|
|
analogWrite(RGBLED_RED, 0);
|
|
analogWrite(RGBLED_GREEN, 0);
|
|
analogWrite(RGBLED_BLUE, 0);
|
|
LOG_INFO("OFF: Ambient light RGB Common Cathode");
|
|
#endif
|
|
#ifdef UNPHONE
|
|
unphone.rgb(0, 0, 0);
|
|
LOG_INFO("OFF: unPhone Ambient lighting");
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
void setLighting()
|
|
{
|
|
#ifdef HAS_NCP5623
|
|
rgb.setCurrent(moduleConfig.ambient_lighting.current);
|
|
rgb.setRed(moduleConfig.ambient_lighting.red);
|
|
rgb.setGreen(moduleConfig.ambient_lighting.green);
|
|
rgb.setBlue(moduleConfig.ambient_lighting.blue);
|
|
LOG_DEBUG("Init NCP5623 Ambient light w/ current=%d, red=%d, green=%d, blue=%d", moduleConfig.ambient_lighting.current,
|
|
moduleConfig.ambient_lighting.red, moduleConfig.ambient_lighting.green, moduleConfig.ambient_lighting.blue);
|
|
#endif
|
|
#ifdef HAS_NEOPIXEL
|
|
pixels.fill(pixels.Color(moduleConfig.ambient_lighting.red, moduleConfig.ambient_lighting.green,
|
|
moduleConfig.ambient_lighting.blue),
|
|
0, NEOPIXEL_COUNT);
|
|
|
|
// RadioMaster Bandit has addressable LED at the two buttons
|
|
// this allow us to set different lighting for them in variant.h file.
|
|
#ifdef RADIOMASTER_900_BANDIT
|
|
#if defined(BUTTON1_COLOR) && defined(BUTTON1_COLOR_INDEX)
|
|
pixels.fill(BUTTON1_COLOR, BUTTON1_COLOR_INDEX, 1);
|
|
#endif
|
|
#if defined(BUTTON2_COLOR) && defined(BUTTON2_COLOR_INDEX)
|
|
pixels.fill(BUTTON2_COLOR, BUTTON1_COLOR_INDEX, 1);
|
|
#endif
|
|
#endif
|
|
pixels.show();
|
|
LOG_DEBUG("Init NeoPixel Ambient light w/ brightness(current)=%d, red=%d, green=%d, blue=%d",
|
|
moduleConfig.ambient_lighting.current, moduleConfig.ambient_lighting.red, moduleConfig.ambient_lighting.green,
|
|
moduleConfig.ambient_lighting.blue);
|
|
#endif
|
|
#ifdef RGBLED_CA
|
|
analogWrite(RGBLED_RED, 255 - moduleConfig.ambient_lighting.red);
|
|
analogWrite(RGBLED_GREEN, 255 - moduleConfig.ambient_lighting.green);
|
|
analogWrite(RGBLED_BLUE, 255 - moduleConfig.ambient_lighting.blue);
|
|
LOG_DEBUG("Init Ambient light RGB Common Anode w/ red=%d, green=%d, blue=%d", moduleConfig.ambient_lighting.red,
|
|
moduleConfig.ambient_lighting.green, moduleConfig.ambient_lighting.blue);
|
|
#elif defined(RGBLED_RED)
|
|
analogWrite(RGBLED_RED, moduleConfig.ambient_lighting.red);
|
|
analogWrite(RGBLED_GREEN, moduleConfig.ambient_lighting.green);
|
|
analogWrite(RGBLED_BLUE, moduleConfig.ambient_lighting.blue);
|
|
LOG_DEBUG("Init Ambient light RGB Common Cathode w/ red=%d, green=%d, blue=%d", moduleConfig.ambient_lighting.red,
|
|
moduleConfig.ambient_lighting.green, moduleConfig.ambient_lighting.blue);
|
|
#endif
|
|
#ifdef UNPHONE
|
|
unphone.rgb(moduleConfig.ambient_lighting.red, moduleConfig.ambient_lighting.green, moduleConfig.ambient_lighting.blue);
|
|
LOG_DEBUG("Init unPhone Ambient light w/ red=%d, green=%d, blue=%d", moduleConfig.ambient_lighting.red,
|
|
moduleConfig.ambient_lighting.green, moduleConfig.ambient_lighting.blue);
|
|
#endif
|
|
}
|
|
};
|
|
|
|
} // namespace concurrency
|