build-time semantic versioning #21

Manually merged
x1ddos merged 2 commits from semver into master 1 year ago

@ -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: pipeline:
lint: lint:
image: git.qcode.ch/nakamochi/ci-zig0.10.1:v2 image: git.qcode.ch/nakamochi/ci-zig0.10.1:v3
commands: commands:
- ./tools/fmt-check.sh - ./tools/fmt-check.sh
test: test:
image: git.qcode.ch/nakamochi/ci-zig0.10.1:v2 image: git.qcode.ch/nakamochi/ci-zig0.10.1:v3
commands: commands:
- zig build test - zig build test
sdl2: sdl2:
image: git.qcode.ch/nakamochi/ci-zig0.10.1:v2 image: git.qcode.ch/nakamochi/ci-zig0.10.1:v3
commands: commands:
- zig build -Ddriver=sdl2 - zig build -Ddriver=sdl2
aarch64: aarch64:
image: git.qcode.ch/nakamochi/ci-zig0.10.1:v2 image: git.qcode.ch/nakamochi/ci-zig0.10.1:v3
commands: commands:
- zig build -Ddriver=fbev -Dtarget=aarch64-linux-musl -Drelease-safe -Dstrip - zig build -Ddriver=fbev -Dtarget=aarch64-linux-musl -Drelease-safe -Dstrip
- sha256sum zig-out/bin/nd zig-out/bin/ngui - sha256sum zig-out/bin/nd zig-out/bin/ngui

@ -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_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 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 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(); const buildopts = b.addOptions();
buildopts.addOption(DriverTarget, "driver", drv); buildopts.addOption(DriverTarget, "driver", drv);
const semver_step = VersionStep.create(b, buildopts, inver);
const common_cflags = .{ const common_cflags = .{
"-Wall", "-Wall",
@ -28,6 +30,7 @@ pub fn build(b: *std.build.Builder) void {
ngui.setBuildMode(mode); ngui.setBuildMode(mode);
ngui.pie = true; ngui.pie = true;
ngui.strip = strip; ngui.strip = strip;
ngui.step.dependOn(semver_step);
ngui.addPackage(buildopts.getPackage("build_options")); ngui.addPackage(buildopts.getPackage("build_options"));
ngui.addIncludePath("lib"); ngui.addIncludePath("lib");
@ -88,6 +91,7 @@ pub fn build(b: *std.build.Builder) void {
nd.setBuildMode(mode); nd.setBuildMode(mode);
nd.pie = true; nd.pie = true;
nd.strip = strip; nd.strip = strip;
nd.step.dependOn(semver_step);
nd.addPackage(buildopts.getPackage("build_options")); nd.addPackage(buildopts.getPackage("build_options"));
nifbuild.addPkg(b, nd, "lib/nif"); 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 v<semver>format, 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;
};
}
};

@ -1,3 +1,4 @@
const buildopts = @import("build_options");
const std = @import("std"); const std = @import("std");
const os = std.os; const os = std.os;
const sys = os.system; 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")) { if (std.mem.eql(u8, a, "-h") or std.mem.eql(u8, a, "-help") or std.mem.eql(u8, a, "--help")) {
usage(prog) catch {}; usage(prog) catch {};
std.process.exit(1); 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")) { } else if (std.mem.eql(u8, a, "-gui")) {
lastarg = .gui; lastarg = .gui;
} else if (std.mem.eql(u8, a, "-gui-user")) { } 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 // parse program args first thing and fail fast if invalid
const args = try parseArgs(gpa); const args = try parseArgs(gpa);
defer args.deinit(gpa); defer args.deinit(gpa);
logger.info("ndg version {any}", .{buildopts.semver});
// reset the screen backlight to normal power regardless // reset the screen backlight to normal power regardless
// of its previous state. // of its previous state.

