Refactored LED class

No more sub classes for faster compile times.
Libraries like Neopixel are only included if needed and there are less variables in the RAM.
This commit is contained in:
Stefan Kremser 2019-05-08 15:47:41 +02:00
parent 34915e2138
commit 4252b4f2f6
3 changed files with 1384 additions and 1485 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,205 +1,84 @@
#include "LED.h"
LED::LED() {}
LED::~LED() {
if (led) delete led;
}
void LED::setup() {
#if defined(DIGITAL_LED)
led = new DigitalLED(LED_PIN_R, LED_PIN_G, LED_PIN_B, LED_ANODE);
led->setup();
#elif defined(RGB_LED)
led = new LED::AnalogRGBLED(LED_PIN_R, LED_PIN_G, LED_PIN_B, LED_MODE_BRIGHTNESS, LED_ANODE);
led->setup();
#elif defined(NEOPIXEL_LED)
led = new LED::NeopixelLED(LED_NEOPIXEL_NUM, LED_NEOPIXEL_PIN, LED_MODE_BRIGHTNESS);
led->setup();
#endif // if defined(DIGITAL_LED)
}
void LED::update() {
if (!tempEnabled || !led) return;
if (!settings.getLedEnabled() && tempEnabled) tempDisable();
if (scan.isScanning() && (scan.deauths < settings.getMinDeauths())) setMode(LED_MODE::SCAN, false);
else if (scan.deauths >= settings.getMinDeauths()) setMode(LED_MODE::DEAUTH, false);
else if (attack.isRunning()) setMode(LED_MODE::ATTACK, false);
else setMode(LED_MODE::IDLE, false);
}
void LED::setMode(uint8_t mode, bool force) {
if (!led) return;
if ((mode != LED::mode) || force) {
LED::mode = mode;
switch (mode) {
case LED_MODE::OFF:
led->setColor(0, 0, 0);
break;
case LED_MODE::SCAN:
led->setColor(0, 0, 255);
break;
case LED_MODE::ATTACK:
led->setColor(255, 255, 0);
break;
case LED_MODE::DEAUTH:
led->setColor(255, 0, 0);
break;
case LED_MODE::IDLE:
led->setColor(0, 255, 0);
break;
}
}
}
void LED::setColor(uint8_t r, uint8_t g, uint8_t b, bool output) {
// debug output
if (output) {
char s[30];
sprintf_P(s, L_OUTPUT, r, g, b);
prnt(String(s));
}
led->setColor(r, g, b);
}
void LED::setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t brightness, bool output) {
led->setBrightness(brightness);
setColor(r, g, b, output);
}
void LED::tempEnable() {
tempEnabled = true;
prntln(L_ENABLED);
}
void LED::tempDisable() {
tempEnabled = false;
prntln(L_DISABLED);
}
bool LED::getTempEnabled() {
return tempEnabled;
}
#ifdef DIGITAL_LED
// ===== DigitalLED ===== //
LED::DigitalLED::DigitalLED(uint8_t rPin, uint8_t gPin, uint8_t bPin, bool anode) {
LED::DigitalLED::anode = anode;
LED::DigitalLED::rPin = rPin;
LED::DigitalLED::gPin = gPin;
LED::DigitalLED::bPin = bPin;
}
LED::DigitalLED::~DigitalLED() {}
void LED::DigitalLED::setup() {
if (rPin < 255) pinMode(rPin, OUTPUT);
if (gPin < 255) pinMode(gPin, OUTPUT);
if (bPin < 255) pinMode(bPin, OUTPUT);
}
void LED::DigitalLED::setColor(uint8_t r, uint8_t g, uint8_t b) {
if (anode) {
if (rPin < 255) digitalWrite(rPin, r > 0);
if (gPin < 255) digitalWrite(gPin, g > 0);
if (bPin < 255) digitalWrite(bPin, b > 0);
} else {
if (rPin < 255) digitalWrite(rPin, r == 0);
if (gPin < 255) digitalWrite(gPin, g == 0);
if (bPin < 255) digitalWrite(bPin, b == 0);
}
}
void LED::DigitalLED::setBrightness(uint8_t brightness) {}
#endif
#ifdef RGB_LED
// ===== AnalogRGBLED ===== //
LED::AnalogRGBLED::AnalogRGBLED(uint8_t rPin, uint8_t gPin, uint8_t bPin, uint8_t brightness, bool anode) {
LED::AnalogRGBLED::anode = anode;
LED::AnalogRGBLED::rPin = rPin;
LED::AnalogRGBLED::gPin = gPin;
LED::AnalogRGBLED::bPin = bPin;
setBrightness(brightness);
}
LED::AnalogRGBLED::~AnalogRGBLED() {}
void LED::AnalogRGBLED::setup() {
analogWriteRange(0xff);
if (rPin < 255) pinMode(rPin, OUTPUT);
if (gPin < 255) pinMode(gPin, OUTPUT);
if (bPin < 255) pinMode(bPin, OUTPUT);
}
void LED::AnalogRGBLED::setColor(uint8_t r, uint8_t g, uint8_t b) {
if ((r > 0) && (brightness < 100)) r = r * brightness / 100;
if ((g > 0) && (brightness < 100)) g = g * brightness / 100;
if ((b > 0) && (brightness < 100)) b = b * brightness / 100;
if (anode) {
r = 255 - r;
g = 255 - g;
b = 255 - b;
}
analogWrite(rPin, r);
analogWrite(gPin, g);
analogWrite(bPin, b);
}
void LED::AnalogRGBLED::setBrightness(uint8_t brightness) {
if (brightness > 100) brightness = 100;
LED::AnalogRGBLED::brightness = brightness;
}
#endif
#ifdef NEOPIXEL_LED
// ===== NeopixelLED ===== //
LED::NeopixelLED::NeopixelLED(int num, uint8_t dataPin, uint8_t brightness) {
strip = new Adafruit_NeoPixel(num, dataPin, LED_NEOPIXEL_MODE);
setBrightness(brightness);
}
LED::NeopixelLED::~NeopixelLED() {
delete strip;
}
void LED::NeopixelLED::setup() {
strip->begin();
strip->show();
}
void LED::NeopixelLED::setColor(uint8_t r, uint8_t g, uint8_t b) {
int num = strip->numPixels();
for (uint16_t i = 0; i < num; i++) strip->setPixelColor(i, strip->Color(r, g, b));
strip->show();
}
void LED::NeopixelLED::setBrightness(uint8_t brightness) {
if (brightness > 100) brightness = 100;
strip->setBrightness(brightness);
}
#endif
#include "LED.h"
// Strings used in printColor and tempDisable
#include "language.h"
// For Update()
#include "Settings.h"
#include "Attack.h"
#include "Scan.h"
extern Settings settings;
extern Attack attack;
extern Scan scan;
void LED::update() {
if (!tempEnabled) return;
if (!settings.getLedEnabled() && tempEnabled) {
tempDisable();
}
if (scan.isScanning() && (scan.deauths < settings.getMinDeauths())) {
setMode(SCAN);
} else if (scan.deauths >= settings.getMinDeauths()) {
setMode(DEAUTH);
} else if (attack.isRunning()) {
setMode(ATTACK);
} else {
setMode(IDLE);
}
}
void LED::printColor(uint8_t r, uint8_t g, uint8_t b) {
char s[30];
sprintf_P(s, L_OUTPUT, r, g, b);
prnt(String(s));
}
void LED::setMode(LED_MODE mode, bool force) {
if ((mode != this->mode) || force) {
this->mode = mode;
switch (mode) {
case OFF:
setColor(0, 0, 0);
break;
case SCAN:
setColor(0, 0, 255);
break;
case ATTACK:
setColor(255, 0, 0);
break;
case DEAUTH:
setColor(255, 0, 0);
break;
case IDLE:
setColor(0, 255, 0);
break;
}
}
}
void LED::setBrightness(uint8_t brightness) {
this->brightness = brightness % 100;
}
void LED::tempEnable() {
tempEnabled = true;
prntln(L_ENABLED);
}
void LED::tempDisable() {
tempEnabled = false;
prntln(L_DISABLED);
}
bool LED::getTempEnabled() {
return tempEnabled;
}

