From b11d9eba6ead25fa6b6e4fdb17adacda2ee40fc7 Mon Sep 17 00:00:00 2001 From: Hans Christian Olaussen <41271048+klutvott123@users.noreply.github.com> Date: Sun, 16 Jan 2022 21:35:35 +0100 Subject: [PATCH] CMS fixes --- src/SCRIPTS/BF/CMS/common.lua | 51 ++++++++++++++++------------------- src/SCRIPTS/BF/cms.lua | 26 +++++++++--------- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/SCRIPTS/BF/CMS/common.lua b/src/SCRIPTS/BF/CMS/common.lua index 5725412..5581d82 100644 --- a/src/SCRIPTS/BF/CMS/common.lua +++ b/src/SCRIPTS/BF/CMS/common.lua @@ -41,31 +41,26 @@ screen = { data = {}, batchId = 0, sequence = 0, + redraws = 2, reset = function() - screen.buffer = {} screen.data = {} screen.batchId = 0 screen.sequence = 0 end, draw = function() - if (screen.buffer ~= nil and screen.config ~= nil and #screen.buffer > 0) then - screen.clear() - for char = 1, #screen.buffer do - if (screen.buffer[char] ~= 32) then -- skip spaces to avoid CPU spikes - c = string.char(screen.buffer[char]) - row = math.ceil(char / screen.config.cols) - col = char - ((row - 1) * screen.config.cols) - xPos = ((col - 1) * screen.config.pixelsPerChar) + screen.config.xIndent + 1 - yPos = ((row - 1) * screen.config.pixelsPerRow) + screen.config.yOffset + 1 - lcd.drawText(xPos, yPos, c, screen.config.textSize) - end + lcd.clear() + lcd.drawText(screen.config.refresh.left, screen.config.refresh.top, screen.config.refresh.text, screen.config.textSize) + for char = 1, #screen.buffer do + if (screen.buffer[char] ~= 32) then -- skip spaces to avoid CPU spikes + local c = string.char(screen.buffer[char]) + local row = math.ceil(char / screen.config.cols) + local col = char - ((row - 1) * screen.config.cols) + local xPos = ((col - 1) * screen.config.pixelsPerChar) + screen.config.xIndent + 1 + local yPos = ((row - 1) * screen.config.pixelsPerRow) + screen.config.yOffset + 1 + lcd.drawText(xPos, yPos, c, screen.config.textSize) end end end, - clear = function() - lcd.clear() - lcd.drawText(screen.config.refresh.left, screen.config.refresh.top, screen.config.refresh.text, screen.config.textSize) - end } cms = { @@ -91,27 +86,23 @@ cms = { update = function() local command, data = protocol.cms.poll() if (command == "update") then - local firstChunk = bit32.band(data[CONST.offset.meta], CONST.bitmask.firstChunk) - local lastChunk = bit32.band(data[CONST.offset.meta], CONST.bitmask.lastChunk) + local firstChunk = bit32.btest(data[CONST.offset.meta], CONST.bitmask.firstChunk) + local lastChunk = bit32.btest(data[CONST.offset.meta], CONST.bitmask.lastChunk) local batchId = bit32.band(data[CONST.offset.meta], CONST.bitmask.batchId) - local sequence = data[CONST.offset.sequence] - local frameData = {} - for i = CONST.offset.data, #data do - frameData[#frameData + 1] = data[i] - end - if (firstChunk ~= 0) then + local sequence = data[CONST.offset.sequence] + if firstChunk then screen.reset() screen.batchId = batchId screen.sequence = 0 end if (screen.batchId == batchId) and (screen.sequence == sequence) then screen.sequence = sequence + 1 - for i = 1, #frameData do - screen.data[#screen.data + 1] = frameData[i] + for i = CONST.offset.data, #data do + screen.data[#screen.data + 1] = data[i] end - if (lastChunk ~= 0) then + if lastChunk then screen.buffer = cRleDecode(screen.data) - screen.draw() + screen.redraws = 2 screen.reset() cms.synced = true end @@ -122,5 +113,9 @@ cms = { elseif (command == "clear") then screen.reset() end + if screen.redraws > 0 then + screen.draw() + screen.redraws = screen.redraws - 1 + end end } diff --git a/src/SCRIPTS/BF/cms.lua b/src/SCRIPTS/BF/cms.lua index 1a6e602..fdb5752 100644 --- a/src/SCRIPTS/BF/cms.lua +++ b/src/SCRIPTS/BF/cms.lua @@ -1,6 +1,5 @@ local lastMenuEventTime = 0 local INTERVAL = 80 -local firstRun = true local function init() cms.init(radio) @@ -12,25 +11,24 @@ local function stickMovement() end local function run(event) - if firstRun then - screen.clear() - firstRun = false - end - if stickMovement() then - cms.synced = false - lastMenuEventTime = getTime() - end cms.update() - if (cms.menuOpen == false) then + if cms.menuOpen == false then cms.open() end - if (event == radio.refresh.event) or (lastMenuEventTime + INTERVAL < getTime() and not cms.synced) then - cms.refresh() - end - if (event == EVT_VIRTUAL_EXIT) then + if event == radio.refresh.event then + cms.synced = false + lastMenuEventTime = 0 + elseif stickMovement() then + cms.synced = false + lastMenuEventTime = getTime() + elseif event == EVT_VIRTUAL_EXIT then cms.close() return 1 end + if lastMenuEventTime + INTERVAL < getTime() and not cms.synced then + lastMenuEventTime = getTime() + cms.refresh() + end return 0 end