From c4a5b80f0a0e6deb6f7093e33acec89ab9f3c404 Mon Sep 17 00:00:00 2001 From: Unreal-Dan <72595612+Unreal-Dan@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:32:42 -0700 Subject: [PATCH 1/5] Daniel/core/serialize harden (#226) * work for now * hardened all serialization code * hardened all serialize code * more hardening * fix wasm --- VortexEngine/VortexLib/VortexLib.cpp | 13 +-- VortexEngine/src/Colors/ColorTypes.cpp | 30 +++++-- VortexEngine/src/Colors/ColorTypes.h | 4 +- VortexEngine/src/Colors/Colorset.cpp | 52 ++++++++---- VortexEngine/src/Colors/Colorset.h | 6 +- .../src/Menus/MenuList/EditorConnection.cpp | 12 ++- .../src/Menus/MenuList/Randomizer.cpp | 8 +- VortexEngine/src/Modes/Mode.cpp | 54 ++++++++++--- VortexEngine/src/Modes/Mode.h | 2 +- VortexEngine/src/Modes/Modes.cpp | 40 +++++++--- .../src/Patterns/Multi/Sequencer/Sequence.cpp | 80 ++++++++++++++----- .../src/Patterns/Multi/Sequencer/Sequence.h | 16 ++-- VortexEngine/src/Patterns/Pattern.cpp | 22 +++-- VortexEngine/src/Patterns/Pattern.h | 4 +- VortexEngine/src/Patterns/PatternArgs.cpp | 19 +++-- VortexEngine/src/Patterns/PatternArgs.h | 2 +- VortexEngine/src/Patterns/PatternBuilder.cpp | 11 ++- VortexEngine/src/Serial/ByteStream.cpp | 60 ++------------ VortexEngine/src/Serial/ByteStream.h | 24 ++---- VortexEngine/src/Serial/Serial.cpp | 2 +- VortexEngine/src/VortexEngine.cpp | 9 ++- 21 files changed, 285 insertions(+), 185 deletions(-) diff --git a/VortexEngine/VortexLib/VortexLib.cpp b/VortexEngine/VortexLib/VortexLib.cpp index d325ae874d..50817c5ff1 100644 --- a/VortexEngine/VortexLib/VortexLib.cpp +++ b/VortexEngine/VortexLib/VortexLib.cpp @@ -166,15 +166,16 @@ EMSCRIPTEN_BINDINGS(Vortex) { .function("sanity", &ByteStream::sanity) .function("checkCRC", &ByteStream::checkCRC) .function("isCRCDirty", &ByteStream::isCRCDirty) - .function("serialize", select_overload(&ByteStream::serialize)) - .function("serialize16", select_overload(&ByteStream::serialize)) - .function("serialize32", select_overload(&ByteStream::serialize)) + .function("serialize8", &ByteStream::serialize8) + .function("serialize16", &ByteStream::serialize16) + .function("serialize32", &ByteStream::serialize32) .function("resetUnserializer", &ByteStream::resetUnserializer) .function("moveUnserializer", &ByteStream::moveUnserializer) .function("unserializerAtEnd", &ByteStream::unserializerAtEnd) - .function("unserialize8", &ByteStream::unserialize8) - .function("unserialize16", &ByteStream::unserialize16) - .function("unserialize32", &ByteStream::unserialize32) + // TODO: provide better apis here + //.function("unserialize8", &ByteStream::unserialize8) + //.function("unserialize16", &ByteStream::unserialize16) + //.function("unserialize32", &ByteStream::unserialize32) .function("peek8", &ByteStream::peek8) .function("peek16", &ByteStream::peek16) .function("peek32", &ByteStream::peek32) diff --git a/VortexEngine/src/Colors/ColorTypes.cpp b/VortexEngine/src/Colors/ColorTypes.cpp index 8b1c009bc6..5dec968e3b 100644 --- a/VortexEngine/src/Colors/ColorTypes.cpp +++ b/VortexEngine/src/Colors/ColorTypes.cpp @@ -198,18 +198,32 @@ RGBColor RGBColor::adjustBrightness(uint8_t fadeBy) return *this; } -void RGBColor::serialize(ByteStream &buffer) const +bool RGBColor::serialize(ByteStream &buffer) const { - buffer.serialize(red); - buffer.serialize(green); - buffer.serialize(blue); + if (!buffer.serialize8(red)) { + return false; + } + if (!buffer.serialize8(green)) { + return false; + } + if (!buffer.serialize8(blue)) { + return false; + } + return true; } -void RGBColor::unserialize(ByteStream &buffer) +bool RGBColor::unserialize(ByteStream &buffer) { - buffer.unserialize(&red); - buffer.unserialize(&green); - buffer.unserialize(&blue); + if (!buffer.unserialize8(&red)) { + return false; + } + if (!buffer.unserialize8(&green)) { + return false; + } + if (!buffer.unserialize8(&blue)) { + return false; + } + return true; } // ======================================================== diff --git a/VortexEngine/src/Colors/ColorTypes.h b/VortexEngine/src/Colors/ColorTypes.h index c4c69a5aa6..c4e92b2936 100644 --- a/VortexEngine/src/Colors/ColorTypes.h +++ b/VortexEngine/src/Colors/ColorTypes.h @@ -79,8 +79,8 @@ class RGBColor void clear(); RGBColor adjustBrightness(uint8_t fadeBy); - void serialize(ByteStream &buffer) const; - void unserialize(ByteStream &buffer); + bool serialize(ByteStream &buffer) const; + bool unserialize(ByteStream &buffer); uint32_t raw() const { return ((uint32_t)red << 16) | ((uint32_t)green << 8) | (uint32_t)blue; } diff --git a/VortexEngine/src/Colors/Colorset.cpp b/VortexEngine/src/Colors/Colorset.cpp index c5ebfafa7f..ea469c2384 100644 --- a/VortexEngine/src/Colors/Colorset.cpp +++ b/VortexEngine/src/Colors/Colorset.cpp @@ -450,52 +450,76 @@ bool Colorset::onEnd() const return (m_curIndex == m_numColors - 1); } -void Colorset::serialize(ByteStream &buffer) const +bool Colorset::serialize(ByteStream &buffer) const { - buffer.serialize(m_numColors); + if (!buffer.serialize8(m_numColors)) { + return false; + } // write all the reds/greens/blues together to maximize chance of // repeated values to improve RLE compression for (uint8_t i = 0; i < m_numColors; ++i) { - buffer.serialize(m_palette[i].red); + if (!buffer.serialize8(m_palette[i].red)) { + return false; + } } for (uint8_t i = 0; i < m_numColors; ++i) { - buffer.serialize(m_palette[i].green); + if (!buffer.serialize8(m_palette[i].green)) { + return false; + } } for (uint8_t i = 0; i < m_numColors; ++i) { - buffer.serialize(m_palette[i].blue); + if (!buffer.serialize8(m_palette[i].blue)) { + return false; + } } + return true; } -void Colorset::unserialize(ByteStream &buffer) +bool Colorset::unserialize(ByteStream &buffer) { - buffer.unserialize(&m_numColors); - initPalette(m_numColors); + if (!buffer.unserialize8(&m_numColors)) { + return false; + } + if (m_numColors > MAX_COLOR_SLOTS) { + return false; + } + if (!initPalette(m_numColors)) { + return false; + } for (uint8_t i = 0; i < m_numColors; ++i) { - buffer.unserialize(&m_palette[i].red); + if (!buffer.unserialize8(&m_palette[i].red)) { + return false; + } } for (uint8_t i = 0; i < m_numColors; ++i) { - buffer.unserialize(&m_palette[i].green); + if (!buffer.unserialize8(&m_palette[i].green)) { + return false; + } } for (uint8_t i = 0; i < m_numColors; ++i) { - buffer.unserialize(&m_palette[i].blue); + if (!buffer.unserialize8(&m_palette[i].blue)) { + return false; + } } + return true; } -void Colorset::initPalette(uint8_t numColors) +bool Colorset::initPalette(uint8_t numColors) { if (m_palette) { delete[] m_palette; m_palette = nullptr; } if (!numColors) { - return; + return true; } //m_palette = (RGBColor *)vcalloc(numColors, sizeof(RGBColor)); m_palette = new RGBColor[numColors]; if (!m_palette) { ERROR_OUT_OF_MEMORY(); - return; + return false; } m_numColors = numColors; + return true; } diff --git a/VortexEngine/src/Colors/Colorset.h b/VortexEngine/src/Colors/Colorset.h index 099b4ab177..9eb1d635f5 100644 --- a/VortexEngine/src/Colors/Colorset.h +++ b/VortexEngine/src/Colors/Colorset.h @@ -143,12 +143,12 @@ class Colorset bool onEnd() const; // serialize the colorset to save/load - void serialize(ByteStream &buffer) const; - void unserialize(ByteStream &buffer); + bool serialize(ByteStream &buffer) const; + bool unserialize(ByteStream &buffer); private: // pre-allocate the palette - void initPalette(uint8_t numColors); + bool initPalette(uint8_t numColors); // palette of colors RGBColor *m_palette; diff --git a/VortexEngine/src/Menus/MenuList/EditorConnection.cpp b/VortexEngine/src/Menus/MenuList/EditorConnection.cpp index 56cbd8953f..b47b25146e 100644 --- a/VortexEngine/src/Menus/MenuList/EditorConnection.cpp +++ b/VortexEngine/src/Menus/MenuList/EditorConnection.cpp @@ -49,7 +49,9 @@ bool EditorConnection::receiveMessage(const char *message) return false; } for (size_t i = 0; i < len; ++i) { - m_receiveBuffer.unserialize(&byte); + if (!m_receiveBuffer.unserialize8(&byte)) { + return false; + } } // if everything was read out, reset if (m_receiveBuffer.unserializerAtEnd()) { @@ -264,7 +266,9 @@ bool EditorConnection::receiveModes() return false; } // okay unserialize now, first unserialize the size - m_receiveBuffer.unserialize(&size); + if (!m_receiveBuffer.unserialize32(&size)) { + return false; + } // create a new ByteStream that will hold the full buffer of data ByteStream buf(m_receiveBuffer.rawSize()); // then copy everything from the receive buffer into the rawdata @@ -294,7 +298,9 @@ bool EditorConnection::receiveDemoMode() return false; } // okay unserialize now, first unserialize the size - m_receiveBuffer.unserialize(&size); + if (!m_receiveBuffer.unserialize32(&size)) { + return false; + } // create a new ByteStream that will hold the full buffer of data ByteStream buf(m_receiveBuffer.rawSize()); // then copy everything from the receive buffer into the rawdata diff --git a/VortexEngine/src/Menus/MenuList/Randomizer.cpp b/VortexEngine/src/Menus/MenuList/Randomizer.cpp index b0860ccd11..608cb3980e 100644 --- a/VortexEngine/src/Menus/MenuList/Randomizer.cpp +++ b/VortexEngine/src/Menus/MenuList/Randomizer.cpp @@ -40,7 +40,9 @@ bool Randomizer::init() ByteStream ledData; Pattern *pat = cur->getPattern(LED_MULTI); if (pat) { - pat->serialize(ledData); + if (!pat->serialize(ledData)) { + return false; + } } m_multiRandCtx.seed(ledData.recalcCRC()); } @@ -51,7 +53,9 @@ bool Randomizer::init() ByteStream ledData; Pattern *pat = cur->getPattern(l); if (pat) { - pat->serialize(ledData); + if (!pat->serialize(ledData)) { + return false; + } } m_singlesRandCtx[l].seed(ledData.recalcCRC()); } diff --git a/VortexEngine/src/Modes/Mode.cpp b/VortexEngine/src/Modes/Mode.cpp index 31630b1850..3d129d18b8 100644 --- a/VortexEngine/src/Modes/Mode.cpp +++ b/VortexEngine/src/Modes/Mode.cpp @@ -187,8 +187,12 @@ bool Mode::loadFromBuffer(ByteStream &modeBuffer) uint8_t major = 0; uint8_t minor = 0; // unserialize the vortex version - modeBuffer.unserialize(&major); - modeBuffer.unserialize(&minor); + if (!modeBuffer.unserialize8(&major)) { + return false; + } + if (!modeBuffer.unserialize8(&minor)) { + return false; + } // check the version for incompatibility if (!VortexEngine::checkVersion(major, minor)) { // incompatible version @@ -204,35 +208,43 @@ bool Mode::loadFromBuffer(ByteStream &modeBuffer) return true; } -void Mode::serialize(ByteStream &buffer, uint8_t numLeds) const +bool Mode::serialize(ByteStream &buffer, uint8_t numLeds) const { if (!numLeds) { numLeds = MODE_LEDCOUNT; } // serialize the number of leds - buffer.serialize(numLeds); + if (!buffer.serialize8(numLeds)) { + return false; + } // empty mode? if (!numLeds) { - return; + return true; } // serialize the flags ModeFlags flags = getFlags(); - buffer.serialize(flags); + if (!buffer.serialize8(flags)) { + return false; + } #if VORTEX_SLIM == 0 // serialiaze the multi led? if ((flags & MODE_FLAG_MULTI_LED) && m_multiPat) { // serialize the multi led - m_multiPat->serialize(buffer); + if (!m_multiPat->serialize(buffer)) { + return false; + } } #endif // if no single leds then just stop here if (!(flags & MODE_FLAG_SINGLE_LED)) { - return; + return true; } // if there are any sparse singles (spaces) then we need to // serialize an led map of which singles are set if (flags & MODE_FLAG_SPARSE_SINGLES) { - buffer.serialize((uint32_t)getSingleLedMap()); + if (!buffer.serialize32((uint32_t)getSingleLedMap())) { + return false; + } } // then iterate each single led and serialize it for (LedPos pos = LED_FIRST; pos < numLeds; ++pos) { @@ -241,12 +253,15 @@ void Mode::serialize(ByteStream &buffer, uint8_t numLeds) const continue; } // just serialize the pattern then colorset - entry->serialize(buffer); + if (!entry->serialize(buffer)) { + return false; + } // if they are all same single then only serialize one if (flags & MODE_FLAG_ALL_SAME_SINGLE) { break; } } + return true; } // this is a hairy function, but a bit of a necessary complexity @@ -255,7 +270,9 @@ bool Mode::unserialize(ByteStream &buffer) clearPattern(LED_ALL); uint8_t ledCount = LED_COUNT; // unserialize the number of leds - buffer.unserialize(&ledCount); + if (!buffer.unserialize8(&ledCount)) { + return false; + } #if FIXED_LED_COUNT == 0 // it's important that we only increase the led count if necessary // otherwise we may end up reducing our led count and only rendering @@ -272,7 +289,9 @@ bool Mode::unserialize(ByteStream &buffer) } // unserialize the flags value ModeFlags flags = 0; - buffer.unserialize(&flags); + if (!buffer.unserialize8(&flags)) { + return false; + } Pattern *firstPat = nullptr; // if there is a multi led pattern then unserialize it if (flags & MODE_FLAG_MULTI_LED) { @@ -291,6 +310,9 @@ bool Mode::unserialize(ByteStream &buffer) #else // otherwise in normal build actually unserialize it m_multiPat = PatternBuilder::unserialize(buffer); + if (!m_multiPat) { + return false; + } m_multiPat->init(); #endif } @@ -301,7 +323,9 @@ bool Mode::unserialize(ByteStream &buffer) // is there an led map to unserialize? if not default to all LedMap map = (1 << ledCount) - 1; if (flags & MODE_FLAG_SPARSE_SINGLES) { - buffer.unserialize((uint32_t *)&map); + if (!buffer.unserialize32((uint32_t *)&map)) { + return false; + } } // unserialize all singleled patterns into their positions MAP_FOREACH_LED(map) { @@ -319,6 +343,10 @@ bool Mode::unserialize(ByteStream &buffer) // otherwise unserialize the pattern like normal m_singlePats[pos] = PatternBuilder::unserialize(buffer); } + if (!m_singlePats[pos]) { + clearPattern(LED_ALL); + return false; + } m_singlePats[pos]->bind(pos); } // there is a few different possibilities here: diff --git a/VortexEngine/src/Modes/Mode.h b/VortexEngine/src/Modes/Mode.h index 9e75e2b9bb..e364483863 100644 --- a/VortexEngine/src/Modes/Mode.h +++ b/VortexEngine/src/Modes/Mode.h @@ -67,7 +67,7 @@ class Mode bool loadFromBuffer(ByteStream &saveBuffer); // save the mode to serial - void serialize(ByteStream &buffer, uint8_t numLeds = 0) const; + bool serialize(ByteStream &buffer, uint8_t numLeds = 0) const; // load the mode from serial (optional led count) bool unserialize(ByteStream &buffer); diff --git a/VortexEngine/src/Modes/Modes.cpp b/VortexEngine/src/Modes/Modes.cpp index 1544f41b5f..8d1fa63b9c 100644 --- a/VortexEngine/src/Modes/Modes.cpp +++ b/VortexEngine/src/Modes/Modes.cpp @@ -83,11 +83,11 @@ bool Modes::serializeSaveHeader(ByteStream &saveBuffer) } // NOTE: instead of global brightness the duo uses this to store the // startup mode ID. The duo doesn't offer a global brightness option - if (!saveBuffer.serialize(m_globalFlags)) { + if (!saveBuffer.serialize8(m_globalFlags)) { return false; } // serialize the global brightness - if (!saveBuffer.serialize((uint8_t)Leds::getBrightness())) { + if (!saveBuffer.serialize8((uint8_t)Leds::getBrightness())) { return false; } DEBUG_LOGF("Serialized all modes, uncompressed size: %u", saveBuffer.size()); @@ -101,8 +101,12 @@ bool Modes::unserializeSaveHeader(ByteStream &saveHeader) uint8_t major = 0; uint8_t minor = 0; // unserialize the vortex version - saveHeader.unserialize(&major); - saveHeader.unserialize(&minor); + if (!saveHeader.unserialize8(&major)) { + return false; + } + if (!saveHeader.unserialize8(&minor)) { + return false; + } // check the version for incompatibility if (!VortexEngine::checkVersion(major, minor)) { // incompatible version @@ -112,10 +116,14 @@ bool Modes::unserializeSaveHeader(ByteStream &saveHeader) // NOTE: instead of global brightness the duo uses this to store the // startup mode ID. The duo doesn't offer a global brightness option // unserialize the global brightness - saveHeader.unserialize(&m_globalFlags); + if (!saveHeader.unserialize8(&m_globalFlags)) { + return false; + } // unserialize the global brightness uint8_t brightness = 0; - saveHeader.unserialize(&brightness); + if (!saveHeader.unserialize8(&brightness)) { + return false; + } if (brightness) { Leds::setBrightness(brightness); } @@ -183,7 +191,9 @@ bool Modes::loadStorage() } // unserialize the number of modes next uint8_t numModes = 0; - headerBuffer.unserialize(&numModes); + if (!headerBuffer.unserialize8(&numModes)) { + return false; + } if (!numModes) { DEBUG_LOG("Did not find any modes"); // this kinda sucks whatever they had loaded is gone @@ -210,7 +220,7 @@ bool Modes::saveStorage() return false; } // serialize the number of modes - if (!headerBuffer.serialize(m_numModes)) { + if (!headerBuffer.serialize8(m_numModes)) { return false; } if (!Storage::write(0, headerBuffer)) { @@ -233,7 +243,9 @@ bool Modes::saveStorage() return false; } // serialize it into the target modes buffer - mode->serialize(modeBuffer); + if (!mode->serialize(modeBuffer)) { + return false; + } // just uninstansiate the mode after serializing ptr->uninstantiate(); // next mode @@ -255,7 +267,7 @@ bool Modes::saveStorage() bool Modes::serialize(ByteStream &modesBuffer) { // serialize the number of modes - if (!modesBuffer.serialize(m_numModes)) { + if (!modesBuffer.serialize8(m_numModes)) { return false; } // make sure the current mode is saved in case it has changed somehow @@ -273,7 +285,9 @@ bool Modes::serialize(ByteStream &modesBuffer) return false; } // serialize it into the target modes buffer - mode->serialize(modesBuffer); + if (!mode->serialize(modesBuffer)) { + return false; + } // just uninstansiate the mode after serializing ptr->uninstantiate(); // next mode @@ -296,7 +310,9 @@ bool Modes::unserialize(ByteStream &modesBuffer) clearModes(); // unserialize the number of modes next uint8_t numModes = 0; - modesBuffer.unserialize(&numModes); + if (!modesBuffer.unserialize8(&numModes)) { + return false; + } if (!numModes) { DEBUG_LOG("Did not find any modes"); // this kinda sucks whatever they had loaded is gone diff --git a/VortexEngine/src/Patterns/Multi/Sequencer/Sequence.cpp b/VortexEngine/src/Patterns/Multi/Sequencer/Sequence.cpp index 48733cade5..33a7239b92 100644 --- a/VortexEngine/src/Patterns/Multi/Sequencer/Sequence.cpp +++ b/VortexEngine/src/Patterns/Multi/Sequencer/Sequence.cpp @@ -39,19 +39,25 @@ PatternID PatternMap::operator[](LedPos index) const return m_patternMap[index]; } -void PatternMap::serialize(ByteStream &buffer) const +bool PatternMap::serialize(ByteStream &buffer) const { for (LedPos i = LED_FIRST; i < LED_COUNT; ++i) { // ensure the PatternID is interpreted as uint8_t - buffer.serialize((uint8_t)m_patternMap[i]); + if (!buffer.serialize8((uint8_t)m_patternMap[i])) { + return false; + } } + return true; } -void PatternMap::unserialize(ByteStream &buffer) +bool PatternMap::unserialize(ByteStream &buffer) { for (LedPos i = LED_FIRST; i < LED_COUNT; ++i) { - buffer.unserialize((uint8_t *)m_patternMap + i); + if (!buffer.unserialize8((uint8_t *)m_patternMap + i)) { + return false; + } } + return true; } ColorsetMap::ColorsetMap() : @@ -79,18 +85,24 @@ const Colorset &ColorsetMap::operator[](LedPos index) const return m_colorsetMap[index]; } -void ColorsetMap::serialize(ByteStream &buffer) const +bool ColorsetMap::serialize(ByteStream &buffer) const { for (LedPos i = LED_FIRST; i < LED_COUNT; ++i) { - m_colorsetMap[i].serialize(buffer); + if (!m_colorsetMap[i].serialize(buffer)) { + return false; + } } + return true; } -void ColorsetMap::unserialize(ByteStream &buffer) +bool ColorsetMap::unserialize(ByteStream &buffer) { for (LedPos i = LED_FIRST; i < LED_COUNT; ++i) { - m_colorsetMap[i].unserialize(buffer); + if (!m_colorsetMap[i].unserialize(buffer)) { + return false; + } } + return true; } // Make an array of sequence steps to create a sequenced pattern @@ -107,18 +119,32 @@ SequenceStep::SequenceStep(const SequenceStep &other) : { } -void SequenceStep::serialize(ByteStream &buffer) const +bool SequenceStep::serialize(ByteStream &buffer) const { - buffer.serialize(m_duration); - m_patternMap.serialize(buffer); - m_colorsetMap.serialize(buffer); + if (!buffer.serialize16(m_duration)) { + return false; + } + if (!m_patternMap.serialize(buffer)) { + return false; + } + if (!m_colorsetMap.serialize(buffer)) { + return false; + } + return true; } -void SequenceStep::unserialize(ByteStream &buffer) +bool SequenceStep::unserialize(ByteStream &buffer) { - buffer.unserialize(&m_duration); - m_patternMap.unserialize(buffer); - m_colorsetMap.unserialize(buffer); + if (!buffer.unserialize16(&m_duration)) { + return false; + } + if (!m_patternMap.unserialize(buffer)) { + return false; + } + if (!m_colorsetMap.unserialize(buffer)) { + return false; + } + return true; } Sequence::Sequence() : @@ -222,20 +248,30 @@ void Sequence::clear() m_numSteps = 0; } -void Sequence::serialize(ByteStream &buffer) const +bool Sequence::serialize(ByteStream &buffer) const { - buffer.serialize(m_numSteps); + if (!buffer.serialize8(m_numSteps)) { + return false; + } for (uint8_t i = 0; i < m_numSteps; ++i) { - m_sequenceSteps[i].serialize(buffer); + if (!m_sequenceSteps[i].serialize(buffer)) { + return false; + } } + return true; } -void Sequence::unserialize(ByteStream &buffer) +bool Sequence::unserialize(ByteStream &buffer) { - buffer.unserialize(&m_numSteps); + if (!buffer.unserialize8(&m_numSteps)) { + return false; + } for (uint8_t i = 0; i < m_numSteps; ++i) { - m_sequenceSteps[i].unserialize(buffer); + if (!m_sequenceSteps[i].unserialize(buffer)) { + return false; + } } + return true; } uint8_t Sequence::numSteps() const diff --git a/VortexEngine/src/Patterns/Multi/Sequencer/Sequence.h b/VortexEngine/src/Patterns/Multi/Sequencer/Sequence.h index 4ca766a694..37ddf75911 100644 --- a/VortexEngine/src/Patterns/Multi/Sequencer/Sequence.h +++ b/VortexEngine/src/Patterns/Multi/Sequencer/Sequence.h @@ -22,8 +22,8 @@ class PatternMap PatternID operator[](LedPos index) const; // serialize and unserialize a pattern map - void serialize(ByteStream &buffer) const; - void unserialize(ByteStream &buffer); + bool serialize(ByteStream &buffer) const; + bool unserialize(ByteStream &buffer); // public list of pattern IDs for each led PatternID m_patternMap[LED_COUNT]; @@ -41,8 +41,8 @@ class ColorsetMap const Colorset &operator[](LedPos index) const; // serialize and unserialize a colorset map - void serialize(ByteStream &buffer) const; - void unserialize(ByteStream &buffer); + bool serialize(ByteStream &buffer) const; + bool unserialize(ByteStream &buffer); // public list of pattern IDs for each led Colorset m_colorsetMap[LED_COUNT]; @@ -57,8 +57,8 @@ class SequenceStep SequenceStep(const SequenceStep &other); // serialize and unserialize a step in the sequencer - void serialize(ByteStream &buffer) const; - void unserialize(ByteStream &buffer); + bool serialize(ByteStream &buffer) const; + bool unserialize(ByteStream &buffer); // public members to allow for easy initialization of an array of SequenceSteps uint16_t m_duration; @@ -85,8 +85,8 @@ class Sequence uint8_t addStep(uint16_t duration, const PatternMap &patternMap, const ColorsetMap &colorsetMap = Colorset()); void clear(); - void serialize(ByteStream &buffer) const; - void unserialize(ByteStream &buffer); + bool serialize(ByteStream &buffer) const; + bool unserialize(ByteStream &buffer); uint8_t numSteps() const; const SequenceStep &operator[](uint8_t index) const; diff --git a/VortexEngine/src/Patterns/Pattern.cpp b/VortexEngine/src/Patterns/Pattern.cpp index 6078cc4ed1..768a9966f2 100644 --- a/VortexEngine/src/Patterns/Pattern.cpp +++ b/VortexEngine/src/Patterns/Pattern.cpp @@ -54,10 +54,14 @@ void Pattern::skip(uint32_t ticks) #endif // must override the serialize routine to save the pattern -void Pattern::serialize(ByteStream &buffer) const +bool Pattern::serialize(ByteStream &buffer) const { - buffer.serialize((uint8_t)m_patternID); - m_colorset.serialize(buffer); + if (!buffer.serialize8((uint8_t)m_patternID)) { + return false; + } + if (!m_colorset.serialize(buffer)) { + return false; + } PatternArgs args; getArgs(args); PatternArgs defaults = PatternBuilder::getDefaultArgs(m_patternID); @@ -68,16 +72,21 @@ void Pattern::serialize(ByteStream &buffer) const ARGMAP_SET(argmap, i); } } - args.serialize(buffer, argmap); + if (!args.serialize(buffer, argmap)) { + return false; + } + return true; } // must override unserialize to load patterns -void Pattern::unserialize(ByteStream &buffer) +bool Pattern::unserialize(ByteStream &buffer) { // don't unserialize the pattern ID because it is already // unserialized by the pattern builder to decide which pattern // to instantiate, instead only unserialize the colorset - m_colorset.unserialize(buffer); + if (!m_colorset.unserialize(buffer)) { + return false; + } // start with the default args for this pattern PatternArgs args = PatternBuilder::getDefaultArgs(m_patternID); // then unserialize any different args overtop of the defaults @@ -85,6 +94,7 @@ void Pattern::unserialize(ByteStream &buffer) // if any args were unserialized, set them setArgs(args); } + return true; } void Pattern::setArg(uint8_t index, uint8_t value) diff --git a/VortexEngine/src/Patterns/Pattern.h b/VortexEngine/src/Patterns/Pattern.h index e659abf885..0a3454ce04 100644 --- a/VortexEngine/src/Patterns/Pattern.h +++ b/VortexEngine/src/Patterns/Pattern.h @@ -76,8 +76,8 @@ class Pattern #endif // serialize and unserialize a pattern to a bytestream - void serialize(ByteStream &buffer) const; - void unserialize(ByteStream &buffer); + bool serialize(ByteStream &buffer) const; + bool unserialize(ByteStream &buffer); // get or set a single arg void setArg(uint8_t index, uint8_t value); diff --git a/VortexEngine/src/Patterns/PatternArgs.cpp b/VortexEngine/src/Patterns/PatternArgs.cpp index a26389dff8..8ea98aa93d 100644 --- a/VortexEngine/src/Patterns/PatternArgs.cpp +++ b/VortexEngine/src/Patterns/PatternArgs.cpp @@ -171,23 +171,32 @@ uint8_t PatternArgs::operator[](int index) const return args[index]; } -void PatternArgs::serialize(ByteStream &buffer, ArgMap argmap) const +bool PatternArgs::serialize(ByteStream &buffer, ArgMap argmap) const { - buffer.serialize(argmap); + if (!buffer.serialize8(argmap)) { + return false; + } for (uint8_t i = 0; i < MAX_ARGS; ++i) { if (ARGMAP_ISSET(argmap, i)) { - buffer.serialize(args[i]); + if (!buffer.serialize8(args[i])) { + return false; + } } } + return true; } ArgMap PatternArgs::unserialize(ByteStream &buffer) { ArgMap argmap = ARG_NONE; - buffer.unserialize(&argmap); + if (!buffer.unserialize8(&argmap)) { + return ARG_NONE; + } for (uint8_t i = 0; i < MAX_ARGS; ++i) { if (ARGMAP_ISSET(argmap, i)) { - buffer.unserialize(args + i); + if (!buffer.unserialize8(args + i)) { + break; + } } } return argmap; diff --git a/VortexEngine/src/Patterns/PatternArgs.h b/VortexEngine/src/Patterns/PatternArgs.h index 942aa9f050..f195c1916c 100644 --- a/VortexEngine/src/Patterns/PatternArgs.h +++ b/VortexEngine/src/Patterns/PatternArgs.h @@ -71,7 +71,7 @@ class PatternArgs uint8_t operator[](int index) const; // serialize the pattern args with a specific mapping of which args to store - void serialize(ByteStream &buffer, ArgMap argmap = ARG_ALL) const; + bool serialize(ByteStream &buffer, ArgMap argmap = ARG_ALL) const; // unserialize the pattern args and return the argmap of which args were loaded // NOTE: You should start with an instance of the default args before you unserialize ArgMap unserialize(ByteStream &buffer); diff --git a/VortexEngine/src/Patterns/PatternBuilder.cpp b/VortexEngine/src/Patterns/PatternBuilder.cpp index 0f0b15587d..3468945ed0 100644 --- a/VortexEngine/src/Patterns/PatternBuilder.cpp +++ b/VortexEngine/src/Patterns/PatternBuilder.cpp @@ -95,11 +95,18 @@ MultiLedPattern *PatternBuilder::makeMulti(PatternID id, const PatternArgs *args Pattern *PatternBuilder::unserialize(ByteStream &buffer) { - Pattern *pat = make((PatternID)buffer.unserialize8()); + PatternID id = PATTERN_NONE; + if (!buffer.unserialize8((uint8_t *)&id)) { + return nullptr; + } + Pattern *pat = make(id); if (!pat) { return nullptr; } - pat->unserialize(buffer); + if (!pat->unserialize(buffer)) { + delete pat; + return nullptr; + } return pat; } diff --git a/VortexEngine/src/Serial/ByteStream.cpp b/VortexEngine/src/Serial/ByteStream.cpp index 73089fcc75..be5abe30d7 100644 --- a/VortexEngine/src/Serial/ByteStream.cpp +++ b/VortexEngine/src/Serial/ByteStream.cpp @@ -338,7 +338,7 @@ bool ByteStream::isCRCDirty() const return (m_pData && (m_pData->flags & BUFFER_FLAG_DIRTY) != 0); } -bool ByteStream::serialize(uint8_t byte) +bool ByteStream::serialize8(uint8_t byte) { //DEBUG_LOGF("Serialize8(): %u", byte); if (!m_pData || (m_pData->size + sizeof(uint8_t)) > m_capacity) { @@ -354,7 +354,7 @@ bool ByteStream::serialize(uint8_t byte) return true; } -bool ByteStream::serialize(uint16_t bytes) +bool ByteStream::serialize16(uint16_t bytes) { //DEBUG_LOGF("Serialize16(): %u", bytes); if (!m_pData || (m_pData->size + sizeof(uint16_t)) > m_capacity) { @@ -370,7 +370,7 @@ bool ByteStream::serialize(uint16_t bytes) return true; } -bool ByteStream::serialize(uint32_t bytes) +bool ByteStream::serialize32(uint32_t bytes) { //DEBUG_LOGF("Serialize32(): %u", bytes); if (!m_pData || (m_pData->size + sizeof(uint32_t)) > m_capacity) { @@ -414,7 +414,7 @@ bool ByteStream::unserializerAtEnd() const } // unserialize data and walk the buffer that many bytes -bool ByteStream::unserialize(uint8_t *byte) +bool ByteStream::unserialize8(uint8_t *byte) { if (!m_pData || m_position >= m_pData->size || (m_pData->size - m_position) < sizeof(uint8_t)) { return false; @@ -425,7 +425,7 @@ bool ByteStream::unserialize(uint8_t *byte) return true; } -bool ByteStream::unserialize(uint16_t *bytes) +bool ByteStream::unserialize16(uint16_t *bytes) { if (!m_pData || m_position >= m_pData->size || (m_pData->size - m_position) < sizeof(uint16_t)) { return false; @@ -436,7 +436,7 @@ bool ByteStream::unserialize(uint16_t *bytes) return true; } -bool ByteStream::unserialize(uint32_t *bytes) +bool ByteStream::unserialize32(uint32_t *bytes) { if (!m_pData || m_position >= m_pData->size || (m_pData->size - m_position) < sizeof(uint32_t)) { return false; @@ -447,27 +447,6 @@ bool ByteStream::unserialize(uint32_t *bytes) return true; } -uint8_t ByteStream::unserialize8() -{ - uint8_t byte = 0; - unserialize(&byte); - return byte; -} - -uint16_t ByteStream::unserialize16() -{ - uint16_t bytes = 0; - unserialize(&bytes); - return bytes; -} - -uint32_t ByteStream::unserialize32() -{ - uint32_t bytes = 0; - unserialize(&bytes); - return bytes; -} - uint8_t ByteStream::peek8() const { if (!m_pData) { @@ -492,33 +471,6 @@ uint32_t ByteStream::peek32() const return *(uint32_t *)frontUnserializer(); } -// read the data from a flash storage -// overload += for appending buffer -ByteStream &ByteStream::operator+=(const ByteStream &rhs) -{ - append(rhs); - return *this; -} - -// also overload += for appending bytes -ByteStream &ByteStream::operator+=(const uint8_t &rhs) -{ - serialize(rhs); - return *this; -} - -ByteStream &ByteStream::operator+=(const uint16_t &rhs) -{ - serialize(rhs); - return *this; -} - -ByteStream &ByteStream::operator+=(const uint32_t &rhs) -{ - serialize(rhs); - return *this; -} - bool ByteStream::is_compressed() const { if (!m_pData) { diff --git a/VortexEngine/src/Serial/ByteStream.h b/VortexEngine/src/Serial/ByteStream.h index 16cff1bcd9..558cfc6e9f 100644 --- a/VortexEngine/src/Serial/ByteStream.h +++ b/VortexEngine/src/Serial/ByteStream.h @@ -78,9 +78,9 @@ class ByteStream bool isCRCDirty() const; // serialize a byte into the buffer - bool serialize(uint8_t byte); - bool serialize(uint16_t bytes); - bool serialize(uint32_t bytes); + bool serialize8(uint8_t byte); + bool serialize16(uint16_t bytes); + bool serialize32(uint32_t bytes); // reset the unserializer index void resetUnserializer(); @@ -90,26 +90,14 @@ class ByteStream bool unserializerAtEnd() const; // serialize a byte into the buffer - bool unserialize(uint8_t *byte); - bool unserialize(uint16_t *bytes); - bool unserialize(uint32_t *bytes); - - // same thing but via return value - uint8_t unserialize8(); - uint16_t unserialize16(); - uint32_t unserialize32(); + bool unserialize8(uint8_t *byte); + bool unserialize16(uint16_t *bytes); + bool unserialize32(uint32_t *bytes); uint8_t peek8() const; uint16_t peek16() const; uint32_t peek32() const; - // overload += for appending buffer - ByteStream &operator+=(const ByteStream &rhs); - // also overload += for appending bytes - ByteStream &operator+=(const uint8_t &rhs); - ByteStream &operator+=(const uint16_t &rhs); - ByteStream &operator+=(const uint32_t &rhs); - // overload [] for array access (no bounds check lol) uint8_t &operator[](uint32_t index) { return m_pData->buf[index]; } // overload (uint8_t *) for cast to buffer diff --git a/VortexEngine/src/Serial/Serial.cpp b/VortexEngine/src/Serial/Serial.cpp index 2d3c4bd343..a3433b79fd 100644 --- a/VortexEngine/src/Serial/Serial.cpp +++ b/VortexEngine/src/Serial/Serial.cpp @@ -127,7 +127,7 @@ void SerialComs::read(ByteStream &byteStream) #else byte = Serial.read(); #endif - byteStream.serialize(byte); + byteStream.serialize8(byte); } while (--amt > 0); #endif } diff --git a/VortexEngine/src/VortexEngine.cpp b/VortexEngine/src/VortexEngine.cpp index 970b1a6421..53b7f944b8 100644 --- a/VortexEngine/src/VortexEngine.cpp +++ b/VortexEngine/src/VortexEngine.cpp @@ -203,8 +203,13 @@ void VortexEngine::runMainLogic() bool VortexEngine::serializeVersion(ByteStream &stream) { // serialize the vortex version - return stream.serialize((uint8_t)VORTEX_VERSION_MAJOR) && - stream.serialize((uint8_t)VORTEX_VERSION_MINOR); + if (!stream.serialize8((uint8_t)VORTEX_VERSION_MAJOR)) { + return false; + } + if (!stream.serialize8((uint8_t)VORTEX_VERSION_MINOR)) { + return false; + } + return true; } bool VortexEngine::checkVersion(uint8_t major, uint8_t minor) From 6e57d56d8c75f87c381d05178900f269beeece7c Mon Sep 17 00:00:00 2001 From: Unreal-Dan <72595612+Unreal-Dan@users.noreply.github.com> Date: Sat, 27 Apr 2024 02:36:16 -0700 Subject: [PATCH 2/5] Separate save header and mode loading (#240) --- VortexEngine/VortexLib/VortexLib.cpp | 5 ++- VortexEngine/src/Modes/Modes.cpp | 60 +++++++++++++++++--------- VortexEngine/src/Modes/Modes.h | 21 ++++++--- VortexEngine/src/Serial/ByteStream.cpp | 2 +- VortexEngine/src/VortexEngine.cpp | 6 +++ 5 files changed, 66 insertions(+), 28 deletions(-) diff --git a/VortexEngine/VortexLib/VortexLib.cpp b/VortexEngine/VortexLib/VortexLib.cpp index 50817c5ff1..dfcfa06f47 100644 --- a/VortexEngine/VortexLib/VortexLib.cpp +++ b/VortexEngine/VortexLib/VortexLib.cpp @@ -659,8 +659,9 @@ bool Vortex::init(VortexCallbacks *callbacks) // init the engine VortexEngine::init(); - // clear the modes - //Modes::clearModes(); + // load the modes + // TODO: don't load modes here? separate api? + Modes::load(); // save and set undo buffer doSave(); diff --git a/VortexEngine/src/Modes/Modes.cpp b/VortexEngine/src/Modes/Modes.cpp index 8d1fa63b9c..95fb11b2fa 100644 --- a/VortexEngine/src/Modes/Modes.cpp +++ b/VortexEngine/src/Modes/Modes.cpp @@ -16,6 +16,7 @@ #include "../Log/Log.h" // static members +bool Modes::m_loaded = false; uint8_t Modes::m_curMode = 0; uint8_t Modes::m_numModes = 0; // the current instantiated mode and it's respective link @@ -34,15 +35,10 @@ bool Modes::init() test(); return true; #endif - // try to load the saved settings or set defaults - if (!loadStorage()) { - if (!setDefaults()) { - return false; - } - if (!saveStorage()) { - return false; - } - } + ByteStream headerBuffer; + Storage::read(0, headerBuffer); + unserializeSaveHeader(headerBuffer); + m_loaded = false; #ifdef VORTEX_LIB // enable the adv menus by default in vortex lib m_globalFlags |= MODES_FLAG_ADV_MENUS; @@ -55,6 +51,24 @@ void Modes::cleanup() clearModes(); } +bool Modes::load() +{ + if (m_loaded) { + return true; + } + // try to load the saved settings or set defaults + if (!loadStorage()) { + if (!setDefaults()) { + return false; + } + if (!saveStorage()) { + return false; + } + } + m_loaded = true; + return true; +} + void Modes::play() { if (!m_numModes) { @@ -210,6 +224,22 @@ bool Modes::loadStorage() return true; } +bool Modes::saveHeader() +{ + ByteStream headerBuffer(MAX_MODE_SIZE); + if (!serializeSaveHeader(headerBuffer)) { + return false; + } + // serialize the number of modes + if (!headerBuffer.serialize8(m_numModes)) { + return false; + } + if (!Storage::write(0, headerBuffer)) { + return false; + } + return true; +} + // NOTE: Flash storage is limited to about 10,000 writes so // use this function sparingly! bool Modes::saveStorage() @@ -672,17 +702,7 @@ bool Modes::setFlag(uint8_t flag, bool enable, bool save) m_globalFlags &= ~flag; } DEBUG_LOGF("Toggled instant on/off to %s", enable ? "on" : "off"); - return !save || saveStorage(); -} - -bool Modes::getFlag(uint8_t flag) -{ - return ((m_globalFlags & flag) != 0); -} - -void Modes::resetFlags() -{ - m_globalFlags = 0; + return !save || saveHeader(); } #ifdef VORTEX_LIB diff --git a/VortexEngine/src/Modes/Modes.h b/VortexEngine/src/Modes/Modes.h index 772e86fd81..9df35c990c 100644 --- a/VortexEngine/src/Modes/Modes.h +++ b/VortexEngine/src/Modes/Modes.h @@ -36,6 +36,9 @@ class Modes static bool init(); static void cleanup(); + // load modes so they are ready to play + static bool load(); + // play the current mode static void play(); @@ -43,6 +46,9 @@ class Modes static bool saveToBuffer(ByteStream &saveBuffer); static bool loadFromBuffer(ByteStream &saveBuffer); + // save the header to storage + static bool saveHeader(); + // full save/load to/from storage static bool loadStorage(); static bool saveStorage(); @@ -107,9 +113,10 @@ class Modes // set or get flags static bool setFlag(uint8_t flag, bool enable, bool save = true); - static bool getFlag(uint8_t flag); + static bool getFlag(uint8_t flag) { return ((m_globalFlags & flag) != 0); } + // reset flags to factory default (must save after) - static void resetFlags(); + static void resetFlags() { m_globalFlags = 0; } // inline functions to toggle the various flags static bool setOneClickMode(bool enable, bool save = true) { @@ -154,9 +161,6 @@ class Modes #endif private: - static bool serializeSaveHeader(ByteStream &saveBuffer); - static bool unserializeSaveHeader(ByteStream &saveBuffer); - // linked list of internal mode storage class ModeLink { public: @@ -204,6 +208,10 @@ class Modes ModeLink *m_prev; }; + // save load the savefile header from storage + static bool serializeSaveHeader(ByteStream &saveBuffer); + static bool unserializeSaveHeader(ByteStream &saveBuffer); + // fetch a link from the chain by index static ModeLink *getModeLink(uint32_t index); @@ -212,6 +220,9 @@ class Modes static Mode *initCurMode(bool force = false); static bool saveCurMode(); + // whether modes have been loaded + static bool m_loaded; + // the current mode we're on static uint8_t m_curMode; diff --git a/VortexEngine/src/Serial/ByteStream.cpp b/VortexEngine/src/Serial/ByteStream.cpp index be5abe30d7..f77ebae5e9 100644 --- a/VortexEngine/src/Serial/ByteStream.cpp +++ b/VortexEngine/src/Serial/ByteStream.cpp @@ -319,7 +319,7 @@ uint32_t ByteStream::recalcCRC(bool force) void ByteStream::sanity() { // to ensure size never exceeds the buffer capacity - if (m_pData->size > m_capacity) { + if (m_pData && m_pData->size > m_capacity) { m_pData->size = m_capacity; } } diff --git a/VortexEngine/src/VortexEngine.cpp b/VortexEngine/src/VortexEngine.cpp index 53b7f944b8..90daee6d18 100644 --- a/VortexEngine/src/VortexEngine.cpp +++ b/VortexEngine/src/VortexEngine.cpp @@ -172,6 +172,12 @@ void VortexEngine::runMainLogic() // the current tick uint32_t now = Time::getCurtime(); + // load modes if necessary + if (!Modes::load()) { + // don't do anything if modes couldn't load + return; + } + // if the menus are open and running then just return if (Menus::run()) { return; From a1def7f8dfbac64f08c11b1ed4e80cfe08b1dbd8 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 30 Apr 2024 16:24:10 -0700 Subject: [PATCH 3/5] modes load save minor refactor --- VortexEngine/src/Modes/Modes.cpp | 199 +++++++++++++++++------------- VortexEngine/src/Modes/Modes.h | 14 ++- VortexEngine/src/VortexEngine.cpp | 2 +- 3 files changed, 121 insertions(+), 94 deletions(-) diff --git a/VortexEngine/src/Modes/Modes.cpp b/VortexEngine/src/Modes/Modes.cpp index 95fb11b2fa..d484f31024 100644 --- a/VortexEngine/src/Modes/Modes.cpp +++ b/VortexEngine/src/Modes/Modes.cpp @@ -83,112 +83,95 @@ void Modes::play() } // shortclick cycles to the next mode if (g_pButton->onShortClick()) { - nextModeSkipEmpty(); + nextMode(); } // play the current mode m_pCurModeLink->play(); } -bool Modes::serializeSaveHeader(ByteStream &saveBuffer) +// full save/load to/from buffer +bool Modes::saveToBuffer(ByteStream &modesBuffer) { - // serialize the engine version into the modes buffer - if (!VortexEngine::serializeVersion(saveBuffer)) { + // first write out the header + if (!serializeSaveHeader(modesBuffer)) { return false; } - // NOTE: instead of global brightness the duo uses this to store the - // startup mode ID. The duo doesn't offer a global brightness option - if (!saveBuffer.serialize8(m_globalFlags)) { + // serialize all modes data into the modesBuffer + if (!serialize(modesBuffer)) { return false; } - // serialize the global brightness - if (!saveBuffer.serialize8((uint8_t)Leds::getBrightness())) { + DEBUG_LOGF("Serialized all modes, uncompressed size: %u", modesBuffer.size()); + if (!modesBuffer.compress()) { return false; } - DEBUG_LOGF("Serialized all modes, uncompressed size: %u", saveBuffer.size()); return true; } -bool Modes::unserializeSaveHeader(ByteStream &saveHeader) +// load modes from a save buffer +bool Modes::loadFromBuffer(ByteStream &modesBuffer) { - // reset the unserializer index before unserializing anything - saveHeader.resetUnserializer(); - uint8_t major = 0; - uint8_t minor = 0; - // unserialize the vortex version - if (!saveHeader.unserialize8(&major)) { - return false; - } - if (!saveHeader.unserialize8(&minor)) { - return false; - } - // check the version for incompatibility - if (!VortexEngine::checkVersion(major, minor)) { - // incompatible version - ERROR_LOGF("Incompatible savefile version: %u.%u", major, minor); + if (!modesBuffer.decompress()) { + // failed to decompress? return false; } - // NOTE: instead of global brightness the duo uses this to store the - // startup mode ID. The duo doesn't offer a global brightness option - // unserialize the global brightness - if (!saveHeader.unserialize8(&m_globalFlags)) { + // read out the header first + if (!unserializeSaveHeader(modesBuffer)) { return false; } - // unserialize the global brightness - uint8_t brightness = 0; - if (!saveHeader.unserialize8(&brightness)) { + // now just unserialize the list of modes + if (!unserialize(modesBuffer)) { return false; } - if (brightness) { - Leds::setBrightness(brightness); + if (oneClickModeEnabled()) { + // set the current mode to the startup mode + switchToStartupMode(); } return true; } -// full save/load to/from buffer -bool Modes::saveToBuffer(ByteStream &modesBuffer) +bool Modes::saveHeader() { - // first write out the header - if (!serializeSaveHeader(modesBuffer)) { + ByteStream headerBuffer(MAX_MODE_SIZE); + if (!serializeSaveHeader(headerBuffer)) { return false; } - // serialize all modes data into the modesBuffer - if (!serialize(modesBuffer)) { + // serialize the number of modes + if (!headerBuffer.serialize8(m_numModes)) { return false; } - DEBUG_LOGF("Serialized all modes, uncompressed size: %u", modesBuffer.size()); - if (!modesBuffer.compress()) { + if (!Storage::write(0, headerBuffer)) { return false; } return true; } -// load modes from a save buffer -bool Modes::loadFromBuffer(ByteStream &modesBuffer) +bool Modes::loadHeader() { - if (!modesBuffer.decompress()) { - // failed to decompress? - return false; - } - // read out the header first - if (!unserializeSaveHeader(modesBuffer)) { + ByteStream headerBuffer; + // only read storage if the modebuffer isn't filled + if (!Storage::read(0, headerBuffer) || !headerBuffer.size()) { + DEBUG_LOG("Empty buffer read from storage"); + // this kinda sucks whatever they had loaded is gone return false; } - // now just unserialize the list of modes - if (!unserialize(modesBuffer)) { + // this erases what is stored before we know whether there is data + // but it's the easiest way to just re-load new data from storage + clearModes(); + // read the header and load the data + if (!unserializeSaveHeader(headerBuffer)) { return false; } - // startupMode is 1-based offset that encodes both the index to start at and - // whether the system is enabled, hence why 0 cannot be used as an offset - uint8_t startupMode = (m_globalFlags & 0xF0) >> 4; - if (oneClickModeEnabled() && startupMode > 0) { - // set the current mode to the startup mode - setCurMode(startupMode); - } + // NOTE: We do not bother loading the number of modes because + // we can't really do anything with it anyway return true; } bool Modes::loadStorage() { + // NOTE: We could call loadHeader here but then we wouldn't have the headerBuffer + // and in turn wouldn't be able to unserialize the number of modes. The number + // of modes is a weird case, it's technically part of the mode list not the + // header but it is stored in the same storage slot as the header ByteStream headerBuffer; // only read storage if the modebuffer isn't filled if (!Storage::read(0, headerBuffer) || !headerBuffer.size()) { @@ -221,21 +204,9 @@ bool Modes::loadStorage() return false; } } - return true; -} - -bool Modes::saveHeader() -{ - ByteStream headerBuffer(MAX_MODE_SIZE); - if (!serializeSaveHeader(headerBuffer)) { - return false; - } - // serialize the number of modes - if (!headerBuffer.serialize8(m_numModes)) { - return false; - } - if (!Storage::write(0, headerBuffer)) { - return false; + if (oneClickModeEnabled()) { + // set the current mode to the startup mode + switchToStartupMode(); } return true; } @@ -245,24 +216,14 @@ bool Modes::saveHeader() bool Modes::saveStorage() { DEBUG_LOG("Saving modes..."); - ByteStream headerBuffer(MAX_MODE_SIZE); - if (!serializeSaveHeader(headerBuffer)) { - return false; - } - // serialize the number of modes - if (!headerBuffer.serialize8(m_numModes)) { - return false; - } - if (!Storage::write(0, headerBuffer)) { - return false; - } + saveHeader(); // make sure the current mode is saved in case it has changed somehow saveCurMode(); // uninstantiate cur mode so we have stack space to serialize if (m_pCurModeLink) { m_pCurModeLink->uninstantiate(); } - uint16_t i = 0; + uint8_t i = 0; ModeLink *ptr = m_storedModes; while (ptr && i < MAX_MODES) { ByteStream modeBuffer(MAX_MODE_SIZE); @@ -293,6 +254,65 @@ bool Modes::saveStorage() return true; } +bool Modes::serializeSaveHeader(ByteStream &saveBuffer) +{ + // serialize the engine version into the modes buffer + if (!VortexEngine::serializeVersion(saveBuffer)) { + return false; + } + // NOTE: instead of global brightness the duo uses this to store the + // startup mode ID. The duo doesn't offer a global brightness option + if (!saveBuffer.serialize8(m_globalFlags)) { + return false; + } + // serialize the global brightness + if (!saveBuffer.serialize8((uint8_t)Leds::getBrightness())) { + return false; + } + DEBUG_LOGF("Serialized all modes, uncompressed size: %u", saveBuffer.size()); + return true; +} + +bool Modes::unserializeSaveHeader(ByteStream &saveHeader) +{ + if (!saveHeader.decompress()) { + // failed to decompress? + return false; + } + // reset the unserializer index before unserializing anything + saveHeader.resetUnserializer(); + uint8_t major = 0; + uint8_t minor = 0; + // unserialize the vortex version + if (!saveHeader.unserialize8(&major)) { + return false; + } + if (!saveHeader.unserialize8(&minor)) { + return false; + } + // check the version for incompatibility + if (!VortexEngine::checkVersion(major, minor)) { + // incompatible version + ERROR_LOGF("Incompatible savefile version: %u.%u", major, minor); + return false; + } + // NOTE: instead of global brightness the duo uses this to store the + // startup mode ID. The duo doesn't offer a global brightness option + // unserialize the global brightness + if (!saveHeader.unserialize8(&m_globalFlags)) { + return false; + } + // unserialize the global brightness + uint8_t brightness = 0; + if (!saveHeader.unserialize8(&brightness)) { + return false; + } + if (brightness) { + Leds::setBrightness(brightness); + } + return true; +} + // Save all of the modes to a serial buffer bool Modes::serialize(ByteStream &modesBuffer) { @@ -692,6 +712,11 @@ uint8_t Modes::startupMode() return (m_globalFlags & 0xF0) >> 4; } +Mode *Modes::switchToStartupMode() +{ + return setCurMode(startupMode()); +} + bool Modes::setFlag(uint8_t flag, bool enable, bool save) { // then actually if it's enabled ensure the upper nibble is set diff --git a/VortexEngine/src/Modes/Modes.h b/VortexEngine/src/Modes/Modes.h index 9df35c990c..8de629da45 100644 --- a/VortexEngine/src/Modes/Modes.h +++ b/VortexEngine/src/Modes/Modes.h @@ -46,12 +46,17 @@ class Modes static bool saveToBuffer(ByteStream &saveBuffer); static bool loadFromBuffer(ByteStream &saveBuffer); - // save the header to storage + // save/load the global settings to/from storage static bool saveHeader(); + static bool loadHeader(); // full save/load to/from storage - static bool loadStorage(); static bool saveStorage(); + static bool loadStorage(); + + // save load the savefile header from storage + static bool serializeSaveHeader(ByteStream &saveBuffer); + static bool unserializeSaveHeader(ByteStream &saveBuffer); // saves all modes to a buffer static bool serialize(ByteStream &buffer); @@ -110,6 +115,7 @@ class Modes // set the startup mode index (which mode will be displayed on startup) static void setStartupMode(uint8_t index); static uint8_t startupMode(); + static Mode *switchToStartupMode(); // set or get flags static bool setFlag(uint8_t flag, bool enable, bool save = true); @@ -208,10 +214,6 @@ class Modes ModeLink *m_prev; }; - // save load the savefile header from storage - static bool serializeSaveHeader(ByteStream &saveBuffer); - static bool unserializeSaveHeader(ByteStream &saveBuffer); - // fetch a link from the chain by index static ModeLink *getModeLink(uint32_t index); diff --git a/VortexEngine/src/VortexEngine.cpp b/VortexEngine/src/VortexEngine.cpp index 90daee6d18..087931c7d9 100644 --- a/VortexEngine/src/VortexEngine.cpp +++ b/VortexEngine/src/VortexEngine.cpp @@ -199,7 +199,7 @@ void VortexEngine::runMainLogic() // if auto cycle is enabled and the last switch was more than the delay ago if (m_autoCycle && (Modes::lastSwitchTime() + AUTO_RANDOM_DELAY < now)) { // then switch to the next mode automatically - Modes::nextModeSkipEmpty(); + Modes::nextMode(); } // otherwise just play the modes From 765afa60f144e9c0f8e5dc8735060a45058f5651 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 30 Apr 2024 16:36:30 -0700 Subject: [PATCH 4/5] switched order of load and saveStorage --- VortexEngine/src/Modes/Modes.cpp | 86 ++++++++++++++++---------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/VortexEngine/src/Modes/Modes.cpp b/VortexEngine/src/Modes/Modes.cpp index d484f31024..7d6b41f1ae 100644 --- a/VortexEngine/src/Modes/Modes.cpp +++ b/VortexEngine/src/Modes/Modes.cpp @@ -166,6 +166,49 @@ bool Modes::loadHeader() return true; } +// NOTE: Flash storage is limited to about 10,000 writes so +// use this function sparingly! +bool Modes::saveStorage() +{ + DEBUG_LOG("Saving modes..."); + saveHeader(); + // make sure the current mode is saved in case it has changed somehow + saveCurMode(); + // uninstantiate cur mode so we have stack space to serialize + if (m_pCurModeLink) { + m_pCurModeLink->uninstantiate(); + } + uint8_t i = 0; + ModeLink *ptr = m_storedModes; + while (ptr && i < MAX_MODES) { + ByteStream modeBuffer(MAX_MODE_SIZE); + // instantiate the mode temporarily + Mode *mode = ptr->instantiate(); + if (!mode) { + ERROR_OUT_OF_MEMORY(); + return false; + } + // serialize it into the target modes buffer + if (!mode->serialize(modeBuffer)) { + return false; + } + // just uninstansiate the mode after serializing + ptr->uninstantiate(); + // next mode + ptr = ptr->next(); + // now write this mode into a storage slot (skip first slot, that's header) + if (!Storage::write(++i, modeBuffer)) { + return false; + } + } + // reinstanstiate the current mode + if (m_pCurModeLink && !m_pCurModeLink->instantiate()) { + return false; + } + DEBUG_LOGF("Serialized num modes: %u", m_numModes); + return true; +} + bool Modes::loadStorage() { // NOTE: We could call loadHeader here but then we wouldn't have the headerBuffer @@ -211,49 +254,6 @@ bool Modes::loadStorage() return true; } -// NOTE: Flash storage is limited to about 10,000 writes so -// use this function sparingly! -bool Modes::saveStorage() -{ - DEBUG_LOG("Saving modes..."); - saveHeader(); - // make sure the current mode is saved in case it has changed somehow - saveCurMode(); - // uninstantiate cur mode so we have stack space to serialize - if (m_pCurModeLink) { - m_pCurModeLink->uninstantiate(); - } - uint8_t i = 0; - ModeLink *ptr = m_storedModes; - while (ptr && i < MAX_MODES) { - ByteStream modeBuffer(MAX_MODE_SIZE); - // instantiate the mode temporarily - Mode *mode = ptr->instantiate(); - if (!mode) { - ERROR_OUT_OF_MEMORY(); - return false; - } - // serialize it into the target modes buffer - if (!mode->serialize(modeBuffer)) { - return false; - } - // just uninstansiate the mode after serializing - ptr->uninstantiate(); - // next mode - ptr = ptr->next(); - // now write this mode into a storage slot (skip first slot, that's header) - if (!Storage::write(++i, modeBuffer)) { - return false; - } - } - // reinstanstiate the current mode - if (m_pCurModeLink && !m_pCurModeLink->instantiate()) { - return false; - } - DEBUG_LOGF("Serialized num modes: %u", m_numModes); - return true; -} - bool Modes::serializeSaveHeader(ByteStream &saveBuffer) { // serialize the engine version into the modes buffer From 7156e625a5c4d11a05a0d0dd19862c7c00f75463 Mon Sep 17 00:00:00 2001 From: Unreal-Dan <72595612+Unreal-Dan@users.noreply.github.com> Date: Tue, 30 Apr 2024 20:24:28 -0700 Subject: [PATCH 5/5] testing zipping of tests (#243) test data files are zipped now --- VortexEngine/tests/create_test.sh | 21 +- .../tests/{extra => }/make_test_list.sh | 0 VortexEngine/tests/record_test.sh | 6 +- VortexEngine/tests/recordtests.sh | 34 +- VortexEngine/tests/runtests.sh | 42 +- VortexEngine/tests/{extra => }/test_list | 0 VortexEngine/tests/tests_general.tar.gz | Bin 0 -> 339916 bytes .../tests_general/0001_Cycle_all_modes.test | 1509 - .../tests/tests_general/0002_Enter_Menus.test | 607 - .../tests_general/0003_Start_Auto-cycle.test | 7007 - .../tests_general/0004_End_Auto-cycle.test | 12009 -- .../0005_Cycle_through_Menu_List.test | 1812 - .../0006_Activate_Adv_Menus.test | 338 - .../tests_general/0007_Enter_Randomizer.test | 338 - .../0008_Enter_Mode_Share_Menu.test | 639 - .../0009_Enter_Color_Select_Menu.test | 641 - .../0010_Enter_Pattern_Select_Menu.test | 642 - .../0011_Enter_Brightness_Menu.test | 643 - .../0012_Enter_Factory_Reset_Menu.test | 644 - .../0013_Enter_Adv_Randomizer.test | 338 - .../0014_Enter_Adv_Mode_Share.test | 339 - .../0015_Enter_Adv_Color_Select.test | 341 - .../0016_Enter_Adv_Pattern_Select.test | 342 - .../0017_Enter_Adv_Brightness.test | 343 - .../0018_Enter_Adv_Factory_Reset.test | 344 - .../0019_Cycle_bulbs_in_Randomizer.test | 912 - .../0020_Randomize_Both_Bulbs.test | 311 - ...0021_Save_Randomization_to_Both_Bulbs.test | 412 - ...0022_Start_Auto-randomizer_Both_Bulbs.test | 3012 - .../0023_Stop_Auto-randomizer_Both_Bulbs.test | 6014 - .../0024_Randomize_Front_Bulb.test | 312 - ...0025_Save_Randomization_to_Front_Bulb.test | 512 - ...0026_Start_Auto-randomizer_Front_Bulb.test | 5012 - .../0027_Stop_Auto-randomizer_Front_Bulb.test | 6014 - .../0028_Randomize_Top_Bulb.test | 312 - .../0029_Save_Randomization_to_Top_Bulb.test | 513 - .../0030_Start_Auto-randomizer_Top_Bulb.test | 5013 - .../0031_Stop_Auto-randomizer_Top_Bulb.test | 6015 - .../0032_Cycle_bulbs_in_Adv_Randomizer.test | 1211 - ...033_Cycle_Randomizer_Types_Both_Bulbs.test | 942 - .../0034_Randomize_Color_Only_Both_Bulbs.test | 672 - ...olor_Only_Randomization_to_Both_Bulbs.test | 312 - ...Color_Only_Auto-randomizer_Both_Bulbs.test | 5012 - ...Color_Only_Auto-randomizer_Both_Bulbs.test | 6014 - ...038_Randomize_Pattern_Only_Both_Bulbs.test | 914 - ...tern_Only_Randomization_to_Both_Bulbs.test | 313 - ...ttern_Only_Auto-randomizer_Both_Bulbs.test | 5013 - ...ttern_Only_Auto-randomizer_Both_Bulbs.test | 6015 - ...andomize_Color_and_Pattern_Both_Bulbs.test | 915 - ...d_Pattern_Randomization_to_Both_Bulbs.test | 314 - ...nd_Pattern_Auto-randomizer_Both_Bulbs.test | 5014 - ...nd_Pattern_Auto-randomizer_Both_Bulbs.test | 6016 - ...046_Cycle_Randomizer_Types_Front_Bulb.test | 913 - .../0047_Randomize_Color_Only_Front_Bulb.test | 914 - ...olor_Only_Randomization_to_Front_Bulb.test | 313 - ...Color_Only_Auto-randomizer_Front_Bulb.test | 5014 - ...Color_Only_Auto-randomizer_Front_Bulb.test | 6016 - ...051_Randomize_Pattern_Only_Front_Bulb.test | 915 - ...tern_Only_Randomization_to_Front_Bulb.test | 314 - ...ttern_Only_Auto-randomizer_Front_Bulb.test | 5014 - ...ttern_Only_Auto-randomizer_Front_Bulb.test | 6016 - ...andomize_Color_and_Pattern_Front_Bulb.test | 916 - ...d_Pattern_Randomization_to_Front_Bulb.test | 315 - ...nd_Pattern_Auto-randomizer_Front_Bulb.test | 5015 - ...nd_Pattern_Auto-randomizer_Front_Bulb.test | 6017 - .../0059_Cycle_Randomizer_Types_Top_Bulb.test | 914 - .../0060_Randomize_Color_Only_Top_Bulb.test | 915 - ..._Color_Only_Randomization_to_Top_Bulb.test | 314 - ...t_Color_Only_Auto-randomizer_Top_Bulb.test | 5014 - ...p_Color_Only_Auto-randomizer_Top_Bulb.test | 6016 - .../0064_Randomize_Pattern_Only_Top_Bulb.test | 314 - ...attern_Only_Randomization_to_Top_Bulb.test | 315 - ...Pattern_Only_Auto-randomizer_Top_Bulb.test | 5015 - ...Pattern_Only_Auto-randomizer_Top_Bulb.test | 6017 - ..._Randomize_Color_and_Pattern_Top_Bulb.test | 917 - ...and_Pattern_Randomization_to_Top_Bulb.test | 316 - ..._and_Pattern_Auto-randomizer_Top_Bulb.test | 5016 - ..._and_Pattern_Auto-randomizer_Top_Bulb.test | 6018 - .../tests_general/0072_Receive_a_mode.test | 309 - .../tests_general/0073_Exit_mode_sharing.test | 310 - ...74_Reveice_a_mode_in_adv_mode_sharing.test | 309 - .../0075_Exit_adv_mode_sharing.test | 310 - .../0076_Cycle_bulbs_in_Color_Select.test | 913 - ...olor_Slots_in_Color_Select_Both_Bulbs.test | 1516 - ...w_Sections_in_Color_Select_Both_Bulbs.test | 1517 - ..._Selection_in_Color_Select_Both_Bulbs.test | 1518 - ..._Selection_in_Color_Select_Both_Bulbs.test | 1519 - ..._Selection_in_Color_Select_Both_Bulbs.test | 1520 - ...lect_Color_in_Color_Select_Both_Bulbs.test | 526 - ...lect_Blank_in_Color_Select_Both_Bulbs.test | 319 - ...lection_from_Val_Selection_Both_Bulbs.test | 320 - ...lect_White_in_Color_Select_Both_Bulbs.test | 318 - ...lection_from_Sat_Selection_Both_Bulbs.test | 319 - ...lection_from_Hue_Selection_Both_Bulbs.test | 318 - ...ion_from_Rainbow_Selection_Both_Bulbs.test | 317 - ..._Add_Color_in_Color_Select_Both_Bulbs.test | 315 - ..._New_Color_in_Color_Select_Both_Bulbs.test | 319 - ...e_and_Exit_in_Color_Select_Both_Bulbs.test | 316 - ...te_a_Color_in_Color_Select_Both_Bulbs.test | 312 - ..._Color_set_in_Color_Select_Both_Bulbs.test | 345 - ...All_Colors_in_Color_Select_Both_Bulbs.test | 316 - ...olor_Slots_in_Color_Select_Front_Bulb.test | 317 - ...w_Sections_in_Color_Select_Front_Bulb.test | 318 - ..._Selection_in_Color_Select_Front_Bulb.test | 319 - ..._Selection_in_Color_Select_Front_Bulb.test | 320 - ..._Selection_in_Color_Select_Front_Bulb.test | 321 - ...lect_Color_in_Color_Select_Front_Bulb.test | 317 - ...lect_Blank_in_Color_Select_Front_Bulb.test | 320 - ...lection_from_Val_Selection_Front_Bulb.test | 321 - ...lect_White_in_Color_Select_Front_Bulb.test | 319 - ...lection_from_Sat_Selection_Front_Bulb.test | 320 - ...lection_from_Hue_Selection_Front_Bulb.test | 319 - ...ion_from_Rainbow_Selection_Front_Bulb.test | 318 - ..._Add_Color_in_Color_Select_Front_Bulb.test | 316 - ..._New_Color_in_Color_Select_Front_Bulb.test | 320 - ...e_and_Exit_in_Color_Select_Front_Bulb.test | 317 - ...te_a_Color_in_Color_Select_Front_Bulb.test | 313 - ..._Color_set_in_Color_Select_Front_Bulb.test | 346 - ...All_Colors_in_Color_Select_Front_Bulb.test | 317 - ..._Color_Slots_in_Color_Select_Top_Bulb.test | 318 - ...bow_Sections_in_Color_Select_Top_Bulb.test | 319 - ...ue_Selection_in_Color_Select_Top_Bulb.test | 320 - ...at_Selection_in_Color_Select_Top_Bulb.test | 321 - ...al_Selection_in_Color_Select_Top_Bulb.test | 322 - ...Select_Color_in_Color_Select_Top_Bulb.test | 318 - ...Select_Blank_in_Color_Select_Top_Bulb.test | 321 - ...Selection_from_Val_Selection_Top_Bulb.test | 322 - ...Select_White_in_Color_Select_Top_Bulb.test | 320 - ...Selection_from_Sat_Selection_Top_Bulb.test | 321 - ...Selection_from_Hue_Selection_Top_Bulb.test | 320 - ...ction_from_Rainbow_Selection_Top_Bulb.test | 319 - ...ct_Add_Color_in_Color_Select_Top_Bulb.test | 317 - ..._a_New_Color_in_Color_Select_Top_Bulb.test | 321 - ...ave_and_Exit_in_Color_Select_Top_Bulb.test | 318 - ...lete_a_Color_in_Color_Select_Top_Bulb.test | 314 - ..._8_Color_set_in_Color_Select_Top_Bulb.test | 347 - ...e_All_Colors_in_Color_Select_Top_Bulb.test | 318 - .../0131_Cycle_bulbs_in_Pattern_Select.test | 314 - ...Patterns_in_Pattern_Select_Both_Bulbs.test | 7862 -- ..._Pattern_in_Pattern_Select_Both_Bulbs.test | 313 - ...e_Patterns_in_Pattern_Select_Top_Bulb.test | 343 - ...ct_Pattern_in_Pattern_Select_Top_Bulb.test | 314 - ...Patterns_in_Pattern_Select_Front_Bulb.test | 344 - ..._Pattern_in_Pattern_Select_Front_Bulb.test | 315 - ...138_Cycle_bulbs_in_Adv_Pattern_Select.test | 914 - ...am_1_in_Adv_Pattern_Select_Both_Bulbs.test | 313 - ...t_10_in_Adv_Pattern_Select_Both_Bulbs.test | 313 - ...am_2_in_Adv_Pattern_Select_Both_Bulbs.test | 314 - ...t_10_in_Adv_Pattern_Select_Both_Bulbs.test | 314 - ...am_3_in_Adv_Pattern_Select_Both_Bulbs.test | 315 - ...t_10_in_Adv_Pattern_Select_Both_Bulbs.test | 315 - ...am_4_in_Adv_Pattern_Select_Both_Bulbs.test | 316 - ...t_10_in_Adv_Pattern_Select_Both_Bulbs.test | 316 - ...am_5_in_Adv_Pattern_Select_Both_Bulbs.test | 317 - ...t_10_in_Adv_Pattern_Select_Both_Bulbs.test | 317 - ...tern_in_Adv_Pattern_Select_Both_Bulbs.test | 317 - ...ions_in_Adv_Pattern_Select_Both_Bulbs.test | 325 - ...ions_in_Adv_Pattern_Select_Both_Bulbs.test | 325 - ...ions_in_Adv_Pattern_Select_Both_Bulbs.test | 324 - ...ions_in_Adv_Pattern_Select_Both_Bulbs.test | 323 - ...ions_in_Adv_Pattern_Select_Both_Bulbs.test | 322 - ...am_1_in_Adv_Pattern_Select_Front_Bulb.test | 314 - ...t_10_in_Adv_Pattern_Select_Front_Bulb.test | 314 - ...am_2_in_Adv_Pattern_Select_Front_Bulb.test | 315 - ...t_10_in_Adv_Pattern_Select_Front_Bulb.test | 315 - ...am_3_in_Adv_Pattern_Select_Front_Bulb.test | 316 - ...t_10_in_Adv_Pattern_Select_Front_Bulb.test | 316 - ...am_4_in_Adv_Pattern_Select_Front_Bulb.test | 317 - ...t_10_in_Adv_Pattern_Select_Front_Bulb.test | 317 - ...am_5_in_Adv_Pattern_Select_Front_Bulb.test | 318 - ...t_10_in_Adv_Pattern_Select_Front_Bulb.test | 318 - ...tern_in_Adv_Pattern_Select_Front_Bulb.test | 318 - ...ions_in_Adv_Pattern_Select_Front_Bulb.test | 326 - ...ions_in_Adv_Pattern_Select_Front_Bulb.test | 326 - ...ions_in_Adv_Pattern_Select_Front_Bulb.test | 325 - ...ions_in_Adv_Pattern_Select_Front_Bulb.test | 324 - ...ions_in_Adv_Pattern_Select_Front_Bulb.test | 323 - ...aram_1_in_Adv_Pattern_Select_Top_Bulb.test | 315 - ...ext_10_in_Adv_Pattern_Select_Top_Bulb.test | 315 - ...aram_2_in_Adv_Pattern_Select_Top_Bulb.test | 316 - ...ext_10_in_Adv_Pattern_Select_Top_Bulb.test | 316 - ...aram_3_in_Adv_Pattern_Select_Top_Bulb.test | 317 - ...ext_10_in_Adv_Pattern_Select_Top_Bulb.test | 317 - ...aram_4_in_Adv_Pattern_Select_Top_Bulb.test | 318 - ...ext_10_in_Adv_Pattern_Select_Top_Bulb.test | 318 - ...aram_5_in_Adv_Pattern_Select_Top_Bulb.test | 319 - ...ext_10_in_Adv_Pattern_Select_Top_Bulb.test | 319 - ...attern_in_Adv_Pattern_Select_Top_Bulb.test | 319 - ...ptions_in_Adv_Pattern_Select_Top_Bulb.test | 327 - ...ptions_in_Adv_Pattern_Select_Top_Bulb.test | 327 - ...ptions_in_Adv_Pattern_Select_Top_Bulb.test | 326 - ...ptions_in_Adv_Pattern_Select_Top_Bulb.test | 325 - ...ptions_in_Adv_Pattern_Select_Top_Bulb.test | 324 - ...Brightness_Options_in_Brightness_Menu.test | 317 - ..._Select_Brightness_in_Brightness_Menu.test | 313 - .../0189_Start_Keychain_Mode.test | 312 - ...0190_Show_Keychain_Mode_First_Pattern.test | 313 - .../0191_Wait_past_Keychain_Mode_Timer.test | 2312 - ...92_Trigger_before_Keychain_Mode_Timer.test | 313 - .../0193_Exit_Keychain_Mode.test | 313 - .../0194_Wait_for_Sleep_in_Keychain_mode.test | 100315 --------------- ...5_Cycle_Options_in_Factory_Reset_Menu.test | 315 - .../0196_Exit_Factory_Reset_Menu.test | 314 - .../tests_general/0197_Factory_Reset.test | 4313 - ...Cycle_bulbs_in_Adv_Factory_Reset_Menu.test | 316 - ..._in_Adv_Factory_Reset_Menu_Both_Bulbs.test | 316 - ...xit_Adv_Factory_Reset_Menu_Both_Bulbs.test | 315 - .../0201_Factory_Reset_Both_Bulbs.test | 4314 - ..._in_Adv_Factory_Reset_Menu_Front_Bulb.test | 317 - ...xit_Adv_Factory_Reset_Menu_Front_Bulb.test | 316 - .../0204_Factory_Reset_Front_Bulb.test | 4315 - ...ns_in_Adv_Factory_Reset_Menu_Top_Bulb.test | 318 - ..._Exit_Adv_Factory_Reset_Menu_Top_Bulb.test | 317 - .../0207_Factory_Reset_Top_Bulb.test | 4316 - .../0208_randomize_mode1_watch.test | 50058 ------- .../0209_randomize_mode2_watch.test | 50059 ------- .../0210_randomize_mode3_watch.test | 50060 ------- .../0211_randomize_mode4_watch.test | 50061 ------- .../0212_randomize_mode5_watch.test | 50062 ------- 219 files changed, 74 insertions(+), 603309 deletions(-) rename VortexEngine/tests/{extra => }/make_test_list.sh (100%) rename VortexEngine/tests/{extra => }/test_list (100%) create mode 100644 VortexEngine/tests/tests_general.tar.gz delete mode 100644 VortexEngine/tests/tests_general/0001_Cycle_all_modes.test delete mode 100644 VortexEngine/tests/tests_general/0002_Enter_Menus.test delete mode 100644 VortexEngine/tests/tests_general/0003_Start_Auto-cycle.test delete mode 100644 VortexEngine/tests/tests_general/0004_End_Auto-cycle.test delete mode 100644 VortexEngine/tests/tests_general/0005_Cycle_through_Menu_List.test delete mode 100644 VortexEngine/tests/tests_general/0006_Activate_Adv_Menus.test delete mode 100644 VortexEngine/tests/tests_general/0007_Enter_Randomizer.test delete mode 100644 VortexEngine/tests/tests_general/0008_Enter_Mode_Share_Menu.test delete mode 100644 VortexEngine/tests/tests_general/0009_Enter_Color_Select_Menu.test delete mode 100644 VortexEngine/tests/tests_general/0010_Enter_Pattern_Select_Menu.test delete mode 100644 VortexEngine/tests/tests_general/0011_Enter_Brightness_Menu.test delete mode 100644 VortexEngine/tests/tests_general/0012_Enter_Factory_Reset_Menu.test delete mode 100644 VortexEngine/tests/tests_general/0013_Enter_Adv_Randomizer.test delete mode 100644 VortexEngine/tests/tests_general/0014_Enter_Adv_Mode_Share.test delete mode 100644 VortexEngine/tests/tests_general/0015_Enter_Adv_Color_Select.test delete mode 100644 VortexEngine/tests/tests_general/0016_Enter_Adv_Pattern_Select.test delete mode 100644 VortexEngine/tests/tests_general/0017_Enter_Adv_Brightness.test delete mode 100644 VortexEngine/tests/tests_general/0018_Enter_Adv_Factory_Reset.test delete mode 100644 VortexEngine/tests/tests_general/0019_Cycle_bulbs_in_Randomizer.test delete mode 100644 VortexEngine/tests/tests_general/0020_Randomize_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0021_Save_Randomization_to_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0022_Start_Auto-randomizer_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0023_Stop_Auto-randomizer_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0024_Randomize_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0025_Save_Randomization_to_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0026_Start_Auto-randomizer_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0027_Stop_Auto-randomizer_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0028_Randomize_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0029_Save_Randomization_to_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0030_Start_Auto-randomizer_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0031_Stop_Auto-randomizer_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0032_Cycle_bulbs_in_Adv_Randomizer.test delete mode 100644 VortexEngine/tests/tests_general/0033_Cycle_Randomizer_Types_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0034_Randomize_Color_Only_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0035_Save_Color_Only_Randomization_to_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0036_Start_Color_Only_Auto-randomizer_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0037_Stop_Color_Only_Auto-randomizer_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0038_Randomize_Pattern_Only_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0039_Save_Pattern_Only_Randomization_to_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0040_Start_Pattern_Only_Auto-randomizer_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0041_Stop_Pattern_Only_Auto-randomizer_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0042_Randomize_Color_and_Pattern_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0043_Save_Color_and_Pattern_Randomization_to_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0044_Start_Color_and_Pattern_Auto-randomizer_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0045_Stop_Color_and_Pattern_Auto-randomizer_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0046_Cycle_Randomizer_Types_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0047_Randomize_Color_Only_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0048_Save_Color_Only_Randomization_to_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0049_Start_Color_Only_Auto-randomizer_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0050_Stop_Color_Only_Auto-randomizer_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0051_Randomize_Pattern_Only_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0052_Save_Pattern_Only_Randomization_to_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0053_Start_Pattern_Only_Auto-randomizer_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0054_Stop_Pattern_Only_Auto-randomizer_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0055_Randomize_Color_and_Pattern_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0056_Save_Color_and_Pattern_Randomization_to_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0057_Start_Color_and_Pattern_Auto-randomizer_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0058_Stop_Color_and_Pattern_Auto-randomizer_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0059_Cycle_Randomizer_Types_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0060_Randomize_Color_Only_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0061_Save_Color_Only_Randomization_to_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0062_Start_Color_Only_Auto-randomizer_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0063_Stop_Color_Only_Auto-randomizer_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0064_Randomize_Pattern_Only_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0065_Save_Pattern_Only_Randomization_to_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0066_Start_Pattern_Only_Auto-randomizer_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0067_Stop_Pattern_Only_Auto-randomizer_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0068_Randomize_Color_and_Pattern_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0069_Save_Color_and_Pattern_Randomization_to_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0070_Start_Color_and_Pattern_Auto-randomizer_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0071_Stop_Color_and_Pattern_Auto-randomizer_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0072_Receive_a_mode.test delete mode 100644 VortexEngine/tests/tests_general/0073_Exit_mode_sharing.test delete mode 100644 VortexEngine/tests/tests_general/0074_Reveice_a_mode_in_adv_mode_sharing.test delete mode 100644 VortexEngine/tests/tests_general/0075_Exit_adv_mode_sharing.test delete mode 100644 VortexEngine/tests/tests_general/0076_Cycle_bulbs_in_Color_Select.test delete mode 100644 VortexEngine/tests/tests_general/0077_Cycle_Color_Slots_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0078_Cycle_Rainbow_Sections_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0079_Cycle_Hue_Selection_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0080_Cycle_Sat_Selection_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0081_Cycle_Val_Selection_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0082_Select_Color_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0083_Select_Blank_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0084_Return_to_Sat_Selection_from_Val_Selection_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0085_Select_White_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0086_Return_to_Hue_Selection_from_Sat_Selection_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0087_Return_to_Rainbow_Selection_from_Hue_Selection_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0088_Return_to_Slot_Selection_from_Rainbow_Selection_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0089_Select_Add_Color_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0090_Add_a_New_Color_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0091_Select_Save_and_Exit_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0092_Delete_a_Color_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0093_Save_an_8_Color_set_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0094_Delete_All_Colors_in_Color_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0095_Cycle_Color_Slots_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0096_Cycle_Rainbow_Sections_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0097_Cycle_Hue_Selection_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0098_Cycle_Sat_Selection_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0099_Cycle_Val_Selection_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0100_Select_Color_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0101_Select_Blank_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0102_Return_to_Sat_Selection_from_Val_Selection_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0103_Select_White_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0104_Return_to_Hue_Selection_from_Sat_Selection_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0105_Return_to_Rainbow_Selection_from_Hue_Selection_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0106_Return_to_Slot_Selection_from_Rainbow_Selection_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0107_Select_Add_Color_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0108_Add_a_New_Color_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0109_Select_Save_and_Exit_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0110_Delete_a_Color_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0111_Save_an_8_Color_set_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0112_Delete_All_Colors_in_Color_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0113_Cycle_Color_Slots_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0114_Cycle_Rainbow_Sections_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0115_Cycle_Hue_Selection_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0116_Cycle_Sat_Selection_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0117_Cycle_Val_Selection_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0118_Select_Color_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0119_Select_Blank_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0120_Return_to_Sat_Selection_from_Val_Selection_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0121_Select_White_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0122_Return_to_Hue_Selection_from_Sat_Selection_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0123_Return_to_Rainbow_Selection_from_Hue_Selection_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0124_Return_to_Slot_Selection_from_Rainbow_Selection_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0125_Select_Add_Color_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0126_Add_a_New_Color_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0127_Select_Save_and_Exit_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0128_Delete_a_Color_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0129_Save_an_8_Color_set_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0130_Delete_All_Colors_in_Color_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0131_Cycle_bulbs_in_Pattern_Select.test delete mode 100644 VortexEngine/tests/tests_general/0132_Cycle_Patterns_in_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0133_Select_Pattern_in_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0134_Cycle_Patterns_in_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0135_Select_Pattern_in_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0136_Cycle_Patterns_in_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0137_Select_Pattern_in_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0138_Cycle_bulbs_in_Adv_Pattern_Select.test delete mode 100644 VortexEngine/tests/tests_general/0139_Increase_Param_1_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0140_Increase_Param_1_to_next_10_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0141_Increase_Param_2_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0142_Increase_Param_2_to_next_10_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0143_Increase_Param_3_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0144_Increase_Param_3_to_next_10_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0145_Increase_Param_4_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0146_Increase_Param_4_to_next_10_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0147_Increase_Param_5_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0148_Increase_Param_5_to_next_10_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0149_Save_Custom_Pattern_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0150_Cycle_Through_Param_5_Options_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0151_Cycle_Through_Param_4_Options_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0152_Cycle_Through_Param_3_Options_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0153_Cycle_Through_Param_2_Options_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0154_Cycle_Through_Param_1_Options_in_Adv_Pattern_Select_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0155_Increase_Param_1_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0156_Increase_Param_1_to_next_10_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0157_Increase_Param_2_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0158_Increase_Param_2_to_next_10_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0159_Increase_Param_3_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0160_Increase_Param_3_to_next_10_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0161_Increase_Param_4_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0162_Increase_Param_4_to_next_10_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0163_Increase_Param_5_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0164_Increase_Param_5_to_next_10_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0165_Save_Custom_Pattern_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0166_Cycle_Through_Param_5_Options_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0167_Cycle_Through_Param_4_Options_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0168_Cycle_Through_Param_3_Options_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0169_Cycle_Through_Param_2_Options_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0170_Cycle_Through_Param_1_Options_in_Adv_Pattern_Select_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0171_Increase_Param_1_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0172_Increase_Param_1_to_next_10_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0173_Increase_Param_2_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0174_Increase_Param_2_to_next_10_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0175_Increase_Param_3_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0176_Increase_Param_3_to_next_10_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0177_Increase_Param_4_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0178_Increase_Param_4_to_next_10_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0179_Increase_Param_5_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0180_Increase_Param_5_to_next_10_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0181_Save_Custom_Pattern_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0182_Cycle_Through_Param_5_Options_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0183_Cycle_Through_Param_4_Options_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0184_Cycle_Through_Param_3_Options_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0185_Cycle_Through_Param_2_Options_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0186_Cycle_Through_Param_1_Options_in_Adv_Pattern_Select_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0187_Cycle_Brightness_Options_in_Brightness_Menu.test delete mode 100644 VortexEngine/tests/tests_general/0188_Select_Brightness_in_Brightness_Menu.test delete mode 100644 VortexEngine/tests/tests_general/0189_Start_Keychain_Mode.test delete mode 100644 VortexEngine/tests/tests_general/0190_Show_Keychain_Mode_First_Pattern.test delete mode 100644 VortexEngine/tests/tests_general/0191_Wait_past_Keychain_Mode_Timer.test delete mode 100644 VortexEngine/tests/tests_general/0192_Trigger_before_Keychain_Mode_Timer.test delete mode 100644 VortexEngine/tests/tests_general/0193_Exit_Keychain_Mode.test delete mode 100644 VortexEngine/tests/tests_general/0194_Wait_for_Sleep_in_Keychain_mode.test delete mode 100644 VortexEngine/tests/tests_general/0195_Cycle_Options_in_Factory_Reset_Menu.test delete mode 100644 VortexEngine/tests/tests_general/0196_Exit_Factory_Reset_Menu.test delete mode 100644 VortexEngine/tests/tests_general/0197_Factory_Reset.test delete mode 100644 VortexEngine/tests/tests_general/0198_Cycle_bulbs_in_Adv_Factory_Reset_Menu.test delete mode 100644 VortexEngine/tests/tests_general/0199_Cycle_Options_in_Adv_Factory_Reset_Menu_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0200_Exit_Adv_Factory_Reset_Menu_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0201_Factory_Reset_Both_Bulbs.test delete mode 100644 VortexEngine/tests/tests_general/0202_Cycle_Options_in_Adv_Factory_Reset_Menu_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0203_Exit_Adv_Factory_Reset_Menu_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0204_Factory_Reset_Front_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0205_Cycle_Options_in_Adv_Factory_Reset_Menu_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0206_Exit_Adv_Factory_Reset_Menu_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0207_Factory_Reset_Top_Bulb.test delete mode 100644 VortexEngine/tests/tests_general/0208_randomize_mode1_watch.test delete mode 100644 VortexEngine/tests/tests_general/0209_randomize_mode2_watch.test delete mode 100644 VortexEngine/tests/tests_general/0210_randomize_mode3_watch.test delete mode 100644 VortexEngine/tests/tests_general/0211_randomize_mode4_watch.test delete mode 100644 VortexEngine/tests/tests_general/0212_randomize_mode5_watch.test diff --git a/VortexEngine/tests/create_test.sh b/VortexEngine/tests/create_test.sh index b93cdae4c6..c4c65653bb 100644 --- a/VortexEngine/tests/create_test.sh +++ b/VortexEngine/tests/create_test.sh @@ -15,10 +15,10 @@ TODO= declare -a REPOS # Iterate through all the folders that start with "test_" in the current directory -for folder in tests_*/; do - # Remove the "./tests_" prefix and the final slash +for folder in tests_*.tar.gz; do + # Remove the "./tests_" prefix and the extension folder_name=${folder#tests_} - folder_name=${folder_name%/} + folder_name=${folder_name%.tar.gz} # Add the folder name to the array REPOS+=("$folder_name") done @@ -54,6 +54,11 @@ select_repo() { local original_PS3=$PS3 local repo + if [ "${#REPOS[@]}" -eq 1 ]; then + echo ${REPOS[0]} + return + fi + PS3='Please choose a repository: ' select repo in "${REPOS[@]}"; do @@ -99,9 +104,10 @@ if [ -z "$TARGETREPO" ]; then TARGETREPO=$(select_repo) fi -TESTDIR=tests_$TARGETREPO +# unzip the tests +tar -xvf tests_$TARGETREPO.tar.gz &> /dev/null -mkdir -p $TESTDIR +TESTDIR=tests_$TARGETREPO if [ $NOMAKE -eq 0 ]; then echo -e -n "\e[33mBuilding Vortex...\e[0m" @@ -206,6 +212,11 @@ while true; do # cd back cd - + # re-zip + tar -zcvf tmp_tests_$TARGETREPO.tar.gz tests_$TARGETREPO &> /dev/null + mv tmp_tests_$TARGETREPO.tar.gz tests_$TARGETREPO.tar.gz + rm -rf tests_$TARGETREPO + # done echo "Test file created: ${TEST_FILE}" diff --git a/VortexEngine/tests/extra/make_test_list.sh b/VortexEngine/tests/make_test_list.sh similarity index 100% rename from VortexEngine/tests/extra/make_test_list.sh rename to VortexEngine/tests/make_test_list.sh diff --git a/VortexEngine/tests/record_test.sh b/VortexEngine/tests/record_test.sh index a83dc7a0e3..71a65786c9 100644 --- a/VortexEngine/tests/record_test.sh +++ b/VortexEngine/tests/record_test.sh @@ -24,13 +24,13 @@ fi INPUT="$(grep "Input=" $FILE | cut -d= -f2)" BRIEF="$(grep "Brief=" $FILE | cut -d= -f2)" ARGS="$(grep "Args=" $FILE | cut -d= -f2)" -TESTNUM="$(echo $FILE | cut -d/ -f2 | cut -d_ -f1 | cut -d/ -f2)" +TESTNUM="$(echo $FILE | cut -d/ -f3 | cut -d_ -f1 | cut -d/ -f2)" TESTNUM=$((10#$TESTNUM)) if [ "$QUIET" -eq 0 ]; then - echo -e -n "\e[31mRecording $PROJECT ($TESTCOUNT/$NUMFILES) \e[33m[\e[97m$BRIEF\e[33m] \e[33m[\e[97m$ARGS\e[33m]...\e[0m" + echo -e -n "\e[31mRecording $FILE ($TESTCOUNT/$NUMFILES) \e[33m[\e[97m$BRIEF\e[33m] \e[33m[\e[97m$ARGS\e[33m]...\e[0m" fi -TEMP_FILE="tmp/${FILE}.out" +TEMP_FILE="${FILE}.out" # Append the output of the $VORTEX command to the temp file # NOTE: When recording the tests we don't use valgrind because # the valgrind output should be clean anyway. But when running diff --git a/VortexEngine/tests/recordtests.sh b/VortexEngine/tests/recordtests.sh index 77c50eeecc..20343d86fa 100644 --- a/VortexEngine/tests/recordtests.sh +++ b/VortexEngine/tests/recordtests.sh @@ -9,10 +9,10 @@ TODO= declare -a REPOS # Iterate through all the folders that start with "test_" in the current directory -for folder in tests_*/; do - # Remove the "./tests_" prefix and the final slash +for folder in tests_*.tar.gz; do + # Remove the "./tests_" prefix and the extension folder_name=${folder#tests_} - folder_name=${folder_name%/} + folder_name=${folder_name%.tar.gz} # Add the folder name to the array REPOS+=("$folder_name") done @@ -49,6 +49,11 @@ select_repo() { local original_PS3=$PS3 local repo + if [ "${#REPOS[@]}" -eq 1 ]; then + echo ${REPOS[0]} + return + fi + PS3='Please choose a repository: ' select repo in "${REPOS[@]}"; do @@ -84,11 +89,21 @@ function record_tests() { FILES= - rm -rf tmp/$PROJECT - mkdir -p tmp/$PROJECT + # clear tmp folder + rm -rf tmp/ + mkdir -p tmp/ + + cp $PROJECT.tar.gz tmp/ + + # unzip the tests + (cd tmp && tar -xvf $PROJECT.tar.gz &> /dev/null) + if [ $? -ne 0 ]; then + echo "Failed to unzip $PROJECT.tar.gz: $!" + exit 1 + fi if [ "$TODO" != "" ]; then - FILES=$(find $PROJECT -name $(printf "%04d" $TODO)*.test) + FILES=$(find tmp/$PROJECT -name $(printf "%04d" $TODO)*.test) if [ "$FILES" == "" ]; then echo "Could not find test $TODO" exit @@ -96,7 +111,7 @@ function record_tests() { NUMFILES=1 else # Iterate through the test files - for file in "$PROJECT"/*.test; do + for file in tmp/$PROJECT/*.test; do # Check if the file exists if [ -e "$file" ]; then NUMFILES=$((NUMFILES + 1)) @@ -126,6 +141,11 @@ function record_tests() { if [ "$QUIET" -eq 1 ]; then echo ". Complete" fi + + # rezip the package + (cd tmp && tar -zcvf $PROJECT.tar.gz $PROJECT &> /dev/null) + mv tmp/$PROJECT.tar.gz $PROJECT.tar.gz + echo "All tests recorded successfully!" #rm -rf tmp/$PROJECT } diff --git a/VortexEngine/tests/runtests.sh b/VortexEngine/tests/runtests.sh index 0a6ebd9623..aa69c60747 100644 --- a/VortexEngine/tests/runtests.sh +++ b/VortexEngine/tests/runtests.sh @@ -13,10 +13,10 @@ TODO= declare -a REPOS # Iterate through all the folders that start with "test_" in the current directory -for folder in tests_*/; do - # Remove the "./tests_" prefix and the final slash +for folder in tests_*.tar.gz; do + # Remove the "./tests_" prefix and the extension folder_name=${folder#tests_} - folder_name=${folder_name%/} + folder_name=${folder_name%.tar.gz} # Add the folder name to the array REPOS+=("$folder_name") done @@ -54,6 +54,11 @@ select_repo() { local original_PS3=$PS3 local repo + if [ "${#REPOS[@]}" -eq 1 ]; then + echo ${REPOS[0]} + return + fi + PS3='Please choose a repository: ' select repo in "${REPOS[@]}"; do @@ -80,8 +85,21 @@ function run_tests() { NUMFILES=0 FILES= + # clear tmp folder + rm -rf tmp/ + mkdir -p tmp/ + + cp $PROJECT.tar.gz tmp/ + + # unzip the tests + (cd tmp && tar -xvf $PROJECT.tar.gz &> /dev/null) + if [ $? -ne 0 ]; then + echo "Failed to unzip $PROJECT.tar.gz: $!" + exit 1 + fi + if [ "$TODO" != "" ]; then - FILES=$(find $PROJECT -name $(printf "%04d" $TODO)*.test) + FILES=$(find tmp/$PROJECT -name $(printf "%04d" $TODO)*.test) if [ "$FILES" == "" ]; then echo "Could not find test $TODO" exit @@ -89,7 +107,7 @@ function run_tests() { NUMFILES=1 else # Iterate through the test files - for file in "$PROJECT"/*.test; do + for file in tmp/$PROJECT/*.test; do # Check if the file exists if [ -e "$file" ]; then NUMFILES=$((NUMFILES + 1)) @@ -104,17 +122,13 @@ function run_tests() { echo -e "\e[33m== [\e[97mRUNNING $NUMFILES $PROJECT INTEGRATION TESTS\e[33m] ==\e[0m" - # clear tmp folder - rm -rf tmp/$PROJECT - mkdir -p tmp/$PROJECT - TESTCOUNT=0 for FILE in $FILES; do INPUT="$(grep "Input=" $FILE | cut -d= -f2)" BRIEF="$(grep "Brief=" $FILE | cut -d= -f2)" ARGS="$(grep "Args=" $FILE | cut -d= -f2)" - TESTNUM="$(echo $FILE | cut -d/ -f2 | cut -d_ -f1 | cut -d/ -f2)" + TESTNUM="$(echo $FILE | cut -d/ -f3 | cut -d_ -f1 | cut -d/ -f2)" TESTNUM=$((10#$TESTNUM)) TESTCOUNT=$((TESTCOUNT + 1)) echo -e -n "\e[33mTesting $PROJECT ($TESTCOUNT/$NUMFILES) [\e[97m$BRIEF\e[33m] " @@ -123,9 +137,9 @@ function run_tests() { fi echo -e -n "... \e[0m" DIVIDER=$(grep -n -- "--------------------------------------------------------------------------------" $FILE | cut -f1 -d:) - EXPECTED="tmp/${FILE}.expected" - OUTPUT="tmp/${FILE}.output" - DIFFOUT="tmp/${FILE}.diff" + EXPECTED="${FILE}.expected" + OUTPUT="${FILE}.output" + DIFFOUT="${FILE}.diff" tail -n +$(($DIVIDER + 1)) "$FILE" &> $EXPECTED # run again? if [ $AUDIT -eq 1 ]; then @@ -163,7 +177,7 @@ function run_tests() { if [ $ALLSUCCES -eq 1 ]; then echo -e "\e[33m== [\e[32mSUCCESS ALL TESTS PASSED\e[33m] ==\e[0m" # if so clear the tmp folder - rm -rf tmp/$PROJECT + rm -rf tmp/ else if [ "$VERBOSE" -eq 1 ]; then # otherwise cat the last diff diff --git a/VortexEngine/tests/extra/test_list b/VortexEngine/tests/test_list similarity index 100% rename from VortexEngine/tests/extra/test_list rename to VortexEngine/tests/test_list diff --git a/VortexEngine/tests/tests_general.tar.gz b/VortexEngine/tests/tests_general.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..eb4a845de6bd22a01b8a1a26c38c1a9ce2f69fcf GIT binary patch literal 339916 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