From 367d79d39590563437e47c4e32316546b3fc0952 Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 9 Dec 2024 15:58:55 -0500 Subject: [PATCH 01/15] Added code to invalidate cached config on factory reset. --- html/script.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/html/script.js b/html/script.js index df3d399a8..92865bd51 100644 --- a/html/script.js +++ b/html/script.js @@ -1,5 +1,6 @@ var StatusRequestTimer = null; var DiagTimer = null; +var ConfigSessionId = new Date().getTime(); // global data var AdminInfo = null; @@ -616,7 +617,9 @@ async function RequestConfigFile(FileName) { // console.log("RequestConfigFile FileName: " + FileName); - await $.getJSON("HTTP://" + target + "/conf/" + FileName, function(data) + var url = "HTTP://" + target + "/conf/" + FileName + '?t=' + ConfigSessionId; + // console.info("'GET' Config URL: '" + url + "'"); + await $.getJSON(url, function(data) { // console.log("RequestConfigFile: " + JSON.stringify(data)); ProcessReceivedJsonConfigMessage(data); @@ -1805,6 +1808,7 @@ function submitDeviceConfig() { ExtractChannelConfigFromHtmlPage(Output_Config.channels, "output"); + ConfigSessionId = new Date().getTime(); ServerAccess.callFunction(SendConfigFileToServer, "output_config", JSON.stringify({'output_config': Output_Config})); ServerAccess.callFunction(SendConfigFileToServer, "input_config", JSON.stringify({'input_config': Input_Config})); submitNetworkConfig(); @@ -2222,4 +2226,5 @@ function reboot() { $('#confirm-reset .btn-ok').on("click", (function () { showReboot(); SendCommand('X7'); + ConfigSessionId = new Date().getTime(); })); From 592f032b6e686f568c766d5cb2d0d3fee309fd4f Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 10 Dec 2024 08:27:30 -0500 Subject: [PATCH 02/15] Corrected some console output. --- html/script.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/html/script.js b/html/script.js index 92865bd51..c92f79f74 100644 --- a/html/script.js +++ b/html/script.js @@ -268,7 +268,7 @@ $(function () { let DeltaTime = (new Date().getTime() - FseqFileTransferStartTime.getTime()) / 1000; let rate = Math.floor((file.size / DeltaTime) / 1000); - console.debug("Final Transfer Rate: " + rate + "KBps"); + // console.debug("Final Transfer Rate: " + rate + "KBps"); }); this.on('addedfile', function (file, resp) { @@ -443,7 +443,7 @@ function MergeConfigTree(SourceTree, TargetTree, CurrentTarget, FullSelector) if(CurrentElementValue === undefined) { - console.info("target element is not properly formed"); + console.error("target element is not properly formed"); continue; } @@ -469,7 +469,7 @@ function MergeConfigTree(SourceTree, TargetTree, CurrentTarget, FullSelector) } else { - console.info("NOT Saving CurrentElement. Source value is Not in target tree."); + console.error("NOT Saving CurrentElement. Source value is Not in target tree."); } } } @@ -1745,13 +1745,13 @@ function hexToRgb(hex) { function ExtractConfigFromHtmlPages(elementids, modeControlName, ChannelConfig) { - console.info("Preping config to send to ESP"); - console.info("num elementids: " + elementids.length); + // console.debug("Preping config to send to ESP"); + // console.debug("num elementids: " + elementids.length); elementids.forEach(function (elementid) { let SelectedElement = modeControlName + ' #' + elementid; - console.info("Element ID: " + $(SelectedElement).id) + // console.debug("Element ID: " + $(SelectedElement).id) if ($(SelectedElement).is(':checkbox')) { @@ -1759,7 +1759,7 @@ function ExtractConfigFromHtmlPages(elementids, modeControlName, ChannelConfig) } else if ($(SelectedElement).attr('type') === 'number') { - console.info("Found Number: " + $(SelectedElement).id) + // console.debug("Found Number: " + $(SelectedElement).id) ChannelConfig[elementid] = parseInt($(SelectedElement).val()); } else From 5fad8fb73b2436c91d2e7b9a4738a5c7d9340a17 Mon Sep 17 00:00:00 2001 From: Martin Date: Thu, 12 Dec 2024 15:47:08 -0500 Subject: [PATCH 03/15] Fixed issue where port and IP address are not initialized in the config file. --- src/input/InputMQTT.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/input/InputMQTT.cpp b/src/input/InputMQTT.cpp index a02bfcd49..ffa1c5cf9 100644 --- a/src/input/InputMQTT.cpp +++ b/src/input/InputMQTT.cpp @@ -123,6 +123,8 @@ void c_InputMQTT::GetConfig (JsonObject & jsonConfig) // DEBUG_START; // Serialize Config + jsonConfig[CN_ip] = ip; + jsonConfig[CN_port] = port; jsonConfig[CN_user] = user; jsonConfig[CN_password] = password; jsonConfig[CN_topic] = topic; @@ -164,10 +166,14 @@ void c_InputMQTT::Process () pEffectsEngine->Process (); } - if (nullptr != pPlayFileEngine) + else if (nullptr != pPlayFileEngine) { pPlayFileEngine->Poll (); } + else + { + // DEBUG_V("No active data generation channel"); + } } // DEBUG_END; @@ -411,7 +417,7 @@ void c_InputMQTT::onMqttMessage( // if its a retained message and we want a clean session, ignore it if (properties.retain && CleanSessionRequired) { - // DEBUG_V (""); + // DEBUG_V ("Ignore retained session."); break; } From 1004c69c71cc73990a09f891de46576965d4deb1 Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 18 Dec 2024 13:55:33 -0500 Subject: [PATCH 04/15] Increased the size of the rmt buffer 2x Made the number of bytes to transfer into the RMT buffer configurable --- include/output/OutputRmt.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/output/OutputRmt.hpp b/include/output/OutputRmt.hpp index 80d4f75a4..c992e62bd 100644 --- a/include/output/OutputRmt.hpp +++ b/include/output/OutputRmt.hpp @@ -98,7 +98,7 @@ class c_OutputRmt uint32_t NumRmtSlotOverruns = 0; uint32_t MaxNumRmtSlotsPerInterrupt = (NUM_RMT_SLOTS/2); - rmt_item32_t SendBuffer[NUM_RMT_SLOTS]; + rmt_item32_t SendBuffer[NUM_RMT_SLOTS * 2]; uint32_t RmtBufferWriteIndex = 0; uint32_t SendBufferWriteIndex = 0; uint32_t SendBufferReadIndex = 0; @@ -109,7 +109,7 @@ class c_OutputRmt uint32_t TxIntensityDataStartingMask = 0x80; RmtDataBitIdType_t InterIntensityValueId = RMT_INVALID_VALUE; - inline void IRAM_ATTR ISR_TransferIntensityDataToRMT (); + inline void IRAM_ATTR ISR_TransferIntensityDataToRMT (uint32_t NumEntriesToTransfer); inline void IRAM_ATTR ISR_CreateIntensityData (); inline void IRAM_ATTR ISR_WriteToBuffer(uint32_t value); inline bool IRAM_ATTR ISR_MoreDataToSend(); @@ -164,7 +164,6 @@ class c_OutputRmt uint32_t DataTaskcounter = 0; uint32_t ISRcounter = 0; uint32_t FrameStartCounter = 0; - uint32_t FrameEndISRcounter = 0; uint32_t SendBlockIsrCounter = 0; uint32_t RanOutOfData = 0; uint32_t UnknownISRcounter = 0; @@ -181,6 +180,7 @@ class c_OutputRmt uint32_t RmtEntriesTransfered = 0; uint32_t RmtXmtFills = 0; uint32_t RmtWhiteDetected = 0; + uint32_t FailedToSendAllData = 0; #define RMT_DEBUG_COUNTER(p) p From b483f929898b46aaf1fb4f8f5d226a3f12ec69dc Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 18 Dec 2024 14:00:47 -0500 Subject: [PATCH 05/15] Moved when the GPIO gets initialized to eliminate a spurious blip in the data stream Major changes to the interrupt handler and rmt buffer management ISR to prevent delays in the SW from causing unexpected data to be transmitted. We now stop transmitting of the transmitter under runs --- src/output/OutputRmt.cpp | 166 +++++++++++++++++++-------------------- 1 file changed, 81 insertions(+), 85 deletions(-) diff --git a/src/output/OutputRmt.cpp b/src/output/OutputRmt.cpp index ab37fc4e6..d4fbd6111 100644 --- a/src/output/OutputRmt.cpp +++ b/src/output/OutputRmt.cpp @@ -39,30 +39,30 @@ static uint32_t FrameTimeouts = 0; //---------------------------------------------------------------------------- void RMT_Task (void *arg) { - unsigned long FrameStartTime = millis(); - unsigned long FrameEndTime = FrameStartTime; - TickType_t DelayTime = pdMS_TO_TICKS(25); + unsigned long FrameStartTimeMS = millis(); + unsigned long FrameEndTimeMS = FrameStartTimeMS; const uint32_t MinFrameTimeMs = 25; + TickType_t DelayTimeTicks = pdMS_TO_TICKS(MinFrameTimeMs); while(1) { - uint32_t DeltaTime = FrameEndTime - FrameStartTime; + uint32_t DeltaTimeMS = FrameEndTimeMS - FrameStartTimeMS; // did the timer wrap? - if (DeltaTime > MinFrameTimeMs) + if (DeltaTimeMS > MinFrameTimeMs) { // Timer has wrapped or // frame took longer than 25MS to run. // Dont wait a long time for the next one. - DelayTime = pdMS_TO_TICKS(1); + DelayTimeTicks = pdMS_TO_TICKS(1); } else { - DelayTime = pdMS_TO_TICKS( MinFrameTimeMs - DeltaTime ); + DelayTimeTicks = pdMS_TO_TICKS( MinFrameTimeMs - DeltaTimeMS ); } - vTaskDelay(DelayTime); + vTaskDelay(DelayTimeTicks); - FrameStartTime = millis(); + FrameStartTimeMS = millis(); // process all possible channels for (c_OutputRmt * pRmt : rmt_isr_ThisPtrs) { @@ -71,7 +71,7 @@ void RMT_Task (void *arg) { // invoke the channel pRmt->StartNextFrame(); - uint32_t NotificationValue = ulTaskNotifyTake( pdTRUE, pdMS_TO_TICKS(25) ); + uint32_t NotificationValue = ulTaskNotifyTake( pdTRUE, pdMS_TO_TICKS(100) ); if(1 == NotificationValue) { // DEBUG_V("The transmission ended as expected."); @@ -85,7 +85,7 @@ void RMT_Task (void *arg) } } // record the loop end time - FrameEndTime = millis(); + FrameEndTimeMS = millis(); } } // RMT_Task @@ -240,7 +240,7 @@ void c_OutputRmt::Begin (OutputRmtConfig_t config, c_OutputCommon * _pParent ) // reset the internal and external pointers to the start of the mem block ISR_ResetRmtBlockPointers (); RMT.conf_ch[OutputRmtConfig.RmtChannelId].conf1.apb_mem_rst = 0;/* Make sure the FIFO is not in reset */ - RMT.conf_ch[OutputRmtConfig.RmtChannelId].conf1.mem_owner = RMT_MEM_OWNER_TX; /* TX owns the memory */ + RMT.conf_ch[OutputRmtConfig.RmtChannelId].conf1.mem_owner = RMT_MEM_OWNER_TX; /* TX owns the memory */ RMT.apb_conf.fifo_mask = RMT_DATA_MODE_MEM; memset((void*)&RMTMEM.chan[OutputRmtConfig.RmtChannelId].data32[0], 0x0, sizeof(RMTMEM.chan[0].data32)); @@ -272,6 +272,8 @@ void c_OutputRmt::Begin (OutputRmtConfig_t config, c_OutputCommon * _pParent ) pParent = _pParent; rmt_isr_ThisPtrs[OutputRmtConfig.RmtChannelId] = this; + rmt_set_gpio(OutputRmtConfig.RmtChannelId, RMT_MODE_TX, OutputRmtConfig.DataPin, false); + HasBeenInitialized = true; } while (false); @@ -294,45 +296,45 @@ void c_OutputRmt::GetStatus (ArduinoJson::JsonObject& jsonStatus) debugStatus["conf1"] = String(RMT.conf_ch[OutputRmtConfig.RmtChannelId].conf1.val, HEX); debugStatus["tx_lim_ch"] = String(RMT.tx_lim_ch[OutputRmtConfig.RmtChannelId].limit); - debugStatus["FrameStartCounter"] = FrameStartCounter; - debugStatus["RawIsrCounter"] = RawIsrCounter; - debugStatus["ISRcounter"] = ISRcounter; - debugStatus["SendBlockIsrCounter"] = SendBlockIsrCounter; - debugStatus["FrameEndISRcounter"] = FrameEndISRcounter; - debugStatus["UnknownISRcounter"] = UnknownISRcounter; - debugStatus["RanOutOfData"] = RanOutOfData; - debugStatus["IntTxEndIsrCounter"] = IntTxEndIsrCounter; - debugStatus["IntTxThrIsrCounter"] = IntTxThrIsrCounter; debugStatus["ErrorIsr"] = ErrorIsr; - debugStatus["RxIsr"] = RxIsr; + debugStatus["FrameCompletes"] = String (FrameCompletes); + debugStatus["FrameStartCounter"] = FrameStartCounter; + debugStatus["FrameTimeouts"] = String (FrameTimeouts); + debugStatus["FailedToSendAllData"] = String (FailedToSendAllData); debugStatus["IncompleteFrame"] = IncompleteFrame; - debugStatus["RMT_INT_TX_END_BIT"] = "0x" + String (RMT_INT_TX_END_BIT, HEX); - debugStatus["RMT_INT_THR_EVNT_BIT"] = "0x" + String (RMT_INT_THR_EVNT_BIT, HEX); - uint32_t temp = RMT.int_ena.val; - debugStatus["Raw int_ena"] = "0x" + String (temp, HEX); - debugStatus["TX END int_ena"] = "0x" + String (temp & (RMT_INT_TX_END_BIT), HEX); - debugStatus["TX THRSH int_ena"] = "0x" + String (temp & (RMT_INT_THR_EVNT_BIT), HEX); - temp = RMT.int_st.val; - debugStatus["Raw int_st"] = "0x" + String (temp, HEX); - debugStatus["TX END int_st"] = "0x" + String (temp & (RMT_INT_TX_END_BIT), HEX); - debugStatus["TX THRSH int_st"] = "0x" + String (temp & (RMT_INT_THR_EVNT_BIT), HEX); debugStatus["IntensityValuesSent"] = IntensityValuesSent; debugStatus["IntensityValuesSentLastFrame"] = IntensityValuesSentLastFrame; debugStatus["IntensityBitsSent"] = IntensityBitsSent; debugStatus["IntensityBitsSentLastFrame"] = IntensityBitsSentLastFrame; + debugStatus["IntTxEndIsrCounter"] = IntTxEndIsrCounter; + debugStatus["IntTxThrIsrCounter"] = IntTxThrIsrCounter; + debugStatus["ISRcounter"] = ISRcounter; debugStatus["NumIdleBits"] = OutputRmtConfig.NumIdleBits; debugStatus["NumFrameStartBits"] = OutputRmtConfig.NumFrameStartBits; debugStatus["NumFrameStopBits"] = OutputRmtConfig.NumFrameStopBits; - debugStatus["SendInterIntensityBits"] = OutputRmtConfig.SendInterIntensityBits; - debugStatus["SendEndOfFrameBits"] = OutputRmtConfig.SendEndOfFrameBits; debugStatus["NumRmtSlotsPerIntensityValue"] = NumRmtSlotsPerIntensityValue; + debugStatus["OneBitValue"] = String (Intensity2Rmt[RmtDataBitIdType_t::RMT_DATA_BIT_ONE_ID].val, HEX); + debugStatus["RanOutOfData"] = RanOutOfData; + uint32_t temp = RMT.int_ena.val; + debugStatus["Raw int_ena"] = "0x" + String (temp, HEX); + temp = RMT.int_st.val; + debugStatus["Raw int_st"] = "0x" + String (temp, HEX); + debugStatus["RawIsrCounter"] = RawIsrCounter; + debugStatus["RMT_INT_TX_END_BIT"] = "0x" + String (RMT_INT_TX_END_BIT, HEX); + debugStatus["RMT_INT_THR_EVNT_BIT"] = "0x" + String (RMT_INT_THR_EVNT_BIT, HEX); debugStatus["RmtEntriesTransfered"] = RmtEntriesTransfered; + debugStatus["RmtWhiteDetected"] = String (RmtWhiteDetected); debugStatus["RmtXmtFills"] = RmtXmtFills; + debugStatus["RxIsr"] = RxIsr; + debugStatus["SendBlockIsrCounter"] = SendBlockIsrCounter; + debugStatus["SendInterIntensityBits"] = OutputRmtConfig.SendInterIntensityBits; + debugStatus["SendEndOfFrameBits"] = OutputRmtConfig.SendEndOfFrameBits; + debugStatus["TX END int_ena"] = "0x" + String (temp & (RMT_INT_TX_END_BIT), HEX); + debugStatus["TX END int_st"] = "0x" + String (temp & (RMT_INT_TX_END_BIT), HEX); + debugStatus["TX THRSH int_ena"] = "0x" + String (temp & (RMT_INT_THR_EVNT_BIT), HEX); + debugStatus["TX THRSH int_st"] = "0x" + String (temp & (RMT_INT_THR_EVNT_BIT), HEX); + debugStatus["UnknownISRcounter"] = UnknownISRcounter; debugStatus["ZeroBitValue"] = String (Intensity2Rmt[RmtDataBitIdType_t::RMT_DATA_BIT_ZERO_ID].val, HEX); - debugStatus["OneBitValue"] = String (Intensity2Rmt[RmtDataBitIdType_t::RMT_DATA_BIT_ONE_ID].val, HEX); - debugStatus["FrameCompletes"] = String (FrameCompletes); - debugStatus["FrameTimeouts"] = String (FrameTimeouts); - debugStatus["RmtWhiteDetected"] = String (RmtWhiteDetected); #ifdef IncludeBufferData { @@ -461,40 +463,39 @@ void IRAM_ATTR c_OutputRmt::ISR_Handler (uint32_t isrFlags) // //DEBUG_V(String(" RMT_INT_TX_END_BIT: 0x") + String(RMT_INT_TX_END_BIT, HEX)); // ClearRmtInterrupts; -#ifdef USE_RMT_DEBUG_COUNTERS - ++ISRcounter; + RMT_DEBUG_COUNTER(++ISRcounter); - if(isrFlags & RMT_INT_TX_END_BIT) + // did the transmitter stall? + if (isrFlags & RMT_INT_TX_END_BIT ) { - ++IntTxEndIsrCounter; - } + RMT_DEBUG_COUNTER(++IntTxEndIsrCounter); + DisableRmtInterrupts; - if(isrFlags & RMT_INT_THR_EVNT_BIT ) - { - ++IntTxThrIsrCounter; - } + if(NumUsedEntriesInSendBuffer) + { + RMT_DEBUG_COUNTER(++FailedToSendAllData); + } - if (isrFlags & RMT_INT_ERROR_BIT) - { - ErrorIsr++; + // tell the background task to start the next output + vTaskNotifyGiveFromISR( SendFrameTaskHandle, &xHigherPriorityTaskWoken ); + // portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); } - - if (isrFlags & RMT_INT_RX_END_BIT) + else if (isrFlags & RMT_INT_THR_EVNT_BIT ) { - RxIsr++; - } -#endif // def USE_RMT_DEBUG_COUNTERS + RMT_DEBUG_COUNTER(++IntTxThrIsrCounter); - if (isrFlags & RMT_ISR_BITS) - { + // do we still have data to send? if(NumUsedEntriesInSendBuffer) { + // LOG_PORT.println(String("NumUsedEntriesInSendBuffer1: ") + String(NumUsedEntriesInSendBuffer)); RMT_DEBUG_COUNTER(++SendBlockIsrCounter); // transfer any prefetched data to the hardware transmitter - ISR_TransferIntensityDataToRMT(); + ISR_TransferIntensityDataToRMT( MaxNumRmtSlotsPerInterrupt ); + // LOG_PORT.println(String("NumUsedEntriesInSendBuffer2: ") + String(NumUsedEntriesInSendBuffer)); // refill the buffer ISR_CreateIntensityData(); + // LOG_PORT.println(String("NumUsedEntriesInSendBuffer3: ") + String(NumUsedEntriesInSendBuffer)); // is there any data left to enqueue? if (!ThereIsDataToSend && 0 == NumUsedEntriesInSendBuffer) @@ -502,28 +503,28 @@ void IRAM_ATTR c_OutputRmt::ISR_Handler (uint32_t isrFlags) RMT_DEBUG_COUNTER(++RanOutOfData); DisableRmtInterrupts; - // terminate the data stream - RMTMEM.chan[OutputRmtConfig.RmtChannelId].data32[RmtBufferWriteIndex].val = 0x0; - // tell the background task to start the next output vTaskNotifyGiveFromISR( SendFrameTaskHandle, &xHigherPriorityTaskWoken ); - portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + // portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); } } - else if (isrFlags & RMT_INT_TX_END_BIT ) - { - DisableRmtInterrupts; - RMT_DEBUG_COUNTER(++FrameEndISRcounter); - - // tell the background task to start the next output - vTaskNotifyGiveFromISR( SendFrameTaskHandle, &xHigherPriorityTaskWoken ); - portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); - } + // else ignore the interrupt and let the transmitter stall when it runs out of data } +#ifdef USE_RMT_DEBUG_COUNTERS else { RMT_DEBUG_COUNTER(++UnknownISRcounter); + if (isrFlags & RMT_INT_ERROR_BIT) + { + ErrorIsr++; + } + + if (isrFlags & RMT_INT_RX_END_BIT) + { + RxIsr++; + } } +#endif // def USE_RMT_DEBUG_COUNTERS // //DEBUG_END; } // ISR_Handler @@ -572,11 +573,11 @@ inline void IRAM_ATTR c_OutputRmt::ISR_StartNewDataFrame() } // StartNewDataFrame //---------------------------------------------------------------------------- -void IRAM_ATTR c_OutputRmt::ISR_TransferIntensityDataToRMT () +void IRAM_ATTR c_OutputRmt::ISR_TransferIntensityDataToRMT (uint32_t MaxNumEntriesToTransfer) { // //DEBUG_START; - uint32_t NumEntriesToTransfer = min((NUM_RMT_SLOTS/2), NumUsedEntriesInSendBuffer); + uint32_t NumEntriesToTransfer = min(NumUsedEntriesInSendBuffer, MaxNumEntriesToTransfer); #ifdef USE_RMT_DEBUG_COUNTERS if(NumEntriesToTransfer) @@ -585,7 +586,6 @@ void IRAM_ATTR c_OutputRmt::ISR_TransferIntensityDataToRMT () RmtEntriesTransfered = NumEntriesToTransfer; } #endif // def USE_RMT_DEBUG_COUNTERS - while(NumEntriesToTransfer) { RMTMEM.chan[OutputRmtConfig.RmtChannelId].data32[RmtBufferWriteIndex].val = SendBuffer[SendBufferReadIndex].val; @@ -594,6 +594,10 @@ void IRAM_ATTR c_OutputRmt::ISR_TransferIntensityDataToRMT () --NumEntriesToTransfer; --NumUsedEntriesInSendBuffer; } + + // terminate the data stream + RMTMEM.chan[OutputRmtConfig.RmtChannelId].data32[RmtBufferWriteIndex].val = uint32_t(0); + // //DEBUG_END; } // ISR_Handler_TransferBufferToRMT @@ -649,7 +653,6 @@ bool c_OutputRmt::StartNewFrame () if(InterrupsAreEnabled) { RMT_DEBUG_COUNTER(IncompleteFrame++); - break; } DisableRmtInterrupts; @@ -692,26 +695,19 @@ bool c_OutputRmt::StartNewFrame () // this fills the send buffer ISR_CreateIntensityData (); - // transfer 1st 32 entries of buffer data to the RMT hardware - ISR_TransferIntensityDataToRMT(); + // Fill the RMT Hardware buffer + ISR_TransferIntensityDataToRMT(NUM_RMT_SLOTS - 1); // this refills the send buffer ISR_CreateIntensityData (); - // transfer 2nd 32 entries of buffer data to the RMT hardware - ISR_TransferIntensityDataToRMT(); - - // top off the send buffer - ISR_CreateIntensityData (); - - // At this point we have 128 bits of data created and ready to send + // At this point we have 191 bits of data created and ready to send RMT.tx_lim_ch[OutputRmtConfig.RmtChannelId].limit = MaxNumRmtSlotsPerInterrupt; ClearRmtInterrupts; EnableRmtInterrupts; // DEBUG_V("start the transmitter"); - rmt_set_gpio(OutputRmtConfig.RmtChannelId, RMT_MODE_TX, OutputRmtConfig.DataPin, false); RMT.conf_ch[OutputRmtConfig.RmtChannelId].conf1.tx_start = 1; Response = true; From 9771ae84d9bb628fd2c4aef9f9d639dbb4b7a9f5 Mon Sep 17 00:00:00 2001 From: Martin Date: Thu, 19 Dec 2024 09:24:03 -0500 Subject: [PATCH 06/15] Fixed issue with reporting errors. --- src/input/InputE131.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input/InputE131.cpp b/src/input/InputE131.cpp index 0bc0c20ad..a687f8e28 100644 --- a/src/input/InputE131.cpp +++ b/src/input/InputE131.cpp @@ -103,7 +103,7 @@ void c_InputE131::GetStatus (JsonObject & jsonStatus) // DEBUG_V (""); JsonArray e131UniverseStatus = e131Status[CN_channels].to (); - uint32_t TotalErrors = e131->stats.packet_errors; + uint32_t TotalErrors = 0; // e131->stats.packet_errors; for (auto & CurrentUniverse : UniverseArray) { JsonObject e131CurrentUniverseStatus = e131UniverseStatus.add (); From 35b3655b62f84a3ccb8dfc3e40553c19ba342c3d Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 20 Dec 2024 07:57:36 -0500 Subject: [PATCH 07/15] Enhanced the % RF signal calculation --- html/script.js | 111 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 108 insertions(+), 3 deletions(-) diff --git a/html/script.js b/html/script.js index c92f79f74..ad8d636cb 100644 --- a/html/script.js +++ b/html/script.js @@ -24,6 +24,111 @@ var ctx = canvas.getContext("2d"); ctx.font = "20px Arial"; ctx.textAlign = "center"; +const rssiToPercent = +[ + /* -100 */ 0, + /* -99 */ 0, + /* -98 */ 0, + /* -97 */ 0, + /* -96 */ 0, + /* -95 */ 0, + /* -94 */ 4, + /* -93 */ 6, + /* -92 */ 8, + /* -91 */ 11, + /* -90 */ 13, + /* -89 */ 15, + /* -88 */ 17, + /* -87 */ 19, + /* -86 */ 21, + /* -85 */ 23, + /* -84 */ 26, + /* -83 */ 28, + /* -82 */ 30, + /* -81 */ 32, + /* -80 */ 34, + /* -79 */ 35, + /* -78 */ 37, + /* -77 */ 39, + /* -76 */ 41, + /* -75 */ 43, + /* -74 */ 45, + /* -73 */ 46, + /* -72 */ 48, + /* -71 */ 50, + /* -70 */ 52, + /* -69 */ 53, + /* -68 */ 55, + /* -67 */ 56, + /* -66 */ 58, + /* -65 */ 59, + /* -64 */ 61, + /* -63 */ 62, + /* -62 */ 64, + /* -61 */ 65, + /* -60 */ 67, + /* -59 */ 68, + /* -58 */ 69, + /* -57 */ 71, + /* -56 */ 72, + /* -55 */ 73, + /* -54 */ 75, + /* -53 */ 76, + /* -52 */ 77, + /* -51 */ 78, + /* -50 */ 79, + /* -49 */ 80, + /* -48 */ 81, + /* -47 */ 82, + /* -46 */ 83, + /* -45 */ 84, + /* -44 */ 85, + /* -43 */ 86, + /* -42 */ 87, + /* -41 */ 88, + /* -40 */ 89, + /* -39 */ 90, + /* -38 */ 90, + /* -37 */ 91, + /* -36 */ 92, + /* -35 */ 93, + /* -34 */ 93, + /* -33 */ 94, + /* -32 */ 95, + /* -31 */ 95, + /* -30 */ 96, + /* -29 */ 96, + /* -28 */ 97, + /* -27 */ 97, + /* -26 */ 98, + /* -25 */ 98, + /* -24 */ 99, + /* -23 */ 99, + /* -22 */ 99, + /* -21 */ 100, + /* -20 */ 100, + /* -19 */ 100, + /* -18 */ 100, + /* -17 */ 100, + /* -16 */ 100, + /* -15 */ 100, + /* -14 */ 100, + /* -13 */ 100, + /* -12 */ 100, + /* -11 */ 100, + /* -10 */ 100, + /* -9 */ 100, + /* -8 */ 100, + /* -7 */ 100, + /* -6 */ 100, + /* -5 */ 100, + /* -4 */ 100, + /* -3 */ 100, + /* -2 */ 100, + /* -1 */ 100, + /* 0 */ 100, +]; + // Default modal properties $.fn.modal.Constructor.DEFAULTS.backdrop = 'static'; $.fn.modal.Constructor.DEFAULTS.keyboard = false; @@ -1934,19 +2039,19 @@ function ProcessReceivedJsonStatusMessage(JsonStat) { let Ethernet = Network.wifi; let rssi = Wifi.rssi; - let quality = 2 * (rssi + 100); + let quality = rssi + 100; if (rssi <= -100) { quality = 0; } - else if (rssi >= -50) { + else if (rssi >= 0) { quality = 100; } $('#w_connected').text((true === Wifi.connected) ? "Yes" : "No"); $('#w_hostname').text(Wifi.hostname); $('#w_rssi').text(rssi); - $('#w_quality').text(quality); + $('#w_quality').text(rssiToPercent[quality]); $('#w_ssid').text(Wifi.ssid); $('#w_ip').text(Wifi.ip); $('#w_subnet').text(Wifi.subnet); From 752d90f47fd38e3ca3e74d7b5bad99ff3d1f376b Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 20 Dec 2024 09:55:43 -0500 Subject: [PATCH 08/15] Added an explicit include path --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index c946a21f4..f9b628640 100644 --- a/platformio.ini +++ b/platformio.ini @@ -50,6 +50,7 @@ build_flags = ; -D FTP_ADDITIONAL_DEBUG -D DISABLE_FS_H_WARNING=1 -I ./ESPixelStick/src + -I ./include lib_ignore = ESP Async WebServer ; force the use of the esphome version AsyncTCP ; force the use of the esphome version From e16377e9947653f4a31e28b9facaf10775612b59 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 20 Dec 2024 17:47:54 -0500 Subject: [PATCH 09/15] Removed unwanted function --- include/output/OutputAPA102Spi.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/output/OutputAPA102Spi.hpp b/include/output/OutputAPA102Spi.hpp index 7086cc618..696b6712d 100644 --- a/include/output/OutputAPA102Spi.hpp +++ b/include/output/OutputAPA102Spi.hpp @@ -3,7 +3,7 @@ * OutputAPA102Spi.h - APA102 driver code for ESPixelStick Spi Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -46,7 +46,6 @@ class c_OutputAPA102Spi : public c_OutputAPA102 #if defined(ARDUINO_ARCH_ESP32) bool RmtPoll () {return false;} #endif // defined(ARDUINO_ARCH_ESP32) - void PauseOutput () {}; private: From f6e12a65cfc60482ae0d7d6b5b3c331f0bf3e2a9 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 20 Dec 2024 17:48:41 -0500 Subject: [PATCH 10/15] Added support for a pause condition. --- include/output/OutputCommon.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/output/OutputCommon.hpp b/include/output/OutputCommon.hpp index f2941086c..7eda6113f 100644 --- a/include/output/OutputCommon.hpp +++ b/include/output/OutputCommon.hpp @@ -59,13 +59,15 @@ class c_OutputCommon virtual void SetOutputBufferSize (uint32_t NewOutputBufferSize) { OutputBufferSize = NewOutputBufferSize; }; virtual uint32_t GetNumOutputBufferBytesNeeded () = 0; virtual uint32_t GetNumOutputBufferChannelsServiced () = 0; - virtual void PauseOutput (bool State) {} + virtual void PauseOutput (bool NewState) {Paused = NewState;} virtual void ClearBuffer (); virtual void WriteChannelData (uint32_t StartChannelId, uint32_t ChannelCount, byte *pSourceData); virtual void ReadChannelData (uint32_t StartChannelId, uint32_t ChannelCount, byte *pTargetData); virtual bool ValidateGpio (gpio_num_t ConsoleTxGpio, gpio_num_t ConsoleRxGpio); virtual bool DriverIsSendingIntensityData() {return false;} virtual uint32_t GetFrameTimeMs() {return 1 + (ActualFrameDurationMicroSec / 1000); } + bool IsPaused() {return Paused;} + protected: gpio_num_t DataPin = gpio_num_t (-1); @@ -78,6 +80,7 @@ class c_OutputCommon uint8_t * pOutputBuffer = nullptr; uint32_t OutputBufferSize = 0; uint32_t FrameCount = 0; + bool Paused = false; virtual void ReportNewFrame (); From b04994217884a77799c1648958d8abd3ac10db25 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 20 Dec 2024 17:51:01 -0500 Subject: [PATCH 11/15] Added Pause state support --- include/output/OutputGECERmt.hpp | 3 ++- include/output/OutputGS8208Rmt.hpp | 3 ++- include/output/OutputGrinchSpi.hpp | 3 +-- include/output/OutputRmt.hpp | 2 +- include/output/OutputSerialRmt.hpp | 4 ++-- include/output/OutputSerialUart.hpp | 3 ++- include/output/OutputTLS3001Rmt.hpp | 3 ++- include/output/OutputTM1814Rmt.hpp | 3 ++- include/output/OutputUCS1903Rmt.hpp | 3 ++- include/output/OutputUCS8903Rmt.hpp | 3 ++- include/output/OutputWS2801Spi.hpp | 3 +-- include/output/OutputWS2811Rmt.hpp | 3 ++- 12 files changed, 21 insertions(+), 15 deletions(-) diff --git a/include/output/OutputGECERmt.hpp b/include/output/OutputGECERmt.hpp index fe6e547d6..da8a0738c 100644 --- a/include/output/OutputGECERmt.hpp +++ b/include/output/OutputGECERmt.hpp @@ -3,7 +3,7 @@ * OutputGECERmt.h - GECE driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -46,6 +46,7 @@ class c_OutputGECERmt : public c_OutputGECE #endif // defined(ARDUINO_ARCH_ESP32) void GetStatus (ArduinoJson::JsonObject& jsonStatus); void SetOutputBufferSize (uint32_t NumChannelsAvailable); + void PauseOutput (bool State); private: diff --git a/include/output/OutputGS8208Rmt.hpp b/include/output/OutputGS8208Rmt.hpp index f1971b420..02c8328df 100644 --- a/include/output/OutputGS8208Rmt.hpp +++ b/include/output/OutputGS8208Rmt.hpp @@ -3,7 +3,7 @@ * OutputGS8208Rmt.h - GS8208 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -47,6 +47,7 @@ class c_OutputGS8208Rmt : public c_OutputGS8208 #endif // defined(ARDUINO_ARCH_ESP32) void GetStatus (ArduinoJson::JsonObject& jsonStatus); void SetOutputBufferSize (uint32_t NumChannelsAvailable); + void PauseOutput (bool State); private: diff --git a/include/output/OutputGrinchSpi.hpp b/include/output/OutputGrinchSpi.hpp index 02fd81748..50bc450bb 100644 --- a/include/output/OutputGrinchSpi.hpp +++ b/include/output/OutputGrinchSpi.hpp @@ -3,7 +3,7 @@ * OutputGrinchSpi.h - GRINCH driver code for ESPixelStick Spi Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2024 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -45,7 +45,6 @@ class c_OutputGrinchSpi : public c_OutputGrinch #if defined(ARDUINO_ARCH_ESP32) bool RmtPoll () {return false;} #endif // defined(ARDUINO_ARCH_ESP32) - void PauseOutput () {}; private: diff --git a/include/output/OutputRmt.hpp b/include/output/OutputRmt.hpp index c992e62bd..a384e0ce0 100644 --- a/include/output/OutputRmt.hpp +++ b/include/output/OutputRmt.hpp @@ -129,7 +129,7 @@ class c_OutputRmt void Begin (OutputRmtConfig_t config, c_OutputCommon * pParent); bool StartNewFrame (); - bool StartNextFrame () { return (pParent) ? pParent->RmtPoll() : false; } + bool StartNextFrame () { return ((nullptr != pParent) & (!OutputIsPaused)) ? pParent->RmtPoll() : false; } void GetStatus (ArduinoJson::JsonObject& jsonStatus); void set_pin (gpio_num_t _DataPin) { OutputRmtConfig.DataPin = _DataPin; rmt_set_gpio (OutputRmtConfig.RmtChannelId, rmt_mode_t::RMT_MODE_TX, OutputRmtConfig.DataPin, false); } void PauseOutput (bool State); diff --git a/include/output/OutputSerialRmt.hpp b/include/output/OutputSerialRmt.hpp index 18d00fe8d..b4e9b354f 100644 --- a/include/output/OutputSerialRmt.hpp +++ b/include/output/OutputSerialRmt.hpp @@ -3,7 +3,7 @@ * OutputSerialRmt.h - WS2811 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -44,7 +44,7 @@ class c_OutputSerialRmt : public c_OutputSerial bool RmtPoll (); void GetStatus (ArduinoJson::JsonObject& jsonStatus); void SetOutputBufferSize (uint32_t NumChannelsAvailable); - void PauseOutput(bool State) {Rmt.PauseOutput(State);} + void PauseOutput(bool State); private: void SetUpRmtBitTimes(); diff --git a/include/output/OutputSerialUart.hpp b/include/output/OutputSerialUart.hpp index 393b6500e..196f89548 100644 --- a/include/output/OutputSerialUart.hpp +++ b/include/output/OutputSerialUart.hpp @@ -2,7 +2,7 @@ /****************************************************************** * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel (And Serial!) driver -* Orginal ESPixelStickproject by 2015 Shelby Merrick +* Orginal ESPixelStickproject by 2015 - 2025 Shelby Merrick * *This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or(at your option) any later version. This program is distributed in the hope that it will be useful, @@ -47,6 +47,7 @@ class c_OutputSerialUart : public c_OutputSerial #if defined(ARDUINO_ARCH_ESP32) bool RmtPoll () {return false;} #endif // defined(ARDUINO_ARCH_ESP32) + void PauseOutput (bool NewState); private: c_OutputUart Uart; diff --git a/include/output/OutputTLS3001Rmt.hpp b/include/output/OutputTLS3001Rmt.hpp index 1a1eab98c..b89168b95 100644 --- a/include/output/OutputTLS3001Rmt.hpp +++ b/include/output/OutputTLS3001Rmt.hpp @@ -3,7 +3,7 @@ * OutputTLS3001Rmt.h - TLS3001 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -56,6 +56,7 @@ class c_OutputTLS3001Rmt : public c_OutputTLS3001 bool RmtPoll (); void GetStatus (ArduinoJson::JsonObject& jsonStatus); void SetOutputBufferSize (uint32_t NumChannelsAvailable); + void PauseOutput(bool State); private: diff --git a/include/output/OutputTM1814Rmt.hpp b/include/output/OutputTM1814Rmt.hpp index 93f308d8d..c2af9b0d4 100644 --- a/include/output/OutputTM1814Rmt.hpp +++ b/include/output/OutputTM1814Rmt.hpp @@ -3,7 +3,7 @@ * OutputTM1814Rmt.h - TM1814 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2024 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -44,6 +44,7 @@ class c_OutputTM1814Rmt : public c_OutputTM1814 bool RmtPoll (); void GetStatus (ArduinoJson::JsonObject& jsonStatus); void SetOutputBufferSize (uint32_t NumChannelsAvailable); + void PauseOutput(bool State); private: diff --git a/include/output/OutputUCS1903Rmt.hpp b/include/output/OutputUCS1903Rmt.hpp index b5ef7f5a9..1e1f70b8d 100644 --- a/include/output/OutputUCS1903Rmt.hpp +++ b/include/output/OutputUCS1903Rmt.hpp @@ -3,7 +3,7 @@ * OutputUCS1903Rmt.h - UCS1903 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -45,6 +45,7 @@ class c_OutputUCS1903Rmt : public c_OutputUCS1903 bool RmtPoll (); void GetStatus (ArduinoJson::JsonObject& jsonStatus); void SetOutputBufferSize (uint32_t NumChannelsAvailable); + void PauseOutput(bool State); private: diff --git a/include/output/OutputUCS8903Rmt.hpp b/include/output/OutputUCS8903Rmt.hpp index 50ae849c6..270666bf5 100644 --- a/include/output/OutputUCS8903Rmt.hpp +++ b/include/output/OutputUCS8903Rmt.hpp @@ -3,7 +3,7 @@ * OutputUCS8903Rmt.h - UCS8903 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015 Shelby Merrick +* Copyright (c) 2015 - 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -45,6 +45,7 @@ class c_OutputUCS8903Rmt : public c_OutputUCS8903 bool RmtPoll (); void GetStatus (ArduinoJson::JsonObject& jsonStatus); void SetOutputBufferSize (uint32_t NumChannelsAvailable); + void PauseOutput(bool State); private: diff --git a/include/output/OutputWS2801Spi.hpp b/include/output/OutputWS2801Spi.hpp index 86762ed62..7c74983c7 100644 --- a/include/output/OutputWS2801Spi.hpp +++ b/include/output/OutputWS2801Spi.hpp @@ -3,7 +3,7 @@ * OutputWS2801Spi.h - WS2801 driver code for ESPixelStick Spi Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -45,7 +45,6 @@ class c_OutputWS2801Spi : public c_OutputWS2801 #if defined(ARDUINO_ARCH_ESP32) bool RmtPoll () {return false;} #endif // defined(ARDUINO_ARCH_ESP32) - void PauseOutput () {}; private: diff --git a/include/output/OutputWS2811Rmt.hpp b/include/output/OutputWS2811Rmt.hpp index 692bb5aae..b95fcce8c 100644 --- a/include/output/OutputWS2811Rmt.hpp +++ b/include/output/OutputWS2811Rmt.hpp @@ -3,7 +3,7 @@ * OutputWS2811Rmt.h - WS2811 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -45,6 +45,7 @@ class c_OutputWS2811Rmt : public c_OutputWS2811 void GetStatus (ArduinoJson::JsonObject& jsonStatus); void SetOutputBufferSize (uint32_t NumChannelsAvailable); bool DriverIsSendingIntensityData() {return (Rmt.DriverIsSendingIntensityData() || false == canRefresh());} + void PauseOutput(bool State); private: From cc4ec1c7cbd567b090b8cf033a4f7cca4e9a910c Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 20 Dec 2024 17:52:11 -0500 Subject: [PATCH 12/15] Added debug message --- src/input/InputMgr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/input/InputMgr.cpp b/src/input/InputMgr.cpp index d8e102eee..6eed931db 100644 --- a/src/input/InputMgr.cpp +++ b/src/input/InputMgr.cpp @@ -2,7 +2,7 @@ * InputMgr.cpp - Input Management class * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2021, 2022 Shelby Merrick +* Copyright (c) 2021, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -950,6 +950,7 @@ void c_InputMgr::SetBufferInfo (uint32_t BufferSize) void c_InputMgr::SetOperationalState (bool ActiveFlag) { // DEBUG_START; + // DEBUG_V(String("ActiveFlag: ") + String(ActiveFlag)); // pass through each active interface and set the active state for (auto & InputChannel : InputChannelDrivers) From 4b12f2789da4101babea87558f1d39a1a59e8a79 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 20 Dec 2024 17:53:11 -0500 Subject: [PATCH 13/15] Updated debug output --- src/output/OutputMgr.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/output/OutputMgr.cpp b/src/output/OutputMgr.cpp index fc77fc340..46d2dce93 100644 --- a/src/output/OutputMgr.cpp +++ b/src/output/OutputMgr.cpp @@ -2,7 +2,7 @@ * OutputMgr.cpp - Output Management class * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2021, 2024 Shelby Merrick +* Copyright (c) 2021, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -1418,6 +1418,8 @@ void c_OutputMgr::UpdateDisplayBufferReferences (void) void c_OutputMgr::PauseOutputs(bool PauseTheOutput) { // DEBUG_START; + // DEBUG_V(String("PauseTheOutput: ") + String(PauseTheOutput)); + IsOutputPaused = PauseTheOutput; for (auto & CurrentOutput : OutputChannelDrivers) From 161f450105d090a140567c7f222199efe521a355 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 20 Dec 2024 17:56:20 -0500 Subject: [PATCH 14/15] Added RMT pause support --- src/output/OutputGECERmt.cpp | 13 ++++++++++++- src/output/OutputGS8208Rmt.cpp | 13 ++++++++++++- src/output/OutputRmt.cpp | 33 ++++++++++++++++++++------------- src/output/OutputSerialRmt.cpp | 13 ++++++++++++- src/output/OutputSerialUart.cpp | 15 +++++++++++++-- src/output/OutputTLS3001Rmt.cpp | 13 ++++++++++++- src/output/OutputTM1814Rmt.cpp | 12 +++++++++++- src/output/OutputUCS1903Rmt.cpp | 13 ++++++++++++- src/output/OutputUCS8903Rmt.cpp | 13 ++++++++++++- src/output/OutputWS2811Rmt.cpp | 13 ++++++++++++- 10 files changed, 128 insertions(+), 23 deletions(-) diff --git a/src/output/OutputGECERmt.cpp b/src/output/OutputGECERmt.cpp index af3e09d7c..856da8383 100644 --- a/src/output/OutputGECERmt.cpp +++ b/src/output/OutputGECERmt.cpp @@ -2,7 +2,7 @@ * OutputGECERmt.cpp - GECE driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -162,4 +162,15 @@ bool c_OutputGECERmt::RmtPoll () } // Poll +//---------------------------------------------------------------------------- +void c_OutputGECERmt::PauseOutput (bool State) +{ + // DEBUG_START; + + c_OutputGECE::PauseOutput(State); + Rmt.PauseOutput(State); + + // DEBUG_END; +} // PauseOutput + #endif // defined(SUPPORT_OutputType_GECE) && defined(ARDUINO_ARCH_ESP32) diff --git a/src/output/OutputGS8208Rmt.cpp b/src/output/OutputGS8208Rmt.cpp index 1f4c7584d..a2fde2696 100644 --- a/src/output/OutputGS8208Rmt.cpp +++ b/src/output/OutputGS8208Rmt.cpp @@ -2,7 +2,7 @@ * OutputGS8208Rmt.cpp - GS8208 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -171,4 +171,15 @@ bool c_OutputGS8208Rmt::RmtPoll () } // Poll +//---------------------------------------------------------------------------- +void c_OutputGS8208Rmt::PauseOutput (bool State) +{ + // DEBUG_START; + + c_OutputGS8208::PauseOutput(State); + Rmt.PauseOutput(State); + + // DEBUG_END; +} // PauseOutput + #endif // defined(SUPPORT_OutputType_GS8208) && defined(ARDUINO_ARCH_ESP32) diff --git a/src/output/OutputRmt.cpp b/src/output/OutputRmt.cpp index d4fbd6111..d12b478e6 100644 --- a/src/output/OutputRmt.cpp +++ b/src/output/OutputRmt.cpp @@ -70,17 +70,19 @@ void RMT_Task (void *arg) if(nullptr != pRmt) { // invoke the channel - pRmt->StartNextFrame(); - uint32_t NotificationValue = ulTaskNotifyTake( pdTRUE, pdMS_TO_TICKS(100) ); - if(1 == NotificationValue) + if (pRmt->StartNextFrame()) { - // DEBUG_V("The transmission ended as expected."); - ++FrameCompletes; - } - else - { - ++FrameTimeouts; - // DEBUG_V("Transmit Timed Out."); + uint32_t NotificationValue = ulTaskNotifyTake( pdTRUE, pdMS_TO_TICKS(100) ); + if(1 == NotificationValue) + { + // DEBUG_V("The transmission ended as expected."); + ++FrameCompletes; + } + else + { + ++FrameTimeouts; + // DEBUG_V("Transmit Timed Out."); + } } } } @@ -464,9 +466,12 @@ void IRAM_ATTR c_OutputRmt::ISR_Handler (uint32_t isrFlags) // ClearRmtInterrupts; RMT_DEBUG_COUNTER(++ISRcounter); - + if(OutputIsPaused) + { + DisableRmtInterrupts; + } // did the transmitter stall? - if (isrFlags & RMT_INT_TX_END_BIT ) + else if (isrFlags & RMT_INT_TX_END_BIT ) { RMT_DEBUG_COUNTER(++IntTxEndIsrCounter); DisableRmtInterrupts; @@ -633,7 +638,7 @@ void c_OutputRmt::PauseOutput(bool PauseOutput) OutputIsPaused = PauseOutput; // //DEBUG_END; -} +} // PauseOutput //---------------------------------------------------------------------------- bool c_OutputRmt::StartNewFrame () @@ -647,6 +652,8 @@ bool c_OutputRmt::StartNewFrame () if(OutputIsPaused) { // DEBUG_V("Paused"); + DisableRmtInterrupts; + ClearRmtInterrupts; break; } diff --git a/src/output/OutputSerialRmt.cpp b/src/output/OutputSerialRmt.cpp index 46868a9d0..0bd3ab14e 100644 --- a/src/output/OutputSerialRmt.cpp +++ b/src/output/OutputSerialRmt.cpp @@ -2,7 +2,7 @@ * OutputSerialRmt.cpp - WS2811 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015 Shelby Merrick +* Copyright (c) 2015 - 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -248,4 +248,15 @@ bool c_OutputSerialRmt::RmtPoll () } // Poll +//---------------------------------------------------------------------------- +void c_OutputSerialRmt::PauseOutput (bool State) +{ + // DEBUG_START; + + c_OutputSerial::PauseOutput(State); + Rmt.PauseOutput(State); + + // DEBUG_END; +} // PauseOutput + #endif // (defined(SUPPORT_OutputType_DMX) || defined(SUPPORT_OutputType_Serial) || defined(SUPPORT_OutputType_Renard)) && defined(ARDUINO_ARCH_ESP32) diff --git a/src/output/OutputSerialUart.cpp b/src/output/OutputSerialUart.cpp index 84b5e8322..c1689a015 100644 --- a/src/output/OutputSerialUart.cpp +++ b/src/output/OutputSerialUart.cpp @@ -1,7 +1,7 @@ /****************************************************************** * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel (And Serial!) driver -* Orginal ESPixelStickproject by 2015 Shelby Merrick +* Orginal ESPixelStickproject by 2015 - 2025 Shelby Merrick * *This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or(at your option) any later version. This program is distributed in the hope that it will be useful, @@ -116,7 +116,7 @@ uint32_t c_OutputSerialUart::Poll () Uart.StartNewFrame(); ReportNewFrame(); } - else + else { FrameLen = 0; } @@ -126,4 +126,15 @@ uint32_t c_OutputSerialUart::Poll () } // render +//---------------------------------------------------------------------------- +void c_OutputSerialUart::PauseOutput (bool State) +{ + // DEBUG_START; + + c_OutputSerial::PauseOutput(State); + Uart.PauseOutput(State); + + // DEBUG_END; +} // PauseOutput + #endif // defined(SUPPORT_OutputType_DMX) || defined(SUPPORT_OutputType_Serial) || defined(SUPPORT_OutputType_Renard) diff --git a/src/output/OutputTLS3001Rmt.cpp b/src/output/OutputTLS3001Rmt.cpp index 3d8f62268..b000b5845 100644 --- a/src/output/OutputTLS3001Rmt.cpp +++ b/src/output/OutputTLS3001Rmt.cpp @@ -2,7 +2,7 @@ * OutputTLS3001Rmt.cpp - TLS3001 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -163,6 +163,17 @@ bool c_OutputTLS3001Rmt::RmtPoll () } // Poll +//---------------------------------------------------------------------------- +void c_OutputTLS3001Rmt::PauseOutput (bool State) +{ + // DEBUG_START; + + c_OutputTLS3001::PauseOutput(State); + Rmt.PauseOutput(State); + + // DEBUG_END; +} // PauseOutput + //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- diff --git a/src/output/OutputTM1814Rmt.cpp b/src/output/OutputTM1814Rmt.cpp index 4bfc92989..5561e5121 100644 --- a/src/output/OutputTM1814Rmt.cpp +++ b/src/output/OutputTM1814Rmt.cpp @@ -2,7 +2,7 @@ * OutputTM1814Rmt.cpp - TM1814 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -176,5 +176,15 @@ bool c_OutputTM1814Rmt::RmtPoll () } // Poll +//---------------------------------------------------------------------------- +void c_OutputTM1814Rmt::PauseOutput (bool State) +{ + // DEBUG_START; + + c_OutputTM1814::PauseOutput(State); + Rmt.PauseOutput(State); + + // DEBUG_END; +} // PauseOutput #endif // defined (SUPPORT_OutputType_TM1814) && defined (ARDUINO_ARCH_ESP32) diff --git a/src/output/OutputUCS1903Rmt.cpp b/src/output/OutputUCS1903Rmt.cpp index a91984c55..ea8b4edb6 100644 --- a/src/output/OutputUCS1903Rmt.cpp +++ b/src/output/OutputUCS1903Rmt.cpp @@ -2,7 +2,7 @@ * OutputUCS1903Rmt.cpp - UCS1903 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -171,4 +171,15 @@ bool c_OutputUCS1903Rmt::RmtPoll () } // Poll +//---------------------------------------------------------------------------- +void c_OutputUCS1903Rmt::PauseOutput (bool State) +{ + // DEBUG_START; + + c_OutputUCS1903::PauseOutput(State); + Rmt.PauseOutput(State); + + // DEBUG_END; +} // PauseOutput + #endif // defined(SUPPORT_OutputType_UCS1903) && defined(ARDUINO_ARCH_ESP32) diff --git a/src/output/OutputUCS8903Rmt.cpp b/src/output/OutputUCS8903Rmt.cpp index c801b057b..aa5dc7b63 100644 --- a/src/output/OutputUCS8903Rmt.cpp +++ b/src/output/OutputUCS8903Rmt.cpp @@ -2,7 +2,7 @@ * OutputUCS8903Rmt.cpp - UCS8903 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015 Shelby Merrick +* Copyright (c) 2015 - 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -175,4 +175,15 @@ bool c_OutputUCS8903Rmt::RmtPoll () } // Poll +//---------------------------------------------------------------------------- +void c_OutputUCS8903Rmt::PauseOutput (bool State) +{ + // DEBUG_START; + + c_OutputUCS8903::PauseOutput(State); + Rmt.PauseOutput(State); + + // DEBUG_END; +} // PauseOutput + #endif // defined(SUPPORT_OutputType_UCS8903) && defined(ARDUINO_ARCH_ESP32) diff --git a/src/output/OutputWS2811Rmt.cpp b/src/output/OutputWS2811Rmt.cpp index c4884abcd..db3516c60 100644 --- a/src/output/OutputWS2811Rmt.cpp +++ b/src/output/OutputWS2811Rmt.cpp @@ -2,7 +2,7 @@ * OutputWS2811Rmt.cpp - WS2811 driver code for ESPixelStick RMT Channel * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2015, 2022 Shelby Merrick +* Copyright (c) 2015, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -177,4 +177,15 @@ bool c_OutputWS2811Rmt::RmtPoll () } // Poll +//---------------------------------------------------------------------------- +void c_OutputWS2811Rmt::PauseOutput (bool State) +{ + // DEBUG_START; + + c_OutputWS2811::PauseOutput(State); + Rmt.PauseOutput(State); + + // DEBUG_END; +} // PauseOutput + #endif // defined(SUPPORT_OutputType_WS2811) && defined(ARDUINO_ARCH_ESP32) From 5dfc4e9ef815aaa48bf015a83f0daf0c6cc9a391 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 20 Dec 2024 17:56:51 -0500 Subject: [PATCH 15/15] Pause input AND output when a file transfer is in progress. --- src/service/FPPDiscovery.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/service/FPPDiscovery.cpp b/src/service/FPPDiscovery.cpp index 6519968c0..ba8701539 100644 --- a/src/service/FPPDiscovery.cpp +++ b/src/service/FPPDiscovery.cpp @@ -1,7 +1,7 @@ /* * c_FPPDiscovery.cpp -* Copyright (c) 2021, 2022 Shelby Merrick +* Copyright (c) 2021, 2025 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -816,6 +816,9 @@ void c_FPPDiscovery::ProcessFile ( StopPlaying(true); inFileUpload = true; UploadFileName = filename; + InputMgr.SetOperationalState(false); + OutputMgr.PauseOutputs(true); + memset(OutputMgr.GetBufferAddress(), 0x00, OutputMgr.GetBufferSize()); } // DEBUG_V(); @@ -833,6 +836,8 @@ void c_FPPDiscovery::ProcessFile ( // DEBUG_V("Allow file to play"); inFileUpload = false; UploadFileName = ""; + InputMgr.SetOperationalState(true); + OutputMgr.PauseOutputs(false); } } while (false);