Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
175 changes: 19 additions & 156 deletions src/DisplayManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <HTTPClient.h>
#include "base64.hpp"
#include "Games/GameManager.h"
#include "Indicators.h"

unsigned long lastArtnetStatusTime = 0;
const int numberOfChannels = 256 * 3;
Expand Down Expand Up @@ -1659,9 +1660,9 @@ String DisplayManager_::getStats()
doc[SignalStrengthKey] = WiFi.RSSI();
doc[MessagesKey] = RECEIVED_MESSAGES;
doc[VersionKey] = VERSION;
doc[F("indicator1")] = ui->indicator1State;
doc[F("indicator2")] = ui->indicator2State;
doc[F("indicator3")] = ui->indicator3State;
doc[F("indicator1")] = getIndicatorState(1);
doc[F("indicator2")] = getIndicatorState(2);
doc[F("indicator3")] = getIndicatorState(3);
doc[F("app")] = CURRENT_APP;
doc[F("uid")] = uniqueID;
doc[F("matrix")] = !MATRIX_OFF;
Expand Down Expand Up @@ -1754,64 +1755,15 @@ void DisplayManager_::setPower(bool state)
}
}

void DisplayManager_::setIndicator1Color(uint32_t color)
{
ui->setIndicator1Color(color);
}

void DisplayManager_::setIndicator1State(bool state)
{
ui->setIndicator1State(state);
}

void DisplayManager_::setIndicator2Color(uint32_t color)
{
ui->setIndicator2Color(color);
}

void DisplayManager_::setIndicator2State(bool state)
{
ui->setIndicator2State(state);
}

void DisplayManager_::setIndicator3Color(uint32_t color)
{
ui->setIndicator3Color(color);
}

void DisplayManager_::setIndicator3State(bool state)
{
ui->setIndicator3State(state);
}

bool DisplayManager_::indicatorParser(uint8_t indicator, const char *json)
{

if (strcmp(json, "") == 0 || strcmp(json, "{}") == 0)
{
switch (indicator)
{
case 1:
ui->setIndicator1State(false);
ui->setIndicator1Fade(0);
ui->setIndicator1Blink(0);
MQTTManager.setIndicatorState(1, ui->indicator1State, ui->indicator1Color);
break;
case 2:
ui->setIndicator2State(false);
ui->setIndicator2Fade(0);
ui->setIndicator2Blink(0);
MQTTManager.setIndicatorState(2, ui->indicator2State, ui->indicator2Color);
break;
case 3:
ui->setIndicator3State(false);
ui->setIndicator3Fade(0);
ui->setIndicator3Blink(0);
MQTTManager.setIndicatorState(3, ui->indicator3State, ui->indicator3Color);
break;
default:
break;
}
setIndicatorState(indicator, false);
setIndicatorFade(indicator, 0);
setIndicatorBlink(indicator, 0);
MQTTManager.setIndicatorState(indicator, getIndicatorState(indicator), getIndicatorColor(indicator));
return true;
}

Expand All @@ -1828,114 +1780,25 @@ bool DisplayManager_::indicatorParser(uint8_t indicator, const char *json)

if (col > 0)
{
switch (indicator)
{
case 1:
ui->setIndicator1State(true);
ui->setIndicator1Color(col);
break;
case 2:
ui->setIndicator2State(true);
ui->setIndicator2Color(col);
break;
case 3:
ui->setIndicator3State(true);
ui->setIndicator3Color(col);
break;
default:
break;
}
setIndicatorState(indicator, true);
setIndicatorColor(indicator, col);
}
else
{
switch (indicator)
{
case 1:
ui->setIndicator1State(false);
break;
case 2:
ui->setIndicator2State(false);
break;
case 3:
ui->setIndicator3State(false);
break;
default:
break;
}
setIndicatorState(indicator, false);
}
}

if (doc.containsKey("blink"))
{
switch (indicator)
{
case 1:
ui->setIndicator1Blink(doc["blink"].as<int>());
break;
case 2:
ui->setIndicator2Blink(doc["blink"].as<int>());
break;
case 3:
ui->setIndicator3Blink(doc["blink"].as<int>());
break;
default:
break;
}
}
else
{
switch (indicator)
{
case 1:
ui->setIndicator1Blink(0);
break;
case 2:
ui->setIndicator2Blink(0);
break;
case 3:
ui->setIndicator3Blink(0);
break;
default:
break;
}
}
setIndicatorBlink(indicator,
doc.containsKey("blink") ? doc["blink"].as<int>() : 0
);

