Skip to content

Commit

Permalink
more work
Browse files Browse the repository at this point in the history
  • Loading branch information
Unreal-Dan committed Jun 17, 2024
1 parent 29495c2 commit d5513ca
Show file tree
Hide file tree
Showing 4 changed files with 380 additions and 143 deletions.
325 changes: 192 additions & 133 deletions VortexEngine/src/Menus/MenuList/EditorConnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,37 +41,6 @@ bool EditorConnection::init()
return true;
}

bool EditorConnection::receiveMessage(const char *message)
{
size_t len = strlen(message);
uint8_t byte = 0;
// wait for the editor to ack the idle
if (m_receiveBuffer.size() < len) {
return false;
}
if (memcmp(m_receiveBuffer.frontUnserializer(), message, len) != 0) {
return false;
}
for (size_t i = 0; i < len; ++i) {
if (!m_receiveBuffer.unserialize8(&byte)) {
return false;
}
}
// if everything was read out, reset
if (m_receiveBuffer.unserializerAtEnd()) {
m_receiveBuffer.clear();
}
return true;
}

void EditorConnection::clearDemo()
{
Colorset set(RGB_WHITE0);
PatternArgs args(1, 0, 0);
m_previewMode.setPattern(PATTERN_STROBE, LED_ALL, &args, &set);
m_previewMode.init();
}

Menu::MenuAction EditorConnection::run()
{
MenuAction result = Menu::run();
Expand Down Expand Up @@ -241,6 +210,55 @@ Menu::MenuAction EditorConnection::run()
// go idle
m_state = STATE_IDLE;
break;
case STATE_PUSH_HEADER_CHROMALINK:
// editor requested to push modes, clear first and reset first
m_receiveBuffer.clear();
// now say we are ready
SerialComs::write(EDITOR_VERB_READY);
// move to receiving
m_state = STATE_PUSH_HEADER_CHROMALINK_RECEIVE;
break;
case STATE_PUSH_HEADER_CHROMALINK_RECEIVE:
// receive the modes into the receive buffer
if (receiveChromaHdr()) {
// success modes were received send the done
m_state = STATE_PUSH_HEADER_CHROMALINK_DONE;
}
break;
case STATE_PUSH_HEADER_CHROMALINK_DONE:
// say we are done
m_receiveBuffer.clear();
SerialComs::write(EDITOR_VERB_PUSH_CHROMA_HDR_ACK);
m_state = STATE_IDLE;
break;
case STATE_PUSH_MODE_CHROMALINK:
// editor requested to push modes, clear first and reset first
m_receiveBuffer.clear();
// now say we are ready
SerialComs::write(EDITOR_VERB_READY);
// move to receiving
m_state = STATE_PUSH_MODE_CHROMALINK_RECEIVE_IDX;
break;
case STATE_PUSH_MODE_CHROMALINK_RECEIVE_IDX:
if (!receiveModeIdx(m_chromaModeIdx)) {
break;
}
m_receiveBuffer.clear();
SerialComs::write(EDITOR_VERB_READY);
m_state = STATE_PUSH_MODE_CHROMALINK_RECEIVE;
break;
case STATE_PUSH_MODE_CHROMALINK_RECEIVE:
if (!receiveChromaMode()) {
break;
}
m_state = STATE_PUSH_MODE_CHROMALINK_DONE;
break;
case STATE_PUSH_MODE_CHROMALINK_DONE:
// say we are done
m_receiveBuffer.clear();
SerialComs::write(EDITOR_VERB_PUSH_CHROMA_MODE_ACK);
m_state = STATE_IDLE;
break;
}
return MENU_CONTINUE;
}
Expand Down Expand Up @@ -300,64 +318,6 @@ bool EditorConnection::pushModeChromalink()
{
}

void EditorConnection::receiveModeVL()
{
// if reveiving new data set our last data time
if (VLReceiver::onNewData()) {
m_timeOutStartTime = Time::getCurtime();
// if our last data was more than time out duration reset the recveiver
} else if (m_timeOutStartTime > 0 && (m_timeOutStartTime + MAX_TIMEOUT_DURATION) < Time::getCurtime()) {
VLReceiver::resetVLState();
m_timeOutStartTime = 0;
return;
}
// check if the VLReceiver has a full packet available
if (!VLReceiver::dataReady()) {
// nothing available yet
return;
}
DEBUG_LOG("Mode ready to receive! Receiving...");
// receive the VL mode into the current mode
if (!VLReceiver::receiveMode(&m_previewMode)) {
ERROR_LOG("Failed to receive mode");
return;
}
DEBUG_LOGF("Success receiving mode: %u", m_previewMode.getPatternID());
Modes::updateCurMode(&m_previewMode);
ByteStream modeBuffer;
m_previewMode.saveToBuffer(modeBuffer);
SerialComs::write(modeBuffer);
m_state = STATE_LISTEN_MODE_VL_DONE;
}

