fix: text sensor placement (#13)

Fixes #11
This commit is contained in:
Markus Zehnder
2025-08-30 15:50:12 +02:00
committed by GitHub
parent 3414589bd5
commit 016942631f
2 changed files with 23 additions and 13 deletions
+9 -6
View File
@@ -9,18 +9,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
_Changes in the next release_
### Fixed
- Misplaced text sensors in custom panels (#11).
### Added
- Simple sensor panel with a file-based data source (#6)
- Initial support for fan-, progress-, & pointer-sensors (#8)
- Use [mdBook](https://rust-lang.github.io/mdBook/) for documentation and publish user guide to GitHub pages (#10)
- Simple sensor panel with a file-based data source (#6).
- Initial support for fan-, progress-, & pointer-sensors (#8).
- Use [mdBook](https://rust-lang.github.io/mdBook/) for documentation and publish user guide to GitHub pages (#10).
### Changed
- Project structure using a Cargo workspace
- Project structure using a Cargo workspace.
---
## v0.1.0 - 2025-08-02
### Added
- Initial `asterctl` tool release for controlling the LCD: on, off, display an image
- Initial `asterctl` tool release for controlling the LCD: on, off, display an image.
- systemd service file to switch off LCD on system start.
- Demo mode
- Demo mode.
+14 -7
View File
@@ -212,8 +212,10 @@ impl PanelRenderer {
};
let font_size = sensor.font_size.unwrap_or(14) as f32;
// TODO verify pixel scaling! Is font_size point size or pixel size?
// This is still a bit off compared to the original AOOSTAR-X. Only tested with HarmonyOS_Sans_SC_Bold!
let adjustment_hack = 0.7;
// TODO some font size calculation is missing, dpi scaling? internal padding?
// The adjustment hack is required to get the correct size of the rendered text.
// However, the y-position requires the regular value (see multiplication by 1.33 below)
let adjustment_hack = 0.75;
let scale = font.pt_to_px_scale(font_size * adjustment_hack).unwrap();
let text = format_value(
@@ -223,14 +225,19 @@ impl PanelRenderer {
unit,
);
let size = text_size(scale, &font, &text);
// TODO verify x & y-coordinate handling
let width = sensor.width.unwrap_or_default() as i32;
let height = sensor.height.unwrap_or_default() as i32;
let x = match sensor.text_align.unwrap_or_default() {
TextAlign::Left => sensor.x,
TextAlign::Center => sensor.x - (size.0 / 2) as i32,
TextAlign::Right => sensor.x - size.0 as i32,
TextAlign::Center => sensor.x + width / 2 - (size.0 / 2) as i32,
TextAlign::Right => sensor.x + width - size.0 as i32,
};
let y = (sensor.y as f32 - scale.y / 2f32) as i32;
// let y = sensor.y as i32 - (size.1 / 2) as i32;
// FIXME figure out font scaling factor / padding / dpi etc. See above for y-adjustment hack.
// This work quite ok for most panels, but not all!
// Some work better with `sensor.y + height / 2 - size.1 as i32;`
// The y parameter in `draw_text_mut` is still a mystery: drawing text at position (0,0)
// renders a huge gap at the top, about the size of half the font-height!?
let y = sensor.y + height / 2 - (size.1 as f32 * 1.3333 / 2f32) as i32;
debug!(
"Sensor({:03},{:03}), pixel({x:03},{y:03}), size{size:?}: {text}",