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

View File

@@ -14,6 +14,7 @@ CLI::~CLI() {}
void CLI::load() { void CLI::load() {
String defaultValue = String(CLI_DEFAULT_AUTOSTART); String defaultValue = String(CLI_DEFAULT_AUTOSTART);
checkFile(execPath, defaultValue); checkFile(execPath, defaultValue);
execFile(execPath); execFile(execPath);
} }
@@ -689,7 +690,7 @@ void CLI::runCommand(String input) {
// ===== STOP ===== // // ===== STOP ===== //
// stop [<mode>] // stop [<mode>]
else if (eqlsCMD(0, CLI_STOP)) { else if (eqlsCMD(0, CLI_STOP)) {
led.setMode(led.LED_MODE::IDLE, true); led.setMode(IDLE, true);
if ((list->size() >= 2) && !(eqlsCMD(1, CLI_ALL))) { if ((list->size() >= 2) && !(eqlsCMD(1, CLI_ALL))) {
for (int i = 1; i < list->size(); i++) { for (int i = 1; i < list->size(); i++) {

View File

@@ -1,79 +1,72 @@
#include "LED.h" #include "LED.h"
LED::LED() {} // Strings used in printColor and tempDisable
#include "language.h"
LED::~LED() { // For Update()
if (led) delete led; #include "Settings.h"
} #include "Attack.h"
#include "Scan.h"
void LED::setup() { extern Settings settings;
#if defined(DIGITAL_LED) extern Attack attack;
led = new DigitalLED(LED_PIN_R, LED_PIN_G, LED_PIN_B, LED_ANODE); extern Scan scan;
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() { void LED::update() {
if (!tempEnabled || !led) return; if (!tempEnabled) return;
if (!settings.getLedEnabled() && tempEnabled) tempDisable(); 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 (scan.isScanning() && (scan.deauths < settings.getMinDeauths())) {
if (!led) return; setMode(SCAN);
} else if (scan.deauths >= settings.getMinDeauths()) {
if ((mode != LED::mode) || force) { setMode(DEAUTH);
LED::mode = mode; } else if (attack.isRunning()) {
setMode(ATTACK);
switch (mode) { } else {
case LED_MODE::OFF: setMode(IDLE);
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) { void LED::printColor(uint8_t r, uint8_t g, uint8_t b) {
// debug output
if (output) {
char s[30]; char s[30];
sprintf_P(s, L_OUTPUT, r, g, b); sprintf_P(s, L_OUTPUT, r, g, b);
prnt(String(s)); prnt(String(s));
} }
led->setColor(r, g, b); 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::setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t brightness, bool output) { void LED::setBrightness(uint8_t brightness) {
led->setBrightness(brightness); this->brightness = brightness % 100;
setColor(r, g, b, output);
} }
void LED::tempEnable() { void LED::tempEnable() {
@@ -89,117 +82,3 @@ void LED::tempDisable() {
bool LED::getTempEnabled() { bool LED::getTempEnabled() {
return tempEnabled; 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

View File

@@ -1,107 +1,126 @@
#ifndef LED_h #ifndef LED_h
#define LED_h #define LED_h
#include "Arduino.h" #include "Arduino.h" // digitalWrite, analogWrite, pinMode
extern "C" { #include "A_config.h" // Config for LEDs
#include "user_interface.h"
}
#include "language.h"
#include "A_config.h"
#include "Settings.h"
#include "Attack.h"
#include "Scan.h"
// Inlcude libraries for Neopixel or MY92xx if used
#if defined(NEOPIXEL_LED)
#include <Adafruit_NeoPixel.h> #include <Adafruit_NeoPixel.h>
#elif defined(MY92)
#include <my92xx.h>
#endif // if defined(NEOPIXEL_LED)
extern Settings settings; enum LED_MODE {
extern Attack attack; OFF = 0,
extern Scan scan; SCAN = 1,
extern Stations stations; ATTACK = 2,
DEAUTH = 3,
IDLE = 4
};
class LED { 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: public:
enum LED_MODE { OFF = 0, SCAN = 1, ATTACK = 2, DEAUTH = 3, IDLE = 4 }; void setup() {
analogWriteRange(0xff);
LED(); #if defined(LED_MODE_BRIGHTNESS)
~LED(); 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 setup();
void update(); void update();
void setMode(uint8_t mode, bool force); void printColor(uint8_t r, uint8_t g, uint8_t b);
void setColor(uint8_t r, uint8_t g, uint8_t b, bool output); void setMode(LED_MODE mode, bool force = false);
void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t brightness, bool output); 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 tempEnable();
void tempDisable(); void tempDisable();
bool getTempEnabled(); 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 #endif // ifndef LED_h