Skip to content

Commit

Permalink
Remove SD Card dependency (#19)
Browse files Browse the repository at this point in the history
* Various UI Fixes
* Move files to flash from sd card
* Move fontdata to flash
* Auto generate fonts for UI
* Move UI not to use SD Card
  • Loading branch information
dk307 committed Mar 26, 2023
1 parent 93305ac commit 9e7a966
Show file tree
Hide file tree
Showing 32 changed files with 3,162 additions and 525 deletions.
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@
"esp_heap_caps.h": "c",
"esp_httpd_priv.h": "c",
"esp_system.h": "c",
"hap.h": "c"
"hap.h": "c",
"ui.h": "c"
},
"C_Cpp.errorSquiggles": "disabled"
}
137 changes: 130 additions & 7 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,18 @@ var stripcomments = require('gulp-strip-comments');
var htmlminify = require('gulp-html-minifier-terser');
var minify = require('gulp-minify');
var shajs = require('sha.js');
var grun = require('gulp-run');
var log = require('fancy-log');
const sizeOfImage = require('image-size');


const baseFolder = 'static/';
const tempWebFolder = baseFolder + 'web/temp/data/';
const staticWebInclude = 'main/generated/web/include';
const staticDisplaySrc = 'main/generated/display/src';
const sdcardFolder = 'sdcard/';

