#define USE_DEBUG
#include "ReelTwo.h"
#include "core/PushButton.h"
#include "dome/Logics.h"
#include "dome/LogicEngineController.h"
#define FRONT_LOGIC_PIN 5
#define REAR_LOGIC_PIN 6
#define PREV_BUTTON_PIN 12
#define NEXT_BUTTON_PIN 13
#define DEFAULT_SEQUENCE 0
#define CustomLogicEffect1 100
#define CustomLogicEffect2 101
LogicEngineDeathStarFLD<FRONT_LOGIC_PIN> FLD(LogicEngineFLDDefault);
LogicEngineDeathStarRLD<REAR_LOGIC_PIN> RLD(LogicEngineRLDDefault);
PushButton prevButton(PREV_BUTTON_PIN);
PushButton nextButton(NEXT_BUTTON_PIN);
int currentSequence = 0;
constexpr int kValidSequences[] = {
LogicEngineDefaults::NORMAL,
LogicEngineDefaults::ALARM,
LogicEngineDefaults::FAILURE,
LogicEngineDefaults::LEIA,
LogicEngineDefaults::MARCH,
LogicEngineDefaults::SOLIDCOLOR,
LogicEngineDefaults::FLASHCOLOR,
LogicEngineDefaults::FLIPFLOPCOLOR,
LogicEngineDefaults::FLIPFLOPALTCOLOR,
LogicEngineDefaults::COLORSWAP,
LogicEngineDefaults::RAINBOW,
LogicEngineDefaults::REDALERT,
LogicEngineDefaults::MICBRIGHT,
LogicEngineDefaults::MICRAINBOW,
LogicEngineDefaults::LIGHTSOUT,
LogicEngineDefaults::TEXT,
LogicEngineDefaults::TEXTSCROLLLEFT,
LogicEngineDefaults::TEXTSCROLLRIGHT,
LogicEngineDefaults::TEXTSCROLLUP,
LogicEngineDefaults::ROAMINGPIXEL,
LogicEngineDefaults::HORIZONTALSCANLINE,
LogicEngineDefaults::VERTICALSCANLINE,
LogicEngineDefaults::FIRE,
LogicEngineDefaults::PSICOLORWIPE,
LogicEngineDefaults::PULSE,
LogicEngineDefaults::RANDOM,
CustomLogicEffect1,
CustomLogicEffect2
};
constexpr const char* kSequenceName[] = {
"NORMAL",
"ALARM",
"FAILURE",
"LEIA",
"MARCH",
"SOLIDCOLOR",
"FLASHCOLOR",
"FLIPFLOPCOLOR",
"FLIPFLOPALTCOLOR",
"COLORSWAP",
"RAINBOW",
"REDALERT",
"MICBRIGHT",
"MICRAINBOW",
"LIGHTSOUT",
"TEXT",
"TEXTSCROLLLEFT",
"TEXTSCROLLRIGHT",
"TEXTSCROLLUP",
"ROAMINGPIXEL",
"HORIZONTALSCANLINE",
"VERTICALSCANLINE",
"FIRE",
"PSICOLORWIPE",
"PULSE",
"RANDOM",
"Custom1",
"Custom2"
};
////////////////////////////////
static bool LogicEffectCustom1(LogicEngineRenderer& r)
{
if (r.hasEffectChanged())
{
r.setBrightness(0);
r.setPaletteHue(2, r.getEffectHue());
r.setupTextMessage(r.getEffectTextMsg());
r.setEffectData(0);
r.setEffectDelay(50 * (r.getEffectSpeed()+1));
r.setEffectData2(r.hasEffectChangedType());
r.clear();
}
if (r.getEffectData2() && r.getEffectDuration() < 2000)
{
r.updateDisplay(0);
}
else if (r.getEffectFlip())
{
int y;
int x = r.getEffectData() & 0xFF;
int px = (r.getEffectData() >> 8) & 0xFF;
int dir = (r.getEffectData() >> 16) & 0x1;
if (px != x)
for (y = 0; y < r.height(); y++)
r.setPixel(px, y, r.getEffectHue(), 0);
for (y = 0; y < r.height(); y++)
r.setPixel(x, y, r.getEffectHue(), 200);
px = x;
x += (!dir) ? 1 : -1;
if (x >= r.width())
{
dir = 1;
x--;
}
else if (x < 0)
{
dir = 0;
x = 0;
}
r.setEffectData((uint32_t(dir)<<16L) | ((uint32_t(px)<<8L)) | x);
r.setEffectFlip(false);
}
return true;
}
////////////////////////////////
static bool LogicEffectCustom2(LogicEngineRenderer& r)
{
if (r.hasEffectChanged())
{
// 200ms intil getEffectFlip returns true
r.setEffectDelay(200);
r.clear();
}
if (r.getEffectFlip())
{
unsigned h = r.height();
unsigned w = r.width();
for (unsigned y = 0; y < h; y++)
{
for (unsigned x = 0; x < w; x++)
{
r.setPixelRGB(x, y, random(50), random(50), random(50));
}
}
// Reset effect flip to false
r.setEffectFlip(false);
}
return true;
}
////////////////////////////////
// Standard LogicEngine sequences are in the range 0-99. Custom sequences start at 100
LogicEffect CustomLogicEffectSelector(unsigned selectSequence)
{
static const LogicEffect sCustomLogicEffects[] = {
LogicEffectCustom1,
LogicEffectCustom2
};
if (selectSequence >= 100 && selectSequence-100 <= SizeOfArray(sCustomLogicEffects))
{
return LogicEffect(sCustomLogicEffects[selectSequence-100]);
}
return LogicEffectDefaultSelector(selectSequence);
}
void setup()
{
REELTWO_READY();
SetupEvent::ready();
// Setup custom logic effect selector for front and rear logic displays
FLD.setLogicEffectSelector(CustomLogicEffectSelector);
RLD.setLogicEffectSelector(CustomLogicEffectSelector);
// Set default text message for front logic display
FLD.setTextMessage("Hello\n World");
// Set default text message for rear logic display
RLD.setTextMessage("You Rock!");
// Select default sequence
currentSequence = DEFAULT_SEQUENCE;
selectSequence(currentSequence);
// Setup prev button action
prevButton.attachClick([]() {
currentSequence--;
if (currentSequence < 0)
currentSequence = SizeOfArray(kValidSequences)-1;
selectSequence(currentSequence);
});
// Setup next button action
nextButton.attachClick([]() {
currentSequence++;
if (currentSequence >= SizeOfArray(kValidSequences))
currentSequence = 0;
selectSequence(currentSequence);
});
}
void selectSequence(int seq)
{
FLD.selectSequence(kValidSequences[seq]);
RLD.selectSequence(kValidSequences[seq]);
DEBUG_PRINT(kSequenceName[seq]);
DEBUG_PRINT(": @APLE");
DEBUG_PRINT(seq);
DEBUG_PRINTLN("0000");
}
#define CONSOLE_BUFFER_SIZE 300
static unsigned sPos;
static char sBuffer[CONSOLE_BUFFER_SIZE];
void loop()
{
AnimatedEvent::process();
if (Serial.available())
{
int ch = Serial.read();
if (ch == 0x0A || ch == 0x0D)
{
if (strncmp(sBuffer, "@AP", 3) == 0)
{
CommandEvent::process(&sBuffer[3]);
}
else
{
DEBUG_PRINT("Invalid command: ");
DEBUG_PRINTLN(sBuffer);
}
sPos = 0;
}
else if (sPos < SizeOfArray(sBuffer)-1)
{
sBuffer[sPos++] = ch;
sBuffer[sPos] = '\0';
}
}
}
FPS: 0
Power: 0.00W
Power: 0.00W