diff --git a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua index 35605ccf8..1988bd9af 100755 --- a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua +++ b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua @@ -19,7 +19,7 @@ local shadowed = 0 local options = { - { "Sensor", SOURCE, 1 }, + { "Sensor", SOURCE, 0 }, { "Color", COLOR, WHITE }, { "Shadow", BOOL, 0 } } @@ -28,12 +28,24 @@ local options = { local function create(zone, options) local myZone = { zone=zone, options=options, counter=0 } histCellData = {} + + -- use default if user did not set, So widget is operational when selecting the widget + if myZone.options.Sensor == 0 then + myZone.options.Sensor = "Cels" + end + return myZone end -- This function allow updates when you change widgets settings local function update(myZone, options) myZone.options = options + + -- use default if user did not set, So widget is operational when selecting the widget + if myZone.options.Sensor == 0 then + myZone.options.Sensor = "Cels" + end + end -- A quick and dirty check for empty table @@ -100,6 +112,9 @@ end --- This function return the percentage remaining in a single Lipo cel local function getCellPercent(cellValue) + if cellValue == nil then + return 0 + end --## Data gathered from commercial lipo sensors local myArrayPercentList = {{3, 0}, {3.093, 1}, {3.196, 2}, {3.301, 3}, {3.401, 4}, {3.477, 5}, {3.544, 6}, {3.601, 7}, {3.637, 8}, {3.664, 9}, {3.679, 10}, {3.683, 11}, {3.689, 12}, {3.692, 13}, {3.705, 14}, {3.71, 15}, {3.713, 16}, {3.715, 17}, {3.72, 18}, {3.731, 19}, {3.735, 20}, {3.744, 21}, {3.753, 22}, {3.756, 23}, {3.758, 24}, {3.762, 25}, {3.767, 26}, {3.774, 27}, {3.78, 28}, {3.783, 29}, {3.786, 30}, {3.789, 31}, {3.794, 32}, {3.797, 33}, {3.8, 34}, {3.802, 35}, {3.805, 36}, {3.808, 37}, {3.811, 38}, {3.815, 39}, {3.818, 40}, {3.822, 41}, {3.825, 42}, {3.829, 43}, {3.833, 44}, {3.836, 45}, {3.84, 46}, {3.843, 47}, {3.847, 48}, {3.85, 49}, {3.854, 50}, {3.857, 51}, {3.86, 52}, {3.863, 53}, {3.866, 54}, {3.87, 55}, {3.874, 56}, {3.879, 57}, {3.888, 58}, {3.893, 59}, {3.897, 60}, {3.902, 61}, {3.906, 62}, {3.911, 63}, {3.918, 64}, {3.923, 65}, {3.928, 66}, {3.939, 67}, {3.943, 68}, {3.949, 69}, {3.955, 70}, {3.961, 71}, {3.968, 72}, {3.974, 73}, {3.981, 74}, {3.987, 75}, {3.994, 76}, {4.001, 77}, {4.007, 78}, {4.014, 79}, {4.021, 80}, {4.029, 81}, {4.036, 82}, {4.044, 83}, {4.052, 84}, {4.062, 85}, {4.074, 86}, {4.085, 87}, {4.095, 88}, {4.105, 89}, {4.111, 90}, {4.116, 91}, {4.12, 92}, {4.125, 93}, {4.129, 94}, {4.135, 95}, {4.145, 96}, {4.176, 97}, {4.179, 98}, {4.193, 99}, {4.2, 100}} @@ -129,7 +144,8 @@ local function getCellAvg(cellData) end end --- This function returns green at 100%, red bellow 30% and graduate in betwwen +-- This function returns green at 100%, red bellow 30% and graduate in between +-- color for battery local function getPercentColor(cpercent) if cpercent < 30 then return lcd.RGB(0xff, 0, 0) @@ -140,7 +156,8 @@ local function getPercentColor(cpercent) end end --- This function returns green at gvalue, red at rvalue and graduate in betwwen +-- This function returns green at gvalue, red at rvalue and graduate in between +-- color for cell local function getRangeColor(value, gvalue, rvalue) if gvalue > rvalue and not range==0 then range = gvalue - rvalue @@ -162,8 +179,9 @@ end -- This size is for top bar widgets local function zoneTiny(zone) local mySensor = getCels(zone.options.Sensor) - if type(mySensor) == "table" then - local myString = string.format("%2.1fV", getCellSum(mySensor)) + local isHaveData = (type(mySensor) == "table") + if isHaveData then + local myString = string.format("%2.1fV", getCellMin(mySensor)) local percent = getCellPercent(getCellAvg(mySensor)) lcd.drawText(zone.zone.x + zone.zone.w, zone.zone.y, percent.."%", RIGHT + SMLSIZE + CUSTOM_COLOR) lcd.drawText(zone.zone.x + zone.zone.w, zone.zone.y + 15, myString, RIGHT + SMLSIZE + CUSTOM_COLOR) @@ -177,28 +195,33 @@ end --- Size is 160x30 1/8th local function zoneSmall(zone) - local myBatt = {["x"]=0, ["y"]=0, ["w"]=75, ["h"]=28, ["segments_w"]=15, ["color"]=WHITE, ["cath_w"]=6, ["cath_h"]=20} + local myBatt = {["x"]=0, ["y"]=0, ["w"]=155, ["h"]=35, ["segments_w"]=25, ["color"]=WHITE, ["cath_w"]=6, ["cath_h"]=20} local mySensor = getCels(zone.options.Sensor) + local isHaveData = (type(mySensor) == "table") - lcd.setColor(CUSTOM_COLOR, zone.options.Color) - if type(mySensor) == "table" then - local myString = string.format("%2.1fV", getCellSum(mySensor)).." ("..getCellCount(mySensor).."S)" - local percent = getCellPercent(getCellAvg(mySensor)) - lcd.drawText(zone.zone.x + zone.zone.w, zone.zone.y + 22, myString, RIGHT + SMLSIZE + CUSTOM_COLOR + shadowed) - lcd.drawText(zone.zone.x + zone.zone.w, zone.zone.y, percent.."%", RIGHT + MIDSIZE + CUSTOM_COLOR + shadowed) - -- fils batt - lcd.setColor(CUSTOM_COLOR, getPercentColor(percent)) - lcd.drawGauge(zone.zone.x+2, zone.zone.y+2, 75, zone.zone.h - 4, percent, 100, CUSTOM_COLOR) - -- draws bat - lcd.setColor(CUSTOM_COLOR, WHITE) - lcd.drawRectangle(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y, myBatt.w, myBatt.h, CUSTOM_COLOR, 2) - lcd.drawFilledRectangle(zone.zone.x + myBatt.x + myBatt.w, zone.zone.y + myBatt.h/2 - myBatt.cath_h/2, myBatt.cath_w, myBatt.cath_h, CUSTOM_COLOR) - for i=1, myBatt.w - myBatt.segments_w, myBatt.segments_w do - lcd.drawRectangle(zone.zone.x + myBatt.x + i, zone.zone.y + myBatt.y, myBatt.segments_w, myBatt.h, CUSTOM_COLOR, 1) - end + local percent = getCellPercent(getCellAvg(mySensor)) + + -- draws bat + lcd.setColor(CUSTOM_COLOR, WHITE) + lcd.drawRectangle(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y, myBatt.w, myBatt.h, CUSTOM_COLOR, 2) + lcd.drawFilledRectangle(zone.zone.x + myBatt.x + myBatt.w, zone.zone.y + myBatt.h/2 - myBatt.cath_h/2, myBatt.cath_w, myBatt.cath_h, CUSTOM_COLOR) + + local mainValue = getCellMin(mySensor) + local secondaryValue = getCellSum(mySensor) + + -- fils batt + lcd.setColor(CUSTOM_COLOR, getPercentColor(percent)) + lcd.drawGauge(zone.zone.x+2, zone.zone.y+2, myBatt.w-4, zone.zone.h, percent, 100, CUSTOM_COLOR) + -- write text + if isHaveData then + lcd.setColor(CUSTOM_COLOR, zone.options.Color) + local topLine = string.format("%2.1fV %2.0f%%", mainValue, percent) + lcd.drawText(zone.zone.x + 20, zone.zone.y +2, topLine , MIDSIZE + CUSTOM_COLOR + shadowed) else - lcd.drawText(zone.zone.x, zone.zone.y+10, "No FLVSS sensor data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) + lcd.drawText(zone.zone.x + 10, zone.zone.y+10, "No Voltage Data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) end + + return end @@ -206,11 +229,12 @@ end local function zoneMedium(zone) local myBatt = {["x"]=0, ["y"]=0, ["w"]=95, ["h"]=35, ["segments_w"]=15, ["color"]=WHITE, ["cath_w"]=6, ["cath_h"]=20} local mySensor = getCels(zone.options.Sensor) + local isHaveData = (type(mySensor) == "table") lcd.setColor(CUSTOM_COLOR, zone.options.Color) - if type(mySensor) == "table" then + if isHaveData then local percent = getCellPercent(getCellAvg(mySensor)) - lcd.drawText(zone.zone.x + zone.zone.w, zone.zone.y+5, percent.."% ", RIGHT + MIDSIZE + CUSTOM_COLOR + shadowed) + lcd.drawText(zone.zone.x + myBatt.w + 20, zone.zone.y, string.format("%2.1fV", getCellMin(mySensor)) , DBLSIZE + CUSTOM_COLOR + shadowed) -- fils batt lcd.setColor(CUSTOM_COLOR, getPercentColor(percent)) @@ -225,13 +249,13 @@ local function zoneMedium(zone) lcd.drawRectangle(zone.zone.x + pos[i].x, zone.zone.y + pos[i].y, 59, 20, CUSTOM_COLOR,1) end else - lcd.drawText(zone.zone.x, zone.zone.y+35, "No FLVSS sensor data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR) + lcd.drawText(zone.zone.x, zone.zone.y+35, "No Voltage Data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR) end -- draws bat lcd.setColor(CUSTOM_COLOR, WHITE) lcd.drawRectangle(zone.zone.x + myBatt.x , zone.zone.y + myBatt.y, myBatt.w, myBatt.h, CUSTOM_COLOR, 2) lcd.drawFilledRectangle(zone.zone.x + myBatt.x + myBatt.w, zone.zone.y + myBatt.h/2 - myBatt.cath_h/2, myBatt.cath_w, myBatt.cath_h, CUSTOM_COLOR) - lcd.drawText(zone.zone.x + myBatt.x + 5 , zone.zone.y + myBatt.y + 5, string.format("%2.1fV", getCellSum(mySensor)), LEFT + MIDSIZE + CUSTOM_COLOR + shadowed) + lcd.drawText(zone.zone.x + myBatt.x + 20 , zone.zone.y + myBatt.y + 5, string.format("%2.0f%%", getCellPercent(getCellAvg(mySensor))), LEFT + MIDSIZE + CUSTOM_COLOR + shadowed) --for i=1, myBatt.w - myBatt.segments_w, myBatt.segments_w do -- lcd.drawRectangle(zone.zone.x + myBatt.x + i, zone.zone.y + myBatt.y, myBatt.segments_w, myBatt.h, CUSTOM_COLOR, 1) --end @@ -242,13 +266,15 @@ end local function zoneLarge(zone) local myBatt = {["x"]=0, ["y"]=18, ["w"]=76, ["h"]=121, ["segments_h"]=30, ["color"]=WHITE, ["cath_w"]=30, ["cath_h"]=10} local mySensor = getCels(zone.options.Sensor) + local isHaveData = (type(mySensor) == "table") lcd.setColor(CUSTOM_COLOR, zone.options.Color) - if type(mySensor) == "table" then + if isHaveData then local percent = getCellPercent(getCellAvg(mySensor)) - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y+15, percent.."%", RIGHT + DBLSIZE + CUSTOM_COLOR + shadowed) - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y+44, string.format("%2.1fV", getCellSum(mySensor)), RIGHT + MIDSIZE + CUSTOM_COLOR + shadowed) - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y+65, getCellCount(mySensor).."S", RIGHT + MIDSIZE + CUSTOM_COLOR + shadowed) + + lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y, percent.."%", RIGHT + DBLSIZE + CUSTOM_COLOR + shadowed) + lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y+30, string.format("%2.1fV", getCellMin(mySensor)), RIGHT + DBLSIZE + CUSTOM_COLOR + shadowed) + lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y+70, string.format("%2.1fV %2.1fS", getCellSum(mySensor), getCellCount(mySensor)), RIGHT + SMLSIZE + CUSTOM_COLOR + shadowed) -- fils batt lcd.setColor(CUSTOM_COLOR, getPercentColor(percent)) lcd.drawFilledRectangle(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y + myBatt.h + myBatt.cath_h - math.floor(percent/100 * myBatt.h), myBatt.w, math.floor(percent/100 * myBatt.h), CUSTOM_COLOR) @@ -262,7 +288,7 @@ local function zoneLarge(zone) lcd.drawRectangle(zone.zone.x + pos[i].x, zone.zone.y + pos[i].y, 59, 20, CUSTOM_COLOR, 1) end else - lcd.drawText(zone.zone.x+5, zone.zone.y, "No FLVSS sensor data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) + lcd.drawText(zone.zone.x+5, zone.zone.y, "No Voltage Data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) end -- draws bat lcd.setColor(CUSTOM_COLOR, WHITE) @@ -278,9 +304,10 @@ end local function zoneXLarge(zone) local myBatt = {["x"]=10, ["y"]=20, ["w"]=80, ["h"]=121, ["segments_h"]=30, ["color"]=WHITE, ["cath_w"]=30, ["cath_h"]=10} local mySensor = getCels(zone.options.Sensor) + local isHaveData = (type(mySensor) == "table") lcd.setColor(CUSTOM_COLOR, zone.options.Color) - if type(mySensor) == "table" then + if isHaveData then local percent = getCellPercent(getCellAvg(mySensor)) -- fils batt lcd.setColor(CUSTOM_COLOR, getPercentColor(percent)) @@ -288,8 +315,13 @@ local function zoneXLarge(zone) -- draw right text section lcd.setColor(CUSTOM_COLOR, zone.options.Color) lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y + myBatt.y, percent.."%", RIGHT + DBLSIZE + CUSTOM_COLOR + shadowed) - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y + myBatt.y + 63, string.format("%2.1fV", getCellSum(mySensor)), RIGHT + MIDSIZE + CUSTOM_COLOR + shadowed) - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y + myBatt.y + 105, getCellCount(mySensor).."S", RIGHT + MIDSIZE + CUSTOM_COLOR + shadowed) + + local mainValue = getCellMin(mySensor) + local secondaryValue = getCellSum(mySensor) + + lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y + myBatt.y + 30, string.format("%2.1fV", mainValue), RIGHT + DBLSIZE + CUSTOM_COLOR + shadowed) + lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y + myBatt.y + 105, string.format("%2.1fV %2.1fS", secondaryValue, getCellCount(mySensor)) , RIGHT + SMLSIZE + CUSTOM_COLOR + shadowed) + -- draw cells local pos = {{x=111, y=38}, {x=164, y=38}, {x=217, y=38}, {x=111, y=57}, {x=164, y=57}, {x=217, y=57}} for i=1, getCellCount(mySensor), 1 do @@ -309,7 +341,7 @@ local function zoneXLarge(zone) lcd.drawText(zone.zone.x + pos[i].x+10, zone.zone.y + pos[i].y, string.format("%.2f", histCellData[i]), CUSTOM_COLOR + shadowed) end else - lcd.drawText(zone.zone.x+5, zone.zone.y, "No FLVSS sensor data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR) + lcd.drawText(zone.zone.x+5, zone.zone.y, "No Voltage Data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR) end -- draws bat lcd.setColor(CUSTOM_COLOR, WHITE) @@ -320,9 +352,9 @@ local function zoneXLarge(zone) end -- draw middle rectangles lcd.drawRectangle(zone.zone.x + 110, zone.zone.y + 38, 161, 40, CUSTOM_COLOR, 1) - lcd.drawText(zone.zone.x + 270, zone.zone.y + 21, "Live data", RIGHT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) + lcd.drawText(zone.zone.x + 220, zone.zone.y + 21, "Live data", RIGHT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) lcd.drawRectangle(zone.zone.x + 110, zone.zone.y + 110, 161, 40, CUSTOM_COLOR, 1) - lcd.drawText(zone.zone.x + 270, zone.zone.y + 93, "Lowest data", RIGHT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) + lcd.drawText(zone.zone.x + 230, zone.zone.y + 93, "Lowest data", RIGHT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) return end @@ -338,16 +370,17 @@ function refresh(myZone) else shadowed = 0 end - if myZone.options.Sensor == 1 then - lcd.drawText(myZone.zone.x+2, myZone.zone.y+2, "Not configured", LEFT + SMLSIZE + CUSTOM_COLOR) - lcd.drawText(myZone.zone.x+2, myZone.zone.y+20, "Requires FLVSS sensor", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR) - return - end - if myZone.zone.w > 380 and myZone.zone.h > 165 then zoneXLarge(myZone) - elseif myZone.zone.w > 180 and myZone.zone.h > 145 then zoneLarge(myZone) - elseif myZone.zone.w > 170 and myZone.zone.h > 65 then zoneMedium(myZone) - elseif myZone.zone.w > 150 and myZone.zone.h > 28 then zoneSmall(myZone) - elseif myZone.zone.w > 65 and myZone.zone.h > 35 then zoneTiny(myZone) + + --if myZone.options.Sensor == 1 then + -- lcd.drawText(myZone.zone.x+2, myZone.zone.y+2, "Not configured", LEFT + SMLSIZE + CUSTOM_COLOR) + -- lcd.drawText(myZone.zone.x+2, myZone.zone.y+20, "Requires setting a Voltage Sensor", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR) + -- return + --end + if myZone.zone.w > 380 and myZone.zone.h > 165 then zoneXLarge(myZone) + elseif myZone.zone.w > 180 and myZone.zone.h > 145 then zoneLarge(myZone) + elseif myZone.zone.w > 170 and myZone.zone.h > 65 then zoneMedium(myZone) + elseif myZone.zone.w > 150 and myZone.zone.h > 28 then zoneSmall(myZone) + elseif myZone.zone.w > 65 and myZone.zone.h > 35 then zoneTiny(myZone) end end