fix: fan sensor angle handling (#14)
Angles > 360° need to be normalized. Fixes #12
This commit is contained in:
@@ -11,6 +11,7 @@ _Changes in the next release_
|
|||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Misplaced text sensors in custom panels (#11).
|
- Misplaced text sensors in custom panels (#11).
|
||||||
|
- Wrong start position for circular progress (fan) sensor using a counter-clockwise direction (#12).
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Simple sensor panel with a file-based data source (#6).
|
- Simple sensor panel with a file-based data source (#6).
|
||||||
|
|||||||
@@ -251,7 +251,6 @@ impl PanelRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Mode 2 - Circular/Arc progress indicator
|
/// Mode 2 - Circular/Arc progress indicator
|
||||||
/// TODO needs testing
|
|
||||||
fn render_fan(
|
fn render_fan(
|
||||||
&mut self,
|
&mut self,
|
||||||
sensor: &Sensor,
|
sensor: &Sensor,
|
||||||
@@ -306,7 +305,6 @@ impl PanelRenderer {
|
|||||||
(start, end)
|
(start, end)
|
||||||
} else {
|
} else {
|
||||||
// Counter-clockwise
|
// Counter-clockwise
|
||||||
// FIXME SensorDirection::RightToLeft does not yet work. Might also be related to certain minAngle / maxAngle values
|
|
||||||
let start = 360.0 - min_angle - (max_angle - min_angle) * progress - 90.0;
|
let start = 360.0 - min_angle - (max_angle - min_angle) * progress - 90.0;
|
||||||
let end = 360.0 - min_angle - 90.0;
|
let end = 360.0 - min_angle - 90.0;
|
||||||
(start, end)
|
(start, end)
|
||||||
@@ -496,8 +494,22 @@ impl PanelRenderer {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Draws a pie‐slice sector of `source` into `layer`, centered at (center_x, center_y),
|
/// Draws a pie‐slice sector of the `source` image into the `layer` destination.
|
||||||
/// from `start_deg` to `end_deg` (both in degrees), blending with alpha.
|
///
|
||||||
|
/// Pixels in the sector are alpha-blended from source into the destination layer at the given
|
||||||
|
/// center_x/center_y placement.
|
||||||
|
///
|
||||||
|
/// Positive and negative angles are supported and are automatically normalized if > +/- 360°.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `layer`: Destination layer.
|
||||||
|
/// * `source`: Source image to cut out a pie-slice sector.
|
||||||
|
/// * `center_x`: Center x position.
|
||||||
|
/// * `center_y`: Center y position.
|
||||||
|
/// * `start_deg`: Starting angle, in degrees. Angles are measured from 3 o’clock, increasing clockwise.
|
||||||
|
/// * `end_deg`: Ending angle, in degrees.
|
||||||
|
///
|
||||||
fn draw_pie_slice(
|
fn draw_pie_slice(
|
||||||
layer: &mut RgbaImage,
|
layer: &mut RgbaImage,
|
||||||
source: &RgbaImage,
|
source: &RgbaImage,
|
||||||
@@ -510,8 +522,8 @@ impl PanelRenderer {
|
|||||||
// Radius is half the smaller dimension
|
// Radius is half the smaller dimension
|
||||||
let radius = (src_w.min(src_h) as f32) / 2.0;
|
let radius = (src_w.min(src_h) as f32) / 2.0;
|
||||||
// Convert angles to radians and normalize
|
// Convert angles to radians and normalize
|
||||||
let start = start_deg.to_radians();
|
let start = (start_deg % 360f32).to_radians();
|
||||||
let end = end_deg.to_radians();
|
let end = (end_deg % 360f32).to_radians();
|
||||||
// Helper: check if angle t is between start and end (clockwise)
|
// Helper: check if angle t is between start and end (clockwise)
|
||||||
let in_sector = |t: f32| {
|
let in_sector = |t: f32| {
|
||||||
let mut a = t;
|
let mut a = t;
|
||||||
|
|||||||
Reference in New Issue
Block a user