// this converts to the header file
var toHeader = function(name, debug) {
return through.obj(function(source, encoding, callback) {
var parts = source.path.split(path.sep);
Expand All @@ -30,6 +35,7 @@ var toHeader = function(name, debug) {

// Generate output
var output = '';
output += '#pragma once\n';
output += '#define ' + safename + '_len ' + source.contents.length + '\n';
output += 'const char ' + safename + '_sha256[] = "' + sha + '";\n';
output += 'const uint8_t ' + safename + '[] = {';
Expand Down Expand Up @@ -59,6 +65,55 @@ var toHeader = function(name, debug) {
});
};

var toImageFile = function(name, debug) {
return through.obj(function(source, encoding, callback) {
var parts = source.path.split(path.sep);
var filename = parts[parts.length - 1];
var safename = name || filename.split('.').join('_');

// Generate output
var output = '';
output += '#include <lvgl.h>\n';
output += 'const uint8_t ' + safename + '_data[] = {';
for (var i = 0; i < source.contents.length; i++) {
if (i > 0) {
output += ',';
}
if (0 === (i % 30)) {
output += '\n';
}
output += '0x' + ('00' + source.contents[i].toString(16)).slice(-2);
}

const dimensions = sizeOfImage(source.path);

output += '\n};\n\n';
output += 'const lv_img_dsc_t ' + safename + '_img = {\n';
output += ' .header.always_zero = 0,\n';
output += ' .header.reserved = 0,\n';
output += ' .header.cf = LV_IMG_CF_RAW_ALPHA,\n';
output += ' .header.w = ' + dimensions.width + ',\n';
output += ' .header.h = ' + dimensions.height + ',\n';
output += ' .data_size = ' + source.contents.length + ',\n';
output += ' .data = ' + safename + '_data\n';
output += '};\n';

// clone the contents
var destination = source.clone();
destination.path = source.path + '.c';
destination.contents = Buffer.from(output);

if (debug) {
console.info(
'Image ' + filename + ' \tsize: ' + source.contents.length +
' bytes');
}

callback(null, destination);
});
};


gulp.task('html', function() {
return gulp.src(baseFolder + 'web/*.html')
.pipe(htmlvalidate())
Expand Down Expand Up @@ -90,37 +145,105 @@ gulp.task('js', function() {
.pipe(concat('s.js'))
.pipe(gzip({gzipOptions: {level: 9}}))
.pipe(gulp.dest(tempWebFolder))
.pipe(gulp.dest(sdcardFolder + '/web'));
.pipe(toHeader(null, true))
.pipe(gulp.dest(staticWebInclude));
});

gulp.task('js-extra', function() {
return gulp.src(baseFolder + 'web/js/extra/*.js')
.pipe(stripcomments())
.pipe(gzip({gzipOptions: {level: 9}}))
.pipe(gulp.dest(tempWebFolder))
.pipe(gulp.dest(sdcardFolder + '/web/extra'));
.pipe(toHeader(null, true))
.pipe(gulp.dest(staticWebInclude));
});

gulp.task('css', function() {
return gulp.src(baseFolder + 'web/css/*.css')
.pipe(minify())
.pipe(gzip({gzipOptions: {level: 9}}))
.pipe(gulp.dest(tempWebFolder))
.pipe(gulp.dest(sdcardFolder + '/web'));
.pipe(toHeader(null, true))
.pipe(gulp.dest(staticWebInclude));
});

gulp.task('web-images', function() {
return gulp.src(baseFolder + 'web/media/*.png')
.pipe(imagemin())
.pipe(gulp.dest(tempWebFolder))
.pipe(gulp.dest(sdcardFolder + '/web'));
.pipe(toHeader(null, true))
.pipe(gulp.dest(staticWebInclude));
});

// display fonts start
function font_create(bpp, size, font, output, symbols_and_range) {
return grun(
'node ./node_modules/lv_font_conv/lv_font_conv.js --bpp ' + bpp +
' --size ' + size + ' --force-fast-kern-format --font ' + font +
' ' + symbols_and_range + ' --format lvgl -o ' +
staticDisplaySrc + '/' + output)
.exec();
}

gulp.task('display-fonts-big-font', function() {
return font_create(
8, 165,
'./node_modules/@fontsource/montserrat/files/montserrat-all-300-normal.woff',
'big_panel_font.c', '--symbols="0,1,2,3,4,5,6,7,8,9,-"');
});

gulp.task('display-fonts-temp-hum', function() {
return font_create(
4, 72,
'./node_modules/@fontsource/montserrat/files/montserrat-all-500-normal.woff',
'temp_hum_font.c', '--symbols="0,1,2,3,4,5,6,7,8,9,F,C,°,⁒,-"');
});

gulp.task('display-fonts-40-regular-number', function() {
return font_create(
4, 40,
'./node_modules/@fontsource/montserrat/files/montserrat-all-400-normal.woff',
'regular_numbers_40_font.c', '--symbols="0,1,2,3,4,5,6,7,8,9"');
});

gulp.task('display-fonts-48-all', function() {
return font_create(
4, 48,
'./node_modules/@fontsource/montserrat/files/montserrat-all-500-normal.woff',
'all_48_font.c',
'--range=0x20-0x7F --symbols="0,1,2,3,4,5,6,7,8,9,F,µ,g,/,m,³,°,F,⁒,p,-"');
});

gulp.task('display-fonts-18-uints', function() {
return font_create(
4, 18,
'./node_modules/@fontsource/montserrat/files/montserrat-all-500-normal.woff',
'uints_18_font.c', '--symbols="C,F,µ,g,/,m,³,°,F,⁒,p,-,l,u,x,b"');
});

gulp.task('display-fonts-14-all', function() {
return font_create(
4, 14,
'./node_modules/@fontsource/montserrat/files/montserrat-all-500-normal.woff',
'all_14_font.c',
'--range=0x20-0x7F --symbols="0,1,2,3,4,5,6,7,8,9,F,µ,g,/,m,³,°,F,⁒,p,-"');
});

gulp.task(
'display-fonts',
gulp.series(
'display-fonts-big-font', 'display-fonts-temp-hum',
'display-fonts-40-regular-number', 'display-fonts-48-all',
'display-fonts-18-uints', 'display-fonts-14-all'));

// display fonts end

gulp.task('display-images', function() {
return gulp.src(baseFolder + 'display/image/*.png')
.pipe(imagemin())
.pipe(gulp.dest(tempWebFolder))
.pipe(gulp.dest(sdcardFolder + '/display/images'));
.pipe(toImageFile(null, true))
.pipe(gulp.dest(staticDisplaySrc));
});

gulp.task('display-file-copy', function() {
Expand All @@ -131,8 +254,8 @@ gulp.task('display-file-copy', function() {
gulp.task(
'default',
gulp.series(
'html', 'js', 'js-extra', 'css', 'web-images', 'display-images',
'display-file-copy'));
'html', 'js', 'js-extra', 'css', 'web-images', 'display-fonts',
'display-images', 'display-file-copy'));

gulp.task('serve', function() {
browserSync.init({server: {baseDir: baseWebFolder}});
Expand Down
17 changes: 16 additions & 1 deletion main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ idf_component_register(SRCS "main.cpp"
"hardware/display.cpp"
"hardware/hardware.cpp"
"hardware/hardware_info.cpp"
"hardware/lvgl_fs/lvgl_fs_sd_card.c"
"hardware/sps30/sps30.c"
"hardware/sps30/sps30_glue.cpp"
"hardware/sps30/sensirion_common.c"
Expand All @@ -28,6 +27,22 @@ idf_component_register(SRCS "main.cpp"
"logging/logger.cpp"
"logging/commands.cpp"
"homekit/homekit_integration.cpp"
"generated/display/src/big_panel_font.c"
"generated/display/src/temp_hum_font.c"
"generated/display/src/regular_numbers_40_font.c"
"generated/display/src/all_48_font.c"
"generated/display/src/all_14_font.c"
"generated/display/src/uints_18_font.c"
"generated/display/src/hardware.png.c"
"generated/display/src/temperature.png.c"
"generated/display/src/humidity.png.c"
"generated/display/src/factory_reset.png.c"
"generated/display/src/homekit.png.c"
"generated/display/src/logo.png.c"
"generated/display/src/nowifi.png.c"
"generated/display/src/restart.png.c"
"generated/display/src/wifi.png.c"
"generated/display/src/info.png.c"

INCLUDE_DIRS "."
REQUIRES fatfs spi_flash LovyanGFX lvgl mbedtls esp_wifi
Expand Down
2 changes: 0 additions & 2 deletions main/hardware/display.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#include "config/config_manager.h"
#include "hardware/hardware.h"
#include "logging/logging_tags.h"
#include "lvgl_fs/lvgl_fs_sd_card.h"
#include "ui/ui2.h"
#include "util/cores.h"
#include "util/default_event.h"
Expand Down Expand Up @@ -54,7 +53,6 @@ void display::start()
instance_app_common_event_.subscribe();

lv_init();
lv_fs_if_fatfs_init();

if (!display_device_.init())
{
Expand Down
4 changes: 2 additions & 2 deletions main/hardware/display.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ class display final : esp32::noncopyable
esp32::default_event_subscriber instance_app_common_event_{
APP_COMMON_EVENT, ESP_EVENT_ANY_ID, [this](esp_event_base_t base, int32_t event, void *data) { app_event_handler(base, event, data); }};

static void display_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
static void touchpad_read(lv_indev_drv_t *indev_driver, lv_indev_data_t *data);
static void IRAM_ATTR display_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
static void IRAM_ATTR touchpad_read(lv_indev_drv_t *indev_driver, lv_indev_data_t *data);
void gui_task();
void app_event_handler(esp_event_base_t, int32_t, void *);

Expand Down
2 changes: 1 addition & 1 deletion main/hardware/hardware_info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ ui_interface::information_table_type hardware::get_information_table(information
{"SSID", config::instance.get_wifi_credentials().get_user_name()},
{"Web user name", config::instance.get_web_user_credentials().get_user_name()},
{"Screen brightness (%)", esp32::string::to_string((100 * config::instance.get_manual_screen_brightness().value_or(0)) / 256)},
{"Use Fahrenheit", esp32::string::to_string(config::instance.is_use_fahrenheit())},
{"Use Fahrenheit", config::instance.is_use_fahrenheit() ? "Yes" : "No"},
};
break;
}
Expand Down
Loading

0 comments on commit 9e7a966

Please sign in to comment.