void EditorConnection::showReceiveModeVL()
{
if (VLReceiver::isReceiving()) {
// using uint32_t to avoid overflow, the result should be within 10 to 255
//Leds::setAll(RGBColor(0, VLReceiver::percentReceived(), 0));
Leds::setRange(LED_0, (LedPos)(VLReceiver::percentReceived() / 10), RGB_GREEN6);
Leds::setRange(LED_10, (LedPos)(LED_10 + (VLReceiver::percentReceived() / 10)), RGB_GREEN6);
} else {
Leds::setAll(RGB_WHITE0);
}
}

bool EditorConnection::receiveModeIdx(uint8_t &idx)
{
// need at least the buffer size first
if (m_receiveBuffer.size() < sizeof(idx)) {
// wait, not enough data available yet
return false;
}
m_receiveBuffer.resetUnserializer();
// okay unserialize now, first unserialize the size
if (!m_receiveBuffer.unserialize8(&idx)) {
return false;
}
return true;
}

// handlers for clicks
void EditorConnection::onShortClick()
{
// reset, this won't actually disconnect the com port
Expand All @@ -371,12 +331,38 @@ void EditorConnection::onLongClick()
leaveMenu(true);
}

// handlers for clicks
void EditorConnection::leaveMenu(bool doSave)
{
SerialComs::write(EDITOR_VERB_GOODBYE);
Menu::leaveMenu(true);
}

void EditorConnection::handleCommand()
{
if (receiveMessage(EDITOR_VERB_PULL_MODES)) {
m_state = STATE_PULL_MODES;
} else if (receiveMessage(EDITOR_VERB_PUSH_MODES)) {
m_state = STATE_PUSH_MODES;
} else if (receiveMessage(EDITOR_VERB_DEMO_MODE)) {
m_state = STATE_DEMO_MODE;
} else if (receiveMessage(EDITOR_VERB_CLEAR_DEMO)) {
m_state = STATE_CLEAR_DEMO;
} else if (receiveMessage(EDITOR_VERB_TRANSMIT_VL)) {
sendCurModeVL();
} else if (receiveMessage(EDITOR_VERB_LISTEN_VL)) {
listenModeVL();
} else if (receiveMessage(EDITOR_VERB_PULL_CHROMA_HDR)) {
m_state = STATE_PULL_HEADER_CHROMALINK;
} else if (receiveMessage(EDITOR_VERB_PUSH_CHROMA_HDR)) {
m_state = STATE_PUSH_HEADER_CHROMALINK;
} else if (receiveMessage(EDITOR_VERB_PULL_CHROMA_MODE)) {
m_state = STATE_PULL_MODE_CHROMALINK;
} else if (receiveMessage(EDITOR_VERB_PUSH_CHROMA_MODE)) {
m_state = STATE_PUSH_MODE_CHROMALINK;
}
}