@ -1,3 +1,4 @@
const buildopts = @import("build_options");
const std = @import("std"); const std = @import("std");
const time = std.time; const time = std.time;
@ -16,6 +17,7 @@ pub const keep_sigpipe = true;
const stdin = std.io.getStdIn().reader(); const stdin = std.io.getStdIn().reader();
const stdout = std.io.getStdOut().writer(); const stdout = std.io.getStdOut().writer();
const stderr = std.io.getStdErr().writer();
const logger = std.log.scoped(.ngui); const logger = std.log.scoped(.ngui);
extern "c" fn ui_update_network_status(text: [*:0]const u8, wifi_list: ?[*:0]const u8) void; 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. /// nakamochi UI program entry point.
pub fn main() anyerror!void { 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 // main heap allocator used through the lifetime of nd
var gpa_state = std.heap.GeneralPurposeAllocator(.{}){}; var gpa_state = std.heap.GeneralPurposeAllocator(.{}){};
defer if (gpa_state.deinit()) { defer if (gpa_state.deinit()) {
logger.err("memory leaks detected", .{}); logger.err("memory leaks detected", .{});
}; };
gpa = gpa_state.allocator(); 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. // initalizes display, input driver and finally creates the user interface.
ui.init() catch |err| { ui.init() catch |err| {

@ -357,6 +357,7 @@
#define NM_SYMBOL_BITCOIN "\xEF\x8D\xB9" /* 0xF379 */ #define NM_SYMBOL_BITCOIN "\xEF\x8D\xB9" /* 0xF379 */
#define NM_SYMBOL_BITCOIN_SIGN "\xEE\x82\xB4" /* 0xE0B4 */ #define NM_SYMBOL_BITCOIN_SIGN "\xEE\x82\xB4" /* 0xE0B4 */
#define NM_SYMBOL_BOLT "\xEF\x83\xA7" /* 0xF0E7 */ #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. /*Enable handling large font and/or fonts with a lot of characters.
*The limit depends on the font size, font face and bpp. *The limit depends on the font size, font face and bpp.

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
* Size: 14 px * Size: 14 px
* Bpp: 4 * 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 #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, 0x4, 0xff, 0x40, 0x0, 0x2f, 0xf4, 0x0, 0x0,
0x2c, 0x40, 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 "" */ /* U+F067 "" */
0x0, 0x0, 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0,
0xb, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xf0, 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 = 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 = 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 = 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 = 4821, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 4893, .adv_w = 196, .box_w = 12, .box_h = 2, .ofs_x = 0, .ofs_y = 5}, {.bitmap_index = 4926, .adv_w = 196, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 4905, .adv_w = 252, .box_w = 17, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, {.bitmap_index = 4998, .adv_w = 196, .box_w = 12, .box_h = 2, .ofs_x = 0, .ofs_y = 5},
{.bitmap_index = 5016, .adv_w = 280, .box_w = 19, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, {.bitmap_index = 5010, .adv_w = 252, .box_w = 17, .box_h = 13, .ofs_x = -1, .ofs_y = -1},
{.bitmap_index = 5159, .adv_w = 224, .box_w = 16, .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 = 5263, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 5264, .adv_w = 224, .box_w = 16, .box_h = 13, .ofs_x = -1, .ofs_y = -1},
{.bitmap_index = 5361, .adv_w = 224, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 2}, {.bitmap_index = 5368, .adv_w = 224, .box_w = 14, .box_h = 14, .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 = 5466, .adv_w = 224, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 2},
{.bitmap_index = 5473, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 5522, .adv_w = 224, .box_w = 14, .box_h = 8, .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 = 5578, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 5652, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, {.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 = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 5757, .adv_w = 224, .box_w = 14, .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 = 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 = 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 = 6080, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 6165, .adv_w = 196, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 6185, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 6237, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 6270, .adv_w = 196, .box_w = 13, .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 = 6342, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 6404, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 6419, .adv_w = 196, .box_w = 12, .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 = 6509, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 6614, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 6614, .adv_w = 196, .box_w = 14, .box_h = 15, .ofs_x = -1, .ofs_y = -2},
{.bitmap_index = 6702, .adv_w = 196, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 6719, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 6780, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 6807, .adv_w = 196, .box_w = 12, .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 = 6885, .adv_w = 168, .box_w = 11, .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 = 6957, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 7049, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 7074, .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 = 7154, .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 = 7234, .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 = 7314, .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 = 7394, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 7477, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 7474, .adv_w = 280, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 7567, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 7582, .adv_w = 196, .box_w = 12, .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 = 7672, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 7778, .adv_w = 224, .box_w = 14, .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 = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 7883, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 7971, .adv_w = 168, .box_w = 11, .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 = 8054, .adv_w = 224, .box_w = 14, .box_h = 10, .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, 0x0, 0x1f72, 0xe004, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d,
0xef61, 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef61, 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77,
0xef78, 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xef78, 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1,
0xefa2, 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefa2, 0xefa3, 0xefa4, 0xefaa, 0xefb7, 0xefb8, 0xefbe, 0xefc0,
0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xefc1, 0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5,
0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf014, 0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043,
0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf06c, 0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193,
0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712, 0xf7f2 0xf194, 0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712,
0xf7f2
}; };
/*Collect the unicode lists and glyph_id offsets*/ /*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, .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
} }
}; };

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
* Size: 16 px * Size: 16 px
* Bpp: 4 * 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 #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, 0x1, 0xdf, 0xd1, 0x0, 0x1d, 0xfd, 0x10, 0x0,
0xcf, 0xd1, 0x0, 0x0, 0xcc, 0x10, 0x0, 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 "" */ /* U+F067 "" */
0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xff, 0x0, 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 = 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 = 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 = 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 = 6045, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 6136, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = 5}, {.bitmap_index = 6173, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 6150, .adv_w = 288, .box_w = 20, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, {.bitmap_index = 6264, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = 5},
{.bitmap_index = 6290, .adv_w = 320, .box_w = 22, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, {.bitmap_index = 6278, .adv_w = 288, .box_w = 20, .box_h = 14, .ofs_x = -1, .ofs_y = -1},
{.bitmap_index = 6488, .adv_w = 256, .box_w = 18, .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 = 6614, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, {.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 = 14, .box_h = 8, .ofs_x = 1, .ofs_y = 3}, {.bitmap_index = 6742, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 6798, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, {.bitmap_index = 6870, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 1, .ofs_y = 3},
{.bitmap_index = 6854, .adv_w = 288, .box_w = 20, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, {.bitmap_index = 6926, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 1, .ofs_y = 1},
{.bitmap_index = 6974, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 6982, .adv_w = 288, .box_w = 20, .box_h = 12, .ofs_x = -1, .ofs_y = 0},
{.bitmap_index = 7086, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, {.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 = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 7214, .adv_w = 256, .box_w = 16, .box_h = 16, .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 = 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 = 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 = 7615, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 7713, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 7743, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 7797, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 7841, .adv_w = 224, .box_w = 14, .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 = 7925, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 8019, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 8021, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 8147, .adv_w = 224, .box_w = 16, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, {.bitmap_index = 8147, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 8275, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 8275, .adv_w = 224, .box_w = 16, .box_h = 16, .ofs_x = -1, .ofs_y = -2},
{.bitmap_index = 8383, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 8403, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 8481, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 8511, .adv_w = 224, .box_w = 14, .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 = 8609, .adv_w = 192, .box_w = 12, .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 = 8693, .adv_w = 320, .box_w = 20, .box_h = 14, .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 = 8833, .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 = 8923, .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 = 9013, .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 = 9103, .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 = 9193, .adv_w = 288, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 9302, .adv_w = 224, .box_w = 12, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, {.bitmap_index = 9283, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = -1, .ofs_y = -1},
{.bitmap_index = 9410, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 9430, .adv_w = 224, .box_w = 12, .box_h = 18, .ofs_x = 1, .ofs_y = -3},
{.bitmap_index = 9522, .adv_w = 256, .box_w = 17, .box_h = 17, .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 = 9667, .adv_w = 256, .box_w = 16, .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 = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 9795, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 9903, .adv_w = 192, .box_w = 12, .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 = 9999, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 1} {.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, 0x0, 0x1f72, 0xe004, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d,
0xef61, 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef61, 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77,
0xef78, 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xef78, 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1,
0xefa2, 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefa2, 0xefa3, 0xefa4, 0xefaa, 0xefb7, 0xefb8, 0xefbe, 0xefc0,
0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xefc1, 0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5,
0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf014, 0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043,
0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf06c, 0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193,
0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712, 0xf7f2 0xf194, 0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712,
0xf7f2
}; };
/*Collect the unicode lists and glyph_id offsets*/ /*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, .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
} }
}; };

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
* Size: 24 px * Size: 24 px
* Bpp: 4 * 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 #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, 0x0, 0x6f, 0xfc, 0x10, 0x0, 0x0, 0x0,
0x0, 0x99, 0x10, 0x0, 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 "" */ /* U+F067 "" */
0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 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 = 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 = 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 = 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 = 12460, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 12670, .adv_w = 336, .box_w = 21, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, {.bitmap_index = 12748, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 12712, .adv_w = 432, .box_w = 29, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, {.bitmap_index = 12958, .adv_w = 336, .box_w = 21, .box_h = 4, .ofs_x = 0, .ofs_y = 8},
{.bitmap_index = 13031, .adv_w = 480, .box_w = 32, .box_h = 26, .ofs_x = -1, .ofs_y = -4}, {.bitmap_index = 13000, .adv_w = 432, .box_w = 29, .box_h = 22, .ofs_x = -1, .ofs_y = -2},
{.bitmap_index = 13447, .adv_w = 384, .box_w = 26, .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 = 13733, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 13735, .adv_w = 384, .box_w = 26, .box_h = 22, .ofs_x = -1, .ofs_y = -2},
{.bitmap_index = 13997, .adv_w = 384, .box_w = 22, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, {.bitmap_index = 14021, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 14140, .adv_w = 384, .box_w = 22, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, {.bitmap_index = 14285, .adv_w = 384, .box_w = 22, .box_h = 13, .ofs_x = 1, .ofs_y = 4},
{.bitmap_index = 14283, .adv_w = 432, .box_w = 29, .box_h = 19, .ofs_x = -1, .ofs_y = -1}, {.bitmap_index = 14428, .adv_w = 384, .box_w = 22, .box_h = 13, .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 = 14571, .adv_w = 432, .box_w = 29, .box_h = 19, .ofs_x = -1, .ofs_y = -1},
{.bitmap_index = 14823, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, {.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 = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 15111, .adv_w = 384, .box_w = 24, .box_h = 24, .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 = 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 = 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 = 16000, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 16231, .adv_w = 336, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 16288, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 16420, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 16519, .adv_w = 336, .box_w = 21, .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 = 16708, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 16883, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 16924, .adv_w = 336, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = -4},
{.bitmap_index = 17171, .adv_w = 336, .box_w = 23, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, {.bitmap_index = 17171, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 17447, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 17459, .adv_w = 336, .box_w = 23, .box_h = 24, .ofs_x = -1, .ofs_y = -3},
{.bitmap_index = 17690, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 17735, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 17900, .adv_w = 288, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 17978, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 18098, .adv_w = 480, .box_w = 30, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 18188, .adv_w = 288, .box_w = 18, .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 = 18386, .adv_w = 480, .box_w = 30, .box_h = 22, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 18644, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, {.bitmap_index = 18716, .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 = 18932, .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 = 19148, .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 = 19364, .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 = 19580, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 19818, .adv_w = 336, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = -4}, {.bitmap_index = 19796, .adv_w = 480, .box_w = 31, .box_h = 20, .ofs_x = -1, .ofs_y = -1},
{.bitmap_index = 20065, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 20106, .adv_w = 336, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = -4},
{.bitmap_index = 20317, .adv_w = 384, .box_w = 25, .box_h = 25, .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 = 20630, .adv_w = 384, .box_w = 24, .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 = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 20918, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 21161, .adv_w = 288, .box_w = 18, .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 = 21377, .adv_w = 384, .box_w = 24, .box_h = 16, .ofs_x = 0, .ofs_y = 1} {.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, 0x0, 0x1f72, 0xe004, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d,
0xef61, 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef61, 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77,
0xef78, 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xef78, 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1,
0xefa2, 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefa2, 0xefa3, 0xefa4, 0xefaa, 0xefb7, 0xefb8, 0xefbe, 0xefc0,
0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xefc1, 0xefc4, 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5,
0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf014, 0xf015, 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043,
0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf06c, 0xf074, 0xf0a8, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193,
0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712, 0xf7f2 0xf194, 0xf1d7, 0xf1e3, 0xf23d, 0xf254, 0xf2c9, 0xf4aa, 0xf712,
0xf7f2
}; };
/*Collect the unicode lists and glyph_id offsets*/ /*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, .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
} }
}; };

@ -15,6 +15,11 @@
*/ */
void nm_sys_shutdown(); 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. * 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 * 0: bitcoin
* 1: lightning * 1: lightning
* 2: settings * 2: settings
* 3: ndg build info and versioning
*/ */
lv_obj_t *tab_btc = lv_tabview_add_tab(tabview, NM_SYMBOL_BITCOIN " BITCOIN"); lv_obj_t *tab_btc = lv_tabview_add_tab(tabview, NM_SYMBOL_BITCOIN " BITCOIN");
if (tab_btc == NULL) { if (tab_btc == NULL) {
return -1; return -1;
} }
create_bitcoin_panel(tab_btc); create_bitcoin_panel(tab_btc);
lv_obj_t *tab_lnd = lv_tabview_add_tab(tabview, NM_SYMBOL_BOLT " LIGHTNING"); lv_obj_t *tab_lnd = lv_tabview_add_tab(tabview, NM_SYMBOL_BOLT " LIGHTNING");
if (tab_lnd == NULL) { if (tab_lnd == NULL) {
return -1; return -1;
} }
create_lnd_panel(tab_lnd); create_lnd_panel(tab_lnd);
lv_obj_t *tab_settings = lv_tabview_add_tab(tabview, LV_SYMBOL_SETTINGS " SETTINGS"); lv_obj_t *tab_settings = lv_tabview_add_tab(tabview, LV_SYMBOL_SETTINGS " SETTINGS");
if (tab_settings == NULL) { if (tab_settings == NULL) {
return -1; return -1;
} }
create_settings_panel(tab_settings); 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); lv_obj_add_event_cb(tabview, tab_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
return 0; return 0;
} }

@ -1,3 +1,4 @@
const buildopts = @import("build_options");
const std = @import("std"); const std = @import("std");
const lvgl = @import("lvgl.zig"); const lvgl = @import("lvgl.zig");
@ -50,3 +51,20 @@ fn poweroffModalCallback(btn_idx: usize) void {
// proceed with shutdown // proceed with shutdown
nm_sys_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 });
}

@ -6,7 +6,7 @@
FROM alpine:3.17.1 FROM alpine:3.17.1
ARG ZIGURL 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 && \ mkdir -p /tools/zig && \
cd /tools/zig && \ cd /tools/zig && \
curl -o zig.tar.xz $ZIGURL && \ curl -o zig.tar.xz $ZIGURL && \