View File

@ -1,107 +1,126 @@
#ifndef LED_h
#define LED_h
#include "Arduino.h"
extern "C" {
#include "user_interface.h"
}
#include "language.h"
#include "A_config.h"
#include "Settings.h"
#include "Attack.h"
#include "Scan.h"
#include <Adafruit_NeoPixel.h>
extern Settings settings;
extern Attack attack;
extern Scan scan;
extern Stations stations;
class LED {
public:
enum LED_MODE { OFF = 0, SCAN = 1, ATTACK = 2, DEAUTH = 3, IDLE = 4 };
LED();
~LED();
void setup();
void update();
void setMode(uint8_t mode, bool force);
void setColor(uint8_t r, uint8_t g, uint8_t b, bool output);
void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t brightness, bool output);
void tempEnable();
void tempDisable();
bool getTempEnabled();
private:
class StatusLED {
public:
virtual ~StatusLED() = default;
virtual void setup() = 0;
virtual void setColor(uint8_t r, uint8_t g, uint8_t b) = 0;
virtual void setBrightness(uint8_t brightness) = 0;
};
#ifdef DIGITAL_LED
class DigitalLED : public StatusLED {
public:
DigitalLED(uint8_t rPin, uint8_t gPin, uint8_t bPin, bool anode);
~DigitalLED();
void setup();
void setColor(uint8_t r, uint8_t g, uint8_t b);
void setBrightness(uint8_t brightness);
void setMode(uint8_t mode, bool force);
private:
bool anode = true;
uint8_t rPin = 255;
uint8_t gPin = 255;
uint8_t bPin = 255;
};
#endif
#ifdef RGB_LED
class AnalogRGBLED : public StatusLED {
public:
AnalogRGBLED(uint8_t rPin, uint8_t gPin, uint8_t bPin, uint8_t brightness, bool anode);
~AnalogRGBLED();
void setup();
void setColor(uint8_t r, uint8_t g, uint8_t b);
void setBrightness(uint8_t brightness);
void setMode(uint8_t mode, bool force);
private:
bool anode = true;
uint8_t rPin = 255;
uint8_t gPin = 255;
uint8_t bPin = 255;
uint8_t brightness = 0;
};
#endif
#ifdef NEOPIXEL_LED
class NeopixelLED : public StatusLED {
public:
NeopixelLED(int num, uint8_t dataPin, uint8_t brightness);
~NeopixelLED();
void setup();
void setColor(uint8_t r, uint8_t g, uint8_t b);
void setBrightness(uint8_t brightness);
void setMode(uint8_t mode, bool force);
private:
Adafruit_NeoPixel* strip;
};
#endif
bool tempEnabled = true;
uint8_t mode = LED_MODE::OFF;
StatusLED* led = NULL;
};
#endif // ifndef LED_h
#ifndef LED_h
#define LED_h
#include "Arduino.h" // digitalWrite, analogWrite, pinMode
#include "A_config.h" // Config for LEDs
// Inlcude libraries for Neopixel or MY92xx if used
#if defined(NEOPIXEL_LED)
#include <Adafruit_NeoPixel.h>
#elif defined(MY92)
#include <my92xx.h>
#endif // if defined(NEOPIXEL_LED)
enum LED_MODE {
OFF = 0,
SCAN = 1,
ATTACK = 2,
DEAUTH = 3,
IDLE = 4
};
class LED {
private:
bool tempEnabled = true;
LED_MODE mode = OFF;
uint8_t brightness = 100;
#if defined(NEOPIXEL_LED)
Adafruit_NeoPixel strip(LED_NEOPIXEL_NUM, LED_NEOPIXEL_PIN, LED_NEOPIXEL_MODE);
#elif defined(MY92)
my92xx myled(MY92_MODEL, MY92_NUM, MY92_DATA, MY92_CLK, MY92XX_COMMAND_DEFAULT);
#endif // if defined(NEOPIXEL_LED)
public:
void setup() {
analogWriteRange(0xff);
#if defined(LED_MODE_BRIGHTNESS)
brightness = LED_MODE_BRIGHTNESS;
#endif // if defined(LED_MODE_BRIGHTNESS)
#if defined(DIGITAL_LED) || defined(RGB_LED)
if (LED_PIN_R < 255) pinMode(LED_PIN_R, OUTPUT);
if (LED_PIN_G < 255) pinMode(LED_PIN_G, OUTPUT);
if (LED_PIN_B < 255) pinMode(LED_PIN_B, OUTPUT);
#elif defined(NEOPIXEL_LED)
strip.begin();
strip.setBrightness(brightness);
strip.show();
#elif defined(MY9291)
myled.setChannel(MY92_CH_R, 0);
myled.setChannel(MY92_CH_G, 0);
myled.setChannel(MY92_CH_B, 0);
myled->setChannel(MY92_CH_BRIGHTNESS, brightness);
myled->setChannel(3, 100);
myled.setState(true);
myled.update();
#endif // if defined(DIGITAL_LED) || defined(RGB_LED)
}
void update();
void printColor(uint8_t r, uint8_t g, uint8_t b);
void setMode(LED_MODE mode, bool force = false);
void setBrightness(uint8_t brightness);
void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t brightness, bool output = false) {
setBrightness(brightness);
setColor(r, g, b, output);
}
void setColor(uint8_t r, uint8_t g, uint8_t b, bool output = false) {
if (output) printColor(r, g, b);
#if defined(DIGITAL_LED)
if (LED_ANODE) {
if (LED_PIN_R < 255) digitalWrite(LED_PIN_R, r > 0);
if (LED_PIN_G < 255) digitalWrite(LED_PIN_G, g > 0);
if (LED_PIN_B < 255) digitalWrite(LED_PIN_B, b > 0);
} else {
if (LED_PIN_R < 255) digitalWrite(LED_PIN_R, r == 0);
if (LED_PIN_G < 255) digitalWrite(LED_PIN_G, g == 0);
if (LED_PIN_B < 255) digitalWrite(LED_PIN_B, b == 0);
}
#elif defined(RGB_LED)
if ((r > 0) && (brightness > 0)) r = r * brightness / 100;
if ((g > 0) && (brightness > 0)) g = g * brightness / 100;
if ((b > 0) && (brightness > 0)) b = b * brightness / 100;
if (LED_ANODE) {
r = 255 - r;
g = 255 - g;
b = 255 - b;
}
analogWrite(LED_PIN_R, r);
analogWrite(LED_PIN_G, g);
analogWrite(LED_PIN_B, b);
#elif defined(NEOPIXEL_LED)
if ((r > 0) && (brightness > 0)) r = r * brightness / 100;
if ((g > 0) && (brightness > 0)) g = g * brightness / 100;
if ((b > 0) && (brightness > 0)) b = b * brightness / 100;
for (size_t i = 0; i < LED_NEOPIXEL_NUM; i++) {
strip.setPixelColor(i, r, g, b);
}
strip.show();
#elif defined(MY9291)
myled->setChannel(MY92_CH_R, r);
myled->setChannel(MY92_CH_G, g);
myled->setChannel(MY92_CH_B, b);
myled->setChannel(MY92_CH_BRIGHTNESS, brightness);
myled->setState(true);
myled->update();
#endif // if defined(DIGITAL_LED)
}
void tempEnable();
void tempDisable();
bool getTempEnabled();
};
#endif // ifndef LED_h