valconomy/firmware/default.nix

70 lines
2.0 KiB
Nix
Raw Normal View History

2024-11-30 21:08:22 +00:00
{
2024-12-12 01:19:02 +00:00
perSystem = { libMy, pkgs, ... }:
let
genImgsPy = pkgs.python3.withPackages (ps: with ps; [ pillow ]);
genImgs = pkgs.writeScriptBin "gen-imgs" ''
#!${genImgsPy}/bin/python
import itertools
import os
from PIL import Image
imgs = ['bg.png']
for fname in imgs:
with Image.open(os.path.join('assets/', fname)) as img:
w = img.width
h = img.height
data = [(r >> 3) << 11 | (g >> 2) << 5 | (b >> 3) for r, g, b in img.getdata()]
basename = os.path.splitext(fname)[0]
with open(os.path.join('main/img/', basename + '.c'), 'w') as f:
f.write(
'#include <inttypes.h>\n\n'
'#include "lvgl.h"\n\n'
'static const uint16_t _data[] = {\n')
for group in itertools.batched(data, 20):
f.write(' ' + ' '.join(map(lambda i: f'{i:#x},', group)) + '\n')
f.write('};\n\n')
f.write(
f'const lv_image_dsc_t ui_img_{basename} = {{\n'
' .header.magic = LV_IMAGE_HEADER_MAGIC,\n'
' .header.cf = LV_COLOR_FORMAT_RGB565,\n'
f' .header.w = {w},\n'
f' .header.h = {h},\n'
' .data_size = sizeof(_data) * 2,\n'
' .data = (const uint8_t *)_data,\n'
'};\n')
'';
in
{
2024-11-30 21:08:22 +00:00
devenv.shells.firmware = libMy.withRootdir {
packages = with pkgs; [
esp-idf-esp32s3
picocom
2024-12-11 21:18:18 +00:00
lv_font_conv
2024-12-12 01:19:02 +00:00
genImgs
2024-11-30 21:08:22 +00:00
];
env = {
# PICO_SDK_PATH = "${pkgs.pico-sdk}/lib/pico-sdk";
};
scripts = {
init.exec = ''
idf.py set-target esp32s3
'';
2024-12-11 21:18:18 +00:00
gen-fonts.exec = ''
for s in 120; do
DEBUG='*' lv_font_conv --font assets/Tungsten-Bold.ttf --bpp 4 --size $s -r 0x20-0x7F --no-compress \
--format lvgl --lv-include lvgl.h --lv-font-name lv_font_tungsten_"$s" -o main/font/tungsten_"$s".c
done
'';
2024-11-30 21:08:22 +00:00
};
};
};
}