setIndicatorFade(indicator,
doc.containsKey("fade") ? doc["fade"].as<int>() : 0
);

if (doc.containsKey("fade"))
{
switch (indicator)
{
case 1:
ui->setIndicator1Fade(doc["fade"].as<int>());
break;
case 2:
ui->setIndicator2Fade(doc["fade"].as<int>());
break;
case 3:
ui->setIndicator3Fade(doc["fade"].as<int>());
break;
default:
break;
}
}
else
{
switch (indicator)
{
case 1:
ui->setIndicator1Fade(0);
break;
case 2:
ui->setIndicator2Fade(0);
break;
case 3:
ui->setIndicator3Fade(0);
break;
default:
break;
}
}
doc.clear();
MQTTManager.setIndicatorState(indicator, ui->indicator1State, ui->indicator1Color);
MQTTManager.setIndicatorState(indicator, getIndicatorState(indicator), getIndicatorColor(indicator));
return true;
}

Expand Down
6 changes: 0 additions & 6 deletions src/DisplayManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,6 @@ class DisplayManager_
String getSettings();
void setPower(bool state);
void powerStateParse(const char *json);
void setIndicator1Color(uint32_t color);
void setIndicator1State(bool state);
void setIndicator2Color(uint32_t color);
void setIndicator2State(bool state);
void setIndicator3Color(uint32_t color);
void setIndicator3State(bool state);
void reorderApps(const String &jsonString);
void gammaCorrection();
bool indicatorParser(uint8_t indicator, const char *json);
Expand Down
91 changes: 91 additions & 0 deletions src/Indicators.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#include "Indicators.h"

///---- note, if optimizing, some opportunity here to reduce the passing of the structs on the stack. return / use pointers instead

// ============= Data section // changes to number of indicators must match in .h INDICATOR_COUNT

IndicatorPixelData _indicator1[] = {
{ {31,0}, DEFAULT_1_COLOR}, // partially fills and uses default value constructor
{ {30,0}, DEFAULT_1_COLOR},
{ {31,1}, DEFAULT_1_COLOR}
};

IndicatorPixelData _indicator2[] =
{
{ {31,3}, DEFAULT_2_COLOR}, // partially fills and uses default value constructor
{ {31,4}, DEFAULT_2_COLOR}
};

IndicatorPixelData _indicator3[] =
{
{ {31,6}, DEFAULT_3_COLOR}, // partially fills and uses default value constructor
{ {31,7}, DEFAULT_3_COLOR},
{ {30,7}, DEFAULT_3_COLOR}
};

Indicator indicators[] = {
{3, _indicator1}, // num of pixels hard coded. could probably do a macro but, meh.
{2, _indicator2},
{3, _indicator3}
};


// ============= Helper fn section to simplify later functions
void setColor(IndicatorPixelData *pd, uint32_t color) { pd->color = color;} // these are just setters so I can use fn points to reuse code instead of repeating all the fns.
void setState(IndicatorPixelData *pd, bool state) { pd->state = state;}
void setBlink(IndicatorPixelData *pd, int blink) { pd->blink = blink;}
void setFade(IndicatorPixelData *pd, int fade) { pd->fade = fade;}

Indicator* getIndicatorPtr(int indicator) {
indicator--; // 1-based indexing -> 0 based
if (indicator >= INDICATOR_COUNT || indicator < 0) indicator = 0; // default to a safe, but wrong, pixel instead of generating NULL pointers
return &(indicators[indicator]);
}

IndicatorPixelData getPixelData(int indicator, int pixel) {
Indicator* ind = getIndicatorPtr(indicator);
if (pixel == ALL_PIXELS || pixel < 0 || pixel >= ind->pixelCount) pixel = 0; // default to first
return ind->data[pixel];
}

template <typename T>
void setPixelData( void (*fieldSetter)(IndicatorPixelData*, T), int indicator, int pixel, T value) {
Indicator* ind = getIndicatorPtr(indicator);

if (pixel == ALL_PIXELS)
{
for (int pixel=0; pixel < ind->pixelCount; pixel++)
{
(*fieldSetter)( &(ind->data[pixel]), value);
}
} else
{
if (pixel < 0 || pixel >= ind->pixelCount)
pixel = 0; // default to first)
(*fieldSetter)( &(ind->data[pixel]), value);
}
}

