diff --git a/.woodpecker.yml b/.woodpecker.yml index c6d1252..4db927b 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,18 +1,27 @@ +clone: + git: + image: woodpeckerci/plugin-git + # https://woodpecker-ci.org/plugins/Git%20Clone + settings: + # tags are required for aarch64 release builds for semver + tags: true + lfs: false + recursive: false pipeline: lint: - image: git.qcode.ch/nakamochi/ci-zig0.10.1:v2 + image: git.qcode.ch/nakamochi/ci-zig0.10.1:v3 commands: - ./tools/fmt-check.sh test: - image: git.qcode.ch/nakamochi/ci-zig0.10.1:v2 + image: git.qcode.ch/nakamochi/ci-zig0.10.1:v3 commands: - zig build test sdl2: - image: git.qcode.ch/nakamochi/ci-zig0.10.1:v2 + image: git.qcode.ch/nakamochi/ci-zig0.10.1:v3 commands: - zig build -Ddriver=sdl2 aarch64: - image: git.qcode.ch/nakamochi/ci-zig0.10.1:v2 + image: git.qcode.ch/nakamochi/ci-zig0.10.1:v3 commands: - zig build -Ddriver=fbev -Dtarget=aarch64-linux-musl -Drelease-safe -Dstrip - sha256sum zig-out/bin/nd zig-out/bin/ngui diff --git a/build.zig b/build.zig index 10a825b..7732216 100644 --- a/build.zig +++ b/build.zig @@ -10,9 +10,11 @@ pub fn build(b: *std.build.Builder) void { const disp_horiz = b.option(u32, "horiz", "display horizontal pixels count; default: 800") orelse 800; const disp_vert = b.option(u32, "vert", "display vertical pixels count; default: 480") orelse 480; const lvgl_loglevel = b.option(LVGLLogLevel, "lvgl_loglevel", "LVGL lib logging level") orelse LVGLLogLevel.default(mode); + const inver = b.option([]const u8, "version", "semantic version of the build; must match git tag when available"); const buildopts = b.addOptions(); buildopts.addOption(DriverTarget, "driver", drv); + const semver_step = VersionStep.create(b, buildopts, inver); const common_cflags = .{ "-Wall", @@ -28,6 +30,7 @@ pub fn build(b: *std.build.Builder) void { ngui.setBuildMode(mode); ngui.pie = true; ngui.strip = strip; + ngui.step.dependOn(semver_step); ngui.addPackage(buildopts.getPackage("build_options")); ngui.addIncludePath("lib"); @@ -88,6 +91,7 @@ pub fn build(b: *std.build.Builder) void { nd.setBuildMode(mode); nd.pie = true; nd.strip = strip; + nd.step.dependOn(semver_step); nd.addPackage(buildopts.getPackage("build_options")); nifbuild.addPkg(b, nd, "lib/nif"); @@ -316,3 +320,75 @@ const LVGLLogLevel = enum { }; } }; + +/// VersionStep injects a release build semantic version into buildopts as "semver". +/// the make step fails if the inver input version and the one found in a git tag mismatch. +/// +/// while git-tagged versions are expected to be in vformat, input version +/// to match against is any format supported by std.SemanticVersion.parse. +/// input version is optional; if unset, make fn succeeds given a correctly formatted +/// git tag is found. +const VersionStep = struct { + inver: ?[]const u8, // input version in std.SemanticVersion.parse format + buildopts: *std.build.OptionsStep, // where to store the build version + + b: *std.build.Builder, + step: std.build.Step, + + fn create(b: *std.build.Builder, o: *std.build.OptionsStep, inver: ?[]const u8) *std.build.Step { + const vstep = b.allocator.create(VersionStep) catch unreachable; + vstep.* = VersionStep{ + .inver = inver, + .buildopts = o, + .b = b, + .step = std.build.Step.init(.custom, "VersionStep: ndg semver", b.allocator, make), + }; + return &vstep.step; + } + + fn make(step: *std.build.Step) anyerror!void { + const self = @fieldParentPtr(VersionStep, "step", step); + const semver = try self.eval(); + std.log.info("build version: {any}", .{semver}); + self.buildopts.addOption(std.SemanticVersion, "semver", semver); + } + + fn eval(self: *VersionStep) !std.SemanticVersion { + const repover = try self.gitver(); + if (self.inver) |v| { + const insem = std.SemanticVersion.parse(v) catch |err| { + std.log.err("invalid input semver '{s}': {any}", .{ v, err }); + return err; + }; + if (repover != null and insem.order(repover.?) != .eq) { + std.log.err("input and repo semver mismatch: {any} vs {any}", .{ insem, repover }); + return error.VersionMismatch; + } + return insem; + } + + if (repover == null) { + std.log.err("must supply build semver from command line.", .{}); + return error.MissingVersion; + } + return repover.?; + } + + fn gitver(self: *VersionStep) !?std.SemanticVersion { + if (!std.process.can_spawn) { + return null; + } + const git = self.b.findProgram(&[_][]const u8{"git"}, &[_][]const u8{}) catch return null; + + const prefix = "v"; // git tag prefix + const matchTag = self.b.fmt("{s}*.*.*", .{prefix}); + const cmd = [_][]const u8{ git, "-C", self.b.pathFromRoot("."), "describe", "--match", matchTag, "--tags", "--abbrev=8" }; + var code: u8 = undefined; + const git_describe = self.b.execAllowFail(&cmd, &code, .Ignore) catch return null; + const repotag = std.mem.trim(u8, git_describe, " \n\r")[prefix.len..]; + return std.SemanticVersion.parse(repotag) catch |err| ret: { + std.log.err("unparsable git tag semver '{s}': {any}", .{ repotag, err }); + break :ret err; + }; + } +}; diff --git a/src/nd.zig b/src/nd.zig index 1ce8f2f..fab09e9 100644 --- a/src/nd.zig +++ b/src/nd.zig @@ -1,3 +1,4 @@ +const buildopts = @import("build_options"); const std = @import("std"); const os = std.os; const sys = os.system; @@ -86,6 +87,9 @@ fn parseArgs(gpa: std.mem.Allocator) !NdArgs { if (std.mem.eql(u8, a, "-h") or std.mem.eql(u8, a, "-help") or std.mem.eql(u8, a, "--help")) { usage(prog) catch {}; std.process.exit(1); + } else if (std.mem.eql(u8, a, "-v")) { + try stderr.print("{any}\n", .{buildopts.semver}); + std.process.exit(0); } else if (std.mem.eql(u8, a, "-gui")) { lastarg = .gui; } else if (std.mem.eql(u8, a, "-gui-user")) { @@ -126,6 +130,7 @@ pub fn main() !void { // parse program args first thing and fail fast if invalid const args = try parseArgs(gpa); defer args.deinit(gpa); + logger.info("ndg version {any}", .{buildopts.semver}); // reset the screen backlight to normal power regardless // of its previous state. diff --git a/src/ngui.zig b/src/ngui.zig index 0ae7bf2..b2c7799 100644 --- a/src/ngui.zig +++ b/src/ngui.zig @@ -1,3 +1,4 @@ +const buildopts = @import("build_options"); const std = @import("std"); const time = std.time; @@ -16,6 +17,7 @@ pub const keep_sigpipe = true; const stdin = std.io.getStdIn().reader(); const stdout = std.io.getStdOut().writer(); +const stderr = std.io.getStdErr().writer(); const logger = std.log.scoped(.ngui); extern "c" fn ui_update_network_status(text: [*:0]const u8, wifi_list: ?[*:0]const u8) void; @@ -177,18 +179,59 @@ fn commThreadLoopCycle() !void { } } +/// prints messages in the same way std.fmt.format does and exits the process +/// with a non-zero code. +fn fatal(comptime fmt: []const u8, args: anytype) noreturn { + stderr.print(fmt, args) catch {}; + if (fmt[fmt.len - 1] != '\n') { + stderr.writeByte('\n') catch {}; + } + std.process.exit(1); +} + +fn parseArgs(alloc: std.mem.Allocator) !void { + var args = try std.process.ArgIterator.initWithAllocator(alloc); + defer args.deinit(); + const prog = args.next() orelse return error.NoProgName; + + while (args.next()) |a| { + if (std.mem.eql(u8, a, "-h") or std.mem.eql(u8, a, "-help") or std.mem.eql(u8, a, "--help")) { + usage(prog) catch {}; + std.process.exit(1); + } else if (std.mem.eql(u8, a, "-v")) { + try stderr.print("{any}\n", .{buildopts.semver}); + std.process.exit(0); + } else { + fatal("unknown arg name {s}", .{a}); + } + } +} + +/// prints usage help text to stderr. +fn usage(prog: []const u8) !void { + try stderr.print( + \\usage: {s} [-v] + \\ + \\ngui is nakamochi GUI interface. it communicates with nd, nakamochi daemon, + \\via stdio and is typically launched by the daemon as a child process. + \\ + , .{prog}); +} + /// nakamochi UI program entry point. pub fn main() anyerror!void { - // ensure timer is available on this platform before doing anything else; - // the UI is unusable otherwise. - tick_timer = try time.Timer.start(); - // main heap allocator used through the lifetime of nd var gpa_state = std.heap.GeneralPurposeAllocator(.{}){}; defer if (gpa_state.deinit()) { logger.err("memory leaks detected", .{}); }; gpa = gpa_state.allocator(); + try parseArgs(gpa); + logger.info("ndg version {any}", .{buildopts.semver}); + + // ensure timer is available on this platform before doing anything else; + // the UI is unusable otherwise. + tick_timer = try time.Timer.start(); // initalizes display, input driver and finally creates the user interface. ui.init() catch |err| { diff --git a/src/ui/c/lv_conf.h b/src/ui/c/lv_conf.h index e0726d6..9d0d342 100644 --- a/src/ui/c/lv_conf.h +++ b/src/ui/c/lv_conf.h @@ -357,6 +357,7 @@ #define NM_SYMBOL_BITCOIN "\xEF\x8D\xB9" /* 0xF379 */ #define NM_SYMBOL_BITCOIN_SIGN "\xEE\x82\xB4" /* 0xE0B4 */ #define NM_SYMBOL_BOLT "\xEF\x83\xA7" /* 0xF0E7 */ +#define NM_SYMBOL_INFO "\xEF\x81\x9A" /* 0xF05A */ /*Enable handling large font and/or fonts with a lot of characters. *The limit depends on the font size, font face and bpp. diff --git a/src/ui/c/lv_font_courierprimecode_14.c b/src/ui/c/lv_font_courierprimecode_14.c index f221153..6e08773 100644 --- a/src/ui/c/lv_font_courierprimecode_14.c +++ b/src/ui/c/lv_font_courierprimecode_14.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 14 px * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 14 --font courier-prime-code.ttf -r 0x20-0x7F,0xB0,0x2022 --font fa-brands-400.ttf -r 0xF287,0xF293,0xF379 --font fa-solid-900.ttf -r 0xF001,0xF008,0xF00B,0xF00C,0xF00D,0xF011,0xF013,0xF015,0xF019,0xF01C,0xF021,0xF026,0xF027,0xF028,0xF03E,0xF043,0xF048,0xF04B,0xF04C,0xF04D,0xF051,0xF052,0xF053,0xF054,0xF067,0xF068,0xF06E,0xF070,0xF071,0xF074,0xF077,0xF078,0xF079,0xF07B,0xF093,0xF095,0xF0C4,0xF0C5,0xF0C7,0xF0C9,0xF0E0,0xF0E7,0xF0EA,0xF0F3,0xF11C,0xF124,0xF158,0xF1EB,0xF240,0xF241,0xF242,0xF243,0xF244,0xF2ED,0xF304,0xF55A,0xF7C2,0xF177=>0xF8A2,0xE0B4,0xF0E7 --format lvgl -o lv_font_courierprimecode_14.c --force-fast-kern-format + * Opts: --no-compress --no-prefilter --bpp 4 --size 14 --font courier-prime-code.ttf -r 0x20-0x7F,0xB0,0x2022 --font fa-brands-400.ttf -r 0xF287,0xF293,0xF379 --font fa-solid-900.ttf -r 0xF001,0xF008,0xF00B,0xF00C,0xF00D,0xF011,0xF013,0xF015,0xF019,0xF01C,0xF021,0xF026,0xF027,0xF028,0xF03E,0xF043,0xF048,0xF04B,0xF04C,0xF04D,0xF051,0xF052,0xF053,0xF054,0xF05A,0xF067,0xF068,0xF06E,0xF070,0xF071,0xF074,0xF077,0xF078,0xF079,0xF07B,0xF093,0xF095,0xF0C4,0xF0C5,0xF0C7,0xF0C9,0xF0E0,0xF0E7,0xF0EA,0xF0F3,0xF11C,0xF124,0xF158,0xF1EB,0xF240,0xF241,0xF242,0xF243,0xF244,0xF2ED,0xF304,0xF55A,0xF7C2,0xF177=>0xF8A2,0xE0B4,0xF0E7 --format lvgl -o lv_font_courierprimecode_14.c --force-fast-kern-format ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -920,6 +920,22 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x4, 0xff, 0x40, 0x0, 0x2f, 0xf4, 0x0, 0x0, 0x2c, 0x40, 0x0, 0x0, + /* U+F05A "" */ + 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x2f, 0xff, 0xff, 0x88, + 0xff, 0xff, 0xf2, 0x8f, 0xff, 0xff, 0x55, 0xff, + 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xf5, 0x3, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xfe, 0x71, 0xff, 0xff, 0xfe, 0xcf, + 0xff, 0xff, 0x81, 0xff, 0xff, 0xfc, 0x6f, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xf6, 0xe, 0xff, 0xfc, + 0x88, 0xcf, 0xff, 0xe0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x6b, 0xee, 0xb6, 0x0, + 0x0, + /* U+F067 "" */ 0x0, 0x0, 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xf0, @@ -1551,43 +1567,44 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 4626, .adv_w = 196, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, {.bitmap_index = 4717, .adv_w = 168, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 4769, .adv_w = 168, .box_w = 8, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4821, .adv_w = 196, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4893, .adv_w = 196, .box_w = 12, .box_h = 2, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 4905, .adv_w = 252, .box_w = 17, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 5016, .adv_w = 280, .box_w = 19, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 5159, .adv_w = 224, .box_w = 16, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 5263, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5361, .adv_w = 224, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 5417, .adv_w = 224, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5473, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5561, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5652, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5757, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5870, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4821, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4926, .adv_w = 196, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4998, .adv_w = 196, .box_w = 12, .box_h = 2, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 5010, .adv_w = 252, .box_w = 17, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 5121, .adv_w = 280, .box_w = 19, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5264, .adv_w = 224, .box_w = 16, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 5368, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5466, .adv_w = 224, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 5522, .adv_w = 224, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5578, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5666, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5757, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5862, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 5975, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6080, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6165, .adv_w = 196, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6237, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6314, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6404, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6509, .adv_w = 196, .box_w = 14, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 6614, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6702, .adv_w = 196, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6780, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6852, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6969, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7049, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7129, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7209, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7289, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7369, .adv_w = 280, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7477, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7567, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7665, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 7778, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7883, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7971, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8054, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0} + {.bitmap_index = 6080, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6185, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6270, .adv_w = 196, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6342, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6419, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6509, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6614, .adv_w = 196, .box_w = 14, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6719, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6807, .adv_w = 196, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6885, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6957, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7074, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7154, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7234, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7314, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7394, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7474, .adv_w = 280, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7582, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7672, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7770, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7883, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7988, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8076, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8159, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0} }; /*--------------------- @@ -1598,11 +1615,12 @@ static const uint16_t unicode_list_1[] = { 0x0, 0x1f72, 0xe004, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, - 0xefa2, 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, - 0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, - 0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, - 0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, - 0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712, 0xf7f2 + 0xefa2, 0xefa3, 0xefa4, 0xefaa, 0xefb7, 0xefb8, 0xefbe, 0xefc0, + 0xefc1, 0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, + 0xf014, 0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, + 0xf06c, 0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, + 0xf194, 0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712, + 0xf7f2 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -1614,7 +1632,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 64, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 65, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/src/ui/c/lv_font_courierprimecode_16.c b/src/ui/c/lv_font_courierprimecode_16.c index bb4aa66..f21a1da 100644 --- a/src/ui/c/lv_font_courierprimecode_16.c +++ b/src/ui/c/lv_font_courierprimecode_16.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 16 px * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font courier-prime-code.ttf -r 0x20-0x7F,0xB0,0x2022 --font fa-brands-400.ttf -r 0xF287,0xF293,0xF379 --font fa-solid-900.ttf -r 0xF001,0xF008,0xF00B,0xF00C,0xF00D,0xF011,0xF013,0xF015,0xF019,0xF01C,0xF021,0xF026,0xF027,0xF028,0xF03E,0xF043,0xF048,0xF04B,0xF04C,0xF04D,0xF051,0xF052,0xF053,0xF054,0xF067,0xF068,0xF06E,0xF070,0xF071,0xF074,0xF077,0xF078,0xF079,0xF07B,0xF093,0xF095,0xF0C4,0xF0C5,0xF0C7,0xF0C9,0xF0E0,0xF0E7,0xF0EA,0xF0F3,0xF11C,0xF124,0xF158,0xF1EB,0xF240,0xF241,0xF242,0xF243,0xF244,0xF2ED,0xF304,0xF55A,0xF7C2,0xF177=>0xF8A2,0xE0B4,0xF0E7 --format lvgl -o lv_font_courierprimecode_16.c --force-fast-kern-format + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font courier-prime-code.ttf -r 0x20-0x7F,0xB0,0x2022 --font fa-brands-400.ttf -r 0xF287,0xF293,0xF379 --font fa-solid-900.ttf -r 0xF001,0xF008,0xF00B,0xF00C,0xF00D,0xF011,0xF013,0xF015,0xF019,0xF01C,0xF021,0xF026,0xF027,0xF028,0xF03E,0xF043,0xF048,0xF04B,0xF04C,0xF04D,0xF051,0xF052,0xF053,0xF054,0xF05A,0xF067,0xF068,0xF06E,0xF070,0xF071,0xF074,0xF077,0xF078,0xF079,0xF07B,0xF093,0xF095,0xF0C4,0xF0C5,0xF0C7,0xF0C9,0xF0E0,0xF0E7,0xF0EA,0xF0F3,0xF11C,0xF124,0xF158,0xF1EB,0xF240,0xF241,0xF242,0xF243,0xF244,0xF2ED,0xF304,0xF55A,0xF7C2,0xF177=>0xF8A2,0xE0B4,0xF0E7 --format lvgl -o lv_font_courierprimecode_16.c --force-fast-kern-format ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -1053,6 +1053,24 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1, 0xdf, 0xd1, 0x0, 0x1d, 0xfd, 0x10, 0x0, 0xcf, 0xd1, 0x0, 0x0, 0xcc, 0x10, 0x0, 0x0, + /* U+F05A "" */ + 0x0, 0x0, 0x29, 0xdf, 0xfd, 0x92, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x2f, 0xff, 0xff, 0xf3, 0x3f, 0xff, 0xff, 0xf2, + 0x9f, 0xff, 0xff, 0xf3, 0x3f, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x72, 0xf, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xfd, + 0x9f, 0xff, 0xff, 0xd5, 0xd, 0xff, 0xff, 0xf9, + 0x2f, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0xf2, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x29, 0xdf, 0xfd, 0x92, 0x0, 0x0, + /* U+F067 "" */ 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -1774,43 +1792,44 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 5821, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, {.bitmap_index = 5933, .adv_w = 192, .box_w = 8, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, {.bitmap_index = 5989, .adv_w = 192, .box_w = 8, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6045, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6136, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 6150, .adv_w = 288, .box_w = 20, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 6290, .adv_w = 320, .box_w = 22, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 6488, .adv_w = 256, .box_w = 18, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 6614, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6742, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 6798, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 6854, .adv_w = 288, .box_w = 20, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 6974, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7086, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7214, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7359, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6045, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6173, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6264, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 6278, .adv_w = 288, .box_w = 20, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 6418, .adv_w = 320, .box_w = 22, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 6616, .adv_w = 256, .box_w = 18, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 6742, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6870, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 6926, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 6982, .adv_w = 288, .box_w = 20, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7102, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7214, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7342, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 7487, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7615, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7713, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7797, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7893, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8019, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8147, .adv_w = 224, .box_w = 16, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 8275, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8383, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8481, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8565, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8705, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 8795, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 8885, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 8975, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9065, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9155, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 9302, .adv_w = 224, .box_w = 12, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 9410, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9522, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 9667, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9795, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9903, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9999, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 1} + {.bitmap_index = 7615, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7743, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7841, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7925, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8021, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8147, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8275, .adv_w = 224, .box_w = 16, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8403, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8511, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8609, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8693, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8833, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8923, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9013, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9103, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9193, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9283, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 9430, .adv_w = 224, .box_w = 12, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 9538, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9650, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 9795, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9923, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10031, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10127, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -1821,11 +1840,12 @@ static const uint16_t unicode_list_1[] = { 0x0, 0x1f72, 0xe004, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, - 0xefa2, 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, - 0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, - 0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, - 0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, - 0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712, 0xf7f2 + 0xefa2, 0xefa3, 0xefa4, 0xefaa, 0xefb7, 0xefb8, 0xefbe, 0xefc0, + 0xefc1, 0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, + 0xf014, 0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, + 0xf06c, 0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, + 0xf194, 0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712, + 0xf7f2 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -1837,7 +1857,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 64, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 65, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/src/ui/c/lv_font_courierprimecode_24.c b/src/ui/c/lv_font_courierprimecode_24.c index c7287d4..7e11825 100644 --- a/src/ui/c/lv_font_courierprimecode_24.c +++ b/src/ui/c/lv_font_courierprimecode_24.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 24 px * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 24 --font courier-prime-code.ttf -r 0x20-0x7F,0xB0,0x2022 --font fa-brands-400.ttf -r 0xF287,0xF293,0xF379 --font fa-solid-900.ttf -r 0xF001,0xF008,0xF00B,0xF00C,0xF00D,0xF011,0xF013,0xF015,0xF019,0xF01C,0xF021,0xF026,0xF027,0xF028,0xF03E,0xF043,0xF048,0xF04B,0xF04C,0xF04D,0xF051,0xF052,0xF053,0xF054,0xF067,0xF068,0xF06E,0xF070,0xF071,0xF074,0xF077,0xF078,0xF079,0xF07B,0xF093,0xF095,0xF0C4,0xF0C5,0xF0C7,0xF0C9,0xF0E0,0xF0E7,0xF0EA,0xF0F3,0xF11C,0xF124,0xF158,0xF1EB,0xF240,0xF241,0xF242,0xF243,0xF244,0xF2ED,0xF304,0xF55A,0xF7C2,0xF177=>0xF8A2,0xE0B4,0xF0E7 --format lvgl -o lv_font_courierprimecode_24.c --force-fast-kern-format + * Opts: --no-compress --no-prefilter --bpp 4 --size 24 --font courier-prime-code.ttf -r 0x20-0x7F,0xB0,0x2022 --font fa-brands-400.ttf -r 0xF287,0xF293,0xF379 --font fa-solid-900.ttf -r 0xF001,0xF008,0xF00B,0xF00C,0xF00D,0xF011,0xF013,0xF015,0xF019,0xF01C,0xF021,0xF026,0xF027,0xF028,0xF03E,0xF043,0xF048,0xF04B,0xF04C,0xF04D,0xF051,0xF052,0xF053,0xF054,0xF05A,0xF067,0xF068,0xF06E,0xF070,0xF071,0xF074,0xF077,0xF078,0xF079,0xF07B,0xF093,0xF095,0xF0C4,0xF0C5,0xF0C7,0xF0C9,0xF0E0,0xF0E7,0xF0EA,0xF0F3,0xF11C,0xF124,0xF158,0xF1EB,0xF240,0xF241,0xF242,0xF243,0xF244,0xF2ED,0xF304,0xF55A,0xF7C2,0xF177=>0xF8A2,0xE0B4,0xF0E7 --format lvgl -o lv_font_courierprimecode_24.c --force-fast-kern-format ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -1870,6 +1870,44 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x6f, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x99, 0x10, 0x0, 0x0, 0x0, 0x0, + /* U+F05A "" */ + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xef, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x1f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x0, + /* U+F067 "" */ 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, @@ -3222,43 +3260,44 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 11921, .adv_w = 336, .box_w = 23, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, {.bitmap_index = 12174, .adv_w = 288, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, {.bitmap_index = 12317, .adv_w = 288, .box_w = 13, .box_h = 22, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 12460, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12670, .adv_w = 336, .box_w = 21, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 12712, .adv_w = 432, .box_w = 29, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 13031, .adv_w = 480, .box_w = 32, .box_h = 26, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 13447, .adv_w = 384, .box_w = 26, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 13733, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13997, .adv_w = 384, .box_w = 22, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 14140, .adv_w = 384, .box_w = 22, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 14283, .adv_w = 432, .box_w = 29, .box_h = 19, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 14559, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14823, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 15111, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 15424, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12460, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12748, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12958, .adv_w = 336, .box_w = 21, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 13000, .adv_w = 432, .box_w = 29, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 13319, .adv_w = 480, .box_w = 32, .box_h = 26, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 13735, .adv_w = 384, .box_w = 26, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 14021, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14285, .adv_w = 384, .box_w = 22, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 14428, .adv_w = 384, .box_w = 22, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 14571, .adv_w = 432, .box_w = 29, .box_h = 19, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 14847, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15111, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15399, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 15712, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 16000, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16231, .adv_w = 336, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16420, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16636, .adv_w = 336, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 16883, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 17171, .adv_w = 336, .box_w = 23, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 17447, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17690, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 17900, .adv_w = 288, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18098, .adv_w = 480, .box_w = 30, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18428, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 18644, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 18860, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 19076, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 19292, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 19508, .adv_w = 480, .box_w = 31, .box_h = 20, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 19818, .adv_w = 336, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 20065, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 20317, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 20630, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 20918, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 21161, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 21377, .adv_w = 384, .box_w = 24, .box_h = 16, .ofs_x = 0, .ofs_y = 1} + {.bitmap_index = 16000, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16288, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16519, .adv_w = 336, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16708, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16924, .adv_w = 336, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 17171, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17459, .adv_w = 336, .box_w = 23, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 17735, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17978, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18188, .adv_w = 288, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18386, .adv_w = 480, .box_w = 30, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18716, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18932, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 19148, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 19364, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 19580, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 19796, .adv_w = 480, .box_w = 31, .box_h = 20, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 20106, .adv_w = 336, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 20353, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20605, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 20918, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 21206, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21449, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 21665, .adv_w = 384, .box_w = 24, .box_h = 16, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -3269,11 +3308,12 @@ static const uint16_t unicode_list_1[] = { 0x0, 0x1f72, 0xe004, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, - 0xefa2, 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, - 0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, - 0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, - 0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, - 0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712, 0xf7f2 + 0xefa2, 0xefa3, 0xefa4, 0xefaa, 0xefb7, 0xefb8, 0xefbe, 0xefc0, + 0xefc1, 0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, + 0xf014, 0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, + 0xf06c, 0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, + 0xf194, 0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712, + 0xf7f2 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -3285,7 +3325,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 64, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 65, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/src/ui/c/ui.c b/src/ui/c/ui.c index a1a256c..b87a291 100644 --- a/src/ui/c/ui.c +++ b/src/ui/c/ui.c @@ -15,6 +15,11 @@ */ void nm_sys_shutdown(); +/** + * creates an info panel with build info, semver, about and other related items. + */ +int nm_create_info_panel(lv_obj_t *parent); + /** * invoken when the UI is switched to the network settings tab. */ @@ -321,23 +326,42 @@ extern int nm_ui_init(lv_disp_t *disp) * 0: bitcoin * 1: lightning * 2: settings + * 3: ndg build info and versioning */ + lv_obj_t *tab_btc = lv_tabview_add_tab(tabview, NM_SYMBOL_BITCOIN " BITCOIN"); if (tab_btc == NULL) { return -1; } create_bitcoin_panel(tab_btc); + lv_obj_t *tab_lnd = lv_tabview_add_tab(tabview, NM_SYMBOL_BOLT " LIGHTNING"); if (tab_lnd == NULL) { return -1; } create_lnd_panel(tab_lnd); + lv_obj_t *tab_settings = lv_tabview_add_tab(tabview, LV_SYMBOL_SETTINGS " SETTINGS"); if (tab_settings == NULL) { return -1; } create_settings_panel(tab_settings); + lv_obj_t *tab_info = lv_tabview_add_tab(tabview, NM_SYMBOL_INFO); + if (tab_info == NULL) { + return -1; + } + if (nm_create_info_panel(tab_info) != 0) { + return -1; + } + + /* make the info tab button narrower, just for the icon to fit, + * by widening the other tab buttons relative width. */ + lv_obj_t *tabbs = lv_tabview_get_tab_btns(tabview); + lv_btnmatrix_set_btn_width(tabbs, 0, 3); + lv_btnmatrix_set_btn_width(tabbs, 1, 3); + lv_btnmatrix_set_btn_width(tabbs, 2, 3); + lv_obj_add_event_cb(tabview, tab_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL); return 0; } diff --git a/src/ui/ui.zig b/src/ui/ui.zig index 043938e..9321211 100644 --- a/src/ui/ui.zig +++ b/src/ui/ui.zig @@ -1,3 +1,4 @@ +const buildopts = @import("build_options"); const std = @import("std"); const lvgl = @import("lvgl.zig"); @@ -50,3 +51,20 @@ fn poweroffModalCallback(btn_idx: usize) void { // proceed with shutdown nm_sys_shutdown(); } + +export fn nm_create_info_panel(parent: *lvgl.LvObj) c_int { + createInfoPanel(parent) catch |err| { + logger.err("createInfoPanel: {any}", .{err}); + return -1; + }; + return 0; +} + +fn createInfoPanel(parent: *lvgl.LvObj) !void { + parent.flexFlow(.column); + parent.flexAlign(.start, .start, .start); + + var buf: [100]u8 = undefined; + const sver = try std.fmt.bufPrintZ(&buf, "GUI version: {any}", .{buildopts.semver}); + _ = try lvgl.createLabel(parent, sver, .{ .long_mode = .wrap, .pos = .none }); +} diff --git a/tools/ci-containerfile b/tools/ci-containerfile index 31babd9..036acaf 100644 --- a/tools/ci-containerfile +++ b/tools/ci-containerfile @@ -6,7 +6,7 @@ FROM alpine:3.17.1 ARG ZIGURL -RUN apk add --no-cache curl xz sdl2-dev clang15-extra-tools && \ +RUN apk add --no-cache git curl xz sdl2-dev clang15-extra-tools && \ mkdir -p /tools/zig && \ cd /tools/zig && \ curl -o zig.tar.xz $ZIGURL && \