void EditorConnection::showEditor()
{
switch (m_state) {
Expand Down Expand Up @@ -408,7 +394,7 @@ void EditorConnection::sendModes()
SerialComs::write(modesBuffer);
}

bool EditorConnection::receiveModes()
bool EditorConnection::receiveBuffer(ByteStream &buffer)
{
// need at least the buffer size first
uint32_t size = 0;
Expand All @@ -428,73 +414,146 @@ bool EditorConnection::receiveModes()
return false;
}
// create a new ByteStream that will hold the full buffer of data
ByteStream buf(m_receiveBuffer.rawSize());
buffer.init(m_receiveBuffer.rawSize());
// then copy everything from the receive buffer into the rawdata
// which is going to overwrite the crc/size/flags of the ByteStream
memcpy(buf.rawData(), m_receiveBuffer.data() + sizeof(size),
memcpy(buffer.rawData(), m_receiveBuffer.data() + sizeof(size),
m_receiveBuffer.size() - sizeof(size));
// clear the receive buffer
m_receiveBuffer.clear();
return true;
}

bool EditorConnection::receiveModes()
{
// create a new ByteStream that will hold the full buffer of data
ByteStream buf;
if (!receiveBuffer(buf)) {
return false;
}
Modes::loadFromBuffer(buf);
Modes::saveStorage();
return true;
}

bool EditorConnection::receiveDemoMode()
{
// create a new ByteStream that will hold the full buffer of data
ByteStream buf;
if (!receiveBuffer(buf)) {
return false;
}
// unserialize the mode into the demo mode
if (!m_previewMode.loadFromBuffer(buf)) {
// failure
}
return true;
}

bool EditorConnection::receiveMessage(const char *message)
{
size_t len = strlen(message);
uint8_t byte = 0;
// wait for the editor to ack the idle
if (m_receiveBuffer.size() < len) {
return false;
}
if (memcmp(m_receiveBuffer.frontUnserializer(), message, len) != 0) {
return false;
}
for (size_t i = 0; i < len; ++i) {
if (!m_receiveBuffer.unserialize8(&byte)) {
return false;
}
}
// if everything was read out, reset
if (m_receiveBuffer.unserializerAtEnd()) {
m_receiveBuffer.clear();
}
return true;
}

void EditorConnection::clearDemo()
{
Colorset set(RGB_WHITE0);
PatternArgs args(1, 0, 0);
m_previewMode.setPattern(PATTERN_STROBE, LED_ALL, &args, &set);
m_previewMode.init();
}

void EditorConnection::receiveModeVL()
{
// if reveiving new data set our last data time
if (VLReceiver::onNewData()) {
m_timeOutStartTime = Time::getCurtime();
// if our last data was more than time out duration reset the recveiver
} else if (m_timeOutStartTime > 0 && (m_timeOutStartTime + MAX_TIMEOUT_DURATION) < Time::getCurtime()) {
VLReceiver::resetVLState();
m_timeOutStartTime = 0;
return;
}
// check if the VLReceiver has a full packet available
if (!VLReceiver::dataReady()) {
// nothing available yet
return;
}
DEBUG_LOG("Mode ready to receive! Receiving...");
// receive the VL mode into the current mode
if (!VLReceiver::receiveMode(&m_previewMode)) {
ERROR_LOG("Failed to receive mode");
return;
}
DEBUG_LOGF("Success receiving mode: %u", m_previewMode.getPatternID());
Modes::updateCurMode(&m_previewMode);
ByteStream modeBuffer;
m_previewMode.saveToBuffer(modeBuffer);
SerialComs::write(modeBuffer);
m_state = STATE_LISTEN_MODE_VL_DONE;
}

void EditorConnection::showReceiveModeVL()
{
if (VLReceiver::isReceiving()) {
// using uint32_t to avoid overflow, the result should be within 10 to 255
//Leds::setAll(RGBColor(0, VLReceiver::percentReceived(), 0));
Leds::setRange(LED_0, (LedPos)(VLReceiver::percentReceived() / 10), RGB_GREEN6);
Leds::setRange(LED_10, (LedPos)(LED_10 + (VLReceiver::percentReceived() / 10)), RGB_GREEN6);
} else {
Leds::setAll(RGB_WHITE0);
}
}

bool EditorConnection::receiveModeIdx(uint8_t &idx)
{
// need at least the buffer size first
uint32_t size = 0;
if (m_receiveBuffer.size() < sizeof(size)) {
if (m_receiveBuffer.size() < sizeof(idx)) {
// wait, not enough data available yet
return false;
}
// grab the size out of the start
m_receiveBuffer.resetUnserializer();
size = m_receiveBuffer.peek32();
if (m_receiveBuffer.size() < (size + sizeof(size))) {
// don't unserialize yet, not ready
return false;
}
// okay unserialize now, first unserialize the size
if (!m_receiveBuffer.unserialize32(&size)) {
if (!m_receiveBuffer.unserialize8(&idx)) {
return false;
}
return true;
}

bool EditorConnection::receiveChromaHdr()
{
// 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
// which is going to overwrite the crc/size/flags of the ByteStream
memcpy(buf.rawData(), m_receiveBuffer.data() + sizeof(size),
m_receiveBuffer.size() - sizeof(size));
// clear the receive buffer
m_receiveBuffer.clear();
// unserialize the mode into the demo mode
if (!m_previewMode.loadFromBuffer(buf)) {
// failure
ByteStream buf;
if (!receiveBuffer(buf)) {
return false;
}
return true;
return UPDI::writeHeader(buf);
}

void EditorConnection::handleCommand()
bool EditorConnection::receiveChromaMode()
{
if (receiveMessage(EDITOR_VERB_PULL_MODES)) {
m_state = STATE_PULL_MODES;
} else if (receiveMessage(EDITOR_VERB_PUSH_MODES)) {
m_state = STATE_PUSH_MODES;
} else if (receiveMessage(EDITOR_VERB_DEMO_MODE)) {
m_state = STATE_DEMO_MODE;
} else if (receiveMessage(EDITOR_VERB_CLEAR_DEMO)) {
m_state = STATE_CLEAR_DEMO;
} else if (receiveMessage(EDITOR_VERB_TRANSMIT_VL)) {
sendCurModeVL();
} else if (receiveMessage(EDITOR_VERB_LISTEN_VL)) {
listenModeVL();
} else if (receiveMessage(EDITOR_VERB_PULL_CHROMA_HDR)) {
m_state = STATE_PULL_HEADER_CHROMALINK;
} else if (receiveMessage(EDITOR_VERB_PUSH_CHROMA_HDR)) {
m_state = STATE_PUSH_HEADER_CHROMALINK;
} else if (receiveMessage(EDITOR_VERB_PULL_CHROMA_MODE)) {
m_state = STATE_PULL_MODE_CHROMALINK;
} else if (receiveMessage(EDITOR_VERB_PUSH_CHROMA_MODE)) {
m_state = STATE_PUSH_MODE_CHROMALINK;
// create a new ByteStream that will hold the full buffer of data
ByteStream buf;
if (!receiveBuffer(buf)) {
return false;
}
return UPDI::writeMode(m_chromaModeIdx, buf);
}
Loading

0 comments on commit d5513ca

Please sign in to comment.