//=============== on off state
bool getIndicatorState(int indicator, int pixel) { return getPixelData(indicator, pixel).state; }
bool getIndicatorState(int indicator) { return getPixelData(indicator, ALL_PIXELS).state; }
void setIndicatorState(int indicator, int pixel, bool state) { setPixelData(&setState, indicator, pixel, state); }
void setIndicatorState(int indicator, bool state) { setPixelData(&setState, indicator, ALL_PIXELS, state); }

// //=============== color
uint32_t getIndicatorColor(int indicator, int pixel) { return getPixelData(indicator, pixel).color; }
uint32_t getIndicatorColor(int indicator) { return getPixelData(indicator, ALL_PIXELS).color; }
void setIndicatorColor(int indicator, int pixel, uint32_t color) { setPixelData(&setColor, indicator, pixel, color); }
void setIndicatorColor(int indicator, uint32_t color) { setPixelData(&setColor, indicator, ALL_PIXELS, color); }

// //=============== blink
int getIndicatorBlink(int indicator, int pixel) { return getPixelData(indicator, pixel).blink; }
int getIndicatorBlink(int indicator) { return getPixelData(indicator, ALL_PIXELS).blink; }
void setIndicatorBlink(int indicator, int pixel, int blink) { setPixelData(&setBlink, indicator, pixel, blink); }
void setIndicatorBlink(int indicator, int blink) { setPixelData(&setBlink, indicator, ALL_PIXELS, blink); }

// //=============== fade
int getIndicatorFade(int indicator, int pixel) { return getPixelData(indicator, pixel).fade; }
int getIndicatorFade(int indicator) { return getPixelData(indicator, ALL_PIXELS).fade; }
void setIndicatorFade(int indicator, int pixel, int fade) { setPixelData(&setFade, indicator, pixel, fade); }
void setIndicatorFade(int indicator, int fade) { setPixelData(&setFade, indicator, ALL_PIXELS, fade); }
72 changes: 72 additions & 0 deletions src/Indicators.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#ifndef INDICATORS_H
#define INDICATORS_H
#include <cstdint>

/// NOTE from the external view, all indicators are indexed from 1 to match the rest of the project. internally mapped
static const int INDICATOR_COUNT = 3; // you can increase this if you want more pixels. Must match the static declarations in the .cpp

// ADVANCED: added features for per pixel operations.
// when accessing standard, not perpixel versions, set sets all pixels. get returns the first. Emulates solid color.
// -- pixels are 0 indexed. but use this flag to set/get ALL pixels at once.

const int ALL_PIXELS = -1;

constexpr bool DEFAULT_STATE = false; // boot time default
constexpr int DEFAULT_BLINK = 0;
constexpr int DEFAULT_FADE = 0;

constexpr uint32_t DEFAULT_1_COLOR = 0xFF0000; // R
constexpr uint32_t DEFAULT_2_COLOR = 0x00FF00; // G
constexpr uint32_t DEFAULT_3_COLOR = 0x0000FF; // B

struct Coord { // coordinate of a single indicator pixel
int x;
int y;
};

struct IndicatorPixelData // data for a single pixel
{
Coord coord;
uint32_t color;
bool state;
int blink;
int fade;

// default values
IndicatorPixelData(Coord c, uint32_t col) : coord(c), color(col), state(DEFAULT_STATE), blink(DEFAULT_BLINK), fade(DEFAULT_FADE) {}
};

struct Indicator { // an indicator consists of a number of pixels
int pixelCount;
IndicatorPixelData* data;
};

Indicator* getIndicatorPtr(int indicator); // returns a pointer to an indicator. careful of pixel count for data array length

//// solid indicators, all same state
bool getIndicatorState(int indicator);
void setIndicatorState(int indicator, bool state);

uint32_t getIndicatorColor(int indicator);
void setIndicatorColor(int indicator, uint32_t color);

int getIndicatorBlink(int indicator);
void setIndicatorBlink(int indicator, int blink); // all at once

int getIndicatorFade(int indicator);
void setIndicatorFade(int indicator, int fade); // all at once

//// per pixel operations

bool getIndicatorState(int indicator, int pixel);
void setIndicatorState(int indicator, int pixel, bool state);

uint32_t getIndicatorColor(int indicator, int pixel);
void setIndicatorColor(int indicator, int pixel, uint32_t color);

int getIndicatorBlink(int indicator, int pixel);
void setIndicatorBlink(int indicator, int pixel, int blink);

int getIndicatorFade(int indicator, int pixel);
void setIndicatorFade(int indicator, int pixel, int fade);
#endif // INDICATORS_H
Loading