diff --git a/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory.lua b/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory.lua deleted file mode 100644 index 3afae9f4..00000000 --- a/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory.lua +++ /dev/null @@ -1,7 +0,0 @@ --- TNS|Flights History|TNE - -local function run() - return "/SCRIPTS/TOOLS/FlightsHistory/main.lua" -end - -return { run = run } diff --git a/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/FlightsHistory4.lua b/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/app.lua similarity index 62% rename from sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/FlightsHistory4.lua rename to sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/app.lua index 7811141a..6e80184e 100644 --- a/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/FlightsHistory4.lua +++ b/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/app.lua @@ -19,23 +19,26 @@ local M = {} -- This history of flights -- Author: Offer Shmuely --- Date: 2023-2025 +-- Date: 2023-2026 -local script_folder = "/SCRIPTS/TOOLS/FlightsHistory/" +local script_folder = "/SCRIPTS/TOOLS/FlightsHistory" local filter_model_name local filter_model_name_idx = 1 local model_name_list = { "-- all --" } +local lvSCALE = lvgl.LCD_SCALE or 1 +local is800 = (LCD_W==800) + -- state machine local STATE = { SPLASH_INIT = 0, - SPLASH_LOOP = 1, + SPLASH = 1, READ_HIST_INIT = 2, - READ_HIST_LOOP = 3, - FLIGHTS_COUNT_INIT = 4, - FLIGHTS_COUNT_LOOP = 5, - SHOW_FLIGHTS_INIT = 6, - SHOW_FLIGHTS_LOOP = 7, + READ_HIST = 3, + SHOW_FLIGHTS_HIST_INIT = 4, + SHOW_FLIGHTS_HIST = 5, + FLIGHTS_COUNT_INIT = 6, + FLIGHTS_COUNT = 7, DO_NOTHING=99,--??? } local state = STATE.SPLASH_INIT @@ -59,58 +62,27 @@ local function compare_date_first(a1, b1) return (a > b) end --- read log file list -local function read_history_file() - log("read_history_file: init") - m_index_file.indexInit() - m_index_file.historyFileRead() - - for i = 1, #m_index_file.log_files_index_info do - local flight_info = m_index_file.log_files_index_info[i] - -- log("to model name list: %d. %s", i, flight_info.model_name) - m_tables.list_ordered_insert(model_name_list, flight_info.model_name, compare_names, 2) - end -end - -local function calculate_model_summary_list() - local model_summary_list = {} - log("calculate_model_summary_list()") - - local model_flight_count = {} - for i = 1, #m_index_file.log_files_index_info do - local flight_info = m_index_file.log_files_index_info[i] - --log("model_summary_list: %d. [%s]=%d (%s min)", i, flight_info.model_name, flight_info.flight_count, flight_info.duration) - - if model_flight_count[flight_info.model_name] == nil then - -- log("model_summary_list: %d. first", i) - model_flight_count[flight_info.model_name] = 0 - else - -- log("model_summary_list: %d. logged", i) - end - - model_flight_count[flight_info.model_name] = flight_info.flight_count - end - - m_tables.table_clear(model_summary_list) - for k, v in pairs(model_flight_count) do - --local inf = string.format("%-17s - %d flights", k, v) - -- local inf = string.format("%03d - %s", v, k) - -- log("model_flight_count: %s", inf) - model_summary_list[#model_summary_list +1] = {v, k} +local function isFileExist(file_name) + log("is_file_exist()") + local hFile = io.open(file_name, "r") + if hFile == nil then + log("file not exist - %s", file_name) + return false end - return model_summary_list + io.close(hFile) + log("file exist - %s", file_name) + return true end - local splash_start_time = 0 local function state_SPLASH_INIT(event, touchState) lvgl.clear() - lvgl.image({x=0,y=0,w=LCD_W,h=LCD_H,file=script_folder.."bg1.png"}) - state = STATE.SPLASH_LOOP + lvgl.image({x=0,y=0,w=LCD_W,h=LCD_H,file=script_folder.."/bg1.png"}) + state = STATE.SPLASH return 0 end -local function state_SPLASH_LOOP(event, touchState) +local function state_SPLASH(event, touchState) if splash_start_time == 0 then splash_start_time = getTime() end @@ -119,71 +91,51 @@ local function state_SPLASH_LOOP(event, touchState) local elapsedMili = elapsed * 10; -- was 1500, but most the time will go anyway from the load of the scripts -- if (elapsedMili >= 1500) then - if (elapsedMili >= 500) then - state = STATE.READ_HIST_INIT + if (elapsedMili < 500) then + return 0 + end + local isHistoryExist = isFileExist( "/flights-history.csv") + if isHistoryExist then + log("History file exist") + state = STATE.READ_HIST_INIT + else + log("History file does not exist") + lvgl.label({x=30, y=180, text="No history file found! \n" + .. "This app is working with 'Flights' widget.\n" + .. "Please count your flights with 'Flights' widget \n" + .. "then use this script.\n" + , color=WHITE, font=BOLD}) + state = STATE.DO_NOTHING end return 0 end local function state_READ_HIST_INIT(event, touchState) - local ui = { - -- draw top-bar - {type="rectangle", x=0, y=0, w=LCD_W, h=20, color=COLOR_THEME_SECONDARY1, filled=true}, - {type="label", x=160, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, - {type="label", x=440, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, - -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."bg2.png"}, - -- {type="label", x=10, y=25, text="Models Flight Count...", font=BOLD}, - } - lvgl.clear() - lvgl.build(ui) - - state = STATE.READ_HIST_LOOP - return 0 -end -local function state_READ_HIST_LOOP(event, touchState) - read_history_file() - state = STATE.FLIGHTS_COUNT_INIT - return 0 -end - -local function state_FLIGHTS_COUNT_INIT(event, touchState) - local model_summary_list = calculate_model_summary_list() - - log("creating new window gui") - lvgl.clear() + -- lvgl.clear() lvgl.build({ - -- draw top-bar - {type="rectangle", x=0, y=0, w=LCD_W, h=LCD_H, color=BLACK, filled=true}, - {type="rectangle", x=0, y=0, w=LCD_W, h=20, color=COLOR_THEME_SECONDARY1, filled=true}, - {type="label", x=160, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, - {type="label", x=440, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, - -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."bg2.png"}, - {type="label", x=10, y=25, text="Models Flight Count...", font=BOLD}, - }) - - libGUIv4.newCtl.ctl_table(nil, "count-table", { - x=20,y=50,w=480,h=272-50, - font=FS.FONT_8, - header={"Flights", "Model"}, - colX={20, 70}, - lines=model_summary_list + {type="label", x=20*lvSCALE, y=200*lvSCALE, text="Reading data...", color=ORANGE, font=FS.FONT_12 + BOLD} }) - state = STATE.FLIGHTS_COUNT_LOOP + state = STATE.READ_HIST return 0 end +local function state_READ_HIST(event, touchState) + -- read log file list + log("read_history_file: init") + m_index_file.indexInit() + m_index_file.historyFileRead() -local function state_FLIGHTS_COUNT_LOOP(event, touchState) - if event == EVT_VIRTUAL_NEXT_PAGE then - lvgl.clear() - lvgl.label({x=0, y=0, text="Loading...", color=WHITE, font=BOLD}) - state = STATE.SHOW_FLIGHTS_INIT - return 0 + for i = 1, #m_index_file.log_files_index_info do + local flight_info = m_index_file.log_files_index_info[i] + -- log("to model name list: %d. %s", i, flight_info.model_name) + m_tables.list_ordered_insert(model_name_list, flight_info.model_name, compare_names, 2) end + state = STATE.SHOW_FLIGHTS_HIST_INIT return 0 end + local function is_visible_line(line) if filter_model_name == nil or filter_model_name == "-- all --" then -- if filter_model_name == nil or filter_model_name == string.sub(filter_model_name, 1, 2) == "--" then @@ -191,11 +143,11 @@ local function is_visible_line(line) end local lineModelName = line[2] - log("is_visible_line by: [%s] [%s]", filter_model_name, lineModelName) + -- log("is_visible_line by: [%s] [%s] --> %s %s %s %s", filter_model_name, lineModelName, filter_model_name == lineModelName) return (filter_model_name == lineModelName) end -local function state_SHOW_FLIGHTS_init(event, touchState) +local function state_SHOW_FLIGHTS_HIST_INIT(event, touchState) -- creating new window gui lvgl.clear() collectgarbage() @@ -203,16 +155,16 @@ local function state_SHOW_FLIGHTS_init(event, touchState) lvgl.build({ -- draw top-bar {type="rectangle", x=0, y=0, w=LCD_W, h=LCD_H, color=BLACK, filled=true}, - {type="rectangle", x=0, y=0, w=LCD_W, h=20, color=COLOR_THEME_SECONDARY1, filled=true}, - {type="label", x=160, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, - {type="label", x=440, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, - -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."bg2.png"}, - {type="label", x=10, y=25, text="All Flight...", font=BOLD}, + {type="rectangle", x=0, y=0, w=LCD_W, h=20*lvSCALE, color=COLOR_THEME_SECONDARY1, filled=true}, + {type="label", x=160*lvSCALE, y=1*lvSCALE, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, + {type="label", x=LCD_W-40*lvSCALE, y=1*lvSCALE, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, + -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."/bg2.png"}, + {type="label", x=10*lvSCALE, y=25*lvSCALE, text="All Flight...", font=BOLD, color=WHITE}, }) filter_model_name_idx = 1 lvgl.build({ - { type = "choice", x=150, y=25, w=LCD_W-10-150, h=27, title = "Craft", + { type="choice", x=150*lvSCALE, y=25*lvSCALE, w=LCD_W-(10+150)*lvSCALE, h=27*lvSCALE, title = "Craft", values = model_name_list, -- values = {"aaa", "bbb", "ccc", "ddd", "eee"}, get = function() return filter_model_name_idx; end, @@ -238,31 +190,32 @@ local function state_SHOW_FLIGHTS_init(event, touchState) lines_csv[#lines_csv + 1] = { day, - string.format("%s", f_info.flight_count), f_info.model_name, + string.format("%s", f_info.flight_count), string.format("(%0.1f min)", f_info.duration/100), } end libGUIv4.newCtl.ctl_table(nil, "count-table", { - x=10, y=64, w=480, h=LCD_H-60, + x=10*lvSCALE, y=64*lvSCALE, w=LCD_W-10*lvSCALE, h=LCD_H-65*lvSCALE, font=FS.FONT_6, - header={"Date", "Flights", "Model", "Duration"}, - colX={20, 100, 140, 400}, + header={"Date", "Model", "Flights", "Duration"}, + colX={20*lvSCALE, 100*lvSCALE, 340*lvSCALE, 400*lvSCALE}, lines=lines_csv, fIsLineVisible=is_visible_line, + maxLines=50, }) for i = 1, #model_name_list do log("model_name_list: %d. [%s]", i, model_name_list[i]) end - state = STATE.SHOW_FLIGHTS_LOOP + state = STATE.SHOW_FLIGHTS_HIST return 0 end -local function state_SHOW_FLIGHTS_LOOP(event, touchState) - if event == EVT_VIRTUAL_EXIT or event == EVT_VIRTUAL_PREV_PAGE then +local function state_SHOW_FLIGHTS_HIST(event, touchState) + if event == EVT_VIRTUAL_NEXT_PAGE then lvgl.clear() lvgl.label({x=0, y=0, text="Loading...", color=WHITE, font=BOLD}) state = STATE.FLIGHTS_COUNT_INIT @@ -272,6 +225,91 @@ local function state_SHOW_FLIGHTS_LOOP(event, touchState) return 0 end +-- ---------------------------------------------------------------------------------------------------------- + +local function calculate_model_summary_list() + + local model_flight_count = {} + for i = 1, #m_index_file.log_files_index_info do + local flight_info = m_index_file.log_files_index_info[i] + --log("model_summary_list: %d. [%s]=%d (%s min)", i, flight_info.model_name, flight_info.flight_count, flight_info.duration) + + if model_flight_count[flight_info.model_name] == nil then + -- log("model_summary_list: %d. first", i) + model_flight_count[flight_info.model_name] = 0 + else + -- log("model_summary_list: %d. logged", i) + end + + model_flight_count[flight_info.model_name] = flight_info.flight_count + end + + -- for k, v in pairs(model_flight_count) do + -- local inf = string.format("===================== %-17s - %d flights", k, v) + -- -- local inf = string.format("%03d - %s", v, k) + -- log("model_flight_count: %s", inf) + -- model_summary_list[#model_summary_list +1] = {k, v} + -- end + + local keys = {} + for k in next, model_flight_count do + keys[#keys+1] = k + end + + local model_summary_list = {} + log("calculate_model_summary_list()") + m_tables.table_clear(model_summary_list) + for i = 1, #keys do + local k = keys[i] + local v = model_flight_count[k] + local inf = string.format("===================== %-17s - %d flights", k, v) + -- local inf = string.format("%03d - %s", v, k) + log("model_flight_count: %s", inf) + model_summary_list[#model_summary_list +1] = {k, v} + end + + return model_summary_list +end + + +local function state_FLIGHTS_COUNT_INIT(event, touchState) + local model_summary_list = calculate_model_summary_list() + + log("creating new window gui") + lvgl.clear() + lvgl.build({ + -- draw top-bar + {type="rectangle", x=0, y=0, w=LCD_W, h=LCD_H, color=BLACK, filled=true}, + {type="rectangle", x=0, y=0, w=LCD_W, h=20*lvSCALE, color=COLOR_THEME_SECONDARY1, filled=true}, + {type="label", x=160*lvSCALE, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, + {type="label", x=LCD_W-40*lvSCALE, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, + -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."/bg2.png"}, + {type="label", x=10*lvSCALE, y=25*lvSCALE, text="Flight Count...", font=BOLD, color=WHITE}, + }) + + libGUIv4.newCtl.ctl_table(nil, "count-table", { + x=20*lvSCALE, y=50*lvSCALE, w=LCD_W-20*lvSCALE, h=LCD_H-50*lvSCALE, + font=FS.FONT_8, + header={"Model", "Flights Count"}, + colX={20*lvSCALE, 250*lvSCALE}, + lines=model_summary_list, + }) + + state = STATE.FLIGHTS_COUNT + return 0 +end + +local function state_FLIGHTS_COUNT(event, touchState) + if event == EVT_VIRTUAL_EXIT or event == EVT_VIRTUAL_PREV_PAGE then + lvgl.clear() + lvgl.label({x=0, y=0, text="Loading...", color=WHITE, font=BOLD}) + state = STATE.SHOW_FLIGHTS_HIST_INIT + return 0 + end + + return 0 +end + function M.init() log("init()") end @@ -287,33 +325,33 @@ function M.run(event, touchState) log("STATE.SPLASH_INIT") return state_SPLASH_INIT() - elseif state == STATE.SPLASH_LOOP then - log("STATE.SPLASH_LOOP") - return state_SPLASH_LOOP() + elseif state == STATE.SPLASH then + log("STATE.SPLASH") + return state_SPLASH() elseif state == STATE.READ_HIST_INIT then log("STATE.READ_HIST_INIT") return state_READ_HIST_INIT() - elseif state == STATE.READ_HIST_LOOP then - log("STATE.READ_HIST_LOOP") - return state_READ_HIST_LOOP() + elseif state == STATE.READ_HIST then + log("STATE.READ_HIST") + return state_READ_HIST() + + elseif state == STATE.SHOW_FLIGHTS_HIST_INIT then + log("STATE.SHOW_FLIGHTS_HIST_INIT") + return state_SHOW_FLIGHTS_HIST_INIT(event, touchState) + + elseif state == STATE.SHOW_FLIGHTS_HIST then + --log("STATE.state_SHOW_FLIGHTS") + return state_SHOW_FLIGHTS_HIST(event, touchState) elseif state == STATE.FLIGHTS_COUNT_INIT then log("STATE.FLIGHTS_COUNT_INIT") return state_FLIGHTS_COUNT_INIT(event, touchState) - elseif state == STATE.FLIGHTS_COUNT_LOOP then - --log("STATE.state_FLIGHTS_COUNT_LOOP") - return state_FLIGHTS_COUNT_LOOP(event, touchState) - - elseif state == STATE.SHOW_FLIGHTS_INIT then - log("STATE.SHOW_FLIGHTS_INIT") - return state_SHOW_FLIGHTS_init(event, touchState) - - elseif state == STATE.SHOW_FLIGHTS_LOOP then - --log("STATE.state_SHOW_FLIGHTS_LOOP") - return state_SHOW_FLIGHTS_LOOP(event, touchState) + elseif state == STATE.FLIGHTS_COUNT then + --log("STATE.state_FLIGHTS_COUNT") + return state_FLIGHTS_COUNT(event, touchState) elseif state == STATE.DO_NOTHING then log("STATE.DO_NOTHING") diff --git a/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua b/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua index 8a017bb3..7d180c2f 100644 --- a/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua +++ b/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua @@ -4,8 +4,11 @@ -- better font size names local FS={FONT_38=XXLSIZE,FONT_16=DBLSIZE,FONT_12=MIDSIZE,FONT_8=0,FONT_6=SMLSIZE} +local lvSCALE = lvgl.LCD_SCALE or 1 +local is800 = (LCD_W==800) -function M(panel, id, args, flags) + +local function M(panel, id, args, flags) assert(args) assert(args.header) assert(args.lines) @@ -17,46 +20,54 @@ function M(panel, id, args, flags) -- args x = args.x, y = args.y, - w = args.w or 0, - h = args.h or 0, + w = args.w, + h = args.h, fontSize = args.font or FS.FONT_8, - colX = args.colX or 0, + fontSizeHeader = args.font_header or FS.FONT_8, + textColor = args.textColor or WHITE, + colX = args.colX or args.x, header = args.header, lines = args.lines, + maxLinesToShow = (args.maxLines ~= nil) and math.min(args.maxLines, #args.lines) or #args.lines, -- max lines to show fIsLineVisible = args.fIsLineVisible or function() return true end, } -- log("ctl_table [%s] x: %d, y: %d, w: %d, h: %d", id, self.x, self.y, self.w, self.h) function self.build_ui() + local boxCtl = (self.panel~=nil) + and panel:box({x=self.x, y=self.y, w=self.w, h=self.h}) + or lvgl.box({x=self.x, y=self.y, w=self.w, h=self.h}) + -- header - local bxHdr = lvgl.box({x=self.x, y=self.y, w=self.w, h=self.h}) - bxHdr:rectangle({x=0, y=0, w=self.w, h=20, color=DARKGREEN, filled=true}) + boxCtl:rectangle({x=0, y=0, w=self.w, h=20*lvSCALE, color=DARKGREEN, filled=true}) for i = 1, self.colNum, 1 do - bxHdr:label({x=self.colX[i], y=0, text=self.header[i], color=WHITE, font=FS.FONT_8}) + boxCtl:label({x=self.colX[i], y=0, text=self.header[i], color=self.textColor, font=self.fontSizeHeader}) end -- lines - local bxLines = bxHdr:box({x=self.x, y=25, flexFlow=lvgl.FLOW_COLUMN, flexPad=2}) - - for k, obj in pairs(self.lines) do + local bxLines = boxCtl:box({x=0, y=25*lvSCALE, flexFlow=lvgl.FLOW_COLUMN, flexPad=2*lvSCALE}) + for lineIdx = 1, self.maxLinesToShow do + local obj = self.lines[lineIdx] local bxSingleLine = bxLines:box({x=0, y=0, visible=function() return self.fIsLineVisible(obj) end }) - - bxSingleLine:button({x=0, y=4,w=12,h=12, cornerRadius=10, color=WHITE}) - -- bxSingleLine:circle({x=7, y=10, radius=4, filled=true, color=WHITE}) - local last_x = 0 + bxSingleLine:button({x=0, y=4*lvSCALE,w=12*lvSCALE,h=12*lvSCALE, cornerRadius=10, color=self.textColor}) + -- bxSingleLine:circle({x=7, y=10, radius=4, filled=true, color=self.textColor}) for i = 1, self.colNum, 1 do -- add single line + -- log("ctl_table colNum: k: %s, i: %s, = %s", k, i, self.lines[k][i]) + -- log("ctl_table colNum: %sx%s, txt=%s, x=%s, w=%s %s", k, i, self.lines[k][i], self.colX[i], self.colX[i+1], self.w -self.colX[i]) bxSingleLine:label({ - x=self.colX[i], y=0, - w=(self.colX[i+1] or 999)-last_x, + x=self.colX[i], + y=0, + --w=self.colX[i+1] or (self.w -10 - self.colX[i]), text=obj[i], - color=WHITE, + color=self.textColor, font=self.fontSize }) end end + end self.build_ui() diff --git a/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua b/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua index ec1204cd..ab61c733 100644 --- a/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua +++ b/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua @@ -1,4 +1,5 @@ -local libgui_dir = ... +local args = {...} +local libgui_dir = args[1] local app_ver = "0.0.0-dev.1" diff --git a/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/main.lua b/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/main.lua index 7a18be78..e3f6d0bb 100644 --- a/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/main.lua +++ b/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/main.lua @@ -1,3 +1,4 @@ +-- TNS|Flights History|TNE ---- ######################################################################### ---- # # ---- # License GPLv3: https://www.gnu.org/licenses/gpl-3.0.html # @@ -15,8 +16,8 @@ -- This script display the flights history as kept using the "Flights" widget -- Author: Offer Shmuely --- Date: 2023-2025 -local app_ver = "1.5" +-- Date: 2023-2026 +local app_ver = "1.9" -- to get help: -- change in lib_log.lua to "ENABLE_LOG_FILE=true" @@ -26,44 +27,19 @@ local app_ver = "1.5" local app_name = "FlightsHistory" -local m_log = nil -local m_utils = nil -local m_tables = nil -local m_index_file = nil -local m_libgui = nil -local m_log_viewer3 = nil - -local error_desc = nil -local script_folder = "/SCRIPTS/TOOLS/FlightsHistory/" +local script_folder = "/SCRIPTS/TOOLS/FlightsHistory" local function my_load_script(file_name, ...) - local code_chunk = assert(loadScript(script_folder .. file_name, "btd")) + local code_chunk = assert(loadScript(script_folder .. "/" .. file_name, "tbd")) -- print(string.format("%s - loading, num args: %d", file_name, #{...})) return code_chunk(...) end - -local function init() - m_log = my_load_script("lib_log", app_name, "/SCRIPTS/TOOLS/" .. app_name) - - m_utils = my_load_script("lib_utils", m_log, app_name) - m_tables = my_load_script("lib_tables", m_log, app_name) - m_index_file = my_load_script("lib_history_index", m_log, app_name, m_utils, m_tables) - m_libgui = my_load_script("libgui4/libgui4.lua", script_folder .. "/libgui4") - m_log_viewer3 = my_load_script("FlightsHistory4", m_log, m_utils,m_tables,m_index_file,m_libgui,app_ver) - return m_log_viewer3.init() -end - -local function run(event, touchState) - -- display if in error mode - if error_desc ~= nil then - print(error_desc) - lcd.clear() - lcd.drawText(5, 30, "Error:", COLOR_THEME_SECONDARY1 + BOLD) - lcd.drawText(5, 60, error_desc, COLOR_THEME_SECONDARY1 + BOLD) - return 0 - end - - return m_log_viewer3.run(event, touchState) -end - -return { init=init, run=run, useLvgl=true } +print("Loading "..app_name.." ver: "..app_ver) +local m_log = my_load_script("lib_log", app_name, "/SCRIPTS/TOOLS/"..app_name) +local m_utils = my_load_script("lib_utils", m_log, app_name) +local m_tables = my_load_script("lib_tables", m_log, app_name) +local m_index_file= my_load_script("lib_history_index", m_log, app_name, m_utils, m_tables) +local m_libgui = my_load_script("libgui4/libgui4.lua", script_folder.."/libgui4") +local app = my_load_script("app", m_log, m_utils,m_tables,m_index_file,m_libgui,app_ver) + +return { init=app.init, run=app.run, useLvgl=true } diff --git a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory.lua b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory.lua deleted file mode 100644 index 3afae9f4..00000000 --- a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory.lua +++ /dev/null @@ -1,7 +0,0 @@ --- TNS|Flights History|TNE - -local function run() - return "/SCRIPTS/TOOLS/FlightsHistory/main.lua" -end - -return { run = run } diff --git a/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/FlightsHistory4.lua b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/app.lua similarity index 62% rename from sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/FlightsHistory4.lua rename to sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/app.lua index 7811141a..6e80184e 100644 --- a/sdcard/c480x272/SCRIPTS/TOOLS/FlightsHistory/FlightsHistory4.lua +++ b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/app.lua @@ -19,23 +19,26 @@ local M = {} -- This history of flights -- Author: Offer Shmuely --- Date: 2023-2025 +-- Date: 2023-2026 -local script_folder = "/SCRIPTS/TOOLS/FlightsHistory/" +local script_folder = "/SCRIPTS/TOOLS/FlightsHistory" local filter_model_name local filter_model_name_idx = 1 local model_name_list = { "-- all --" } +local lvSCALE = lvgl.LCD_SCALE or 1 +local is800 = (LCD_W==800) + -- state machine local STATE = { SPLASH_INIT = 0, - SPLASH_LOOP = 1, + SPLASH = 1, READ_HIST_INIT = 2, - READ_HIST_LOOP = 3, - FLIGHTS_COUNT_INIT = 4, - FLIGHTS_COUNT_LOOP = 5, - SHOW_FLIGHTS_INIT = 6, - SHOW_FLIGHTS_LOOP = 7, + READ_HIST = 3, + SHOW_FLIGHTS_HIST_INIT = 4, + SHOW_FLIGHTS_HIST = 5, + FLIGHTS_COUNT_INIT = 6, + FLIGHTS_COUNT = 7, DO_NOTHING=99,--??? } local state = STATE.SPLASH_INIT @@ -59,58 +62,27 @@ local function compare_date_first(a1, b1) return (a > b) end --- read log file list -local function read_history_file() - log("read_history_file: init") - m_index_file.indexInit() - m_index_file.historyFileRead() - - for i = 1, #m_index_file.log_files_index_info do - local flight_info = m_index_file.log_files_index_info[i] - -- log("to model name list: %d. %s", i, flight_info.model_name) - m_tables.list_ordered_insert(model_name_list, flight_info.model_name, compare_names, 2) - end -end - -local function calculate_model_summary_list() - local model_summary_list = {} - log("calculate_model_summary_list()") - - local model_flight_count = {} - for i = 1, #m_index_file.log_files_index_info do - local flight_info = m_index_file.log_files_index_info[i] - --log("model_summary_list: %d. [%s]=%d (%s min)", i, flight_info.model_name, flight_info.flight_count, flight_info.duration) - - if model_flight_count[flight_info.model_name] == nil then - -- log("model_summary_list: %d. first", i) - model_flight_count[flight_info.model_name] = 0 - else - -- log("model_summary_list: %d. logged", i) - end - - model_flight_count[flight_info.model_name] = flight_info.flight_count - end - - m_tables.table_clear(model_summary_list) - for k, v in pairs(model_flight_count) do - --local inf = string.format("%-17s - %d flights", k, v) - -- local inf = string.format("%03d - %s", v, k) - -- log("model_flight_count: %s", inf) - model_summary_list[#model_summary_list +1] = {v, k} +local function isFileExist(file_name) + log("is_file_exist()") + local hFile = io.open(file_name, "r") + if hFile == nil then + log("file not exist - %s", file_name) + return false end - return model_summary_list + io.close(hFile) + log("file exist - %s", file_name) + return true end - local splash_start_time = 0 local function state_SPLASH_INIT(event, touchState) lvgl.clear() - lvgl.image({x=0,y=0,w=LCD_W,h=LCD_H,file=script_folder.."bg1.png"}) - state = STATE.SPLASH_LOOP + lvgl.image({x=0,y=0,w=LCD_W,h=LCD_H,file=script_folder.."/bg1.png"}) + state = STATE.SPLASH return 0 end -local function state_SPLASH_LOOP(event, touchState) +local function state_SPLASH(event, touchState) if splash_start_time == 0 then splash_start_time = getTime() end @@ -119,71 +91,51 @@ local function state_SPLASH_LOOP(event, touchState) local elapsedMili = elapsed * 10; -- was 1500, but most the time will go anyway from the load of the scripts -- if (elapsedMili >= 1500) then - if (elapsedMili >= 500) then - state = STATE.READ_HIST_INIT + if (elapsedMili < 500) then + return 0 + end + local isHistoryExist = isFileExist( "/flights-history.csv") + if isHistoryExist then + log("History file exist") + state = STATE.READ_HIST_INIT + else + log("History file does not exist") + lvgl.label({x=30, y=180, text="No history file found! \n" + .. "This app is working with 'Flights' widget.\n" + .. "Please count your flights with 'Flights' widget \n" + .. "then use this script.\n" + , color=WHITE, font=BOLD}) + state = STATE.DO_NOTHING end return 0 end local function state_READ_HIST_INIT(event, touchState) - local ui = { - -- draw top-bar - {type="rectangle", x=0, y=0, w=LCD_W, h=20, color=COLOR_THEME_SECONDARY1, filled=true}, - {type="label", x=160, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, - {type="label", x=440, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, - -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."bg2.png"}, - -- {type="label", x=10, y=25, text="Models Flight Count...", font=BOLD}, - } - lvgl.clear() - lvgl.build(ui) - - state = STATE.READ_HIST_LOOP - return 0 -end -local function state_READ_HIST_LOOP(event, touchState) - read_history_file() - state = STATE.FLIGHTS_COUNT_INIT - return 0 -end - -local function state_FLIGHTS_COUNT_INIT(event, touchState) - local model_summary_list = calculate_model_summary_list() - - log("creating new window gui") - lvgl.clear() + -- lvgl.clear() lvgl.build({ - -- draw top-bar - {type="rectangle", x=0, y=0, w=LCD_W, h=LCD_H, color=BLACK, filled=true}, - {type="rectangle", x=0, y=0, w=LCD_W, h=20, color=COLOR_THEME_SECONDARY1, filled=true}, - {type="label", x=160, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, - {type="label", x=440, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, - -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."bg2.png"}, - {type="label", x=10, y=25, text="Models Flight Count...", font=BOLD}, - }) - - libGUIv4.newCtl.ctl_table(nil, "count-table", { - x=20,y=50,w=480,h=272-50, - font=FS.FONT_8, - header={"Flights", "Model"}, - colX={20, 70}, - lines=model_summary_list + {type="label", x=20*lvSCALE, y=200*lvSCALE, text="Reading data...", color=ORANGE, font=FS.FONT_12 + BOLD} }) - state = STATE.FLIGHTS_COUNT_LOOP + state = STATE.READ_HIST return 0 end +local function state_READ_HIST(event, touchState) + -- read log file list + log("read_history_file: init") + m_index_file.indexInit() + m_index_file.historyFileRead() -local function state_FLIGHTS_COUNT_LOOP(event, touchState) - if event == EVT_VIRTUAL_NEXT_PAGE then - lvgl.clear() - lvgl.label({x=0, y=0, text="Loading...", color=WHITE, font=BOLD}) - state = STATE.SHOW_FLIGHTS_INIT - return 0 + for i = 1, #m_index_file.log_files_index_info do + local flight_info = m_index_file.log_files_index_info[i] + -- log("to model name list: %d. %s", i, flight_info.model_name) + m_tables.list_ordered_insert(model_name_list, flight_info.model_name, compare_names, 2) end + state = STATE.SHOW_FLIGHTS_HIST_INIT return 0 end + local function is_visible_line(line) if filter_model_name == nil or filter_model_name == "-- all --" then -- if filter_model_name == nil or filter_model_name == string.sub(filter_model_name, 1, 2) == "--" then @@ -191,11 +143,11 @@ local function is_visible_line(line) end local lineModelName = line[2] - log("is_visible_line by: [%s] [%s]", filter_model_name, lineModelName) + -- log("is_visible_line by: [%s] [%s] --> %s %s %s %s", filter_model_name, lineModelName, filter_model_name == lineModelName) return (filter_model_name == lineModelName) end -local function state_SHOW_FLIGHTS_init(event, touchState) +local function state_SHOW_FLIGHTS_HIST_INIT(event, touchState) -- creating new window gui lvgl.clear() collectgarbage() @@ -203,16 +155,16 @@ local function state_SHOW_FLIGHTS_init(event, touchState) lvgl.build({ -- draw top-bar {type="rectangle", x=0, y=0, w=LCD_W, h=LCD_H, color=BLACK, filled=true}, - {type="rectangle", x=0, y=0, w=LCD_W, h=20, color=COLOR_THEME_SECONDARY1, filled=true}, - {type="label", x=160, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, - {type="label", x=440, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, - -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."bg2.png"}, - {type="label", x=10, y=25, text="All Flight...", font=BOLD}, + {type="rectangle", x=0, y=0, w=LCD_W, h=20*lvSCALE, color=COLOR_THEME_SECONDARY1, filled=true}, + {type="label", x=160*lvSCALE, y=1*lvSCALE, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, + {type="label", x=LCD_W-40*lvSCALE, y=1*lvSCALE, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, + -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."/bg2.png"}, + {type="label", x=10*lvSCALE, y=25*lvSCALE, text="All Flight...", font=BOLD, color=WHITE}, }) filter_model_name_idx = 1 lvgl.build({ - { type = "choice", x=150, y=25, w=LCD_W-10-150, h=27, title = "Craft", + { type="choice", x=150*lvSCALE, y=25*lvSCALE, w=LCD_W-(10+150)*lvSCALE, h=27*lvSCALE, title = "Craft", values = model_name_list, -- values = {"aaa", "bbb", "ccc", "ddd", "eee"}, get = function() return filter_model_name_idx; end, @@ -238,31 +190,32 @@ local function state_SHOW_FLIGHTS_init(event, touchState) lines_csv[#lines_csv + 1] = { day, - string.format("%s", f_info.flight_count), f_info.model_name, + string.format("%s", f_info.flight_count), string.format("(%0.1f min)", f_info.duration/100), } end libGUIv4.newCtl.ctl_table(nil, "count-table", { - x=10, y=64, w=480, h=LCD_H-60, + x=10*lvSCALE, y=64*lvSCALE, w=LCD_W-10*lvSCALE, h=LCD_H-65*lvSCALE, font=FS.FONT_6, - header={"Date", "Flights", "Model", "Duration"}, - colX={20, 100, 140, 400}, + header={"Date", "Model", "Flights", "Duration"}, + colX={20*lvSCALE, 100*lvSCALE, 340*lvSCALE, 400*lvSCALE}, lines=lines_csv, fIsLineVisible=is_visible_line, + maxLines=50, }) for i = 1, #model_name_list do log("model_name_list: %d. [%s]", i, model_name_list[i]) end - state = STATE.SHOW_FLIGHTS_LOOP + state = STATE.SHOW_FLIGHTS_HIST return 0 end -local function state_SHOW_FLIGHTS_LOOP(event, touchState) - if event == EVT_VIRTUAL_EXIT or event == EVT_VIRTUAL_PREV_PAGE then +local function state_SHOW_FLIGHTS_HIST(event, touchState) + if event == EVT_VIRTUAL_NEXT_PAGE then lvgl.clear() lvgl.label({x=0, y=0, text="Loading...", color=WHITE, font=BOLD}) state = STATE.FLIGHTS_COUNT_INIT @@ -272,6 +225,91 @@ local function state_SHOW_FLIGHTS_LOOP(event, touchState) return 0 end +-- ---------------------------------------------------------------------------------------------------------- + +local function calculate_model_summary_list() + + local model_flight_count = {} + for i = 1, #m_index_file.log_files_index_info do + local flight_info = m_index_file.log_files_index_info[i] + --log("model_summary_list: %d. [%s]=%d (%s min)", i, flight_info.model_name, flight_info.flight_count, flight_info.duration) + + if model_flight_count[flight_info.model_name] == nil then + -- log("model_summary_list: %d. first", i) + model_flight_count[flight_info.model_name] = 0 + else + -- log("model_summary_list: %d. logged", i) + end + + model_flight_count[flight_info.model_name] = flight_info.flight_count + end + + -- for k, v in pairs(model_flight_count) do + -- local inf = string.format("===================== %-17s - %d flights", k, v) + -- -- local inf = string.format("%03d - %s", v, k) + -- log("model_flight_count: %s", inf) + -- model_summary_list[#model_summary_list +1] = {k, v} + -- end + + local keys = {} + for k in next, model_flight_count do + keys[#keys+1] = k + end + + local model_summary_list = {} + log("calculate_model_summary_list()") + m_tables.table_clear(model_summary_list) + for i = 1, #keys do + local k = keys[i] + local v = model_flight_count[k] + local inf = string.format("===================== %-17s - %d flights", k, v) + -- local inf = string.format("%03d - %s", v, k) + log("model_flight_count: %s", inf) + model_summary_list[#model_summary_list +1] = {k, v} + end + + return model_summary_list +end + + +local function state_FLIGHTS_COUNT_INIT(event, touchState) + local model_summary_list = calculate_model_summary_list() + + log("creating new window gui") + lvgl.clear() + lvgl.build({ + -- draw top-bar + {type="rectangle", x=0, y=0, w=LCD_W, h=LCD_H, color=BLACK, filled=true}, + {type="rectangle", x=0, y=0, w=LCD_W, h=20*lvSCALE, color=COLOR_THEME_SECONDARY1, filled=true}, + {type="label", x=160*lvSCALE, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, + {type="label", x=LCD_W-40*lvSCALE, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, + -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."/bg2.png"}, + {type="label", x=10*lvSCALE, y=25*lvSCALE, text="Flight Count...", font=BOLD, color=WHITE}, + }) + + libGUIv4.newCtl.ctl_table(nil, "count-table", { + x=20*lvSCALE, y=50*lvSCALE, w=LCD_W-20*lvSCALE, h=LCD_H-50*lvSCALE, + font=FS.FONT_8, + header={"Model", "Flights Count"}, + colX={20*lvSCALE, 250*lvSCALE}, + lines=model_summary_list, + }) + + state = STATE.FLIGHTS_COUNT + return 0 +end + +local function state_FLIGHTS_COUNT(event, touchState) + if event == EVT_VIRTUAL_EXIT or event == EVT_VIRTUAL_PREV_PAGE then + lvgl.clear() + lvgl.label({x=0, y=0, text="Loading...", color=WHITE, font=BOLD}) + state = STATE.SHOW_FLIGHTS_HIST_INIT + return 0 + end + + return 0 +end + function M.init() log("init()") end @@ -287,33 +325,33 @@ function M.run(event, touchState) log("STATE.SPLASH_INIT") return state_SPLASH_INIT() - elseif state == STATE.SPLASH_LOOP then - log("STATE.SPLASH_LOOP") - return state_SPLASH_LOOP() + elseif state == STATE.SPLASH then + log("STATE.SPLASH") + return state_SPLASH() elseif state == STATE.READ_HIST_INIT then log("STATE.READ_HIST_INIT") return state_READ_HIST_INIT() - elseif state == STATE.READ_HIST_LOOP then - log("STATE.READ_HIST_LOOP") - return state_READ_HIST_LOOP() + elseif state == STATE.READ_HIST then + log("STATE.READ_HIST") + return state_READ_HIST() + + elseif state == STATE.SHOW_FLIGHTS_HIST_INIT then + log("STATE.SHOW_FLIGHTS_HIST_INIT") + return state_SHOW_FLIGHTS_HIST_INIT(event, touchState) + + elseif state == STATE.SHOW_FLIGHTS_HIST then + --log("STATE.state_SHOW_FLIGHTS") + return state_SHOW_FLIGHTS_HIST(event, touchState) elseif state == STATE.FLIGHTS_COUNT_INIT then log("STATE.FLIGHTS_COUNT_INIT") return state_FLIGHTS_COUNT_INIT(event, touchState) - elseif state == STATE.FLIGHTS_COUNT_LOOP then - --log("STATE.state_FLIGHTS_COUNT_LOOP") - return state_FLIGHTS_COUNT_LOOP(event, touchState) - - elseif state == STATE.SHOW_FLIGHTS_INIT then - log("STATE.SHOW_FLIGHTS_INIT") - return state_SHOW_FLIGHTS_init(event, touchState) - - elseif state == STATE.SHOW_FLIGHTS_LOOP then - --log("STATE.state_SHOW_FLIGHTS_LOOP") - return state_SHOW_FLIGHTS_LOOP(event, touchState) + elseif state == STATE.FLIGHTS_COUNT then + --log("STATE.state_FLIGHTS_COUNT") + return state_FLIGHTS_COUNT(event, touchState) elseif state == STATE.DO_NOTHING then log("STATE.DO_NOTHING") diff --git a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/bg1.png b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/bg1.png new file mode 100644 index 00000000..0a80b79d Binary files /dev/null and b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/bg1.png differ diff --git a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/bg2.png b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/bg2.png new file mode 100644 index 00000000..db1a6000 Binary files /dev/null and b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/bg2.png differ diff --git a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua index 8a017bb3..7d180c2f 100644 --- a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua +++ b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua @@ -4,8 +4,11 @@ -- better font size names local FS={FONT_38=XXLSIZE,FONT_16=DBLSIZE,FONT_12=MIDSIZE,FONT_8=0,FONT_6=SMLSIZE} +local lvSCALE = lvgl.LCD_SCALE or 1 +local is800 = (LCD_W==800) -function M(panel, id, args, flags) + +local function M(panel, id, args, flags) assert(args) assert(args.header) assert(args.lines) @@ -17,46 +20,54 @@ function M(panel, id, args, flags) -- args x = args.x, y = args.y, - w = args.w or 0, - h = args.h or 0, + w = args.w, + h = args.h, fontSize = args.font or FS.FONT_8, - colX = args.colX or 0, + fontSizeHeader = args.font_header or FS.FONT_8, + textColor = args.textColor or WHITE, + colX = args.colX or args.x, header = args.header, lines = args.lines, + maxLinesToShow = (args.maxLines ~= nil) and math.min(args.maxLines, #args.lines) or #args.lines, -- max lines to show fIsLineVisible = args.fIsLineVisible or function() return true end, } -- log("ctl_table [%s] x: %d, y: %d, w: %d, h: %d", id, self.x, self.y, self.w, self.h) function self.build_ui() + local boxCtl = (self.panel~=nil) + and panel:box({x=self.x, y=self.y, w=self.w, h=self.h}) + or lvgl.box({x=self.x, y=self.y, w=self.w, h=self.h}) + -- header - local bxHdr = lvgl.box({x=self.x, y=self.y, w=self.w, h=self.h}) - bxHdr:rectangle({x=0, y=0, w=self.w, h=20, color=DARKGREEN, filled=true}) + boxCtl:rectangle({x=0, y=0, w=self.w, h=20*lvSCALE, color=DARKGREEN, filled=true}) for i = 1, self.colNum, 1 do - bxHdr:label({x=self.colX[i], y=0, text=self.header[i], color=WHITE, font=FS.FONT_8}) + boxCtl:label({x=self.colX[i], y=0, text=self.header[i], color=self.textColor, font=self.fontSizeHeader}) end -- lines - local bxLines = bxHdr:box({x=self.x, y=25, flexFlow=lvgl.FLOW_COLUMN, flexPad=2}) - - for k, obj in pairs(self.lines) do + local bxLines = boxCtl:box({x=0, y=25*lvSCALE, flexFlow=lvgl.FLOW_COLUMN, flexPad=2*lvSCALE}) + for lineIdx = 1, self.maxLinesToShow do + local obj = self.lines[lineIdx] local bxSingleLine = bxLines:box({x=0, y=0, visible=function() return self.fIsLineVisible(obj) end }) - - bxSingleLine:button({x=0, y=4,w=12,h=12, cornerRadius=10, color=WHITE}) - -- bxSingleLine:circle({x=7, y=10, radius=4, filled=true, color=WHITE}) - local last_x = 0 + bxSingleLine:button({x=0, y=4*lvSCALE,w=12*lvSCALE,h=12*lvSCALE, cornerRadius=10, color=self.textColor}) + -- bxSingleLine:circle({x=7, y=10, radius=4, filled=true, color=self.textColor}) for i = 1, self.colNum, 1 do -- add single line + -- log("ctl_table colNum: k: %s, i: %s, = %s", k, i, self.lines[k][i]) + -- log("ctl_table colNum: %sx%s, txt=%s, x=%s, w=%s %s", k, i, self.lines[k][i], self.colX[i], self.colX[i+1], self.w -self.colX[i]) bxSingleLine:label({ - x=self.colX[i], y=0, - w=(self.colX[i+1] or 999)-last_x, + x=self.colX[i], + y=0, + --w=self.colX[i+1] or (self.w -10 - self.colX[i]), text=obj[i], - color=WHITE, + color=self.textColor, font=self.fontSize }) end end + end self.build_ui() diff --git a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua index ec1204cd..ab61c733 100644 --- a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua +++ b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua @@ -1,4 +1,5 @@ -local libgui_dir = ... +local args = {...} +local libgui_dir = args[1] local app_ver = "0.0.0-dev.1" diff --git a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/main.lua b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/main.lua index 7a18be78..e3f6d0bb 100644 --- a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/main.lua +++ b/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/main.lua @@ -1,3 +1,4 @@ +-- TNS|Flights History|TNE ---- ######################################################################### ---- # # ---- # License GPLv3: https://www.gnu.org/licenses/gpl-3.0.html # @@ -15,8 +16,8 @@ -- This script display the flights history as kept using the "Flights" widget -- Author: Offer Shmuely --- Date: 2023-2025 -local app_ver = "1.5" +-- Date: 2023-2026 +local app_ver = "1.9" -- to get help: -- change in lib_log.lua to "ENABLE_LOG_FILE=true" @@ -26,44 +27,19 @@ local app_ver = "1.5" local app_name = "FlightsHistory" -local m_log = nil -local m_utils = nil -local m_tables = nil -local m_index_file = nil -local m_libgui = nil -local m_log_viewer3 = nil - -local error_desc = nil -local script_folder = "/SCRIPTS/TOOLS/FlightsHistory/" +local script_folder = "/SCRIPTS/TOOLS/FlightsHistory" local function my_load_script(file_name, ...) - local code_chunk = assert(loadScript(script_folder .. file_name, "btd")) + local code_chunk = assert(loadScript(script_folder .. "/" .. file_name, "tbd")) -- print(string.format("%s - loading, num args: %d", file_name, #{...})) return code_chunk(...) end - -local function init() - m_log = my_load_script("lib_log", app_name, "/SCRIPTS/TOOLS/" .. app_name) - - m_utils = my_load_script("lib_utils", m_log, app_name) - m_tables = my_load_script("lib_tables", m_log, app_name) - m_index_file = my_load_script("lib_history_index", m_log, app_name, m_utils, m_tables) - m_libgui = my_load_script("libgui4/libgui4.lua", script_folder .. "/libgui4") - m_log_viewer3 = my_load_script("FlightsHistory4", m_log, m_utils,m_tables,m_index_file,m_libgui,app_ver) - return m_log_viewer3.init() -end - -local function run(event, touchState) - -- display if in error mode - if error_desc ~= nil then - print(error_desc) - lcd.clear() - lcd.drawText(5, 30, "Error:", COLOR_THEME_SECONDARY1 + BOLD) - lcd.drawText(5, 60, error_desc, COLOR_THEME_SECONDARY1 + BOLD) - return 0 - end - - return m_log_viewer3.run(event, touchState) -end - -return { init=init, run=run, useLvgl=true } +print("Loading "..app_name.." ver: "..app_ver) +local m_log = my_load_script("lib_log", app_name, "/SCRIPTS/TOOLS/"..app_name) +local m_utils = my_load_script("lib_utils", m_log, app_name) +local m_tables = my_load_script("lib_tables", m_log, app_name) +local m_index_file= my_load_script("lib_history_index", m_log, app_name, m_utils, m_tables) +local m_libgui = my_load_script("libgui4/libgui4.lua", script_folder.."/libgui4") +local app = my_load_script("app", m_log, m_utils,m_tables,m_index_file,m_libgui,app_ver) + +return { init=app.init, run=app.run, useLvgl=true } diff --git a/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory.lua b/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory.lua deleted file mode 100644 index 3afae9f4..00000000 --- a/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory.lua +++ /dev/null @@ -1,7 +0,0 @@ --- TNS|Flights History|TNE - -local function run() - return "/SCRIPTS/TOOLS/FlightsHistory/main.lua" -end - -return { run = run } diff --git a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/FlightsHistory4.lua b/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/app.lua similarity index 62% rename from sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/FlightsHistory4.lua rename to sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/app.lua index 7811141a..6e80184e 100644 --- a/sdcard/c480x320/SCRIPTS/TOOLS/FlightsHistory/FlightsHistory4.lua +++ b/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/app.lua @@ -19,23 +19,26 @@ local M = {} -- This history of flights -- Author: Offer Shmuely --- Date: 2023-2025 +-- Date: 2023-2026 -local script_folder = "/SCRIPTS/TOOLS/FlightsHistory/" +local script_folder = "/SCRIPTS/TOOLS/FlightsHistory" local filter_model_name local filter_model_name_idx = 1 local model_name_list = { "-- all --" } +local lvSCALE = lvgl.LCD_SCALE or 1 +local is800 = (LCD_W==800) + -- state machine local STATE = { SPLASH_INIT = 0, - SPLASH_LOOP = 1, + SPLASH = 1, READ_HIST_INIT = 2, - READ_HIST_LOOP = 3, - FLIGHTS_COUNT_INIT = 4, - FLIGHTS_COUNT_LOOP = 5, - SHOW_FLIGHTS_INIT = 6, - SHOW_FLIGHTS_LOOP = 7, + READ_HIST = 3, + SHOW_FLIGHTS_HIST_INIT = 4, + SHOW_FLIGHTS_HIST = 5, + FLIGHTS_COUNT_INIT = 6, + FLIGHTS_COUNT = 7, DO_NOTHING=99,--??? } local state = STATE.SPLASH_INIT @@ -59,58 +62,27 @@ local function compare_date_first(a1, b1) return (a > b) end --- read log file list -local function read_history_file() - log("read_history_file: init") - m_index_file.indexInit() - m_index_file.historyFileRead() - - for i = 1, #m_index_file.log_files_index_info do - local flight_info = m_index_file.log_files_index_info[i] - -- log("to model name list: %d. %s", i, flight_info.model_name) - m_tables.list_ordered_insert(model_name_list, flight_info.model_name, compare_names, 2) - end -end - -local function calculate_model_summary_list() - local model_summary_list = {} - log("calculate_model_summary_list()") - - local model_flight_count = {} - for i = 1, #m_index_file.log_files_index_info do - local flight_info = m_index_file.log_files_index_info[i] - --log("model_summary_list: %d. [%s]=%d (%s min)", i, flight_info.model_name, flight_info.flight_count, flight_info.duration) - - if model_flight_count[flight_info.model_name] == nil then - -- log("model_summary_list: %d. first", i) - model_flight_count[flight_info.model_name] = 0 - else - -- log("model_summary_list: %d. logged", i) - end - - model_flight_count[flight_info.model_name] = flight_info.flight_count - end - - m_tables.table_clear(model_summary_list) - for k, v in pairs(model_flight_count) do - --local inf = string.format("%-17s - %d flights", k, v) - -- local inf = string.format("%03d - %s", v, k) - -- log("model_flight_count: %s", inf) - model_summary_list[#model_summary_list +1] = {v, k} +local function isFileExist(file_name) + log("is_file_exist()") + local hFile = io.open(file_name, "r") + if hFile == nil then + log("file not exist - %s", file_name) + return false end - return model_summary_list + io.close(hFile) + log("file exist - %s", file_name) + return true end - local splash_start_time = 0 local function state_SPLASH_INIT(event, touchState) lvgl.clear() - lvgl.image({x=0,y=0,w=LCD_W,h=LCD_H,file=script_folder.."bg1.png"}) - state = STATE.SPLASH_LOOP + lvgl.image({x=0,y=0,w=LCD_W,h=LCD_H,file=script_folder.."/bg1.png"}) + state = STATE.SPLASH return 0 end -local function state_SPLASH_LOOP(event, touchState) +local function state_SPLASH(event, touchState) if splash_start_time == 0 then splash_start_time = getTime() end @@ -119,71 +91,51 @@ local function state_SPLASH_LOOP(event, touchState) local elapsedMili = elapsed * 10; -- was 1500, but most the time will go anyway from the load of the scripts -- if (elapsedMili >= 1500) then - if (elapsedMili >= 500) then - state = STATE.READ_HIST_INIT + if (elapsedMili < 500) then + return 0 + end + local isHistoryExist = isFileExist( "/flights-history.csv") + if isHistoryExist then + log("History file exist") + state = STATE.READ_HIST_INIT + else + log("History file does not exist") + lvgl.label({x=30, y=180, text="No history file found! \n" + .. "This app is working with 'Flights' widget.\n" + .. "Please count your flights with 'Flights' widget \n" + .. "then use this script.\n" + , color=WHITE, font=BOLD}) + state = STATE.DO_NOTHING end return 0 end local function state_READ_HIST_INIT(event, touchState) - local ui = { - -- draw top-bar - {type="rectangle", x=0, y=0, w=LCD_W, h=20, color=COLOR_THEME_SECONDARY1, filled=true}, - {type="label", x=160, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, - {type="label", x=440, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, - -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."bg2.png"}, - -- {type="label", x=10, y=25, text="Models Flight Count...", font=BOLD}, - } - lvgl.clear() - lvgl.build(ui) - - state = STATE.READ_HIST_LOOP - return 0 -end -local function state_READ_HIST_LOOP(event, touchState) - read_history_file() - state = STATE.FLIGHTS_COUNT_INIT - return 0 -end - -local function state_FLIGHTS_COUNT_INIT(event, touchState) - local model_summary_list = calculate_model_summary_list() - - log("creating new window gui") - lvgl.clear() + -- lvgl.clear() lvgl.build({ - -- draw top-bar - {type="rectangle", x=0, y=0, w=LCD_W, h=LCD_H, color=BLACK, filled=true}, - {type="rectangle", x=0, y=0, w=LCD_W, h=20, color=COLOR_THEME_SECONDARY1, filled=true}, - {type="label", x=160, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, - {type="label", x=440, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, - -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."bg2.png"}, - {type="label", x=10, y=25, text="Models Flight Count...", font=BOLD}, - }) - - libGUIv4.newCtl.ctl_table(nil, "count-table", { - x=20,y=50,w=480,h=272-50, - font=FS.FONT_8, - header={"Flights", "Model"}, - colX={20, 70}, - lines=model_summary_list + {type="label", x=20*lvSCALE, y=200*lvSCALE, text="Reading data...", color=ORANGE, font=FS.FONT_12 + BOLD} }) - state = STATE.FLIGHTS_COUNT_LOOP + state = STATE.READ_HIST return 0 end +local function state_READ_HIST(event, touchState) + -- read log file list + log("read_history_file: init") + m_index_file.indexInit() + m_index_file.historyFileRead() -local function state_FLIGHTS_COUNT_LOOP(event, touchState) - if event == EVT_VIRTUAL_NEXT_PAGE then - lvgl.clear() - lvgl.label({x=0, y=0, text="Loading...", color=WHITE, font=BOLD}) - state = STATE.SHOW_FLIGHTS_INIT - return 0 + for i = 1, #m_index_file.log_files_index_info do + local flight_info = m_index_file.log_files_index_info[i] + -- log("to model name list: %d. %s", i, flight_info.model_name) + m_tables.list_ordered_insert(model_name_list, flight_info.model_name, compare_names, 2) end + state = STATE.SHOW_FLIGHTS_HIST_INIT return 0 end + local function is_visible_line(line) if filter_model_name == nil or filter_model_name == "-- all --" then -- if filter_model_name == nil or filter_model_name == string.sub(filter_model_name, 1, 2) == "--" then @@ -191,11 +143,11 @@ local function is_visible_line(line) end local lineModelName = line[2] - log("is_visible_line by: [%s] [%s]", filter_model_name, lineModelName) + -- log("is_visible_line by: [%s] [%s] --> %s %s %s %s", filter_model_name, lineModelName, filter_model_name == lineModelName) return (filter_model_name == lineModelName) end -local function state_SHOW_FLIGHTS_init(event, touchState) +local function state_SHOW_FLIGHTS_HIST_INIT(event, touchState) -- creating new window gui lvgl.clear() collectgarbage() @@ -203,16 +155,16 @@ local function state_SHOW_FLIGHTS_init(event, touchState) lvgl.build({ -- draw top-bar {type="rectangle", x=0, y=0, w=LCD_W, h=LCD_H, color=BLACK, filled=true}, - {type="rectangle", x=0, y=0, w=LCD_W, h=20, color=COLOR_THEME_SECONDARY1, filled=true}, - {type="label", x=160, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, - {type="label", x=440, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, - -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."bg2.png"}, - {type="label", x=10, y=25, text="All Flight...", font=BOLD}, + {type="rectangle", x=0, y=0, w=LCD_W, h=20*lvSCALE, color=COLOR_THEME_SECONDARY1, filled=true}, + {type="label", x=160*lvSCALE, y=1*lvSCALE, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, + {type="label", x=LCD_W-40*lvSCALE, y=1*lvSCALE, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, + -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."/bg2.png"}, + {type="label", x=10*lvSCALE, y=25*lvSCALE, text="All Flight...", font=BOLD, color=WHITE}, }) filter_model_name_idx = 1 lvgl.build({ - { type = "choice", x=150, y=25, w=LCD_W-10-150, h=27, title = "Craft", + { type="choice", x=150*lvSCALE, y=25*lvSCALE, w=LCD_W-(10+150)*lvSCALE, h=27*lvSCALE, title = "Craft", values = model_name_list, -- values = {"aaa", "bbb", "ccc", "ddd", "eee"}, get = function() return filter_model_name_idx; end, @@ -238,31 +190,32 @@ local function state_SHOW_FLIGHTS_init(event, touchState) lines_csv[#lines_csv + 1] = { day, - string.format("%s", f_info.flight_count), f_info.model_name, + string.format("%s", f_info.flight_count), string.format("(%0.1f min)", f_info.duration/100), } end libGUIv4.newCtl.ctl_table(nil, "count-table", { - x=10, y=64, w=480, h=LCD_H-60, + x=10*lvSCALE, y=64*lvSCALE, w=LCD_W-10*lvSCALE, h=LCD_H-65*lvSCALE, font=FS.FONT_6, - header={"Date", "Flights", "Model", "Duration"}, - colX={20, 100, 140, 400}, + header={"Date", "Model", "Flights", "Duration"}, + colX={20*lvSCALE, 100*lvSCALE, 340*lvSCALE, 400*lvSCALE}, lines=lines_csv, fIsLineVisible=is_visible_line, + maxLines=50, }) for i = 1, #model_name_list do log("model_name_list: %d. [%s]", i, model_name_list[i]) end - state = STATE.SHOW_FLIGHTS_LOOP + state = STATE.SHOW_FLIGHTS_HIST return 0 end -local function state_SHOW_FLIGHTS_LOOP(event, touchState) - if event == EVT_VIRTUAL_EXIT or event == EVT_VIRTUAL_PREV_PAGE then +local function state_SHOW_FLIGHTS_HIST(event, touchState) + if event == EVT_VIRTUAL_NEXT_PAGE then lvgl.clear() lvgl.label({x=0, y=0, text="Loading...", color=WHITE, font=BOLD}) state = STATE.FLIGHTS_COUNT_INIT @@ -272,6 +225,91 @@ local function state_SHOW_FLIGHTS_LOOP(event, touchState) return 0 end +-- ---------------------------------------------------------------------------------------------------------- + +local function calculate_model_summary_list() + + local model_flight_count = {} + for i = 1, #m_index_file.log_files_index_info do + local flight_info = m_index_file.log_files_index_info[i] + --log("model_summary_list: %d. [%s]=%d (%s min)", i, flight_info.model_name, flight_info.flight_count, flight_info.duration) + + if model_flight_count[flight_info.model_name] == nil then + -- log("model_summary_list: %d. first", i) + model_flight_count[flight_info.model_name] = 0 + else + -- log("model_summary_list: %d. logged", i) + end + + model_flight_count[flight_info.model_name] = flight_info.flight_count + end + + -- for k, v in pairs(model_flight_count) do + -- local inf = string.format("===================== %-17s - %d flights", k, v) + -- -- local inf = string.format("%03d - %s", v, k) + -- log("model_flight_count: %s", inf) + -- model_summary_list[#model_summary_list +1] = {k, v} + -- end + + local keys = {} + for k in next, model_flight_count do + keys[#keys+1] = k + end + + local model_summary_list = {} + log("calculate_model_summary_list()") + m_tables.table_clear(model_summary_list) + for i = 1, #keys do + local k = keys[i] + local v = model_flight_count[k] + local inf = string.format("===================== %-17s - %d flights", k, v) + -- local inf = string.format("%03d - %s", v, k) + log("model_flight_count: %s", inf) + model_summary_list[#model_summary_list +1] = {k, v} + end + + return model_summary_list +end + + +local function state_FLIGHTS_COUNT_INIT(event, touchState) + local model_summary_list = calculate_model_summary_list() + + log("creating new window gui") + lvgl.clear() + lvgl.build({ + -- draw top-bar + {type="rectangle", x=0, y=0, w=LCD_W, h=LCD_H, color=BLACK, filled=true}, + {type="rectangle", x=0, y=0, w=LCD_W, h=20*lvSCALE, color=COLOR_THEME_SECONDARY1, filled=true}, + {type="label", x=160*lvSCALE, y=1, text="Flight History Viewer", color=WHITE, font=FS.FONT_6}, + {type="label", x=LCD_W-40*lvSCALE, y=1, text="v" .. app_ver, color=WHITE, font=FS.FONT_6}, + -- {type="image", x=0, y=0, w=LCD_W, h=LCD_H, file=script_folder.."/bg2.png"}, + {type="label", x=10*lvSCALE, y=25*lvSCALE, text="Flight Count...", font=BOLD, color=WHITE}, + }) + + libGUIv4.newCtl.ctl_table(nil, "count-table", { + x=20*lvSCALE, y=50*lvSCALE, w=LCD_W-20*lvSCALE, h=LCD_H-50*lvSCALE, + font=FS.FONT_8, + header={"Model", "Flights Count"}, + colX={20*lvSCALE, 250*lvSCALE}, + lines=model_summary_list, + }) + + state = STATE.FLIGHTS_COUNT + return 0 +end + +local function state_FLIGHTS_COUNT(event, touchState) + if event == EVT_VIRTUAL_EXIT or event == EVT_VIRTUAL_PREV_PAGE then + lvgl.clear() + lvgl.label({x=0, y=0, text="Loading...", color=WHITE, font=BOLD}) + state = STATE.SHOW_FLIGHTS_HIST_INIT + return 0 + end + + return 0 +end + function M.init() log("init()") end @@ -287,33 +325,33 @@ function M.run(event, touchState) log("STATE.SPLASH_INIT") return state_SPLASH_INIT() - elseif state == STATE.SPLASH_LOOP then - log("STATE.SPLASH_LOOP") - return state_SPLASH_LOOP() + elseif state == STATE.SPLASH then + log("STATE.SPLASH") + return state_SPLASH() elseif state == STATE.READ_HIST_INIT then log("STATE.READ_HIST_INIT") return state_READ_HIST_INIT() - elseif state == STATE.READ_HIST_LOOP then - log("STATE.READ_HIST_LOOP") - return state_READ_HIST_LOOP() + elseif state == STATE.READ_HIST then + log("STATE.READ_HIST") + return state_READ_HIST() + + elseif state == STATE.SHOW_FLIGHTS_HIST_INIT then + log("STATE.SHOW_FLIGHTS_HIST_INIT") + return state_SHOW_FLIGHTS_HIST_INIT(event, touchState) + + elseif state == STATE.SHOW_FLIGHTS_HIST then + --log("STATE.state_SHOW_FLIGHTS") + return state_SHOW_FLIGHTS_HIST(event, touchState) elseif state == STATE.FLIGHTS_COUNT_INIT then log("STATE.FLIGHTS_COUNT_INIT") return state_FLIGHTS_COUNT_INIT(event, touchState) - elseif state == STATE.FLIGHTS_COUNT_LOOP then - --log("STATE.state_FLIGHTS_COUNT_LOOP") - return state_FLIGHTS_COUNT_LOOP(event, touchState) - - elseif state == STATE.SHOW_FLIGHTS_INIT then - log("STATE.SHOW_FLIGHTS_INIT") - return state_SHOW_FLIGHTS_init(event, touchState) - - elseif state == STATE.SHOW_FLIGHTS_LOOP then - --log("STATE.state_SHOW_FLIGHTS_LOOP") - return state_SHOW_FLIGHTS_LOOP(event, touchState) + elseif state == STATE.FLIGHTS_COUNT then + --log("STATE.state_FLIGHTS_COUNT") + return state_FLIGHTS_COUNT(event, touchState) elseif state == STATE.DO_NOTHING then log("STATE.DO_NOTHING") diff --git a/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua b/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua index 8a017bb3..7d180c2f 100644 --- a/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua +++ b/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/libgui4/ctl_table.lua @@ -4,8 +4,11 @@ -- better font size names local FS={FONT_38=XXLSIZE,FONT_16=DBLSIZE,FONT_12=MIDSIZE,FONT_8=0,FONT_6=SMLSIZE} +local lvSCALE = lvgl.LCD_SCALE or 1 +local is800 = (LCD_W==800) -function M(panel, id, args, flags) + +local function M(panel, id, args, flags) assert(args) assert(args.header) assert(args.lines) @@ -17,46 +20,54 @@ function M(panel, id, args, flags) -- args x = args.x, y = args.y, - w = args.w or 0, - h = args.h or 0, + w = args.w, + h = args.h, fontSize = args.font or FS.FONT_8, - colX = args.colX or 0, + fontSizeHeader = args.font_header or FS.FONT_8, + textColor = args.textColor or WHITE, + colX = args.colX or args.x, header = args.header, lines = args.lines, + maxLinesToShow = (args.maxLines ~= nil) and math.min(args.maxLines, #args.lines) or #args.lines, -- max lines to show fIsLineVisible = args.fIsLineVisible or function() return true end, } -- log("ctl_table [%s] x: %d, y: %d, w: %d, h: %d", id, self.x, self.y, self.w, self.h) function self.build_ui() + local boxCtl = (self.panel~=nil) + and panel:box({x=self.x, y=self.y, w=self.w, h=self.h}) + or lvgl.box({x=self.x, y=self.y, w=self.w, h=self.h}) + -- header - local bxHdr = lvgl.box({x=self.x, y=self.y, w=self.w, h=self.h}) - bxHdr:rectangle({x=0, y=0, w=self.w, h=20, color=DARKGREEN, filled=true}) + boxCtl:rectangle({x=0, y=0, w=self.w, h=20*lvSCALE, color=DARKGREEN, filled=true}) for i = 1, self.colNum, 1 do - bxHdr:label({x=self.colX[i], y=0, text=self.header[i], color=WHITE, font=FS.FONT_8}) + boxCtl:label({x=self.colX[i], y=0, text=self.header[i], color=self.textColor, font=self.fontSizeHeader}) end -- lines - local bxLines = bxHdr:box({x=self.x, y=25, flexFlow=lvgl.FLOW_COLUMN, flexPad=2}) - - for k, obj in pairs(self.lines) do + local bxLines = boxCtl:box({x=0, y=25*lvSCALE, flexFlow=lvgl.FLOW_COLUMN, flexPad=2*lvSCALE}) + for lineIdx = 1, self.maxLinesToShow do + local obj = self.lines[lineIdx] local bxSingleLine = bxLines:box({x=0, y=0, visible=function() return self.fIsLineVisible(obj) end }) - - bxSingleLine:button({x=0, y=4,w=12,h=12, cornerRadius=10, color=WHITE}) - -- bxSingleLine:circle({x=7, y=10, radius=4, filled=true, color=WHITE}) - local last_x = 0 + bxSingleLine:button({x=0, y=4*lvSCALE,w=12*lvSCALE,h=12*lvSCALE, cornerRadius=10, color=self.textColor}) + -- bxSingleLine:circle({x=7, y=10, radius=4, filled=true, color=self.textColor}) for i = 1, self.colNum, 1 do -- add single line + -- log("ctl_table colNum: k: %s, i: %s, = %s", k, i, self.lines[k][i]) + -- log("ctl_table colNum: %sx%s, txt=%s, x=%s, w=%s %s", k, i, self.lines[k][i], self.colX[i], self.colX[i+1], self.w -self.colX[i]) bxSingleLine:label({ - x=self.colX[i], y=0, - w=(self.colX[i+1] or 999)-last_x, + x=self.colX[i], + y=0, + --w=self.colX[i+1] or (self.w -10 - self.colX[i]), text=obj[i], - color=WHITE, + color=self.textColor, font=self.fontSize }) end end + end self.build_ui() diff --git a/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua b/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua index ec1204cd..ab61c733 100644 --- a/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua +++ b/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/libgui4/libgui4.lua @@ -1,4 +1,5 @@ -local libgui_dir = ... +local args = {...} +local libgui_dir = args[1] local app_ver = "0.0.0-dev.1" diff --git a/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/main.lua b/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/main.lua index 7a18be78..e3f6d0bb 100644 --- a/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/main.lua +++ b/sdcard/c800x480/SCRIPTS/TOOLS/FlightsHistory/main.lua @@ -1,3 +1,4 @@ +-- TNS|Flights History|TNE ---- ######################################################################### ---- # # ---- # License GPLv3: https://www.gnu.org/licenses/gpl-3.0.html # @@ -15,8 +16,8 @@ -- This script display the flights history as kept using the "Flights" widget -- Author: Offer Shmuely --- Date: 2023-2025 -local app_ver = "1.5" +-- Date: 2023-2026 +local app_ver = "1.9" -- to get help: -- change in lib_log.lua to "ENABLE_LOG_FILE=true" @@ -26,44 +27,19 @@ local app_ver = "1.5" local app_name = "FlightsHistory" -local m_log = nil -local m_utils = nil -local m_tables = nil -local m_index_file = nil -local m_libgui = nil -local m_log_viewer3 = nil - -local error_desc = nil -local script_folder = "/SCRIPTS/TOOLS/FlightsHistory/" +local script_folder = "/SCRIPTS/TOOLS/FlightsHistory" local function my_load_script(file_name, ...) - local code_chunk = assert(loadScript(script_folder .. file_name, "btd")) + local code_chunk = assert(loadScript(script_folder .. "/" .. file_name, "tbd")) -- print(string.format("%s - loading, num args: %d", file_name, #{...})) return code_chunk(...) end - -local function init() - m_log = my_load_script("lib_log", app_name, "/SCRIPTS/TOOLS/" .. app_name) - - m_utils = my_load_script("lib_utils", m_log, app_name) - m_tables = my_load_script("lib_tables", m_log, app_name) - m_index_file = my_load_script("lib_history_index", m_log, app_name, m_utils, m_tables) - m_libgui = my_load_script("libgui4/libgui4.lua", script_folder .. "/libgui4") - m_log_viewer3 = my_load_script("FlightsHistory4", m_log, m_utils,m_tables,m_index_file,m_libgui,app_ver) - return m_log_viewer3.init() -end - -local function run(event, touchState) - -- display if in error mode - if error_desc ~= nil then - print(error_desc) - lcd.clear() - lcd.drawText(5, 30, "Error:", COLOR_THEME_SECONDARY1 + BOLD) - lcd.drawText(5, 60, error_desc, COLOR_THEME_SECONDARY1 + BOLD) - return 0 - end - - return m_log_viewer3.run(event, touchState) -end - -return { init=init, run=run, useLvgl=true } +print("Loading "..app_name.." ver: "..app_ver) +local m_log = my_load_script("lib_log", app_name, "/SCRIPTS/TOOLS/"..app_name) +local m_utils = my_load_script("lib_utils", m_log, app_name) +local m_tables = my_load_script("lib_tables", m_log, app_name) +local m_index_file= my_load_script("lib_history_index", m_log, app_name, m_utils, m_tables) +local m_libgui = my_load_script("libgui4/libgui4.lua", script_folder.."/libgui4") +local app = my_load_script("app", m_log, m_utils,m_tables,m_index_file,m_libgui,app_ver) + +return { init=app.init, run=app.run, useLvgl=true }