[INFO] cloning repository https://github.com/shunte88/LyMonS
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/shunte88/LyMonS" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fshunte88%2FLyMonS", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fshunte88%2FLyMonS'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] c96f0e114100d959bb815781fb659b4f53fcfcf0
[INFO] checking shunte88/LyMonS against try#54bb9bb1bbe87f59b5a2e9afea4c8cedcf5e0b47 for pr-153041
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fshunte88%2FLyMonS" "/workspace/builds/worker-6-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-6-tc2/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/shunte88/LyMonS
[INFO] finished tweaking git repo https://github.com/shunte88/LyMonS
[INFO] tweaked toml for git repo https://github.com/shunte88/LyMonS written to /workspace/builds/worker-6-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/shunte88/LyMonS on toolchain 54bb9bb1bbe87f59b5a2e9afea4c8cedcf5e0b47
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+54bb9bb1bbe87f59b5a2e9afea4c8cedcf5e0b47" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/shunte88/LyMonS already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+54bb9bb1bbe87f59b5a2e9afea4c8cedcf5e0b47" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:61361fe0aef631f17e9d025a70c5a647956f8c671dd02950a60ad3f5cc5526d7" "/opt/rustwide/cargo-home/bin/cargo" "+54bb9bb1bbe87f59b5a2e9afea4c8cedcf5e0b47" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] c3a3fb0430cba25c97a34df981da14abbe064f45b3d56d3cf1b1bdd911da990f
[INFO] running `Command { std: "docker" "start" "-a" "c3a3fb0430cba25c97a34df981da14abbe064f45b3d56d3cf1b1bdd911da990f", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "c3a3fb0430cba25c97a34df981da14abbe064f45b3d56d3cf1b1bdd911da990f", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "c3a3fb0430cba25c97a34df981da14abbe064f45b3d56d3cf1b1bdd911da990f", kill_on_drop: false }`
[INFO] [stdout] c3a3fb0430cba25c97a34df981da14abbe064f45b3d56d3cf1b1bdd911da990f
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:61361fe0aef631f17e9d025a70c5a647956f8c671dd02950a60ad3f5cc5526d7" "/opt/rustwide/cargo-home/bin/cargo" "+54bb9bb1bbe87f59b5a2e9afea4c8cedcf5e0b47" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] cfc375cab785161b0df1361f656bcf75ddc58d47caa7dbc6cc4e9e2c304d8fe2
[INFO] running `Command { std: "docker" "start" "-a" "cfc375cab785161b0df1361f656bcf75ddc58d47caa7dbc6cc4e9e2c304d8fe2", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.174
[INFO] [stderr]     Checking scopeguard v1.2.0
[INFO] [stderr]     Checking smallvec v1.15.0
[INFO] [stderr]    Compiling az v1.2.1
[INFO] [stderr]    Compiling lock_api v0.4.13
[INFO] [stderr]    Compiling memoffset v0.7.1
[INFO] [stderr]     Checking nb v1.1.0
[INFO] [stderr]     Checking embedded-hal v1.0.0
[INFO] [stderr]    Compiling serde_core v1.0.225
[INFO] [stderr]    Compiling memoffset v0.6.5
[INFO] [stderr]    Compiling slab v0.4.9
[INFO] [stderr]     Checking float-cmp v0.9.0
[INFO] [stderr]    Compiling syn v2.0.101
[INFO] [stderr]    Compiling serde v1.0.225
[INFO] [stderr]     Checking micromath v2.1.0
[INFO] [stderr]    Compiling cc v1.2.24
[INFO] [stderr]     Checking nb v0.1.3
[INFO] [stderr]     Checking void v1.0.2
[INFO] [stderr]    Compiling syn v1.0.109
[INFO] [stderr]     Checking hashbrown v0.16.1
[INFO] [stderr]     Checking embedded-hal v0.2.7
[INFO] [stderr]     Checking embedded-hal-nb v1.0.0
[INFO] [stderr]    Compiling libm v0.2.15
[INFO] [stderr]     Checking tracing-core v0.1.33
[INFO] [stderr]    Compiling proc-macro-error-attr v1.0.4
[INFO] [stderr]    Compiling embedded-hal-async v1.0.0
[INFO] [stderr]     Checking miniz_oxide v0.8.8
[INFO] [stderr]    Compiling proc-macro-error v1.0.4
[INFO] [stderr]    Compiling pulldown-cmark v0.11.3
[INFO] [stderr]     Checking bytemuck v1.23.1
[INFO] [stderr]    Compiling rustls v0.23.27
[INFO] [stderr]    Compiling slotmap v1.0.7
[INFO] [stderr]     Checking aho-corasick v1.1.3
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]     Checking tracing v0.1.41
[INFO] [stderr]    Compiling getrandom v0.3.3
[INFO] [stderr]    Compiling memchr v2.7.4
[INFO] [stderr]    Compiling unicase v2.8.1
[INFO] [stderr]     Checking display-interface v0.5.0
[INFO] [stderr]     Checking flate2 v1.1.2
[INFO] [stderr]    Compiling zerocopy v0.8.25
[INFO] [stderr]     Checking arrayvec v0.7.6
[INFO] [stderr]    Compiling bitflags v2.9.1
[INFO] [stderr]     Checking strict-num v0.1.1
[INFO] [stderr]    Compiling memoffset v0.9.1
[INFO] [stderr]     Checking either v1.15.0
[INFO] [stderr]     Checking core_maths v0.1.1
[INFO] [stderr]     Checking roxmltree v0.20.0
[INFO] [stderr]     Checking ttf-parser v0.25.1
[INFO] [stderr]     Checking indexmap v2.13.0
[INFO] [stderr]     Checking byte-slice-cast v1.2.3
[INFO] [stderr]    Compiling sh1106 v0.5.0
[INFO] [stderr]    Compiling ssd1309 v0.4.0
[INFO] [stderr]     Checking display-interface-spi v0.5.0
[INFO] [stderr]     Checking tiny-skia-path v0.11.4
[INFO] [stderr]     Checking itertools v0.7.11
[INFO] [stderr]     Checking regex-automata v0.4.9
[INFO] [stderr]     Checking fontconfig-parser v0.5.8
[INFO] [stderr]     Checking embedded-graphics-core v0.4.0
[INFO] [stderr]    Compiling ring v0.17.14
[INFO] [stderr]    Compiling nix v0.29.0
[INFO] [stderr]     Checking tinyvec v1.9.0
[INFO] [stderr]     Checking kurbo v0.11.2
[INFO] [stderr]     Checking display-interface-i2c v0.5.0
[INFO] [stderr]     Checking embedded-graphics v0.8.1
[INFO] [stderr]     Checking webpki-roots v1.0.0
[INFO] [stderr]     Checking parking_lot_core v0.9.11
[INFO] [stderr]     Checking nix v0.26.4
[INFO] [stderr]     Checking parking_lot v0.12.4
[INFO] [stderr]     Checking socket2 v0.6.0
[INFO] [stderr]     Checking mio v1.0.3
[INFO] [stderr]     Checking signal-hook-registry v1.4.5
[INFO] [stderr]     Checking nix v0.23.2
[INFO] [stderr]     Checking nix v0.27.1
[INFO] [stderr]     Checking getrandom v0.2.16
[INFO] [stderr]     Checking socket2 v0.5.9
[INFO] [stderr]     Checking gpio-cdev v0.6.0
[INFO] [stderr]     Checking memmap2 v0.9.8
[INFO] [stderr]     Checking num-integer v0.1.46
[INFO] [stderr]     Checking unicode-ccc v0.4.0
[INFO] [stderr]     Checking unicode-bidi-mirroring v0.4.0
[INFO] [stderr]    Compiling iana-time-zone v0.1.63
[INFO] [stderr]     Checking display-interface v0.4.1
[INFO] [stderr]     Checking unicode-properties v0.1.3
[INFO] [stderr]     Checking unicode-script v0.5.7
[INFO] [stderr]     Checking rand_core v0.9.3
[INFO] [stderr]    Compiling chrono v0.4.41
[INFO] [stderr]     Checking svgtypes v0.15.3
[INFO] [stderr]     Checking serde_json v1.0.145
[INFO] [stderr]     Checking png v0.17.16
[INFO] [stderr]     Checking ppv-lite86 v0.2.21
[INFO] [stderr]     Checking ssd1322 v0.3.0
[INFO] [stderr]     Checking regex v1.11.1
[INFO] [stderr]     Checking simplecss v0.2.2
[INFO] [stderr]     Checking encoding_rs v0.8.35
[INFO] [stderr]     Checking byteorder-lite v0.1.0
[INFO] [stderr]     Checking macon_api v1.3.0
[INFO] [stderr]     Checking utf8-width v0.1.7
[INFO] [stderr]     Checking xmlwriter v0.1.0
[INFO] [stderr]     Checking quick-error v2.0.1
[INFO] [stderr]     Checking pico-args v0.5.0
[INFO] [stderr]     Checking unicode-vo v0.1.0
[INFO] [stderr]     Checking zune-core v0.4.12
[INFO] [stderr]     Checking weezl v0.1.10
[INFO] [stderr]     Checking strength_reduce v0.2.4
[INFO] [stderr]    Compiling mini-moka v0.10.3
[INFO] [stderr]     Checking rustybuzz v0.20.1
[INFO] [stderr]     Checking fontdb v0.23.0
[INFO] [stderr]     Checking hashbrown v0.14.5
[INFO] [stderr]     Checking data-url v0.3.1
[INFO] [stderr]     Checking unicode-bidi v0.3.18
[INFO] [stderr]     Checking imagesize v0.13.0
[INFO] [stderr]     Checking tiny-skia v0.11.4
[INFO] [stderr]     Checking clap_builder v4.5.39
[INFO] [stderr]     Checking image-webp v0.2.3
[INFO] [stderr]     Checking zune-jpeg v0.4.19
[INFO] [stderr]     Checking gif v0.13.3
[INFO] [stderr]    Compiling synstructure v0.13.2
[INFO] [stderr]     Checking transpose v0.2.3
[INFO] [stderr]     Checking rand_chacha v0.9.0
[INFO] [stderr]     Checking html-escape v0.2.13
[INFO] [stderr]     Checking env_filter v0.1.3
[INFO] [stderr]     Checking dashmap v5.5.3
[INFO] [stderr]     Checking crossbeam-channel v0.5.15
[INFO] [stderr]     Checking primal-check v0.3.4
[INFO] [stderr]     Checking dirs-sys-next v0.1.2
[INFO] [stderr]     Checking rgb v0.8.51
[INFO] [stderr]    Compiling LyMonS v0.2.8 (/opt/rustwide/workdir)
[INFO] [stderr]     Checking num-complex v0.4.6
[INFO] [stderr]     Checking spidev v0.6.0
[INFO] [stderr]     Checking i2cdev v0.6.1
[INFO] [stderr]     Checking embedded-dma v0.2.0
[INFO] [stderr]     Checking unsafe-libyaml v0.2.11
[INFO] [stderr]     Checking jiff v0.2.14
[INFO] [stderr]     Checking object-chain v0.1.3
[INFO] [stderr]     Checking triomphe v0.1.14
[INFO] [stderr]     Checking urlencoding v2.1.3
[INFO] [stderr]     Checking tagptr v0.2.0
[INFO] [stderr]     Checking sysfs_gpio v0.6.2
[INFO] [stderr]     Checking embedded-text v0.7.2
[INFO] [stderr]     Checking usvg v0.45.1
[INFO] [stderr]     Checking env v1.0.1
[INFO] [stderr]     Checking embedded-graphics-framebuf v0.5.0
[INFO] [stderr]     Checking dirs-next v2.0.0
[INFO] [stderr]     Checking rand v0.9.2
[INFO] [stderr]     Checking async-compression v0.4.25
[INFO] [stderr]     Checking rustls-webpki v0.103.3
[INFO] [stderr]     Checking libloading v0.8.9
[INFO] [stderr]     Checking rustfft v6.4.0
[INFO] [stderr]     Checking mac_address v1.1.8
[INFO] [stderr]    Compiling maybe-async-cfg v0.2.4
[INFO] [stderr]    Compiling zerofrom-derive v0.1.6
[INFO] [stderr]    Compiling yoke-derive v0.8.0
[INFO] [stderr]    Compiling thiserror-impl v2.0.12
[INFO] [stderr]    Compiling zerovec-derive v0.11.1
[INFO] [stderr]    Compiling displaydoc v0.2.5
[INFO] [stderr]    Compiling tokio-macros v2.5.0
[INFO] [stderr]    Compiling futures-macro v0.3.31
[INFO] [stderr]    Compiling serde_derive v1.0.225
[INFO] [stderr]    Compiling macon_derive v1.3.0
[INFO] [stderr]    Compiling clap_derive v4.5.32
[INFO] [stderr]     Checking resvg v0.45.1
[INFO] [stderr]     Checking tokio v1.47.1
[INFO] [stderr]     Checking macon v1.3.0
[INFO] [stderr]     Checking ssd1306 v0.10.0
[INFO] [stderr]     Checking futures-util v0.3.31
[INFO] [stderr]     Checking zerofrom v0.1.6
[INFO] [stderr]     Checking thiserror v2.0.12
[INFO] [stderr]     Checking unescaper v0.1.6
[INFO] [stderr]     Checking yoke v0.8.0
[INFO] [stderr]     Checking serialport v4.7.3
[INFO] [stderr]     Checking clap v4.5.39
[INFO] [stderr]     Checking linux-embedded-hal v0.4.0
[INFO] [stderr]     Checking zerovec v0.11.2
[INFO] [stderr]     Checking zerotrie v0.2.2
[INFO] [stderr]     Checking lymons-driver-ssd1309 v1.0.0 (/opt/rustwide/workdir/drivers/lymons-driver-ssd1309)
[INFO] [stderr]     Checking lymons-driver-ssd1306 v1.0.0 (/opt/rustwide/workdir/drivers/lymons-driver-ssd1306)
[INFO] [stderr]     Checking lymons-driver-ssd1322 v1.0.0 (/opt/rustwide/workdir/drivers/lymons-driver-ssd1322)
[INFO] [stderr]     Checking lymons-driver-sh1106 v1.0.0 (/opt/rustwide/workdir/drivers/lymons-driver-sh1106)
[INFO] [stderr]     Checking env_logger v0.11.8
[INFO] [stderr]     Checking tinystr v0.8.1
[INFO] [stderr]     Checking potential_utf v0.1.2
[INFO] [stderr]     Checking icu_collections v2.0.0
[INFO] [stderr]     Checking icu_locale_core v2.0.0
[INFO] [stderr]     Checking serde_urlencoded v0.7.1
[INFO] [stderr]     Checking serde_yaml v0.9.34+deprecated
[INFO] [stderr]    Compiling neli-proc-macros v0.1.4
[INFO] [stderr]     Checking futures-executor v0.3.31
[INFO] [stderr]     Checking futures v0.3.31
[INFO] [stderr]     Checking icu_provider v2.0.0
[INFO] [stderr]     Checking icu_normalizer v2.0.0
[INFO] [stderr]     Checking icu_properties v2.0.1
[INFO] [stderr]     Checking neli v0.6.5
[INFO] [stderr]     Checking idna_adapter v1.2.1
[INFO] [stderr]     Checking idna v1.0.3
[INFO] [stderr]     Checking url v2.5.4
[INFO] [stderr]     Checking tokio-util v0.7.15
[INFO] [stderr]     Checking tower v0.5.2
[INFO] [stderr]     Checking tokio-rustls v0.26.2
[INFO] [stderr]     Checking local-ip-address v0.6.5
[INFO] [stderr]     Checking tower-http v0.6.6
[INFO] [stderr]     Checking h2 v0.4.10
[INFO] [stderr]     Checking hyper v1.6.0
[INFO] [stderr]     Checking hyper-util v0.1.12
[INFO] [stderr]     Checking hyper-rustls v0.27.6
[INFO] [stderr]     Checking reqwest v0.12.23
[INFO] [stderr]     Checking translators v0.1.5
[INFO] [stdout] warning: unused imports: `Local` and `Timelike`
[INFO] [stdout]   --> src/main.rs:34:14
[INFO] [stdout]    |
[INFO] [stdout] 34 | use chrono::{Timelike, Local};
[INFO] [stdout]    |              ^^^^^^^^  ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Deserialize` and `Serialize`
[INFO] [stdout]  --> src/config.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use serde::{Deserialize, Serialize};
[INFO] [stdout]   |             ^^^^^^^^^^^  ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `c_void`
[INFO] [stdout]   --> src/display/plugin/ffi.rs:30:16
[INFO] [stdout]    |
[INFO] [stdout] 30 | use std::ffi::{c_void, c_char};
[INFO] [stdout]    |                ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::os::raw::c_int`
[INFO] [stdout]   --> src/display/plugin/ffi.rs:31:5
[INFO] [stdout]    |
[INFO] [stdout] 31 | use std::os::raw::c_int;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::ffi::CStr`
[INFO] [stdout]   --> src/display/plugin/loader.rs:25:5
[INFO] [stdout]    |
[INFO] [stdout] 25 | use std::ffi::CStr;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `LyMonsBusConfig`, `LyMonsBusType`, `LyMonsColorDepth`, `LyMonsDisplayCapabilities`, `LyMonsDisplayConfig`, `LyMonsDriverHandle`, `LyMonsErrorCode`, `LyMonsError`, and `LyMonsPluginVTable`
[INFO] [stdout]   --> src/display/plugin/mod.rs:65:5
[INFO] [stdout]    |
[INFO] [stdout] 65 |     LyMonsPluginVTable,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 66 |     LyMonsDriverHandle,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 67 |     LyMonsErrorCode,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 68 |     LyMonsError,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 69 |     LyMonsDisplayConfig,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 70 |     LyMonsDisplayCapabilities,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 71 |     LyMonsBusConfig,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 72 |     LyMonsBusType,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 73 |     LyMonsColorDepth,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `LoadedPlugin`
[INFO] [stdout]   --> src/display/plugin/mod.rs:76:32
[INFO] [stdout]    |
[INFO] [stdout] 76 | pub use loader::{PluginLoader, LoadedPlugin};
[INFO] [stdout]    |                                ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PageLayout`
[INFO] [stdout]   --> src/display/manager.rs:41:5
[INFO] [stdout]    |
[INFO] [stdout] 41 |     PageLayout,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `embedded_graphics::Pixel`
[INFO] [stdout]     --> src/display/manager.rs:1422:13
[INFO] [stdout]      |
[INFO] [stdout] 1422 |         use embedded_graphics::Pixel;
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `embedded_graphics::Pixel`
[INFO] [stdout]     --> src/display/manager.rs:1577:13
[INFO] [stdout]      |
[INFO] [stdout] 1577 |         use embedded_graphics::Pixel;
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `PrimitiveStyle` and `Rectangle as EgRect`
[INFO] [stdout]     --> src/display/manager.rs:1755:45
[INFO] [stdout]      |
[INFO] [stdout] 1755 |         use embedded_graphics::primitives::{PrimitiveStyle, Rectangle as EgRect};
[INFO] [stdout]      |                                             ^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Line`
[INFO] [stdout]    --> src/display/components/status_bar.rs:230:45
[INFO] [stdout]     |
[INFO] [stdout] 230 |         use embedded_graphics::primitives::{Line};
[INFO] [stdout]     |                                             ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `embedded_graphics::text::TextStyle`
[INFO] [stdout]   --> src/display/components/scrollers.rs:26:5
[INFO] [stdout]    |
[INFO] [stdout] 26 | use embedded_graphics::text::TextStyle;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `GetPixel`
[INFO] [stdout]    --> src/display/components/clock.rs:271:47
[INFO] [stdout]     |
[INFO] [stdout] 271 |         use embedded_graphics::image::{Image, GetPixel};
[INFO] [stdout]     |                                               ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `embedded_graphics::primitives::Rectangle as EgRectangle`
[INFO] [stdout]    --> src/display/components/clock.rs:296:13
[INFO] [stdout]     |
[INFO] [stdout] 296 |         use embedded_graphics::primitives::Rectangle as EgRectangle;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PrimitiveStyleBuilder`
[INFO] [stdout]   --> src/display/components/visualizer.rs:26:53
[INFO] [stdout]    |
[INFO] [stdout] 26 | use embedded_graphics::primitives::{PrimitiveStyle, PrimitiveStyleBuilder};
[INFO] [stdout]    |                                                     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `ConvertColor`
[INFO] [stdout]   --> src/display/components/visualizer.rs:31:35
[INFO] [stdout]    |
[INFO] [stdout] 31 | use crate::display::color_proxy::{ConvertColor};
[INFO] [stdout]    |                                   ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `primitives::Rectangle`
[INFO] [stdout]   --> src/display/components/easter_eggs.rs:29:5
[INFO] [stdout]    |
[INFO] [stdout] 29 |     primitives::Rectangle,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `FieldType`
[INFO] [stdout]   --> src/display/layout_manager.rs:24:27
[INFO] [stdout]    |
[INFO] [stdout] 24 | use super::field::{Field, FieldType};
[INFO] [stdout]    |                           ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DrawableDisplay`
[INFO] [stdout]   --> src/display/mod.rs:71:33
[INFO] [stdout]    |
[INFO] [stdout] 71 | pub use traits::{DisplayDriver, DrawableDisplay, DisplayCapabilities, ColorDepth};
[INFO] [stdout]    |                                 ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DisplayFactoryError`
[INFO] [stdout]   --> src/display/mod.rs:72:31
[INFO] [stdout]    |
[INFO] [stdout] 72 | pub use error::{DisplayError, DisplayFactoryError};
[INFO] [stdout]    |                               ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `AssetType`, `FontSize`, and `LayoutCategory`
[INFO] [stdout]   --> src/display/mod.rs:75:32
[INFO] [stdout]    |
[INFO] [stdout] 75 | pub use layout::{LayoutConfig, LayoutCategory, AssetType, FontSize};
[INFO] [stdout]    |                                ^^^^^^^^^^^^^^  ^^^^^^^^^  ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `FieldType`
[INFO] [stdout]   --> src/display/mod.rs:77:24
[INFO] [stdout]    |
[INFO] [stdout] 77 | pub use field::{Field, FieldType};
[INFO] [stdout]    |                        ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `ColorValue` and `Color`
[INFO] [stdout]   --> src/display/mod.rs:80:17
[INFO] [stdout]    |
[INFO] [stdout] 80 | pub use color::{Color, ColorValue};
[INFO] [stdout]    |                 ^^^^^  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `drivers::ssd1306::Ssd1306Driver`
[INFO] [stdout]    --> src/display/mod.rs:100:9
[INFO] [stdout]     |
[INFO] [stdout] 100 | pub use drivers::ssd1306::Ssd1306Driver;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `drivers::ssd1309::Ssd1309Driver`
[INFO] [stdout]    --> src/display/mod.rs:103:9
[INFO] [stdout]     |
[INFO] [stdout] 103 | pub use drivers::ssd1309::Ssd1309Driver;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `drivers::ssd1322::Ssd1322Driver`
[INFO] [stdout]    --> src/display/mod.rs:106:9
[INFO] [stdout]     |
[INFO] [stdout] 106 | pub use drivers::ssd1322::Ssd1322Driver;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `drivers::sh1106::Sh1106Driver`
[INFO] [stdout]    --> src/display/mod.rs:109:9
[INFO] [stdout]     |
[INFO] [stdout] 109 | pub use drivers::sh1106::Sh1106Driver;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `FixedOffset` and `Utc`
[INFO] [stdout]   --> src/weather.rs:32:31
[INFO] [stdout]    |
[INFO] [stdout] 32 | use chrono::{DateTime, Local, FixedOffset, Utc};
[INFO] [stdout]    |                               ^^^^^^^^^^^  ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `BinaryColor` and `PixelColor`
[INFO] [stdout]   --> src/vision.rs:47:18
[INFO] [stdout]    |
[INFO] [stdout] 47 |     pixelcolor::{BinaryColor, PixelColor},
[INFO] [stdout]    |                  ^^^^^^^^^^^  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `LEVEL_DECAY_STEPS_PER_FRAME`
[INFO] [stdout]   --> src/visualizer.rs:42:5
[INFO] [stdout]    |
[INFO] [stdout] 42 |     LEVEL_DECAY_STEPS_PER_FRAME,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `warn`
[INFO] [stdout]   --> src/vuphysics_new.rs:71:11
[INFO] [stdout]    |
[INFO] [stdout] 71 | use log::{warn};
[INFO] [stdout]    |           ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Local` and `Timelike`
[INFO] [stdout]   --> src/main.rs:34:14
[INFO] [stdout]    |
[INFO] [stdout] 34 | use chrono::{Timelike, Local};
[INFO] [stdout]    |              ^^^^^^^^  ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Deserialize` and `Serialize`
[INFO] [stdout]  --> src/config.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use serde::{Deserialize, Serialize};
[INFO] [stdout]   |             ^^^^^^^^^^^  ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `c_void`
[INFO] [stdout]   --> src/display/plugin/ffi.rs:30:16
[INFO] [stdout]    |
[INFO] [stdout] 30 | use std::ffi::{c_void, c_char};
[INFO] [stdout]    |                ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::os::raw::c_int`
[INFO] [stdout]   --> src/display/plugin/ffi.rs:31:5
[INFO] [stdout]    |
[INFO] [stdout] 31 | use std::os::raw::c_int;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::ffi::CStr`
[INFO] [stdout]   --> src/display/plugin/loader.rs:25:5
[INFO] [stdout]    |
[INFO] [stdout] 25 | use std::ffi::CStr;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `LyMonsBusConfig`, `LyMonsBusType`, `LyMonsColorDepth`, `LyMonsDisplayCapabilities`, `LyMonsDisplayConfig`, `LyMonsDriverHandle`, `LyMonsErrorCode`, `LyMonsError`, and `LyMonsPluginVTable`
[INFO] [stdout]   --> src/display/plugin/mod.rs:65:5
[INFO] [stdout]    |
[INFO] [stdout] 65 |     LyMonsPluginVTable,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 66 |     LyMonsDriverHandle,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 67 |     LyMonsErrorCode,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 68 |     LyMonsError,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 69 |     LyMonsDisplayConfig,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 70 |     LyMonsDisplayCapabilities,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 71 |     LyMonsBusConfig,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 72 |     LyMonsBusType,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 73 |     LyMonsColorDepth,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `LoadedPlugin`
[INFO] [stdout]   --> src/display/plugin/mod.rs:76:32
[INFO] [stdout]    |
[INFO] [stdout] 76 | pub use loader::{PluginLoader, LoadedPlugin};
[INFO] [stdout]    |                                ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PageLayout`
[INFO] [stdout]   --> src/display/manager.rs:41:5
[INFO] [stdout]    |
[INFO] [stdout] 41 |     PageLayout,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `embedded_graphics::Pixel`
[INFO] [stdout]     --> src/display/manager.rs:1422:13
[INFO] [stdout]      |
[INFO] [stdout] 1422 |         use embedded_graphics::Pixel;
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `embedded_graphics::Pixel`
[INFO] [stdout]     --> src/display/manager.rs:1577:13
[INFO] [stdout]      |
[INFO] [stdout] 1577 |         use embedded_graphics::Pixel;
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `PrimitiveStyle` and `Rectangle as EgRect`
[INFO] [stdout]     --> src/display/manager.rs:1755:45
[INFO] [stdout]      |
[INFO] [stdout] 1755 |         use embedded_graphics::primitives::{PrimitiveStyle, Rectangle as EgRect};
[INFO] [stdout]      |                                             ^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Line`
[INFO] [stdout]    --> src/display/components/status_bar.rs:230:45
[INFO] [stdout]     |
[INFO] [stdout] 230 |         use embedded_graphics::primitives::{Line};
[INFO] [stdout]     |                                             ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `embedded_graphics::text::TextStyle`
[INFO] [stdout]   --> src/display/components/scrollers.rs:26:5
[INFO] [stdout]    |
[INFO] [stdout] 26 | use embedded_graphics::text::TextStyle;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `GetPixel`
[INFO] [stdout]    --> src/display/components/clock.rs:271:47
[INFO] [stdout]     |
[INFO] [stdout] 271 |         use embedded_graphics::image::{Image, GetPixel};
[INFO] [stdout]     |                                               ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `embedded_graphics::primitives::Rectangle as EgRectangle`
[INFO] [stdout]    --> src/display/components/clock.rs:296:13
[INFO] [stdout]     |
[INFO] [stdout] 296 |         use embedded_graphics::primitives::Rectangle as EgRectangle;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PrimitiveStyleBuilder`
[INFO] [stdout]   --> src/display/components/visualizer.rs:26:53
[INFO] [stdout]    |
[INFO] [stdout] 26 | use embedded_graphics::primitives::{PrimitiveStyle, PrimitiveStyleBuilder};
[INFO] [stdout]    |                                                     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `ConvertColor`
[INFO] [stdout]   --> src/display/components/visualizer.rs:31:35
[INFO] [stdout]    |
[INFO] [stdout] 31 | use crate::display::color_proxy::{ConvertColor};
[INFO] [stdout]    |                                   ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `primitives::Rectangle`
[INFO] [stdout]   --> src/display/components/easter_eggs.rs:29:5
[INFO] [stdout]    |
[INFO] [stdout] 29 |     primitives::Rectangle,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `FieldType`
[INFO] [stdout]   --> src/display/layout_manager.rs:24:27
[INFO] [stdout]    |
[INFO] [stdout] 24 | use super::field::{Field, FieldType};
[INFO] [stdout]    |                           ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DrawableDisplay`
[INFO] [stdout]   --> src/display/mod.rs:71:33
[INFO] [stdout]    |
[INFO] [stdout] 71 | pub use traits::{DisplayDriver, DrawableDisplay, DisplayCapabilities, ColorDepth};
[INFO] [stdout]    |                                 ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DisplayFactoryError`
[INFO] [stdout]   --> src/display/mod.rs:72:31
[INFO] [stdout]    |
[INFO] [stdout] 72 | pub use error::{DisplayError, DisplayFactoryError};
[INFO] [stdout]    |                               ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `AssetType`, `FontSize`, and `LayoutCategory`
[INFO] [stdout]   --> src/display/mod.rs:75:32
[INFO] [stdout]    |
[INFO] [stdout] 75 | pub use layout::{LayoutConfig, LayoutCategory, AssetType, FontSize};
[INFO] [stdout]    |                                ^^^^^^^^^^^^^^  ^^^^^^^^^  ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `FieldType`
[INFO] [stdout]   --> src/display/mod.rs:77:24
[INFO] [stdout]    |
[INFO] [stdout] 77 | pub use field::{Field, FieldType};
[INFO] [stdout]    |                        ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `ColorValue` and `Color`
[INFO] [stdout]   --> src/display/mod.rs:80:17
[INFO] [stdout]    |
[INFO] [stdout] 80 | pub use color::{Color, ColorValue};
[INFO] [stdout]    |                 ^^^^^  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `drivers::ssd1306::Ssd1306Driver`
[INFO] [stdout]    --> src/display/mod.rs:100:9
[INFO] [stdout]     |
[INFO] [stdout] 100 | pub use drivers::ssd1306::Ssd1306Driver;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `drivers::ssd1309::Ssd1309Driver`
[INFO] [stdout]    --> src/display/mod.rs:103:9
[INFO] [stdout]     |
[INFO] [stdout] 103 | pub use drivers::ssd1309::Ssd1309Driver;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `drivers::ssd1322::Ssd1322Driver`
[INFO] [stdout]    --> src/display/mod.rs:106:9
[INFO] [stdout]     |
[INFO] [stdout] 106 | pub use drivers::ssd1322::Ssd1322Driver;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `drivers::sh1106::Sh1106Driver`
[INFO] [stdout]    --> src/display/mod.rs:109:9
[INFO] [stdout]     |
[INFO] [stdout] 109 | pub use drivers::sh1106::Sh1106Driver;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `FixedOffset` and `Utc`
[INFO] [stdout]   --> src/weather.rs:32:31
[INFO] [stdout]    |
[INFO] [stdout] 32 | use chrono::{DateTime, Local, FixedOffset, Utc};
[INFO] [stdout]    |                               ^^^^^^^^^^^  ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `BinaryColor` and `PixelColor`
[INFO] [stdout]   --> src/vision.rs:47:18
[INFO] [stdout]    |
[INFO] [stdout] 47 |     pixelcolor::{BinaryColor, PixelColor},
[INFO] [stdout]    |                  ^^^^^^^^^^^  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `LEVEL_DECAY_STEPS_PER_FRAME`
[INFO] [stdout]   --> src/visualizer.rs:42:5
[INFO] [stdout]    |
[INFO] [stdout] 42 |     LEVEL_DECAY_STEPS_PER_FRAME,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `warn`
[INFO] [stdout]   --> src/vuphysics_new.rs:71:11
[INFO] [stdout]    |
[INFO] [stdout] 71 | use log::{warn};
[INFO] [stdout]    |           ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/visualizer.rs:172:9
[INFO] [stdout]     |
[INFO] [stdout] 172 |     let mut peak_hold_l: u8 = 0;
[INFO] [stdout]     |         ----^^^^^^^^^^^
[INFO] [stdout]     |         |
[INFO] [stdout]     |         help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/visualizer.rs:173:9
[INFO] [stdout]     |
[INFO] [stdout] 173 |     let mut peak_hold_r: u8 = 0;
[INFO] [stdout]     |         ----^^^^^^^^^^^
[INFO] [stdout]     |         |
[INFO] [stdout]     |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/visualizer.rs:174:9
[INFO] [stdout]     |
[INFO] [stdout] 174 |     let mut peak_hold_m: u8 = 0;
[INFO] [stdout]     |         ----^^^^^^^^^^^
[INFO] [stdout]     |         |
[INFO] [stdout]     |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/visualizer.rs:172:9
[INFO] [stdout]     |
[INFO] [stdout] 172 |     let mut peak_hold_l: u8 = 0;
[INFO] [stdout]     |         ----^^^^^^^^^^^
[INFO] [stdout]     |         |
[INFO] [stdout]     |         help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/visualizer.rs:173:9
[INFO] [stdout]     |
[INFO] [stdout] 173 |     let mut peak_hold_r: u8 = 0;
[INFO] [stdout]     |         ----^^^^^^^^^^^
[INFO] [stdout]     |         |
[INFO] [stdout]     |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/visualizer.rs:174:9
[INFO] [stdout]     |
[INFO] [stdout] 174 |     let mut peak_hold_m: u8 = 0;
[INFO] [stdout]     |         ----^^^^^^^^^^^
[INFO] [stdout]     |         |
[INFO] [stdout]     |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `inverted`
[INFO] [stdout]    --> src/display/traits.rs:111:30
[INFO] [stdout]     |
[INFO] [stdout] 111 |     fn set_invert(&mut self, inverted: bool) -> Result<(), DisplayError> {
[INFO] [stdout]     |                              ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_inverted`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `inverted`
[INFO] [stdout]    --> src/display/traits.rs:111:30
[INFO] [stdout]     |
[INFO] [stdout] 111 |     fn set_invert(&mut self, inverted: bool) -> Result<(), DisplayError> {
[INFO] [stdout]     |                              ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_inverted`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `poll_handle`
[INFO] [stdout]     --> src/display/manager.rs:3090:14
[INFO] [stdout]      |
[INFO] [stdout] 3090 |         let (poll_handle, weather_rx) = weather.start_polling_with_watch().await
[INFO] [stdout]      |              ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_poll_handle`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `poll_handle`
[INFO] [stdout]     --> src/display/manager.rs:3090:14
[INFO] [stdout]      |
[INFO] [stdout] 3090 |         let (poll_handle, weather_rx) = weather.start_polling_with_watch().await
[INFO] [stdout]      |              ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_poll_handle`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `target`
[INFO] [stdout]   --> src/display/components/weather.rs:99:29
[INFO] [stdout]    |
[INFO] [stdout] 99 |     pub fn render<D>(&self, target: &mut D) -> Result<(), D::Error>
[INFO] [stdout]    |                             ^^^^^^ help: if this is intentional, prefix it with an underscore: `_target`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `target`
[INFO] [stdout]   --> src/display/components/weather.rs:99:29
[INFO] [stdout]    |
[INFO] [stdout] 99 |     pub fn render<D>(&self, target: &mut D) -> Result<(), D::Error>
[INFO] [stdout]    |                             ^^^^^^ help: if this is intentional, prefix it with an underscore: `_target`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `viz`
[INFO] [stdout]     --> src/display/components/visualizer.rs:1248:9
[INFO] [stdout]      |
[INFO] [stdout] 1248 |         viz: &mut Visual,
[INFO] [stdout]      |         ^^^ help: if this is intentional, prefix it with an underscore: `_viz`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `field`
[INFO] [stdout]   --> src/display/components/easter_eggs.rs:81:9
[INFO] [stdout]    |
[INFO] [stdout] 81 |         field: &Field,
[INFO] [stdout]    |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_field`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `field`
[INFO] [stdout]    --> src/display/components/easter_eggs.rs:139:9
[INFO] [stdout]     |
[INFO] [stdout] 139 |         field: &Field,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_field`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `field`
[INFO] [stdout]    --> src/display/components/easter_eggs.rs:178:9
[INFO] [stdout]     |
[INFO] [stdout] 178 |         field: &Field,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_field`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `viz`
[INFO] [stdout]     --> src/display/components/visualizer.rs:1248:9
[INFO] [stdout]      |
[INFO] [stdout] 1248 |         viz: &mut Visual,
[INFO] [stdout]      |         ^^^ help: if this is intentional, prefix it with an underscore: `_viz`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `field`
[INFO] [stdout]   --> src/display/components/easter_eggs.rs:81:9
[INFO] [stdout]    |
[INFO] [stdout] 81 |         field: &Field,
[INFO] [stdout]    |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_field`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `field`
[INFO] [stdout]    --> src/display/components/easter_eggs.rs:139:9
[INFO] [stdout]     |
[INFO] [stdout] 139 |         field: &Field,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_field`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `field`
[INFO] [stdout]    --> src/display/components/easter_eggs.rs:178:9
[INFO] [stdout]     |
[INFO] [stdout] 178 |         field: &Field,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_field`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `parse_f64`
[INFO] [stdout]    --> src/sliminfo.rs:262:13
[INFO] [stdout]     |
[INFO] [stdout] 262 |         let parse_f64 = |s: &Option<String>| {
[INFO] [stdout]     |             ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_parse_f64`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `parse_f64`
[INFO] [stdout]    --> src/sliminfo.rs:262:13
[INFO] [stdout]     |
[INFO] [stdout] 262 |         let parse_f64 = |s: &Option<String>| {
[INFO] [stdout]     |             ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_parse_f64`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `top_scale`
[INFO] [stdout]    --> src/vision.rs:287:5
[INFO] [stdout]     |
[INFO] [stdout] 287 |     top_scale: i32,
[INFO] [stdout]     |     ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_top_scale`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `bottom_scale`
[INFO] [stdout]    --> src/vision.rs:288:5
[INFO] [stdout]     |
[INFO] [stdout] 288 |     bottom_scale: i32, 
[INFO] [stdout]     |     ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_bottom_scale`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `peak_hold_l`
[INFO] [stdout]    --> src/visualizer.rs:172:9
[INFO] [stdout]     |
[INFO] [stdout] 172 |     let mut peak_hold_l: u8 = 0;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_peak_hold_l`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `peak_hold_r`
[INFO] [stdout]    --> src/visualizer.rs:173:9
[INFO] [stdout]     |
[INFO] [stdout] 173 |     let mut peak_hold_r: u8 = 0;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_peak_hold_r`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `peak_hold_m`
[INFO] [stdout]    --> src/visualizer.rs:174:9
[INFO] [stdout]     |
[INFO] [stdout] 174 |     let mut peak_hold_m: u8 = 0;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_peak_hold_m`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `top_scale`
[INFO] [stdout]    --> src/vision.rs:287:5
[INFO] [stdout]     |
[INFO] [stdout] 287 |     top_scale: i32,
[INFO] [stdout]     |     ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_top_scale`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `bottom_scale`
[INFO] [stdout]    --> src/vision.rs:288:5
[INFO] [stdout]     |
[INFO] [stdout] 288 |     bottom_scale: i32, 
[INFO] [stdout]     |     ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_bottom_scale`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `peak_hold_l`
[INFO] [stdout]    --> src/visualizer.rs:172:9
[INFO] [stdout]     |
[INFO] [stdout] 172 |     let mut peak_hold_l: u8 = 0;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_peak_hold_l`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `peak_hold_r`
[INFO] [stdout]    --> src/visualizer.rs:173:9
[INFO] [stdout]     |
[INFO] [stdout] 173 |     let mut peak_hold_r: u8 = 0;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_peak_hold_r`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `peak_hold_m`
[INFO] [stdout]    --> src/visualizer.rs:174:9
[INFO] [stdout]     |
[INFO] [stdout] 174 |     let mut peak_hold_m: u8 = 0;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_peak_hold_m`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `i2c_bus_path`
[INFO] [stdout]    --> src/main.rs:932:9
[INFO] [stdout]     |
[INFO] [stdout] 932 |     let i2c_bus_path = matches.get_one::<String>("i2c-bus").unwrap();
[INFO] [stdout]     |         ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_i2c_bus_path`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `unified_display_loop` is never used
[INFO] [stdout]   --> src/main.rs:89:10
[INFO] [stdout]    |
[INFO] [stdout] 89 | async fn unified_display_loop(
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ConfigError` is never used
[INFO] [stdout]  --> src/config.rs:9:10
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub enum ConfigError {
[INFO] [stdout]   |          ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load` is never used
[INFO] [stdout]   --> src/config.rs:75:8
[INFO] [stdout]    |
[INFO] [stdout] 75 | pub fn load() -> Result<Config, ConfigError> {
[INFO] [stdout]    |        ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `find_config_file` is never used
[INFO] [stdout]    --> src/config.rs:114:4
[INFO] [stdout]     |
[INFO] [stdout] 114 | fn find_config_file() -> Option<PathBuf> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `read_yaml` is never used
[INFO] [stdout]    --> src/config.rs:130:4
[INFO] [stdout]     |
[INFO] [stdout] 130 | fn read_yaml(path: &Path) -> Result<Config, ConfigError> {
[INFO] [stdout]     |    ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `merge` is never used
[INFO] [stdout]    --> src/config.rs:137:4
[INFO] [stdout]     |
[INFO] [stdout] 137 | fn merge(dst: &mut Config, src: Config) {
[INFO] [stdout]     |    ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `merge_display` is never used
[INFO] [stdout]    --> src/config.rs:148:4
[INFO] [stdout]     |
[INFO] [stdout] 148 | fn merge_display(dst: &mut DisplayConfig, src: DisplayConfig) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `apply_cli_overrides` is never used
[INFO] [stdout]    --> src/config.rs:158:4
[INFO] [stdout]     |
[INFO] [stdout] 158 | fn apply_cli_overrides(cfg: &mut Config, cli: &Cli) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate` is never used
[INFO] [stdout]    --> src/config.rs:177:4
[INFO] [stdout]     |
[INFO] [stdout] 177 | fn validate(cfg: &Config) -> Result<(), ConfigError> {
[INFO] [stdout]     |    ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEG_TO_RAD` is never used
[INFO] [stdout]   --> src/trig.rs:28:11
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub const DEG_TO_RAD: f32 = core::f32::consts::PI / 180.0;
[INFO] [stdout]    |           ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RAD_TO_DEG` is never used
[INFO] [stdout]   --> src/trig.rs:29:11
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub const RAD_TO_DEG: f32 = 180.0 / core::f32::consts::PI;
[INFO] [stdout]    |           ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `Draw` is never constructed
[INFO] [stdout]   --> src/drawsvg.rs:40:5
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub enum PutSvgError<DE> {
[INFO] [stdout]    |          ----------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 40 |     Draw(DE),
[INFO] [stdout]    |     ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PutSvgError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_svg_async` is never used
[INFO] [stdout]   --> src/drawsvg.rs:55:14
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub async fn get_svg_async (
[INFO] [stdout]    |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `put_svg` is never used
[INFO] [stdout]    --> src/drawsvg.rs:116:8
[INFO] [stdout]     |
[INFO] [stdout] 116 | pub fn put_svg<D>(
[INFO] [stdout]     |        ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `put_svg_async` is never used
[INFO] [stdout]    --> src/drawsvg.rs:152:14
[INFO] [stdout]     |
[INFO] [stdout] 152 | pub async fn put_svg_async<D>(
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_svg_gray4_binary` is never used
[INFO] [stdout]    --> src/drawsvg.rs:187:8
[INFO] [stdout]     |
[INFO] [stdout] 187 | pub fn get_svg_gray4_binary(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `as_any`, `as_any_mut`, and `dimensions` are never used
[INFO] [stdout]   --> src/display/traits.rs:68:8
[INFO] [stdout]    |
[INFO] [stdout] 63 | pub trait DisplayDriver: Send + Sync {
[INFO] [stdout]    |           ------------- methods in this trait
[INFO] [stdout] ...
[INFO] [stdout] 68 |     fn as_any(&self) -> &dyn std::any::Any;
[INFO] [stdout]    |        ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 71 |     fn as_any_mut(&mut self) -> &mut dyn std::any::Any;
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 77 |     fn dimensions(&self) -> (u32, u32) {
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `DrawableDisplay` is never used
[INFO] [stdout]    --> src/display/traits.rs:143:11
[INFO] [stdout]     |
[INFO] [stdout] 143 | pub trait DrawableDisplay: DisplayDriver {
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `SpiError` and `GpioError` are never constructed
[INFO] [stdout]   --> src/display/error.rs:37:5
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub enum DisplayError {
[INFO] [stdout]    |          ------------ variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 37 |     SpiError(String),
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 40 |     GpioError(String),
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `DisplayError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `dimensions`, `as_mono_mut`, `as_mono`, `as_gray4_mut`, `as_gray4`, and `as_bytes` are never used
[INFO] [stdout]    --> src/display/framebuffer.rs:64:12
[INFO] [stdout]     |
[INFO] [stdout]  42 | impl FrameBuffer {
[INFO] [stdout]     | ---------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  64 |     pub fn dimensions(&self) -> (u32, u32) {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  83 |     pub fn as_mono_mut(&mut self) -> &mut VarFrameBuf<BinaryColor> {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  91 |     pub fn as_mono(&self) -> Option<&VarFrameBuf<BinaryColor>> {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 146 |     pub fn as_gray4_mut(&mut self) -> &mut VarFrameBuf<Gray4> {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 154 |     pub fn as_gray4(&self) -> Option<&VarFrameBuf<Gray4>> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 165 |     pub fn as_bytes(&self) -> Vec<u8> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `DarkGray` and `LightGray` are never constructed
[INFO] [stdout]   --> src/display/color.rs:37:5
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub enum Color {
[INFO] [stdout]    |          ----- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 37 |     DarkGray,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 43 |     LightGray,
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Color` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `as_binary` and `as_gray4` are never used
[INFO] [stdout]    --> src/display/color.rs:132:12
[INFO] [stdout]     |
[INFO] [stdout] 130 | impl ColorValue {
[INFO] [stdout]     | --------------- methods in this implementation
[INFO] [stdout] 131 |     /// Get as BinaryColor (converts if needed)
[INFO] [stdout] 132 |     pub fn as_binary(&self) -> BinaryColor {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 148 |     pub fn as_gray4(&self) -> Gray4 {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated constants `OFF` and `ON` are never used
[INFO] [stdout]    --> src/display/color.rs:164:15
[INFO] [stdout]     |
[INFO] [stdout] 163 | impl Color {
[INFO] [stdout]     | ---------- associated constants in this implementation
[INFO] [stdout] 164 |     pub const OFF: Color = Color::Black;
[INFO] [stdout]     |               ^^^
[INFO] [stdout] 165 |     pub const ON: Color = Color::White;
[INFO] [stdout]     |               ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple variants are never constructed
[INFO] [stdout]   --> src/display/color_proxy.rs:66:5
[INFO] [stdout]    |
[INFO] [stdout] 64 | pub enum Pal16 {
[INFO] [stdout]    |          ----- variants in this enum
[INFO] [stdout] 65 |     Black = 0x0,        // Black
[INFO] [stdout] 66 |     Blue = 0x1,         // Blue
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 67 |     Green = 0x2,        // Green
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 68 |     Cyan = 0x3,         // Cyan
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 69 |     Red = 0x4,          // Red
[INFO] [stdout]    |     ^^^
[INFO] [stdout] 70 |     Magenta = 0x5,      // Magenta
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 71 |     Brown = 0x6,        // Brown
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 74 |     LightBlue = 0x9,    // Light blue
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 75 |     LightGreen = 0xA,   // Light green
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 76 |     LightCyan = 0xB,    // Light cyan
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 77 |     LightRed = 0xC,     // Light red
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 78 |     LightMagenta = 0xD, // Light magenta
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 79 |     Yellow = 0xE,       // Yellow
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Pal16` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `get_framebuffer`, `reset_state`, and `save_to_pbm` are never used
[INFO] [stdout]    --> src/display/drivers/mock.rs:134:12
[INFO] [stdout]     |
[INFO] [stdout]  90 | impl MockDriver {
[INFO] [stdout]     | --------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 134 |     pub fn get_framebuffer(&self) -> Vec<BinaryColor> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 153 |     pub fn reset_state(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 169 |     pub fn save_to_pbm(&self, path: &str) -> std::io::Result<()> {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `ErrorNullPointer` and `ErrorAbiMismatch` are never constructed
[INFO] [stdout]   --> src/display/plugin/ffi.rs:82:5
[INFO] [stdout]    |
[INFO] [stdout] 59 | pub enum LyMonsErrorCode {
[INFO] [stdout]    |          --------------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 82 |     ErrorNullPointer = 7,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 88 |     ErrorAbiMismatch = 9,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LyMonsErrorCode` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `driver_type` and `abi_version` are never read
[INFO] [stdout]   --> src/display/plugin/loader.rs:50:9
[INFO] [stdout]    |
[INFO] [stdout] 42 | pub struct PluginMetadata {
[INFO] [stdout]    |            -------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 50 |     pub driver_type: String,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 53 |     pub abi_version: (u32, u32, u32),
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PluginMetadata` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `plugin_name` and `plugin_version` are never used
[INFO] [stdout]    --> src/display/plugin/adapter.rs:132:12
[INFO] [stdout]     |
[INFO] [stdout]  64 | impl PluginDriverAdapter {
[INFO] [stdout]     | ------------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 132 |     pub fn plugin_name(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 137 |     pub fn plugin_version(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `status_bar`, `content_area`, `fonts`, and `clock` are never read
[INFO] [stdout]   --> src/display/layout.rs:45:9
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub struct LayoutConfig {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 45 |     pub status_bar: StatusBarLayout,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 48 |     pub content_area: ContentAreaLayout,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 51 |     pub fonts: FontSizes,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 60 |     pub clock: ClockLayout,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LayoutConfig` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `height`, `y`, `icon_size`, `spacing`, and `font_size` are never read
[INFO] [stdout]   --> src/display/layout.rs:86:9
[INFO] [stdout]    |
[INFO] [stdout] 84 | pub struct StatusBarLayout {
[INFO] [stdout]    |            --------------- fields in this struct
[INFO] [stdout] 85 |     /// Height of status bar in pixels
[INFO] [stdout] 86 |     pub height: u32,
[INFO] [stdout]    |         ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 89 |     pub y: u32,
[INFO] [stdout]    |         ^
[INFO] [stdout] ...
[INFO] [stdout] 92 |     pub icon_size: u32,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 95 |     pub spacing: u32,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 98 |     pub font_size: FontSize,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `StatusBarLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `y`, `height`, `margin_left`, `margin_right`, `margin_top`, and `margin_bottom` are never read
[INFO] [stdout]    --> src/display/layout.rs:105:9
[INFO] [stdout]     |
[INFO] [stdout] 103 | pub struct ContentAreaLayout {
[INFO] [stdout]     |            ----------------- fields in this struct
[INFO] [stdout] 104 |     /// Y position where content starts (after status bar)
[INFO] [stdout] 105 |     pub y: u32,
[INFO] [stdout]     |         ^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     pub height: u32,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 111 |     pub margin_left: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 114 |     pub margin_right: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 117 |     pub margin_top: u32,
[INFO] [stdout]     |         ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 120 |     pub margin_bottom: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `ContentAreaLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `height`, `vu_segments`, `peak_height`, and `hist_bar_width` are never read
[INFO] [stdout]    --> src/display/layout.rs:130:9
[INFO] [stdout]     |
[INFO] [stdout] 125 | pub struct VisualizerLayout {
[INFO] [stdout]     |            ---------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 130 |     pub height: u32,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 133 |     pub vu_segments: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 136 |     pub peak_height: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 139 |     pub hist_bar_width: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `VisualizerLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `digit_width`, `digit_height`, `digit_spacing`, `date_font_size`, `clock_y`, and `date_y` are never read
[INFO] [stdout]    --> src/display/layout.rs:149:9
[INFO] [stdout]     |
[INFO] [stdout] 147 | pub struct ClockLayout {
[INFO] [stdout]     |            ----------- fields in this struct
[INFO] [stdout] 148 |     /// Digit width for large clock digits
[INFO] [stdout] 149 |     pub digit_width: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 152 |     pub digit_height: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 155 |     pub digit_spacing: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 158 |     pub date_font_size: FontSize,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 161 |     pub clock_y: u32,
[INFO] [stdout]     |         ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 164 |     pub date_y: u32,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `ClockLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `icon_size`, `temp_font_size`, `condition_font_size`, and `forecast_font_size` are never read
[INFO] [stdout]    --> src/display/layout.rs:171:9
[INFO] [stdout]     |
[INFO] [stdout] 169 | pub struct WeatherLayout {
[INFO] [stdout]     |            ------------- fields in this struct
[INFO] [stdout] 170 |     /// Icon size for weather icons
[INFO] [stdout] 171 |     pub icon_size: u32,
[INFO] [stdout]     |         ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 174 |     pub temp_font_size: FontSize,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 177 |     pub condition_font_size: FontSize,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 180 |     pub forecast_font_size: FontSize,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `WeatherLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `status`, `content`, `time`, `clock_digits`, and `weather` are never read
[INFO] [stdout]    --> src/display/layout.rs:209:9
[INFO] [stdout]     |
[INFO] [stdout] 207 | pub struct FontSizes {
[INFO] [stdout]     |            --------- fields in this struct
[INFO] [stdout] 208 |     /// Status bar text
[INFO] [stdout] 209 |     pub status: FontSize,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 212 |     pub content: FontSize,
[INFO] [stdout]     |         ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 215 |     pub time: FontSize,
[INFO] [stdout]     |         ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 218 |     pub clock_digits: FontSize,
[INFO] [stdout]     |         ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 221 |     pub weather: FontSize,
[INFO] [stdout]     |         ^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `FontSizes` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `scroll_speed`, `recommended_fps`, and `supports_grayscale` are never used
[INFO] [stdout]    --> src/display/layout.rs:465:12
[INFO] [stdout]     |
[INFO] [stdout] 224 | impl LayoutConfig {
[INFO] [stdout]     | ----------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 465 |     pub fn scroll_speed(&self) -> u32 {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 475 |     pub fn recommended_fps(&self) -> u32 {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 484 |     pub fn supports_grayscale(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Visualizer` and `EasterEgg` are never constructed
[INFO] [stdout]    --> src/display/layout.rs:496:5
[INFO] [stdout]     |
[INFO] [stdout] 491 | pub enum AssetType {
[INFO] [stdout]     |          --------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 496 |     Visualizer,
[INFO] [stdout]     |     ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 499 |     EasterEgg,
[INFO] [stdout]     |     ^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `AssetType` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `track_buffer` is never read
[INFO] [stdout]   --> src/display/manager.rs:66:9
[INFO] [stdout]    |
[INFO] [stdout] 60 | pub struct RenderBuffers {
[INFO] [stdout]    |            ------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 66 |     pub track_buffer: ArrayString<128>,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `RenderBuffers` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `format_hms` is never used
[INFO] [stdout]   --> src/display/manager.rs:93:12
[INFO] [stdout]    |
[INFO] [stdout] 82 | impl RenderBuffers {
[INFO] [stdout]    | ------------------ method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 93 |     pub fn format_hms(&mut self, seconds: f32) -> &str {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `easter_eggs_component`, `last_viz_state`, `album`, and `weather_wind_speed_units` are never read
[INFO] [stdout]    --> src/display/manager.rs:255:5
[INFO] [stdout]     |
[INFO] [stdout] 231 | pub struct DisplayManager {
[INFO] [stdout]     |            -------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 255 |     easter_eggs_component: EasterEggsComponent,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 267 |     pub last_viz_state: LastVizState,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 283 |     pub album: String,
[INFO] [stdout]     |         ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 293 |     pub weather_wind_speed_units: String,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]     --> src/display/manager.rs:440:12
[INFO] [stdout]      |
[INFO] [stdout]  304 | impl DisplayManager {
[INFO] [stdout]      | ------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  440 |     pub fn capabilities(&self) -> &DisplayCapabilities {
[INFO] [stdout]      |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  445 |     pub fn layout(&self) -> &LayoutConfig {
[INFO] [stdout]      |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  450 |     pub fn status_bar_mut(&mut self) -> &mut StatusBar {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  455 |     pub fn scrolling_text_mut(&mut self) -> &mut ScrollingText {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  460 |     pub fn clock_display_mut(&mut self) -> &mut ClockDisplay {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  465 |     pub fn weather_display_mut(&mut self) -> &mut WeatherComponent {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  470 |     pub fn visualizer_mut(&mut self) -> &mut VisualizerComponent {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  837 |     fn render_progress_bar_to_field_data<D>(
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  887 |     fn render_progress_bar_to_field<D>(&mut self, field: &crate::display::field::Field, fb: &mut D) -> Result<(), DisplayError>
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  895 |     fn render_progress_bar(&mut self) -> Result<(), DisplayError> {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  938 |     fn render_info_line_to_field_data<D>(
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1014 |     fn render_info_line_to_field<D>(&mut self, field: &crate::display::field::Field, fb: &mut D) -> Result<(), DisplayError>
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1030 |     fn render_info_line(&mut self) -> Result<(), DisplayError> {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2788 |     pub fn set_brightness(&mut self, brightness: u8) -> Result<(), DisplayError> {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2793 |     pub fn display_mode(&self) -> DisplayMode {
[INFO] [stdout]      |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2819 |     pub fn is_manual_mode_override(&self) -> bool {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2835 |     pub fn check_emulator_mode_request(&mut self) -> Option<DisplayMode> {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2849 |     pub fn update_emulator_current_mode(&mut self, _mode: DisplayMode) {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2862 |     pub async fn update(&mut self) -> Result<(), DisplayError> {
[INFO] [stdout]      |                  ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2875 |     pub fn render_buffers_mut(&mut self) -> &mut RenderBuffers {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2880 |     pub fn performance_metrics(&self) -> &PerformanceMetrics {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 3102 |     pub async fn setup_visualizer(
[INFO] [stdout]      |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 3170 |     pub fn cycle_easter_egg(&mut self) {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 3198 |     pub fn cycle_visualization(&mut self) {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `layout` is never read
[INFO] [stdout]    --> src/display/components/status_bar.rs:101:5
[INFO] [stdout]     |
[INFO] [stdout]  99 | pub struct StatusBar {
[INFO] [stdout]     |            --------- field in this struct
[INFO] [stdout] 100 |     state: StatusBarState,
[INFO] [stdout] 101 |     layout: LayoutConfig,
[INFO] [stdout]     |     ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `update`, `state`, `render`, and `format_volume` are never used
[INFO] [stdout]    --> src/display/components/status_bar.rs:138:12
[INFO] [stdout]     |
[INFO] [stdout] 104 | impl StatusBar {
[INFO] [stdout]     | -------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 138 |     pub fn update(&mut self, state: StatusBarState) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 143 |     pub fn state(&self) -> &StatusBarState {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 148 |     pub fn render<D>(&self, target: &mut D) -> Result<(), D::Error>
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 365 |     pub fn format_volume(&self) -> ArrayString<8> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `transpose_repeat_mode` is never used
[INFO] [stdout]    --> src/display/components/status_bar.rs:377:8
[INFO] [stdout]     |
[INFO] [stdout] 377 | pub fn transpose_repeat_mode(mode: i32) -> RepeatMode {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `transpose_shuffle_mode` is never used
[INFO] [stdout]    --> src/display/components/status_bar.rs:387:8
[INFO] [stdout]     |
[INFO] [stdout] 387 | pub fn transpose_shuffle_mode(mode: i32) -> ShuffleMode {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `album_artist_scroller`, `album_scroller`, `title_scroller`, `artist_scroller`, `layout`, and `display_width` are never read
[INFO] [stdout]    --> src/display/components/scrollers.rs:119:5
[INFO] [stdout]     |
[INFO] [stdout] 118 | pub struct ScrollingText {
[INFO] [stdout]     |            ------------- fields in this struct
[INFO] [stdout] 119 |     album_artist_scroller: Option<TextScroller>,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 120 |     album_scroller: Option<TextScroller>,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^
[INFO] [stdout] 121 |     title_scroller: Option<TextScroller>,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^
[INFO] [stdout] 122 |     artist_scroller: Option<TextScroller>,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 123 |     scroll_mode: ScrollMode,
[INFO] [stdout] 124 |     layout: LayoutConfig,
[INFO] [stdout]     |     ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 130 |     display_width: u32,
[INFO] [stdout]     |     ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `set_track_info`, `update`, `render`, `stop`, `scroll_mode`, and `set_scroll_mode` are never used
[INFO] [stdout]    --> src/display/components/scrollers.rs:173:12
[INFO] [stdout]     |
[INFO] [stdout] 133 | impl ScrollingText {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 173 |     pub fn set_track_info(&mut self, artist: String, title: String) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 193 |     pub fn update(&mut self) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 215 |     pub fn render<D>(&self, target: &mut D) -> Result<(), D::Error>
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 338 |     pub fn stop(&mut self) {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 346 |     pub fn scroll_mode(&self) -> ScrollMode {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 351 |     pub fn set_scroll_mode(&mut self, mode: ScrollMode) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `last_clock_digits`, `colon_on`, `last_colon_toggle_time`, `last_second_drawn`, and `last_date_drawn` are never read
[INFO] [stdout]   --> src/display/components/clock.rs:34:9
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub struct ClockState {
[INFO] [stdout]    |            ---------- fields in this struct
[INFO] [stdout] 33 |     /// Last displayed time digits [H, H, :, M, M]
[INFO] [stdout] 34 |     pub last_clock_digits: [char; 5],
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 37 |     pub colon_on: bool,
[INFO] [stdout]    |         ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 40 |     pub last_colon_toggle_time: Instant,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 43 |     pub last_second_drawn: f32,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 46 |     pub last_date_drawn: String,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ClockState` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `state` and `metrics` are never read
[INFO] [stdout]   --> src/display/components/clock.rs:63:5
[INFO] [stdout]    |
[INFO] [stdout] 62 | pub struct ClockDisplay {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] 63 |     state: ClockState,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 66 |     metrics: bool,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `update`, `toggle_colon`, `state`, and `set_date` are never used
[INFO] [stdout]    --> src/display/components/clock.rs:81:12
[INFO] [stdout]     |
[INFO] [stdout]  69 | impl ClockDisplay {
[INFO] [stdout]     | ----------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  81 |     pub fn update(&mut self, current_time_secs: f32) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  87 |     pub fn toggle_colon(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 326 |     pub fn state(&self) -> &ClockState {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 331 |     pub fn set_date(&mut self, date: String) {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `Forecast` is never constructed
[INFO] [stdout]   --> src/display/components/weather.rs:37:5
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub enum WeatherDisplayMode {
[INFO] [stdout]    |          ------------------ variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 37 |     Forecast,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `WeatherDisplayMode` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `layout`, `display_mode`, and `display_switch_timer` are never read
[INFO] [stdout]   --> src/display/components/weather.rs:42:5
[INFO] [stdout]    |
[INFO] [stdout] 41 | pub struct WeatherDisplay {
[INFO] [stdout]    |            -------------- fields in this struct
[INFO] [stdout] 42 |     layout: LayoutConfig,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 43 |     last_weather_data: Vec<WeatherData>,
[INFO] [stdout] 44 |     display_mode: WeatherDisplayMode,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 45 |     display_switch_timer: Option<Instant>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `display_mode`, `set_display_mode`, `toggle_mode`, `has_changed`, `render`, and `get_icon_path` are never used
[INFO] [stdout]    --> src/display/components/weather.rs:65:12
[INFO] [stdout]     |
[INFO] [stdout]  48 | impl WeatherDisplay {
[INFO] [stdout]     | ------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  65 |     pub fn display_mode(&self) -> WeatherDisplayMode {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  70 |     pub fn set_display_mode(&mut self, mode: WeatherDisplayMode) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  75 |     pub fn toggle_mode(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  84 |     pub fn has_changed(&self, new_data: &[WeatherData]) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  99 |     pub fn render<D>(&self, target: &mut D) -> Result<(), D::Error>
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 114 |     pub fn get_icon_path(&self) -> Option<String> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `level`, `pct`, and `viz_init_clear` are never read
[INFO] [stdout]   --> src/display/components/visualizer.rs:43:9
[INFO] [stdout]    |
[INFO] [stdout] 41 | pub struct VisualizerState {
[INFO] [stdout]    |            --------------- fields in this struct
[INFO] [stdout] 42 |     /// Audio level (0-100)
[INFO] [stdout] 43 |     pub level: u8,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] 44 |     /// Peak percentage
[INFO] [stdout] 45 |     pub pct: f64,
[INFO] [stdout]    |         ^^^
[INFO] [stdout] 46 |     /// Whether visualizer needs initialization clear
[INFO] [stdout] 47 |     pub viz_init_clear: bool,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `VisualizerState` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `state` is never read
[INFO] [stdout]   --> src/display/components/visualizer.rs:92:5
[INFO] [stdout]    |
[INFO] [stdout] 90 | pub struct VisualizerComponent {
[INFO] [stdout]    |            ------------------- field in this struct
[INFO] [stdout] 91 |     visualizer: Option<Visualizer>,
[INFO] [stdout] 92 |     state: VisualizerState,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/display/components/visualizer.rs:119:12
[INFO] [stdout]     |
[INFO] [stdout]  99 | impl VisualizerComponent {
[INFO] [stdout]     | ------------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 119 |     pub fn set_visualizer(&mut self, visualizer: Visualizer) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 123 |     pub fn update_visual(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 133 |     pub fn visualizer(&self) -> Option<&Visualizer> {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 138 |     pub fn update(&mut self, level: u8, pct: f64) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 144 |     pub fn state(&self) -> &VisualizerState {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 149 |     pub fn visualization_type(&self) -> Visualization {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 155 |     pub fn set_visualization_type(&mut self, viz_type: Visualization) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 382 |     pub fn mark_init_clear(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 387 |     pub fn needs_init_clear(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 392 |     pub fn clear_init_flag(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 402 |     pub fn viz_state(&self) -> &crate::vision::LastVizState {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `render_egg_image`, `render_artist_text`, `render_title_text`, and `render_time_text` are never used
[INFO] [stdout]    --> src/display/components/easter_eggs.rs:51:18
[INFO] [stdout]     |
[INFO] [stdout]  45 | impl EasterEggsComponent {
[INFO] [stdout]     | ------------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  51 |     pub async fn render_egg_image<D>(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  79 |     pub fn render_artist_text<D>(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 137 |     pub fn render_title_text<D>(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 176 |     pub fn render_time_text<D>(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `field_type` is never read
[INFO] [stdout]   --> src/display/field.rs:52:9
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub struct Field {
[INFO] [stdout]    |            ----- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 52 |     pub field_type: FieldType,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Field` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `bg_binary` is never used
[INFO] [stdout]    --> src/display/field.rs:168:12
[INFO] [stdout]     |
[INFO] [stdout]  77 | impl Field {
[INFO] [stdout]     | ---------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 168 |     pub fn bg_binary(&self) -> Option<BinaryColor> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `name` is never read
[INFO] [stdout]   --> src/display/page.rs:33:9
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub struct PageLayout {
[INFO] [stdout]    |            ---------- field in this struct
[INFO] [stdout] 32 |     /// Page identifier
[INFO] [stdout] 33 |     pub name: String,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PageLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `add_fields` and `get_field_mut` are never used
[INFO] [stdout]   --> src/display/page.rs:55:12
[INFO] [stdout]    |
[INFO] [stdout] 39 | impl PageLayout {
[INFO] [stdout]    | --------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 55 |     pub fn add_fields(mut self, fields: Vec<Field>) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 66 |     pub fn get_field_mut(&mut self, name: &str) -> Option<&mut Field> {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `create_visualizer_page`, `create_easter_eggs_page`, and `layout_config` are never used
[INFO] [stdout]    --> src/display/layout_manager.rs:537:12
[INFO] [stdout]     |
[INFO] [stdout]  44 | impl LayoutManager {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 537 |     pub fn create_visualizer_page(&self) -> PageLayout {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 560 |     pub fn create_easter_eggs_page(&self) -> PageLayout {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 627 |     pub fn layout_config(&self) -> &LayoutConfig {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLOCK_DIGIT_WIDTH` is never used
[INFO] [stdout]    --> src/display/layout_manager.rs:142:15
[INFO] [stdout]     |
[INFO] [stdout] 142 |         const CLOCK_DIGIT_WIDTH: i32 = 25; // custom font width
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `time_since_mode_change` is never used
[INFO] [stdout]    --> src/display/mode_controller.rs:176:12
[INFO] [stdout]     |
[INFO] [stdout]  72 | impl DisplayModeController {
[INFO] [stdout]     | -------------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 176 |     pub fn time_since_mode_change(&self) -> std::time::Duration {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]   --> src/metrics.rs:44:8
[INFO] [stdout]    |
[INFO] [stdout] 40 | impl MachineMetrics {
[INFO] [stdout]    | ------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 44 |     fn read_first_float_from_file(&mut self, path: &str) -> io::Result<f32> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 51 |     fn read_first_long_from_file(&mut self, path: &str) -> io::Result<i64> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 59 |     fn cpu_load(&mut self) -> f64 {
[INFO] [stdout]    |        ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 68 |     fn cpu_temp(&mut self) -> f64 {
[INFO] [stdout]    |        ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 80 |     fn up_time(&mut self) -> f64 {
[INFO] [stdout]    |        ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 87 |     pub fn update(&mut self, metrics: MachineMetrics) {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 93 |     pub fn check(&mut self) -> MachineMetrics {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TAG_DISPLAY_ALBUMARTIST` is never used
[INFO] [stdout]   --> src/constants.rs:28:11
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub const TAG_DISPLAY_ALBUMARTIST: usize = 0;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TAG_DISPLAY_ALBUM` is never used
[INFO] [stdout]   --> src/constants.rs:29:11
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub const TAG_DISPLAY_ALBUM: usize = 1;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TAG_DISPLAY_TITLE` is never used
[INFO] [stdout]   --> src/constants.rs:30:11
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub const TAG_DISPLAY_TITLE: usize = 2;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TAG_DISPLAY_ARTIST` is never used
[INFO] [stdout]   --> src/constants.rs:31:11
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub const TAG_DISPLAY_ARTIST: usize = 3;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DISPLAY_WIDTH` is never used
[INFO] [stdout]   --> src/constants.rs:34:11
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub const DISPLAY_WIDTH: u32 = 128;
[INFO] [stdout]    |           ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DISPLAY_REGION_X_OFFSET` is never used
[INFO] [stdout]   --> src/constants.rs:39:11
[INFO] [stdout]    |
[INFO] [stdout] 39 | pub const DISPLAY_REGION_X_OFFSET: i32 = 0; // Starts from the left edge
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DISPLAY_REGION_Y_OFFSET` is never used
[INFO] [stdout]   --> src/constants.rs:41:11
[INFO] [stdout]    |
[INFO] [stdout] 41 | pub const DISPLAY_REGION_Y_OFFSET: i32 = 0; // Starts from the top edge
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DISPLAY_REGION_WIDTH` is never used
[INFO] [stdout]   --> src/constants.rs:43:11
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub const DISPLAY_REGION_WIDTH: u32 = DISPLAY_WIDTH - 2; // Occupies adjusted width
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_LINES` is never used
[INFO] [stdout]   --> src/constants.rs:50:11
[INFO] [stdout]    |
[INFO] [stdout] 50 | pub const MAX_LINES: usize = 6;
[INFO] [stdout]    |           ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAIN_FONT_HEIGHT` is never used
[INFO] [stdout]   --> src/constants.rs:53:11
[INFO] [stdout]    |
[INFO] [stdout] 53 | pub const MAIN_FONT_HEIGHT: u32 = 8;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAIN_LINE_SPACING` is never used
[INFO] [stdout]   --> src/constants.rs:55:11
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub const MAIN_LINE_SPACING: i32 = 2; // Additional pixels between lines
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GLYPH_WIDTH` is never used
[INFO] [stdout]   --> src/constants.rs:58:11
[INFO] [stdout]    |
[INFO] [stdout] 58 | pub const GLYPH_WIDTH: u32 = 8;
[INFO] [stdout]    |           ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLOCK_DIGIT_GAP_HORIZONTAL` is never used
[INFO] [stdout]   --> src/constants.rs:65:11
[INFO] [stdout]    |
[INFO] [stdout] 65 | pub const CLOCK_DIGIT_GAP_HORIZONTAL: i32 = 1; // For spacing between H and H, M and M, and H and colon
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLOCK_COLON_MINUTE_GAP` is never used
[INFO] [stdout]   --> src/constants.rs:67:11
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub const CLOCK_COLON_MINUTE_GAP: i32 = 0; // Wider gap for visual separation
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLOCK_PROGRESS_BAR_GAP` is never used
[INFO] [stdout]   --> src/constants.rs:69:11
[INFO] [stdout]    |
[INFO] [stdout] 69 | pub const CLOCK_PROGRESS_BAR_GAP: i32 = 4;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PROGRESS_BAR_DATE_GAP` is never used
[INFO] [stdout]   --> src/constants.rs:71:11
[INFO] [stdout]    |
[INFO] [stdout] 71 | pub const PROGRESS_BAR_DATE_GAP: i32 = 2;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DATE_FONT_HEIGHT` is never used
[INFO] [stdout]   --> src/constants.rs:73:11
[INFO] [stdout]    |
[INFO] [stdout] 73 | pub const DATE_FONT_HEIGHT: u32 = 10;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYER_PROGRESS_BAR_Y_POS` is never used
[INFO] [stdout]   --> src/constants.rs:77:11
[INFO] [stdout]    |
[INFO] [stdout] 77 | pub const PLAYER_PROGRESS_BAR_Y_POS: i32 = 51; // Line 5 starts at this Y position
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYER_PROGRESS_BAR_WIDTH` is never used
[INFO] [stdout]   --> src/constants.rs:79:11
[INFO] [stdout]    |
[INFO] [stdout] 79 | pub const PLAYER_PROGRESS_BAR_WIDTH: u32 = DISPLAY_WIDTH - 4; // 2 pixels padding on each side
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYER_PROGRESS_BAR_HEIGHT` is never used
[INFO] [stdout]   --> src/constants.rs:81:11
[INFO] [stdout]    |
[INFO] [stdout] 81 | pub const PLAYER_PROGRESS_BAR_HEIGHT: u32 = 4;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYER_PROGRESS_BAR_BORDER_THICKNESS` is never used
[INFO] [stdout]   --> src/constants.rs:83:11
[INFO] [stdout]    |
[INFO] [stdout] 83 | pub const PLAYER_PROGRESS_BAR_BORDER_THICKNESS: u32 = 1;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYER_TRACK_INFO_LINE_Y_POS` is never used
[INFO] [stdout]   --> src/constants.rs:86:11
[INFO] [stdout]    |
[INFO] [stdout] 86 | pub const PLAYER_TRACK_INFO_LINE_Y_POS: i32 = DISPLAY_HEIGHT as i32 - MAIN_FONT_HEIGHT as i32; // Bottom of the screen
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `LYMONS_LOGO_WIDTH` is never used
[INFO] [stdout]   --> src/constants.rs:88:11
[INFO] [stdout]    |
[INFO] [stdout] 88 | pub const LYMONS_LOGO_WIDTH: u32 = 108;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `AudioBitrate` is never used
[INFO] [stdout]   --> src/glyphs.rs:26:10
[INFO] [stdout]    |
[INFO] [stdout] 26 | pub enum AudioBitrate {
[INFO] [stdout]    |          ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `map_repeat_mode` is never used
[INFO] [stdout]   --> src/glyphs.rs:42:4
[INFO] [stdout]    |
[INFO] [stdout] 42 | fn map_repeat_mode(mode: u8) -> RepeatMode {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `map_shuffle_mode` is never used
[INFO] [stdout]   --> src/glyphs.rs:60:4
[INFO] [stdout]    |
[INFO] [stdout] 60 | fn map_shuffle_mode(mode: u8) -> ShuffleMode {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GLYPH_AUDIO_HD` is never used
[INFO] [stdout]   --> src/glyphs.rs:86:11
[INFO] [stdout]    |
[INFO] [stdout] 86 | pub const GLYPH_AUDIO_HD: [u8; 8] = [0x00, 0x66, 0x66, 0x7e, 0x7e, 0x66, 0x66, 0x00,];
[INFO] [stdout]    |           ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GLYPH_AUDIO_SD` is never used
[INFO] [stdout]   --> src/glyphs.rs:87:11
[INFO] [stdout]    |
[INFO] [stdout] 87 | pub const GLYPH_AUDIO_SD: [u8; 8] = [0x00, 0x3c, 0x66, 0x60, 0x1c, 0x46, 0x66, 0x3c,];
[INFO] [stdout]    |           ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GLYPH_AUDIO_DSD` is never used
[INFO] [stdout]   --> src/glyphs.rs:88:11
[INFO] [stdout]    |
[INFO] [stdout] 88 | pub const GLYPH_AUDIO_DSD: [u8; 8] = [0x00, 0x78, 0x6c, 0x66, 0x66, 0x6c, 0x78, 0x00,];
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_zero_i16` is never used
[INFO] [stdout]   --> src/deutils.rs:30:8
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub fn default_zero_i16() -> i16 { 0 }
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_numeric_i32` is never used
[INFO] [stdout]   --> src/deutils.rs:54:8
[INFO] [stdout]    |
[INFO] [stdout] 54 | pub fn deserialize_numeric_i32<'de, D>(deserializer: D) -> Result<i32, D::Error>
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_numeric_u8` is never used
[INFO] [stdout]    --> src/deutils.rs:102:8
[INFO] [stdout]     |
[INFO] [stdout] 102 | pub fn deserialize_numeric_u8<'de, D>(deserializer: D) -> Result<u8, D::Error>
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_epoch_to_date_string` is never used
[INFO] [stdout]    --> src/deutils.rs:119:8
[INFO] [stdout]     |
[INFO] [stdout] 119 | pub fn deserialize_epoch_to_date_string<'de, D>(deserializer: D) -> Result<String, D::Error>
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_seconds_to_hms` is never used
[INFO] [stdout]    --> src/deutils.rs:158:8
[INFO] [stdout]     |
[INFO] [stdout] 158 | pub fn deserialize_seconds_to_hms<'de, D>(deserializer: D) -> Result<String, D::Error>
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `playing_rx` is never read
[INFO] [stdout]    --> src/sliminfo.rs:382:5
[INFO] [stdout]     |
[INFO] [stdout] 362 | pub struct LMSServer {
[INFO] [stdout]     |            --------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 382 |     playing_rx: watch::Receiver<bool>,
[INFO] [stdout]     |     ^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `LMSServer` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `subscribe_playing` and `player_mac` are never used
[INFO] [stdout]    --> src/sliminfo.rs:417:12
[INFO] [stdout]     |
[INFO] [stdout] 388 | impl LMSServer {
[INFO] [stdout]     | -------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 417 |     pub fn subscribe_playing(&self) -> watch::Receiver<bool> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 537 |     pub fn player_mac(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `IconSet` is never used
[INFO] [stdout]   --> src/weather.rs:46:10
[INFO] [stdout]    |
[INFO] [stdout] 46 | pub enum IconSet {
[INFO] [stdout]    |          ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `ForecastDay4`, `ForecastDay5`, and `ForecastDay6` are never constructed
[INFO] [stdout]   --> src/weather.rs:57:5
[INFO] [stdout]    |
[INFO] [stdout] 52 | pub enum WeatherCondition {
[INFO] [stdout]    |          ---------------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 57 |     ForecastDay4 = 4,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 58 |     ForecastDay5 = 5,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 59 |     ForecastDay6 = 6,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `WeatherCondition` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `wind_speed_units`, `sun`, `svg`, and `fsvg` are never read
[INFO] [stdout]   --> src/weather.rs:65:9
[INFO] [stdout]    |
[INFO] [stdout] 63 | pub struct WeatherDisplay{
[INFO] [stdout]    |            -------------- fields in this struct
[INFO] [stdout] 64 |     pub temp_units: String,
[INFO] [stdout] 65 |     pub wind_speed_units: String,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 66 |     pub sun: sun::SunTimes,
[INFO] [stdout]    |         ^^^
[INFO] [stdout] ...
[INFO] [stdout] 69 |     pub svg: String,
[INFO] [stdout]    |         ^^^
[INFO] [stdout] 70 |     pub fsvg: Vec<String>,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `WeatherDisplay` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Location` is never constructed
[INFO] [stdout]    --> src/weather.rs:131:12
[INFO] [stdout]     |
[INFO] [stdout] 131 | pub struct Location {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SCROLL_RIGHT` is never used
[INFO] [stdout]   --> src/textable.rs:42:7
[INFO] [stdout]    |
[INFO] [stdout] 42 | const SCROLL_RIGHT: i8 = 1;
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GAP_BETWEEN_LOOP_TEXT_FIXED` is never used
[INFO] [stdout]   --> src/textable.rs:43:11
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub const GAP_BETWEEN_LOOP_TEXT_FIXED: i32 = 12; // Fixed gap for continuous loop
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple fields are never read
[INFO] [stdout]   --> src/textable.rs:55:9
[INFO] [stdout]    |
[INFO] [stdout] 54 | pub struct State { // Made public so OledDisplay can read it
[INFO] [stdout]    |            ----- fields in this struct
[INFO] [stdout] 55 |     pub text: String,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] 56 |     pub scroll_mode: ScrollMode,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 57 |     pub font: MonoFont<'static>, // Stored here to be accessible to the task
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] 58 |     pub text_width: u32, // NEW: Text width, updated by OledDisplay
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout] 59 |     pub stop_flag: bool,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 60 |     pub current_offset_float: f32, // Use f32 for smoother scrolling calculation
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 61 |     pub last_drawn_x_rounded: i32, // Store the last rounded X position that was drawn
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 62 |     pub direction: i8, // -1 for left, 1 for right (for cylon)
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 63 |     pub paused: bool, // For pause states in scrolling
[INFO] [stdout]    |         ^^^^^^
[INFO] [stdout] 64 |     pub has_paused: bool, // For pause states in scrolling
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `name`, `top_left`, `width`, and `state` are never read
[INFO] [stdout]   --> src/textable.rs:96:9
[INFO] [stdout]    |
[INFO] [stdout] 95 | pub struct TextScroller {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] 96 |     pub name: String,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] 97 |     pub top_left: Point, // Public so OledDisplay can get position
[INFO] [stdout]    |         ^^^^^^^^
[INFO] [stdout] 98 |     pub width: u32, // Display region width
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] 99 |     pub state: Arc<TokMutex<State>>, // Shared state for the scrolling task
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `spawn_task`, `update_content`, `start`, and `stop` are never used
[INFO] [stdout]    --> src/textable.rs:107:12
[INFO] [stdout]     |
[INFO] [stdout] 103 | impl TextScroller {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 107 |     pub fn new(
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 138 |     fn spawn_task(&mut self) {
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 246 |     pub async fn update_content(&mut self, new_text: String, new_mode: ScrollMode, new_text_width: u32) {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 273 |     pub async fn start(&mut self) {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 287 |     pub async fn stop(&mut self) {
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `THERMO_GLYPH_WIDTH` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:37:11
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub const THERMO_GLYPH_WIDTH: u32 = 12;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `THERMO_GLYPH_HEIGHT` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:38:11
[INFO] [stdout]    |
[INFO] [stdout] 38 | pub const THERMO_GLYPH_HEIGHT: u32 = 12;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_weather_glyph_slice` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:61:8
[INFO] [stdout]    |
[INFO] [stdout] 61 | pub fn get_weather_glyph_slice(glyph_index: usize) -> &'static [u8] {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MOON_PHASE_WIDTH` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:71:11
[INFO] [stdout]    |
[INFO] [stdout] 71 | pub const MOON_PHASE_WIDTH: u32 = 30;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MOON_PHASE_HEIGHT` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:72:11
[INFO] [stdout]    |
[INFO] [stdout] 72 | pub const MOON_PHASE_HEIGHT: u32 = 30;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MOON_PHASE_RAW_DATA` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:76:7
[INFO] [stdout]    |
[INFO] [stdout] 76 | const MOON_PHASE_RAW_DATA: &[u8] = include_bytes!("../data/moonphase_30x30.bin");
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_moon_phase_slice` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:85:8
[INFO] [stdout]    |
[INFO] [stdout] 85 | pub fn get_moon_phase_slice(phase: MoonPhase) -> &'static [u8] {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `ConfigMissing` is never constructed
[INFO] [stdout]   --> src/location.rs:66:5
[INFO] [stdout]    |
[INFO] [stdout] 65 | pub enum LocationError {
[INFO] [stdout]    |          ------------- variant in this enum
[INFO] [stdout] 66 |     ConfigMissing,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LocationError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `moonrise` and `moonset` are never read
[INFO] [stdout]   --> src/astral.rs:38:9
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub struct AstralData {
[INFO] [stdout]    |            ---------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 38 |     pub moonrise: Option<DateTime<Local>>,
[INFO] [stdout]    |         ^^^^^^^^
[INFO] [stdout] 39 |     pub moonset: Option<DateTime<Local>>,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `AstralData` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `is_daytime`, `minutes_until_next_event`, and `update_location` are never used
[INFO] [stdout]    --> src/astral.rs:112:12
[INFO] [stdout]     |
[INFO] [stdout]  48 | impl AstralService {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 112 |     pub fn is_daytime(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 125 |     pub fn minutes_until_next_event(&self) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 148 |     pub fn update_location(&mut self, location: Location) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `NO_WIDE_ASSETS` is never used
[INFO] [stdout]   --> src/eggs.rs:56:11
[INFO] [stdout]    |
[INFO] [stdout] 56 | pub const NO_WIDE_ASSETS: [u8; 1] = [EGGS_TYPE_CASSETTE];
[INFO] [stdout]    |           ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HIST_FLOOR_DB` is never used
[INFO] [stdout]   --> src/spectrum.rs:24:7
[INFO] [stdout]    |
[INFO] [stdout] 24 | const HIST_FLOOR_DB: f32 = -80.0;
[INFO] [stdout]    |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HIST_CEIL_DB` is never used
[INFO] [stdout]   --> src/spectrum.rs:25:7
[INFO] [stdout]    |
[INFO] [stdout] 25 | const HIST_CEIL_DB:  f32 = -12.0;
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `EPS` is never used
[INFO] [stdout]   --> src/spectrum.rs:26:7
[INFO] [stdout]    |
[INFO] [stdout] 26 | const EPS: f32 = 1e-12;
[INFO] [stdout]    |       ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SPECTRUM_MIN_HZ` is never used
[INFO] [stdout]   --> src/spectrum.rs:27:7
[INFO] [stdout]    |
[INFO] [stdout] 27 | const SPECTRUM_MIN_HZ: f32 = 20.0;              // start of spectrum
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FFT_MIN` is never used
[INFO] [stdout]   --> src/spectrum.rs:28:7
[INFO] [stdout]    |
[INFO] [stdout] 28 | const FFT_MIN: usize = 128;
[INFO] [stdout]    |       ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FFT_MAX` is never used
[INFO] [stdout]   --> src/spectrum.rs:29:7
[INFO] [stdout]    |
[INFO] [stdout] 29 | const FFT_MAX: usize = 4096;
[INFO] [stdout]    |       ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PEAK_METER_LEVELS_MAX` is never used
[INFO] [stdout]   --> src/spectrum.rs:30:7
[INFO] [stdout]    |
[INFO] [stdout] 30 | const PEAK_METER_LEVELS_MAX: u8 = 48;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SPECTRUM_BANDS_COUNT` is never used
[INFO] [stdout]   --> src/spectrum.rs:31:11
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub const SPECTRUM_BANDS_COUNT:u8 = 16;         // Number of spectrum bands
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `db_to_hist_level` is never used
[INFO] [stdout]   --> src/spectrum.rs:34:4
[INFO] [stdout]    |
[INFO] [stdout] 34 | fn db_to_hist_level(db: f32) -> u8 {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SpectrumEngine` is never constructed
[INFO] [stdout]   --> src/spectrum.rs:39:12
[INFO] [stdout]    |
[INFO] [stdout] 39 | pub struct SpectrumEngine {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `build_log_bands`, `ensure`, `compute_db_bands`, and `compute_levels` are never used
[INFO] [stdout]    --> src/spectrum.rs:56:12
[INFO] [stdout]     |
[INFO] [stdout]  55 | impl SpectrumEngine {
[INFO] [stdout]     | ------------------- associated items in this implementation
[INFO] [stdout]  56 |     pub fn new(sr: u32, samples_len: usize, bands: usize) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  85 |     pub fn build_log_bands(sr: u32, nfft: usize, bands: usize) -> Vec<(usize, usize)> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 109 |     pub fn ensure(&mut self, sr: u32, samples_len: usize) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 116 |     pub fn compute_db_bands(&mut self, pcm: &[i16]) -> Vec<f32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 157 |     pub fn compute_levels(&mut self, left: &[i16], right: &[i16]) -> (Vec<u8>, Vec<u8>) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `width` and `height` are never used
[INFO] [stdout]   --> src/vframebuf.rs:44:12
[INFO] [stdout]    |
[INFO] [stdout] 38 | impl<C: PixelColor + Clone> VarFrameBuf<C> {
[INFO] [stdout]    | ------------------------------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 44 |     pub fn width(&self) -> usize { self.w }
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 45 |     pub fn height(&self) -> usize { self.h }
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `VIS_BUF_SIZE` is never used
[INFO] [stdout]   --> src/vision.rs:52:7
[INFO] [stdout]    |
[INFO] [stdout] 52 | const VIS_BUF_SIZE:usize = 16_384;              // Predefined in Squeezelite.
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PEAK_METER_SCALE_HEADROOM` is never used
[INFO] [stdout]   --> src/vision.rs:54:11
[INFO] [stdout]    |
[INFO] [stdout] 54 | pub const PEAK_METER_SCALE_HEADROOM:f32 = 0.8;  // 20% headroom clipping
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `METER_CHANNELS` is never used
[INFO] [stdout]   --> src/vision.rs:55:11
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub const METER_CHANNELS:usize = 2;             // Number of metered channels.
[INFO] [stdout]    |           ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `LEVEL_DECAY_STEPS_PER_FRAME` is never used
[INFO] [stdout]   --> src/vision.rs:59:11
[INFO] [stdout]    |
[INFO] [stdout] 59 | pub const LEVEL_DECAY_STEPS_PER_FRAME: u8 = 1;  // visual fall rate (levels / frame)
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `LOCK_TRY_WINDOW_MS` is never used
[INFO] [stdout]   --> src/vision.rs:60:7
[INFO] [stdout]    |
[INFO] [stdout] 60 | const LOCK_TRY_WINDOW_MS: u32 = 5;              // total budget for try-loop
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `POLL_IDLE` is never used
[INFO] [stdout]   --> src/vision.rs:64:11
[INFO] [stdout]    |
[INFO] [stdout] 64 | pub const POLL_IDLE: Duration    = Duration::from_millis(48); // chill when idle
[INFO] [stdout]    |           ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `reset` is never used
[INFO] [stdout]    --> src/vision.rs:241:12
[INFO] [stdout]     |
[INFO] [stdout] 239 | impl LastVizState {
[INFO] [stdout]     | ----------------- method in this implementation
[INFO] [stdout] 240 |
[INFO] [stdout] 241 |     pub fn reset(&mut self) {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `ensure_band_state_old` is never used
[INFO] [stdout]    --> src/vision.rs:275:8
[INFO] [stdout]     |
[INFO] [stdout] 275 | pub fn ensure_band_state_old(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ReadGuard` is never constructed
[INFO] [stdout]    --> src/vision.rs:409:8
[INFO] [stdout]     |
[INFO] [stdout] 409 | struct ReadGuard {
[INFO] [stdout]     |        ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `VisT` is never constructed
[INFO] [stdout]    --> src/vision.rs:420:8
[INFO] [stdout]     |
[INFO] [stdout] 420 | struct VisT {
[INFO] [stdout]     |        ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `VisFrame` is never constructed
[INFO] [stdout]    --> src/vision.rs:432:12
[INFO] [stdout]     |
[INFO] [stdout] 432 | pub struct VisFrame {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `VisReader` is never constructed
[INFO] [stdout]    --> src/vision.rs:440:12
[INFO] [stdout]     |
[INFO] [stdout] 440 | pub struct VisReader {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/vision.rs:458:12
[INFO] [stdout]     |
[INFO] [stdout] 456 | impl VisReader {
[INFO] [stdout]     | -------------- associated items in this implementation
[INFO] [stdout] 457 |     /// Discover the active Squeezelite shm in /dev/shm and map it.
[INFO] [stdout] 458 |     pub fn new() -> io::Result<Self> {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 494 |     fn sd(&self) -> &VisT {
[INFO] [stdout]     |        ^^
[INFO] [stdout] ...
[INFO] [stdout] 501 |     pub fn snapshot_if_new(&mut self) -> io::Result<Option<VisFrame>> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 565 |     fn unlocked_snapshot_if_new_using_index(&self) -> Option<VisFrame> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 611 |     pub fn with_data<F>(&mut self, f: F) -> io::Result<bool>
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 634 |     pub fn with_data_extended<F>(&mut self, f: F) -> io::Result<bool>
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 654 |     pub fn with_data_swapped<F>(&mut self, swap_lr: bool, f: F) -> std::io::Result<bool>
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 679 |     pub fn reopen_if_stale(&mut self) -> io::Result<()> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 694 |     fn unlocked_snapshot_if_new(&self) -> Option<VisFrame> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `header_looks_good` is never used
[INFO] [stdout]    --> src/vision.rs:745:4
[INFO] [stdout]     |
[INFO] [stdout] 745 | fn header_looks_good(size: usize, idx: usize, rate: u32) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `lock_read_best_effort` is never used
[INFO] [stdout]    --> src/vision.rs:754:11
[INFO] [stdout]     |
[INFO] [stdout] 754 | unsafe fn lock_read_best_effort(
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `peak_and_rms` is never used
[INFO] [stdout]    --> src/vision.rs:783:8
[INFO] [stdout]     |
[INFO] [stdout] 783 | pub fn peak_and_rms(ch: &[i16]) -> (i16, f32) {
[INFO] [stdout]     |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `db_to_level` is never used
[INFO] [stdout]    --> src/vision.rs:799:4
[INFO] [stdout]     |
[INFO] [stdout] 799 | fn db_to_level(db: f32) -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `db_to_level_scale` is never used
[INFO] [stdout]    --> src/vision.rs:806:4
[INFO] [stdout]     |
[INFO] [stdout] 806 | fn db_to_level_scale(db: f32) -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `dbfs` is never used
[INFO] [stdout]    --> src/vision.rs:811:8
[INFO] [stdout]     |
[INFO] [stdout] 811 | pub fn dbfs(x: f32) -> f32 {
[INFO] [stdout]     |        ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `stereo_channel_peak_rms` is never used
[INFO] [stdout]    --> src/vision.rs:816:4
[INFO] [stdout]     |
[INFO] [stdout] 816 | fn stereo_channel_peak_rms(samples_l: &[i16],samples_r: &[i16]) -> ((i16, f32), (i16, f32)) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `stereo_peak_rms` is never used
[INFO] [stdout]    --> src/vision.rs:847:4
[INFO] [stdout]     |
[INFO] [stdout] 847 | fn stereo_peak_rms(samples: &[i16]) -> ((i16, f32), (i16, f32)) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `PeakStereo`, `PeakMono`, `HistStereo`, `HistMono`, `AioHistMono`, and `WaveformSpectrum` are never constructed
[INFO] [stdout]   --> src/visualization.rs:43:5
[INFO] [stdout]    |
[INFO] [stdout] 40 | pub enum Visualization {
[INFO] [stdout]    |          ------------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 43 |     PeakStereo,               // two peak meters with hold/decay
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 44 |     PeakMono,                 // mono peak meter with hold/decay
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 45 |     HistStereo,               // two histogram bars (L/R)
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 46 |     HistMono,                 // mono histogram (downmix)
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 49 |     AioHistMono,              // All In One with downmix histogram
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 50 |     WaveformSpectrum,         // Waveform + Spectrogram (oscilloscope + waterfall)
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Visualization` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `transpose_kind` is never used
[INFO] [stdout]    --> src/visualization.rs:375:8
[INFO] [stdout]     |
[INFO] [stdout] 375 | pub fn transpose_kind(kind: &str) -> Visualization {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_visualizer_panel_with_layout` is never used
[INFO] [stdout]    --> src/visualization.rs:397:8
[INFO] [stdout]     |
[INFO] [stdout] 397 | pub fn get_visualizer_panel_with_layout(kind: Visualization, layout: &LayoutConfig) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_visualizer_panel` is never used
[INFO] [stdout]    --> src/visualization.rs:437:8
[INFO] [stdout]     |
[INFO] [stdout] 437 | pub fn get_visualizer_panel(kind: Visualization, wide: bool) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `ts`, `playing`, `sample_rate`, and `kind` are never read
[INFO] [stdout]   --> src/visualizer.rs:58:9
[INFO] [stdout]    |
[INFO] [stdout] 57 | pub struct VizFrameOut {
[INFO] [stdout]    |            ----------- fields in this struct
[INFO] [stdout] 58 |     pub ts: i64,
[INFO] [stdout]    |         ^^
[INFO] [stdout] 59 |     pub playing: bool,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout] 60 |     pub sample_rate: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 61 |     pub kind: Visualization,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `VizFrameOut` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple variants are never constructed
[INFO] [stdout]   --> src/visualizer.rs:68:5
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub enum VizPayload {
[INFO] [stdout]    |          ---------- variants in this enum
[INFO] [stdout] 68 |     VuStereo { l_db: f32, r_db: f32 },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 69 |     VuMono   { m_db: f32 },
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 70 |     PeakStereo {
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 74 |     PeakMono { m_db: f32, hold: u8 },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 75 |     HistStereo { bands_l: Vec<u8>, bands_r: Vec<u8> },
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 76 |     HistMono   { bands: Vec<u8> },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 77 |     VuStereoWithCenterPeak { l_db: f32, r_db: f32, m_db: f32, peak_hold: u8 },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 78 |     AioVuMono { m_db: f32 },
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 79 |     AioHistMono { bands: Vec<u8> },
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 80 |     WaveformSpectrum {
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 85 |     NoVisualization {},
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `VizPayload` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Enable` and `SetKind` are never constructed
[INFO] [stdout]   --> src/visualizer.rs:91:5
[INFO] [stdout]    |
[INFO] [stdout] 90 | pub enum VizCommand {
[INFO] [stdout]    |          ---------- variants in this enum
[INFO] [stdout] 91 |     Enable(bool),                 // enable/disable publishing
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 92 |     SetKind(Visualization),       // switch viz mode
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `VizCommand` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `spawn`, `enable`, `set_kind`, and `shutdown` are never used
[INFO] [stdout]    --> src/visualizer.rs:107:12
[INFO] [stdout]     |
[INFO] [stdout] 104 | impl Visualizer {
[INFO] [stdout]     | --------------- associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 107 |     pub fn spawn(kind: &str, playing_rx: watch::Receiver<bool>) -> std::io::Result<Self> {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 126 |     pub fn enable(&self, on: bool) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 130 |     pub fn set_kind(&self, k: Visualization) {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 135 |     pub fn shutdown(mut self) {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `visualizer_worker` is never used
[INFO] [stdout]    --> src/visualizer.rs:152:10
[INFO] [stdout]     |
[INFO] [stdout] 152 | async fn visualizer_worker(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `publish` is never used
[INFO] [stdout]    --> src/visualizer.rs:349:4
[INFO] [stdout]     |
[INFO] [stdout] 349 | fn publish(
[INFO] [stdout]     |    ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `db_to_level` is never used
[INFO] [stdout]    --> src/visualizer.rs:363:4
[INFO] [stdout]     |
[INFO] [stdout] 363 | fn db_to_level(db: f32) -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PeakHold` is never constructed
[INFO] [stdout]    --> src/visualizer.rs:368:8
[INFO] [stdout]     |
[INFO] [stdout] 368 | struct PeakHold {
[INFO] [stdout]     |        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `update` is never used
[INFO] [stdout]    --> src/visualizer.rs:375:8
[INFO] [stdout]     |
[INFO] [stdout] 374 | impl PeakHold {
[INFO] [stdout]     | ------------- method in this implementation
[INFO] [stdout] 375 |     fn update(&mut self, leds: &[bool; 19]) -> Option<usize> {
[INFO] [stdout]     |        ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `with_db_range`, `with_arc_degrees`, `with_restitution`, and `with_max_dt` are never used
[INFO] [stdout]    --> src/vuphysics_new.rs:224:12
[INFO] [stdout]     |
[INFO] [stdout] 148 | impl VuMeter {
[INFO] [stdout]     | ------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 224 |     pub fn with_db_range(mut self, scale_min: f64, scale_max: f64) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 234 |     pub fn with_arc_degrees(mut self, sweep_min: f64, sweep_max: f64) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 306 |     pub fn with_restitution(mut self, restitution: f64) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 320 |     pub fn with_max_dt(mut self, max_dt: f64) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `set_arc_degrees`, `set_overload_threshold`, and `set_physics` are never used
[INFO] [stdout]    --> src/vuphysics_new.rs:355:12
[INFO] [stdout]     |
[INFO] [stdout] 327 | impl VuMeter {
[INFO] [stdout]     | ------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 355 |     pub fn set_arc_degrees(&mut self, sweep_min: f64, sweep_max: f64) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 363 |     pub fn set_overload_threshold(&mut self, threshold_db: f64, hold_s: f64) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 370 |     pub fn set_physics(&mut self, inertia: f64, spring_k: f64, damping_b: f64) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `angle_radians` is never used
[INFO] [stdout]    --> src/vuphysics_new.rs:406:12
[INFO] [stdout]     |
[INFO] [stdout] 388 | impl VuMeter {
[INFO] [stdout]     | ------------ method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 406 |     pub fn angle_radians(&self) -> f64 {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `RenderingError` is never constructed
[INFO] [stdout]   --> src/svgimage.rs:55:5
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub enum SvgImageError {
[INFO] [stdout]    |          ------------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 55 |     RenderingError(String),
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SvgImageError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `find_squeezelite_shm_path` is never used
[INFO] [stdout]   --> src/shm_path.rs:28:8
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub fn find_squeezelite_shm_path() -> io::Result<PathBuf> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FunctionTimer` is never constructed
[INFO] [stdout]   --> src/func_timer.rs:28:12
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub struct FunctionTimer {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]   --> src/func_timer.rs:34:13
[INFO] [stdout]    |
[INFO] [stdout] 33 | impl FunctionTimer {
[INFO] [stdout]    | ------------------ associated function in this implementation
[INFO] [stdout] 34 |      pub fn new(name: &'static str) -> Self {
[INFO] [stdout]    |             ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `asin_deg` is never used
[INFO] [stdout]   --> src/sun.rs:45:4
[INFO] [stdout]    |
[INFO] [stdout] 45 | fn asin_deg(x: f64) -> f64 { (x).asin() * RAD_TO_DEG }
[INFO] [stdout]    |    ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `to_fixed_offset` is never used
[INFO] [stdout]    --> src/sun.rs:166:8
[INFO] [stdout]     |
[INFO] [stdout] 166 | pub fn to_fixed_offset(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/eggs.rs:457:9
[INFO] [stdout]     |
[INFO] [stdout] 457 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 463 |     ) -> Result<ImageRaw<BinaryColor>, EggsError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout]     = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 463 |     ) -> Result<ImageRaw<'_, BinaryColor>, EggsError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/eggs.rs:469:9
[INFO] [stdout]     |
[INFO] [stdout] 469 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 475 |     ) -> Result<ImageRaw<BinaryColor>, EggsError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 475 |     ) -> Result<ImageRaw<'_, BinaryColor>, EggsError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/eggs.rs:494:9
[INFO] [stdout]     |
[INFO] [stdout] 494 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 500 |     ) -> Result<ImageRaw<Gray4>, EggsError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 500 |     ) -> Result<ImageRaw<'_, Gray4>, EggsError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/visualization.rs:249:9
[INFO] [stdout]     |
[INFO] [stdout] 249 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 260 |     ) -> Result<ImageRaw<BinaryColor>, VizError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 260 |     ) -> Result<ImageRaw<'_, BinaryColor>, VizError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/visualization.rs:277:9
[INFO] [stdout]     |
[INFO] [stdout] 277 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 288 |     ) -> Result<ImageRaw<BinaryColor>, VizError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 288 |     ) -> Result<ImageRaw<'_, BinaryColor>, VizError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/visualization.rs:319:9
[INFO] [stdout]     |
[INFO] [stdout] 319 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 330 |     ) -> Result<ImageRaw<Gray4>, VizError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 330 |     ) -> Result<ImageRaw<'_, Gray4>, VizError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `i2c_bus_path`
[INFO] [stdout]    --> src/main.rs:932:9
[INFO] [stdout]     |
[INFO] [stdout] 932 |     let i2c_bus_path = matches.get_one::<String>("i2c-bus").unwrap();
[INFO] [stdout]     |         ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_i2c_bus_path`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `unified_display_loop` is never used
[INFO] [stdout]   --> src/main.rs:89:10
[INFO] [stdout]    |
[INFO] [stdout] 89 | async fn unified_display_loop(
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ConfigError` is never used
[INFO] [stdout]  --> src/config.rs:9:10
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub enum ConfigError {
[INFO] [stdout]   |          ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load` is never used
[INFO] [stdout]   --> src/config.rs:75:8
[INFO] [stdout]    |
[INFO] [stdout] 75 | pub fn load() -> Result<Config, ConfigError> {
[INFO] [stdout]    |        ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `find_config_file` is never used
[INFO] [stdout]    --> src/config.rs:114:4
[INFO] [stdout]     |
[INFO] [stdout] 114 | fn find_config_file() -> Option<PathBuf> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `read_yaml` is never used
[INFO] [stdout]    --> src/config.rs:130:4
[INFO] [stdout]     |
[INFO] [stdout] 130 | fn read_yaml(path: &Path) -> Result<Config, ConfigError> {
[INFO] [stdout]     |    ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `merge` is never used
[INFO] [stdout]    --> src/config.rs:137:4
[INFO] [stdout]     |
[INFO] [stdout] 137 | fn merge(dst: &mut Config, src: Config) {
[INFO] [stdout]     |    ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `merge_display` is never used
[INFO] [stdout]    --> src/config.rs:148:4
[INFO] [stdout]     |
[INFO] [stdout] 148 | fn merge_display(dst: &mut DisplayConfig, src: DisplayConfig) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `apply_cli_overrides` is never used
[INFO] [stdout]    --> src/config.rs:158:4
[INFO] [stdout]     |
[INFO] [stdout] 158 | fn apply_cli_overrides(cfg: &mut Config, cli: &Cli) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate` is never used
[INFO] [stdout]    --> src/config.rs:177:4
[INFO] [stdout]     |
[INFO] [stdout] 177 | fn validate(cfg: &Config) -> Result<(), ConfigError> {
[INFO] [stdout]     |    ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEG_TO_RAD` is never used
[INFO] [stdout]   --> src/trig.rs:28:11
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub const DEG_TO_RAD: f32 = core::f32::consts::PI / 180.0;
[INFO] [stdout]    |           ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RAD_TO_DEG` is never used
[INFO] [stdout]   --> src/trig.rs:29:11
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub const RAD_TO_DEG: f32 = 180.0 / core::f32::consts::PI;
[INFO] [stdout]    |           ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sinf` is never used
[INFO] [stdout]   --> src/trig.rs:32:8
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub fn sinf(x: f32) -> f32 {
[INFO] [stdout]    |        ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cosf` is never used
[INFO] [stdout]   --> src/trig.rs:50:8
[INFO] [stdout]    |
[INFO] [stdout] 50 | pub fn cosf(x: f32) -> f32 {
[INFO] [stdout]    |        ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `reduce_pi_over_2` is never used
[INFO] [stdout]   --> src/trig.rs:66:4
[INFO] [stdout]    |
[INFO] [stdout] 66 | fn reduce_pi_over_2(x: f32) -> (f32, i32) {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sin_poly` is never used
[INFO] [stdout]   --> src/trig.rs:84:4
[INFO] [stdout]    |
[INFO] [stdout] 84 | fn sin_poly(r: f32) -> f32 {
[INFO] [stdout]    |    ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cos_poly` is never used
[INFO] [stdout]    --> src/trig.rs:100:4
[INFO] [stdout]     |
[INFO] [stdout] 100 | fn cos_poly(r: f32) -> f32 {
[INFO] [stdout]     |    ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `Draw` is never constructed
[INFO] [stdout]   --> src/drawsvg.rs:40:5
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub enum PutSvgError<DE> {
[INFO] [stdout]    |          ----------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 40 |     Draw(DE),
[INFO] [stdout]    |     ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PutSvgError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_svg_async` is never used
[INFO] [stdout]   --> src/drawsvg.rs:55:14
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub async fn get_svg_async (
[INFO] [stdout]    |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `put_svg` is never used
[INFO] [stdout]    --> src/drawsvg.rs:116:8
[INFO] [stdout]     |
[INFO] [stdout] 116 | pub fn put_svg<D>(
[INFO] [stdout]     |        ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `put_svg_async` is never used
[INFO] [stdout]    --> src/drawsvg.rs:152:14
[INFO] [stdout]     |
[INFO] [stdout] 152 | pub async fn put_svg_async<D>(
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_svg_gray4_binary` is never used
[INFO] [stdout]    --> src/drawsvg.rs:187:8
[INFO] [stdout]     |
[INFO] [stdout] 187 | pub fn get_svg_gray4_binary(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `as_any`, `as_any_mut`, `dimensions`, and `clear` are never used
[INFO] [stdout]   --> src/display/traits.rs:68:8
[INFO] [stdout]    |
[INFO] [stdout] 63 | pub trait DisplayDriver: Send + Sync {
[INFO] [stdout]    |           ------------- methods in this trait
[INFO] [stdout] ...
[INFO] [stdout] 68 |     fn as_any(&self) -> &dyn std::any::Any;
[INFO] [stdout]    |        ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 71 |     fn as_any_mut(&mut self) -> &mut dyn std::any::Any;
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 77 |     fn dimensions(&self) -> (u32, u32) {
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 99 |     fn clear(&mut self) -> Result<(), DisplayError>;
[INFO] [stdout]    |        ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `DrawableDisplay` is never used
[INFO] [stdout]    --> src/display/traits.rs:143:11
[INFO] [stdout]     |
[INFO] [stdout] 143 | pub trait DrawableDisplay: DisplayDriver {
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `SpiError` and `GpioError` are never constructed
[INFO] [stdout]   --> src/display/error.rs:37:5
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub enum DisplayError {
[INFO] [stdout]    |          ------------ variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 37 |     SpiError(String),
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 40 |     GpioError(String),
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `DisplayError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `dimensions`, `as_mono_mut`, `as_mono`, `as_gray4_mut`, `as_gray4`, and `as_bytes` are never used
[INFO] [stdout]    --> src/display/framebuffer.rs:64:12
[INFO] [stdout]     |
[INFO] [stdout]  42 | impl FrameBuffer {
[INFO] [stdout]     | ---------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  64 |     pub fn dimensions(&self) -> (u32, u32) {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  83 |     pub fn as_mono_mut(&mut self) -> &mut VarFrameBuf<BinaryColor> {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  91 |     pub fn as_mono(&self) -> Option<&VarFrameBuf<BinaryColor>> {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 146 |     pub fn as_gray4_mut(&mut self) -> &mut VarFrameBuf<Gray4> {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 154 |     pub fn as_gray4(&self) -> Option<&VarFrameBuf<Gray4>> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 165 |     pub fn as_bytes(&self) -> Vec<u8> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `validate_config` is never used
[INFO] [stdout]    --> src/display/factory.rs:258:12
[INFO] [stdout]     |
[INFO] [stdout]  50 | impl DisplayDriverFactory {
[INFO] [stdout]     | ------------------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 258 |     pub fn validate_config(config: &DisplayConfig) -> Result<(), DisplayFactoryError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Black`, `DarkGray`, `Gray`, `LightGray`, and `Grayscale` are never constructed
[INFO] [stdout]   --> src/display/color.rs:34:5
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub enum Color {
[INFO] [stdout]    |          ----- variants in this enum
[INFO] [stdout] 33 |     /// Black/Off (0% intensity)
[INFO] [stdout] 34 |     Black,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 37 |     DarkGray,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 40 |     Gray,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 43 |     LightGray,
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 58 |     Grayscale(u8),
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Color` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `to_color_depth` and `luminance` are never used
[INFO] [stdout]    --> src/display/color.rs:100:12
[INFO] [stdout]     |
[INFO] [stdout]  61 | impl Color {
[INFO] [stdout]     | ---------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 100 |     pub fn to_color_depth(&self, depth: ColorDepth) -> ColorValue {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     pub fn luminance(&self) -> u8 {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ColorValue` is never used
[INFO] [stdout]    --> src/display/color.rs:125:10
[INFO] [stdout]     |
[INFO] [stdout] 125 | pub enum ColorValue {
[INFO] [stdout]     |          ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `as_binary` and `as_gray4` are never used
[INFO] [stdout]    --> src/display/color.rs:132:12
[INFO] [stdout]     |
[INFO] [stdout] 130 | impl ColorValue {
[INFO] [stdout]     | --------------- methods in this implementation
[INFO] [stdout] 131 |     /// Get as BinaryColor (converts if needed)
[INFO] [stdout] 132 |     pub fn as_binary(&self) -> BinaryColor {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 148 |     pub fn as_gray4(&self) -> Gray4 {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated constants `OFF` and `ON` are never used
[INFO] [stdout]    --> src/display/color.rs:164:15
[INFO] [stdout]     |
[INFO] [stdout] 163 | impl Color {
[INFO] [stdout]     | ---------- associated constants in this implementation
[INFO] [stdout] 164 |     pub const OFF: Color = Color::Black;
[INFO] [stdout]     |               ^^^
[INFO] [stdout] 165 |     pub const ON: Color = Color::White;
[INFO] [stdout]     |               ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `Pal16` is never used
[INFO] [stdout]   --> src/display/color_proxy.rs:64:10
[INFO] [stdout]    |
[INFO] [stdout] 64 | pub enum Pal16 {
[INFO] [stdout]    |          ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `to_gray4` and `to_binary` are never used
[INFO] [stdout]   --> src/display/color_proxy.rs:85:12
[INFO] [stdout]    |
[INFO] [stdout] 83 | impl Pal16 {
[INFO] [stdout]    | ---------- methods in this implementation
[INFO] [stdout] 84 |     /// Convert palette color to grayscale value (0-15)
[INFO] [stdout] 85 |     pub fn to_gray4(self) -> Gray4 {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 90 |     pub fn to_binary(self) -> BinaryColor {
[INFO] [stdout]    |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `ColorProxy` is never used
[INFO] [stdout]    --> src/display/color_proxy.rs:101:11
[INFO] [stdout]     |
[INFO] [stdout] 101 | pub trait ColorProxy {
[INFO] [stdout]     |           ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MonoProxy` is never constructed
[INFO] [stdout]    --> src/display/color_proxy.rs:115:12
[INFO] [stdout]     |
[INFO] [stdout] 115 | pub struct MonoProxy;
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Gray4Proxy` is never constructed
[INFO] [stdout]    --> src/display/color_proxy.rs:134:12
[INFO] [stdout]     |
[INFO] [stdout] 134 | pub struct Gray4Proxy;
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `ErrorNullPointer` and `ErrorAbiMismatch` are never constructed
[INFO] [stdout]   --> src/display/plugin/ffi.rs:82:5
[INFO] [stdout]    |
[INFO] [stdout] 59 | pub enum LyMonsErrorCode {
[INFO] [stdout]    |          --------------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 82 |     ErrorNullPointer = 7,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 88 |     ErrorAbiMismatch = 9,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LyMonsErrorCode` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `driver_type` and `abi_version` are never read
[INFO] [stdout]   --> src/display/plugin/loader.rs:50:9
[INFO] [stdout]    |
[INFO] [stdout] 42 | pub struct PluginMetadata {
[INFO] [stdout]    |            -------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 50 |     pub driver_type: String,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 53 |     pub abi_version: (u32, u32, u32),
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PluginMetadata` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `plugin_name` and `plugin_version` are never used
[INFO] [stdout]    --> src/display/plugin/adapter.rs:132:12
[INFO] [stdout]     |
[INFO] [stdout]  64 | impl PluginDriverAdapter {
[INFO] [stdout]     | ------------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 132 |     pub fn plugin_name(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 137 |     pub fn plugin_version(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `color_depth`, `status_bar`, `content_area`, `fonts`, `clock`, and `weather` are never read
[INFO] [stdout]   --> src/display/layout.rs:39:9
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub struct LayoutConfig {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 39 |     pub color_depth: ColorDepth,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 45 |     pub status_bar: StatusBarLayout,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 48 |     pub content_area: ContentAreaLayout,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 51 |     pub fonts: FontSizes,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 60 |     pub clock: ClockLayout,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 63 |     pub weather: WeatherLayout,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LayoutConfig` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `height`, `y`, `icon_size`, `spacing`, and `font_size` are never read
[INFO] [stdout]   --> src/display/layout.rs:86:9
[INFO] [stdout]    |
[INFO] [stdout] 84 | pub struct StatusBarLayout {
[INFO] [stdout]    |            --------------- fields in this struct
[INFO] [stdout] 85 |     /// Height of status bar in pixels
[INFO] [stdout] 86 |     pub height: u32,
[INFO] [stdout]    |         ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 89 |     pub y: u32,
[INFO] [stdout]    |         ^
[INFO] [stdout] ...
[INFO] [stdout] 92 |     pub icon_size: u32,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 95 |     pub spacing: u32,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 98 |     pub font_size: FontSize,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `StatusBarLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `y`, `height`, `margin_left`, `margin_right`, `margin_top`, and `margin_bottom` are never read
[INFO] [stdout]    --> src/display/layout.rs:105:9
[INFO] [stdout]     |
[INFO] [stdout] 103 | pub struct ContentAreaLayout {
[INFO] [stdout]     |            ----------------- fields in this struct
[INFO] [stdout] 104 |     /// Y position where content starts (after status bar)
[INFO] [stdout] 105 |     pub y: u32,
[INFO] [stdout]     |         ^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     pub height: u32,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 111 |     pub margin_left: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 114 |     pub margin_right: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 117 |     pub margin_top: u32,
[INFO] [stdout]     |         ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 120 |     pub margin_bottom: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `ContentAreaLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `height`, `vu_segments`, `peak_height`, and `hist_bar_width` are never read
[INFO] [stdout]    --> src/display/layout.rs:130:9
[INFO] [stdout]     |
[INFO] [stdout] 125 | pub struct VisualizerLayout {
[INFO] [stdout]     |            ---------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 130 |     pub height: u32,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 133 |     pub vu_segments: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 136 |     pub peak_height: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 139 |     pub hist_bar_width: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `VisualizerLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `digit_width`, `digit_height`, `digit_spacing`, `date_font_size`, `clock_y`, and `date_y` are never read
[INFO] [stdout]    --> src/display/layout.rs:149:9
[INFO] [stdout]     |
[INFO] [stdout] 147 | pub struct ClockLayout {
[INFO] [stdout]     |            ----------- fields in this struct
[INFO] [stdout] 148 |     /// Digit width for large clock digits
[INFO] [stdout] 149 |     pub digit_width: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 152 |     pub digit_height: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 155 |     pub digit_spacing: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 158 |     pub date_font_size: FontSize,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 161 |     pub clock_y: u32,
[INFO] [stdout]     |         ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 164 |     pub date_y: u32,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `ClockLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `icon_size`, `temp_font_size`, `condition_font_size`, `forecast_font_size`, and `forecast_days` are never read
[INFO] [stdout]    --> src/display/layout.rs:171:9
[INFO] [stdout]     |
[INFO] [stdout] 169 | pub struct WeatherLayout {
[INFO] [stdout]     |            ------------- fields in this struct
[INFO] [stdout] 170 |     /// Icon size for weather icons
[INFO] [stdout] 171 |     pub icon_size: u32,
[INFO] [stdout]     |         ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 174 |     pub temp_font_size: FontSize,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 177 |     pub condition_font_size: FontSize,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 180 |     pub forecast_font_size: FontSize,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 183 |     pub forecast_days: u32,
[INFO] [stdout]     |         ^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `WeatherLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `status`, `content`, `time`, `clock_digits`, and `weather` are never read
[INFO] [stdout]    --> src/display/layout.rs:209:9
[INFO] [stdout]     |
[INFO] [stdout] 207 | pub struct FontSizes {
[INFO] [stdout]     |            --------- fields in this struct
[INFO] [stdout] 208 |     /// Status bar text
[INFO] [stdout] 209 |     pub status: FontSize,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 212 |     pub content: FontSize,
[INFO] [stdout]     |         ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 215 |     pub time: FontSize,
[INFO] [stdout]     |         ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 218 |     pub clock_digits: FontSize,
[INFO] [stdout]     |         ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 221 |     pub weather: FontSize,
[INFO] [stdout]     |         ^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `FontSizes` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `asset_path_for`, `scale_width`, `scale_height`, `scroll_speed`, `recommended_fps`, and `supports_grayscale` are never used
[INFO] [stdout]    --> src/display/layout.rs:432:12
[INFO] [stdout]     |
[INFO] [stdout] 224 | impl LayoutConfig {
[INFO] [stdout]     | ----------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 432 |     pub fn asset_path_for(&self, asset_type: AssetType) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 453 |     pub fn scale_width(&self, reference_value: u32) -> u32 {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 460 |     pub fn scale_height(&self, reference_value: u32) -> u32 {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 465 |     pub fn scroll_speed(&self) -> u32 {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 475 |     pub fn recommended_fps(&self) -> u32 {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 484 |     pub fn supports_grayscale(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `AssetType` is never used
[INFO] [stdout]    --> src/display/layout.rs:491:10
[INFO] [stdout]     |
[INFO] [stdout] 491 | pub enum AssetType {
[INFO] [stdout]     |          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `layout_for_resolution` is never used
[INFO] [stdout]    --> src/display/layout.rs:503:8
[INFO] [stdout]     |
[INFO] [stdout] 503 | pub fn layout_for_resolution(width: u32, height: u32, color_depth: ColorDepth) -> LayoutConfig {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `track_buffer` is never read
[INFO] [stdout]   --> src/display/manager.rs:66:9
[INFO] [stdout]    |
[INFO] [stdout] 60 | pub struct RenderBuffers {
[INFO] [stdout]    |            ------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 66 |     pub track_buffer: ArrayString<128>,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `RenderBuffers` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `format_hms` is never used
[INFO] [stdout]   --> src/display/manager.rs:93:12
[INFO] [stdout]    |
[INFO] [stdout] 82 | impl RenderBuffers {
[INFO] [stdout]    | ------------------ method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 93 |     pub fn format_hms(&mut self, seconds: f32) -> &str {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `easter_eggs_component`, `last_viz_state`, `album`, and `weather_wind_speed_units` are never read
[INFO] [stdout]    --> src/display/manager.rs:255:5
[INFO] [stdout]     |
[INFO] [stdout] 231 | pub struct DisplayManager {
[INFO] [stdout]     |            -------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 255 |     easter_eggs_component: EasterEggsComponent,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 267 |     pub last_viz_state: LastVizState,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 283 |     pub album: String,
[INFO] [stdout]     |         ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 293 |     pub weather_wind_speed_units: String,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]     --> src/display/manager.rs:440:12
[INFO] [stdout]      |
[INFO] [stdout]  304 | impl DisplayManager {
[INFO] [stdout]      | ------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  440 |     pub fn capabilities(&self) -> &DisplayCapabilities {
[INFO] [stdout]      |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  445 |     pub fn layout(&self) -> &LayoutConfig {
[INFO] [stdout]      |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  450 |     pub fn status_bar_mut(&mut self) -> &mut StatusBar {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  455 |     pub fn scrolling_text_mut(&mut self) -> &mut ScrollingText {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  460 |     pub fn clock_display_mut(&mut self) -> &mut ClockDisplay {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  465 |     pub fn weather_display_mut(&mut self) -> &mut WeatherComponent {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  470 |     pub fn visualizer_mut(&mut self) -> &mut VisualizerComponent {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  837 |     fn render_progress_bar_to_field_data<D>(
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  887 |     fn render_progress_bar_to_field<D>(&mut self, field: &crate::display::field::Field, fb: &mut D) -> Result<(), DisplayError>
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  895 |     fn render_progress_bar(&mut self) -> Result<(), DisplayError> {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  938 |     fn render_info_line_to_field_data<D>(
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1014 |     fn render_info_line_to_field<D>(&mut self, field: &crate::display::field::Field, fb: &mut D) -> Result<(), DisplayError>
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1030 |     fn render_info_line(&mut self) -> Result<(), DisplayError> {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2788 |     pub fn set_brightness(&mut self, brightness: u8) -> Result<(), DisplayError> {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2793 |     pub fn display_mode(&self) -> DisplayMode {
[INFO] [stdout]      |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2819 |     pub fn is_manual_mode_override(&self) -> bool {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2835 |     pub fn check_emulator_mode_request(&mut self) -> Option<DisplayMode> {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2849 |     pub fn update_emulator_current_mode(&mut self, _mode: DisplayMode) {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2862 |     pub async fn update(&mut self) -> Result<(), DisplayError> {
[INFO] [stdout]      |                  ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2875 |     pub fn render_buffers_mut(&mut self) -> &mut RenderBuffers {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 2880 |     pub fn performance_metrics(&self) -> &PerformanceMetrics {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 3102 |     pub async fn setup_visualizer(
[INFO] [stdout]      |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 3170 |     pub fn cycle_easter_egg(&mut self) {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 3198 |     pub fn cycle_visualization(&mut self) {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `layout` is never read
[INFO] [stdout]    --> src/display/components/status_bar.rs:101:5
[INFO] [stdout]     |
[INFO] [stdout]  99 | pub struct StatusBar {
[INFO] [stdout]     |            --------- field in this struct
[INFO] [stdout] 100 |     state: StatusBarState,
[INFO] [stdout] 101 |     layout: LayoutConfig,
[INFO] [stdout]     |     ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `update`, `state`, `render`, and `format_volume` are never used
[INFO] [stdout]    --> src/display/components/status_bar.rs:138:12
[INFO] [stdout]     |
[INFO] [stdout] 104 | impl StatusBar {
[INFO] [stdout]     | -------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 138 |     pub fn update(&mut self, state: StatusBarState) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 143 |     pub fn state(&self) -> &StatusBarState {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 148 |     pub fn render<D>(&self, target: &mut D) -> Result<(), D::Error>
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 365 |     pub fn format_volume(&self) -> ArrayString<8> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `transpose_repeat_mode` is never used
[INFO] [stdout]    --> src/display/components/status_bar.rs:377:8
[INFO] [stdout]     |
[INFO] [stdout] 377 | pub fn transpose_repeat_mode(mode: i32) -> RepeatMode {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `transpose_shuffle_mode` is never used
[INFO] [stdout]    --> src/display/components/status_bar.rs:387:8
[INFO] [stdout]     |
[INFO] [stdout] 387 | pub fn transpose_shuffle_mode(mode: i32) -> ShuffleMode {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `album_artist_scroller`, `album_scroller`, `title_scroller`, `artist_scroller`, `layout`, and `display_width` are never read
[INFO] [stdout]    --> src/display/components/scrollers.rs:119:5
[INFO] [stdout]     |
[INFO] [stdout] 118 | pub struct ScrollingText {
[INFO] [stdout]     |            ------------- fields in this struct
[INFO] [stdout] 119 |     album_artist_scroller: Option<TextScroller>,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 120 |     album_scroller: Option<TextScroller>,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^
[INFO] [stdout] 121 |     title_scroller: Option<TextScroller>,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^
[INFO] [stdout] 122 |     artist_scroller: Option<TextScroller>,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 123 |     scroll_mode: ScrollMode,
[INFO] [stdout] 124 |     layout: LayoutConfig,
[INFO] [stdout]     |     ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 130 |     display_width: u32,
[INFO] [stdout]     |     ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `set_track_info`, `update`, `render`, `stop`, `scroll_mode`, and `set_scroll_mode` are never used
[INFO] [stdout]    --> src/display/components/scrollers.rs:173:12
[INFO] [stdout]     |
[INFO] [stdout] 133 | impl ScrollingText {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 173 |     pub fn set_track_info(&mut self, artist: String, title: String) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 193 |     pub fn update(&mut self) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 215 |     pub fn render<D>(&self, target: &mut D) -> Result<(), D::Error>
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 338 |     pub fn stop(&mut self) {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 346 |     pub fn scroll_mode(&self) -> ScrollMode {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 351 |     pub fn set_scroll_mode(&mut self, mode: ScrollMode) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `last_clock_digits`, `colon_on`, `last_colon_toggle_time`, `last_second_drawn`, and `last_date_drawn` are never read
[INFO] [stdout]   --> src/display/components/clock.rs:34:9
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub struct ClockState {
[INFO] [stdout]    |            ---------- fields in this struct
[INFO] [stdout] 33 |     /// Last displayed time digits [H, H, :, M, M]
[INFO] [stdout] 34 |     pub last_clock_digits: [char; 5],
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 37 |     pub colon_on: bool,
[INFO] [stdout]    |         ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 40 |     pub last_colon_toggle_time: Instant,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 43 |     pub last_second_drawn: f32,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 46 |     pub last_date_drawn: String,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ClockState` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `state` and `metrics` are never read
[INFO] [stdout]   --> src/display/components/clock.rs:63:5
[INFO] [stdout]    |
[INFO] [stdout] 62 | pub struct ClockDisplay {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] 63 |     state: ClockState,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 66 |     metrics: bool,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `update`, `toggle_colon`, `state`, and `set_date` are never used
[INFO] [stdout]    --> src/display/components/clock.rs:81:12
[INFO] [stdout]     |
[INFO] [stdout]  69 | impl ClockDisplay {
[INFO] [stdout]     | ----------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  81 |     pub fn update(&mut self, current_time_secs: f32) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  87 |     pub fn toggle_colon(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 326 |     pub fn state(&self) -> &ClockState {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 331 |     pub fn set_date(&mut self, date: String) {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `Forecast` is never constructed
[INFO] [stdout]   --> src/display/components/weather.rs:37:5
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub enum WeatherDisplayMode {
[INFO] [stdout]    |          ------------------ variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 37 |     Forecast,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `WeatherDisplayMode` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `layout`, `display_mode`, and `display_switch_timer` are never read
[INFO] [stdout]   --> src/display/components/weather.rs:42:5
[INFO] [stdout]    |
[INFO] [stdout] 41 | pub struct WeatherDisplay {
[INFO] [stdout]    |            -------------- fields in this struct
[INFO] [stdout] 42 |     layout: LayoutConfig,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 43 |     last_weather_data: Vec<WeatherData>,
[INFO] [stdout] 44 |     display_mode: WeatherDisplayMode,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 45 |     display_switch_timer: Option<Instant>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `display_mode`, `set_display_mode`, `toggle_mode`, `has_changed`, `render`, and `get_icon_path` are never used
[INFO] [stdout]    --> src/display/components/weather.rs:65:12
[INFO] [stdout]     |
[INFO] [stdout]  48 | impl WeatherDisplay {
[INFO] [stdout]     | ------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  65 |     pub fn display_mode(&self) -> WeatherDisplayMode {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  70 |     pub fn set_display_mode(&mut self, mode: WeatherDisplayMode) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  75 |     pub fn toggle_mode(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  84 |     pub fn has_changed(&self, new_data: &[WeatherData]) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  99 |     pub fn render<D>(&self, target: &mut D) -> Result<(), D::Error>
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 114 |     pub fn get_icon_path(&self) -> Option<String> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `level`, `pct`, and `viz_init_clear` are never read
[INFO] [stdout]   --> src/display/components/visualizer.rs:43:9
[INFO] [stdout]    |
[INFO] [stdout] 41 | pub struct VisualizerState {
[INFO] [stdout]    |            --------------- fields in this struct
[INFO] [stdout] 42 |     /// Audio level (0-100)
[INFO] [stdout] 43 |     pub level: u8,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] 44 |     /// Peak percentage
[INFO] [stdout] 45 |     pub pct: f64,
[INFO] [stdout]    |         ^^^
[INFO] [stdout] 46 |     /// Whether visualizer needs initialization clear
[INFO] [stdout] 47 |     pub viz_init_clear: bool,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `VisualizerState` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `state` is never read
[INFO] [stdout]   --> src/display/components/visualizer.rs:92:5
[INFO] [stdout]    |
[INFO] [stdout] 90 | pub struct VisualizerComponent {
[INFO] [stdout]    |            ------------------- field in this struct
[INFO] [stdout] 91 |     visualizer: Option<Visualizer>,
[INFO] [stdout] 92 |     state: VisualizerState,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/display/components/visualizer.rs:119:12
[INFO] [stdout]     |
[INFO] [stdout]  99 | impl VisualizerComponent {
[INFO] [stdout]     | ------------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 119 |     pub fn set_visualizer(&mut self, visualizer: Visualizer) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 123 |     pub fn update_visual(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 133 |     pub fn visualizer(&self) -> Option<&Visualizer> {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 138 |     pub fn update(&mut self, level: u8, pct: f64) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 144 |     pub fn state(&self) -> &VisualizerState {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 149 |     pub fn visualization_type(&self) -> Visualization {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 155 |     pub fn set_visualization_type(&mut self, viz_type: Visualization) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 382 |     pub fn mark_init_clear(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 387 |     pub fn needs_init_clear(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 392 |     pub fn clear_init_flag(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 402 |     pub fn viz_state(&self) -> &crate::vision::LastVizState {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `render_egg_image`, `render_artist_text`, `render_title_text`, and `render_time_text` are never used
[INFO] [stdout]    --> src/display/components/easter_eggs.rs:51:18
[INFO] [stdout]     |
[INFO] [stdout]  45 | impl EasterEggsComponent {
[INFO] [stdout]     | ------------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  51 |     pub async fn render_egg_image<D>(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  79 |     pub fn render_artist_text<D>(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 137 |     pub fn render_title_text<D>(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 176 |     pub fn render_time_text<D>(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `field_type` is never read
[INFO] [stdout]   --> src/display/field.rs:52:9
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub struct Field {
[INFO] [stdout]    |            ----- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 52 |     pub field_type: FieldType,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Field` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `bg_binary` is never used
[INFO] [stdout]    --> src/display/field.rs:168:12
[INFO] [stdout]     |
[INFO] [stdout]  77 | impl Field {
[INFO] [stdout]     | ---------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 168 |     pub fn bg_binary(&self) -> Option<BinaryColor> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `name` is never read
[INFO] [stdout]   --> src/display/page.rs:33:9
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub struct PageLayout {
[INFO] [stdout]    |            ---------- field in this struct
[INFO] [stdout] 32 |     /// Page identifier
[INFO] [stdout] 33 |     pub name: String,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PageLayout` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `add_fields` and `get_field_mut` are never used
[INFO] [stdout]   --> src/display/page.rs:55:12
[INFO] [stdout]    |
[INFO] [stdout] 39 | impl PageLayout {
[INFO] [stdout]    | --------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 55 |     pub fn add_fields(mut self, fields: Vec<Field>) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 66 |     pub fn get_field_mut(&mut self, name: &str) -> Option<&mut Field> {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `create_visualizer_page`, `create_easter_eggs_page`, and `layout_config` are never used
[INFO] [stdout]    --> src/display/layout_manager.rs:537:12
[INFO] [stdout]     |
[INFO] [stdout]  44 | impl LayoutManager {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 537 |     pub fn create_visualizer_page(&self) -> PageLayout {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 560 |     pub fn create_easter_eggs_page(&self) -> PageLayout {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 627 |     pub fn layout_config(&self) -> &LayoutConfig {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLOCK_DIGIT_WIDTH` is never used
[INFO] [stdout]    --> src/display/layout_manager.rs:142:15
[INFO] [stdout]     |
[INFO] [stdout] 142 |         const CLOCK_DIGIT_WIDTH: i32 = 25; // custom font width
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `time_since_mode_change` is never used
[INFO] [stdout]    --> src/display/mode_controller.rs:176:12
[INFO] [stdout]     |
[INFO] [stdout]  72 | impl DisplayModeController {
[INFO] [stdout]     | -------------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 176 |     pub fn time_since_mode_change(&self) -> std::time::Duration {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]   --> src/metrics.rs:44:8
[INFO] [stdout]    |
[INFO] [stdout] 40 | impl MachineMetrics {
[INFO] [stdout]    | ------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 44 |     fn read_first_float_from_file(&mut self, path: &str) -> io::Result<f32> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 51 |     fn read_first_long_from_file(&mut self, path: &str) -> io::Result<i64> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 59 |     fn cpu_load(&mut self) -> f64 {
[INFO] [stdout]    |        ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 68 |     fn cpu_temp(&mut self) -> f64 {
[INFO] [stdout]    |        ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 80 |     fn up_time(&mut self) -> f64 {
[INFO] [stdout]    |        ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 87 |     pub fn update(&mut self, metrics: MachineMetrics) {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 93 |     pub fn check(&mut self) -> MachineMetrics {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TAG_DISPLAY_ALBUMARTIST` is never used
[INFO] [stdout]   --> src/constants.rs:28:11
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub const TAG_DISPLAY_ALBUMARTIST: usize = 0;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TAG_DISPLAY_ALBUM` is never used
[INFO] [stdout]   --> src/constants.rs:29:11
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub const TAG_DISPLAY_ALBUM: usize = 1;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TAG_DISPLAY_TITLE` is never used
[INFO] [stdout]   --> src/constants.rs:30:11
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub const TAG_DISPLAY_TITLE: usize = 2;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TAG_DISPLAY_ARTIST` is never used
[INFO] [stdout]   --> src/constants.rs:31:11
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub const TAG_DISPLAY_ARTIST: usize = 3;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DISPLAY_WIDTH` is never used
[INFO] [stdout]   --> src/constants.rs:34:11
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub const DISPLAY_WIDTH: u32 = 128;
[INFO] [stdout]    |           ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DISPLAY_REGION_X_OFFSET` is never used
[INFO] [stdout]   --> src/constants.rs:39:11
[INFO] [stdout]    |
[INFO] [stdout] 39 | pub const DISPLAY_REGION_X_OFFSET: i32 = 0; // Starts from the left edge
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DISPLAY_REGION_Y_OFFSET` is never used
[INFO] [stdout]   --> src/constants.rs:41:11
[INFO] [stdout]    |
[INFO] [stdout] 41 | pub const DISPLAY_REGION_Y_OFFSET: i32 = 0; // Starts from the top edge
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DISPLAY_REGION_WIDTH` is never used
[INFO] [stdout]   --> src/constants.rs:43:11
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub const DISPLAY_REGION_WIDTH: u32 = DISPLAY_WIDTH - 2; // Occupies adjusted width
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_LINES` is never used
[INFO] [stdout]   --> src/constants.rs:50:11
[INFO] [stdout]    |
[INFO] [stdout] 50 | pub const MAX_LINES: usize = 6;
[INFO] [stdout]    |           ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAIN_FONT_HEIGHT` is never used
[INFO] [stdout]   --> src/constants.rs:53:11
[INFO] [stdout]    |
[INFO] [stdout] 53 | pub const MAIN_FONT_HEIGHT: u32 = 8;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAIN_LINE_SPACING` is never used
[INFO] [stdout]   --> src/constants.rs:55:11
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub const MAIN_LINE_SPACING: i32 = 2; // Additional pixels between lines
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GLYPH_WIDTH` is never used
[INFO] [stdout]   --> src/constants.rs:58:11
[INFO] [stdout]    |
[INFO] [stdout] 58 | pub const GLYPH_WIDTH: u32 = 8;
[INFO] [stdout]    |           ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLOCK_DIGIT_GAP_HORIZONTAL` is never used
[INFO] [stdout]   --> src/constants.rs:65:11
[INFO] [stdout]    |
[INFO] [stdout] 65 | pub const CLOCK_DIGIT_GAP_HORIZONTAL: i32 = 1; // For spacing between H and H, M and M, and H and colon
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLOCK_COLON_MINUTE_GAP` is never used
[INFO] [stdout]   --> src/constants.rs:67:11
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub const CLOCK_COLON_MINUTE_GAP: i32 = 0; // Wider gap for visual separation
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLOCK_PROGRESS_BAR_GAP` is never used
[INFO] [stdout]   --> src/constants.rs:69:11
[INFO] [stdout]    |
[INFO] [stdout] 69 | pub const CLOCK_PROGRESS_BAR_GAP: i32 = 4;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PROGRESS_BAR_DATE_GAP` is never used
[INFO] [stdout]   --> src/constants.rs:71:11
[INFO] [stdout]    |
[INFO] [stdout] 71 | pub const PROGRESS_BAR_DATE_GAP: i32 = 2;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DATE_FONT_HEIGHT` is never used
[INFO] [stdout]   --> src/constants.rs:73:11
[INFO] [stdout]    |
[INFO] [stdout] 73 | pub const DATE_FONT_HEIGHT: u32 = 10;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYER_PROGRESS_BAR_Y_POS` is never used
[INFO] [stdout]   --> src/constants.rs:77:11
[INFO] [stdout]    |
[INFO] [stdout] 77 | pub const PLAYER_PROGRESS_BAR_Y_POS: i32 = 51; // Line 5 starts at this Y position
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYER_PROGRESS_BAR_WIDTH` is never used
[INFO] [stdout]   --> src/constants.rs:79:11
[INFO] [stdout]    |
[INFO] [stdout] 79 | pub const PLAYER_PROGRESS_BAR_WIDTH: u32 = DISPLAY_WIDTH - 4; // 2 pixels padding on each side
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYER_PROGRESS_BAR_HEIGHT` is never used
[INFO] [stdout]   --> src/constants.rs:81:11
[INFO] [stdout]    |
[INFO] [stdout] 81 | pub const PLAYER_PROGRESS_BAR_HEIGHT: u32 = 4;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYER_PROGRESS_BAR_BORDER_THICKNESS` is never used
[INFO] [stdout]   --> src/constants.rs:83:11
[INFO] [stdout]    |
[INFO] [stdout] 83 | pub const PLAYER_PROGRESS_BAR_BORDER_THICKNESS: u32 = 1;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYER_TRACK_INFO_LINE_Y_POS` is never used
[INFO] [stdout]   --> src/constants.rs:86:11
[INFO] [stdout]    |
[INFO] [stdout] 86 | pub const PLAYER_TRACK_INFO_LINE_Y_POS: i32 = DISPLAY_HEIGHT as i32 - MAIN_FONT_HEIGHT as i32; // Bottom of the screen
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `LYMONS_LOGO_WIDTH` is never used
[INFO] [stdout]   --> src/constants.rs:88:11
[INFO] [stdout]    |
[INFO] [stdout] 88 | pub const LYMONS_LOGO_WIDTH: u32 = 108;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `AudioBitrate` is never used
[INFO] [stdout]   --> src/glyphs.rs:26:10
[INFO] [stdout]    |
[INFO] [stdout] 26 | pub enum AudioBitrate {
[INFO] [stdout]    |          ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `map_repeat_mode` is never used
[INFO] [stdout]   --> src/glyphs.rs:42:4
[INFO] [stdout]    |
[INFO] [stdout] 42 | fn map_repeat_mode(mode: u8) -> RepeatMode {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `map_shuffle_mode` is never used
[INFO] [stdout]   --> src/glyphs.rs:60:4
[INFO] [stdout]    |
[INFO] [stdout] 60 | fn map_shuffle_mode(mode: u8) -> ShuffleMode {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GLYPH_AUDIO_HD` is never used
[INFO] [stdout]   --> src/glyphs.rs:86:11
[INFO] [stdout]    |
[INFO] [stdout] 86 | pub const GLYPH_AUDIO_HD: [u8; 8] = [0x00, 0x66, 0x66, 0x7e, 0x7e, 0x66, 0x66, 0x00,];
[INFO] [stdout]    |           ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GLYPH_AUDIO_SD` is never used
[INFO] [stdout]   --> src/glyphs.rs:87:11
[INFO] [stdout]    |
[INFO] [stdout] 87 | pub const GLYPH_AUDIO_SD: [u8; 8] = [0x00, 0x3c, 0x66, 0x60, 0x1c, 0x46, 0x66, 0x3c,];
[INFO] [stdout]    |           ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GLYPH_AUDIO_DSD` is never used
[INFO] [stdout]   --> src/glyphs.rs:88:11
[INFO] [stdout]    |
[INFO] [stdout] 88 | pub const GLYPH_AUDIO_DSD: [u8; 8] = [0x00, 0x78, 0x6c, 0x66, 0x66, 0x6c, 0x78, 0x00,];
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_zero_i16` is never used
[INFO] [stdout]   --> src/deutils.rs:30:8
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub fn default_zero_i16() -> i16 { 0 }
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_numeric_i32` is never used
[INFO] [stdout]   --> src/deutils.rs:54:8
[INFO] [stdout]    |
[INFO] [stdout] 54 | pub fn deserialize_numeric_i32<'de, D>(deserializer: D) -> Result<i32, D::Error>
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_numeric_u8` is never used
[INFO] [stdout]    --> src/deutils.rs:102:8
[INFO] [stdout]     |
[INFO] [stdout] 102 | pub fn deserialize_numeric_u8<'de, D>(deserializer: D) -> Result<u8, D::Error>
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_epoch_to_date_string` is never used
[INFO] [stdout]    --> src/deutils.rs:119:8
[INFO] [stdout]     |
[INFO] [stdout] 119 | pub fn deserialize_epoch_to_date_string<'de, D>(deserializer: D) -> Result<String, D::Error>
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_seconds_to_hms` is never used
[INFO] [stdout]    --> src/deutils.rs:158:8
[INFO] [stdout]     |
[INFO] [stdout] 158 | pub fn deserialize_seconds_to_hms<'de, D>(deserializer: D) -> Result<String, D::Error>
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `playing_rx` is never read
[INFO] [stdout]    --> src/sliminfo.rs:382:5
[INFO] [stdout]     |
[INFO] [stdout] 362 | pub struct LMSServer {
[INFO] [stdout]     |            --------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 382 |     playing_rx: watch::Receiver<bool>,
[INFO] [stdout]     |     ^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `LMSServer` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `subscribe_playing` and `player_mac` are never used
[INFO] [stdout]    --> src/sliminfo.rs:417:12
[INFO] [stdout]     |
[INFO] [stdout] 388 | impl LMSServer {
[INFO] [stdout]     | -------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 417 |     pub fn subscribe_playing(&self) -> watch::Receiver<bool> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 537 |     pub fn player_mac(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `IconSet` is never used
[INFO] [stdout]   --> src/weather.rs:46:10
[INFO] [stdout]    |
[INFO] [stdout] 46 | pub enum IconSet {
[INFO] [stdout]    |          ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `ForecastDay4`, `ForecastDay5`, and `ForecastDay6` are never constructed
[INFO] [stdout]   --> src/weather.rs:57:5
[INFO] [stdout]    |
[INFO] [stdout] 52 | pub enum WeatherCondition {
[INFO] [stdout]    |          ---------------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 57 |     ForecastDay4 = 4,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 58 |     ForecastDay5 = 5,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 59 |     ForecastDay6 = 6,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `WeatherCondition` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `wind_speed_units`, `sun`, `svg`, and `fsvg` are never read
[INFO] [stdout]   --> src/weather.rs:65:9
[INFO] [stdout]    |
[INFO] [stdout] 63 | pub struct WeatherDisplay{
[INFO] [stdout]    |            -------------- fields in this struct
[INFO] [stdout] 64 |     pub temp_units: String,
[INFO] [stdout] 65 |     pub wind_speed_units: String,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 66 |     pub sun: sun::SunTimes,
[INFO] [stdout]    |         ^^^
[INFO] [stdout] ...
[INFO] [stdout] 69 |     pub svg: String,
[INFO] [stdout]    |         ^^^
[INFO] [stdout] 70 |     pub fsvg: Vec<String>,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `WeatherDisplay` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Location` is never constructed
[INFO] [stdout]    --> src/weather.rs:131:12
[INFO] [stdout]     |
[INFO] [stdout] 131 | pub struct Location {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SCROLL_RIGHT` is never used
[INFO] [stdout]   --> src/textable.rs:42:7
[INFO] [stdout]    |
[INFO] [stdout] 42 | const SCROLL_RIGHT: i8 = 1;
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GAP_BETWEEN_LOOP_TEXT_FIXED` is never used
[INFO] [stdout]   --> src/textable.rs:43:11
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub const GAP_BETWEEN_LOOP_TEXT_FIXED: i32 = 12; // Fixed gap for continuous loop
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple fields are never read
[INFO] [stdout]   --> src/textable.rs:55:9
[INFO] [stdout]    |
[INFO] [stdout] 54 | pub struct State { // Made public so OledDisplay can read it
[INFO] [stdout]    |            ----- fields in this struct
[INFO] [stdout] 55 |     pub text: String,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] 56 |     pub scroll_mode: ScrollMode,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 57 |     pub font: MonoFont<'static>, // Stored here to be accessible to the task
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] 58 |     pub text_width: u32, // NEW: Text width, updated by OledDisplay
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout] 59 |     pub stop_flag: bool,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 60 |     pub current_offset_float: f32, // Use f32 for smoother scrolling calculation
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 61 |     pub last_drawn_x_rounded: i32, // Store the last rounded X position that was drawn
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 62 |     pub direction: i8, // -1 for left, 1 for right (for cylon)
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 63 |     pub paused: bool, // For pause states in scrolling
[INFO] [stdout]    |         ^^^^^^
[INFO] [stdout] 64 |     pub has_paused: bool, // For pause states in scrolling
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `name`, `top_left`, `width`, and `state` are never read
[INFO] [stdout]   --> src/textable.rs:96:9
[INFO] [stdout]    |
[INFO] [stdout] 95 | pub struct TextScroller {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] 96 |     pub name: String,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] 97 |     pub top_left: Point, // Public so OledDisplay can get position
[INFO] [stdout]    |         ^^^^^^^^
[INFO] [stdout] 98 |     pub width: u32, // Display region width
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] 99 |     pub state: Arc<TokMutex<State>>, // Shared state for the scrolling task
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `spawn_task`, `update_content`, `start`, and `stop` are never used
[INFO] [stdout]    --> src/textable.rs:107:12
[INFO] [stdout]     |
[INFO] [stdout] 103 | impl TextScroller {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 107 |     pub fn new(
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 138 |     fn spawn_task(&mut self) {
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 246 |     pub async fn update_content(&mut self, new_text: String, new_mode: ScrollMode, new_text_width: u32) {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 273 |     pub async fn start(&mut self) {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 287 |     pub async fn stop(&mut self) {
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `THERMO_GLYPH_WIDTH` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:37:11
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub const THERMO_GLYPH_WIDTH: u32 = 12;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `THERMO_GLYPH_HEIGHT` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:38:11
[INFO] [stdout]    |
[INFO] [stdout] 38 | pub const THERMO_GLYPH_HEIGHT: u32 = 12;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_weather_glyph_slice` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:61:8
[INFO] [stdout]    |
[INFO] [stdout] 61 | pub fn get_weather_glyph_slice(glyph_index: usize) -> &'static [u8] {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MOON_PHASE_WIDTH` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:71:11
[INFO] [stdout]    |
[INFO] [stdout] 71 | pub const MOON_PHASE_WIDTH: u32 = 30;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MOON_PHASE_HEIGHT` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:72:11
[INFO] [stdout]    |
[INFO] [stdout] 72 | pub const MOON_PHASE_HEIGHT: u32 = 30;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MOON_PHASE_RAW_DATA` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:76:7
[INFO] [stdout]    |
[INFO] [stdout] 76 | const MOON_PHASE_RAW_DATA: &[u8] = include_bytes!("../data/moonphase_30x30.bin");
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_moon_phase_slice` is never used
[INFO] [stdout]   --> src/weather_glyph.rs:85:8
[INFO] [stdout]    |
[INFO] [stdout] 85 | pub fn get_moon_phase_slice(phase: MoonPhase) -> &'static [u8] {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `ConfigMissing` is never constructed
[INFO] [stdout]   --> src/location.rs:66:5
[INFO] [stdout]    |
[INFO] [stdout] 65 | pub enum LocationError {
[INFO] [stdout]    |          ------------- variant in this enum
[INFO] [stdout] 66 |     ConfigMissing,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LocationError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `moonrise` and `moonset` are never read
[INFO] [stdout]   --> src/astral.rs:38:9
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub struct AstralData {
[INFO] [stdout]    |            ---------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 38 |     pub moonrise: Option<DateTime<Local>>,
[INFO] [stdout]    |         ^^^^^^^^
[INFO] [stdout] 39 |     pub moonset: Option<DateTime<Local>>,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `AstralData` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `is_daytime`, `minutes_until_next_event`, and `update_location` are never used
[INFO] [stdout]    --> src/astral.rs:112:12
[INFO] [stdout]     |
[INFO] [stdout]  48 | impl AstralService {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 112 |     pub fn is_daytime(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 125 |     pub fn minutes_until_next_event(&self) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 148 |     pub fn update_location(&mut self, location: Location) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `NO_WIDE_ASSETS` is never used
[INFO] [stdout]   --> src/eggs.rs:56:11
[INFO] [stdout]    |
[INFO] [stdout] 56 | pub const NO_WIDE_ASSETS: [u8; 1] = [EGGS_TYPE_CASSETTE];
[INFO] [stdout]    |           ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HIST_FLOOR_DB` is never used
[INFO] [stdout]   --> src/spectrum.rs:24:7
[INFO] [stdout]    |
[INFO] [stdout] 24 | const HIST_FLOOR_DB: f32 = -80.0;
[INFO] [stdout]    |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HIST_CEIL_DB` is never used
[INFO] [stdout]   --> src/spectrum.rs:25:7
[INFO] [stdout]    |
[INFO] [stdout] 25 | const HIST_CEIL_DB:  f32 = -12.0;
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `EPS` is never used
[INFO] [stdout]   --> src/spectrum.rs:26:7
[INFO] [stdout]    |
[INFO] [stdout] 26 | const EPS: f32 = 1e-12;
[INFO] [stdout]    |       ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SPECTRUM_MIN_HZ` is never used
[INFO] [stdout]   --> src/spectrum.rs:27:7
[INFO] [stdout]    |
[INFO] [stdout] 27 | const SPECTRUM_MIN_HZ: f32 = 20.0;              // start of spectrum
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FFT_MIN` is never used
[INFO] [stdout]   --> src/spectrum.rs:28:7
[INFO] [stdout]    |
[INFO] [stdout] 28 | const FFT_MIN: usize = 128;
[INFO] [stdout]    |       ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FFT_MAX` is never used
[INFO] [stdout]   --> src/spectrum.rs:29:7
[INFO] [stdout]    |
[INFO] [stdout] 29 | const FFT_MAX: usize = 4096;
[INFO] [stdout]    |       ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PEAK_METER_LEVELS_MAX` is never used
[INFO] [stdout]   --> src/spectrum.rs:30:7
[INFO] [stdout]    |
[INFO] [stdout] 30 | const PEAK_METER_LEVELS_MAX: u8 = 48;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SPECTRUM_BANDS_COUNT` is never used
[INFO] [stdout]   --> src/spectrum.rs:31:11
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub const SPECTRUM_BANDS_COUNT:u8 = 16;         // Number of spectrum bands
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `db_to_hist_level` is never used
[INFO] [stdout]   --> src/spectrum.rs:34:4
[INFO] [stdout]    |
[INFO] [stdout] 34 | fn db_to_hist_level(db: f32) -> u8 {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SpectrumEngine` is never constructed
[INFO] [stdout]   --> src/spectrum.rs:39:12
[INFO] [stdout]    |
[INFO] [stdout] 39 | pub struct SpectrumEngine {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `build_log_bands`, `ensure`, `compute_db_bands`, and `compute_levels` are never used
[INFO] [stdout]    --> src/spectrum.rs:56:12
[INFO] [stdout]     |
[INFO] [stdout]  55 | impl SpectrumEngine {
[INFO] [stdout]     | ------------------- associated items in this implementation
[INFO] [stdout]  56 |     pub fn new(sr: u32, samples_len: usize, bands: usize) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  85 |     pub fn build_log_bands(sr: u32, nfft: usize, bands: usize) -> Vec<(usize, usize)> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 109 |     pub fn ensure(&mut self, sr: u32, samples_len: usize) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 116 |     pub fn compute_db_bands(&mut self, pcm: &[i16]) -> Vec<f32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 157 |     pub fn compute_levels(&mut self, left: &[i16], right: &[i16]) -> (Vec<u8>, Vec<u8>) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `width` and `height` are never used
[INFO] [stdout]   --> src/vframebuf.rs:44:12
[INFO] [stdout]    |
[INFO] [stdout] 38 | impl<C: PixelColor + Clone> VarFrameBuf<C> {
[INFO] [stdout]    | ------------------------------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 44 |     pub fn width(&self) -> usize { self.w }
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 45 |     pub fn height(&self) -> usize { self.h }
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `VIS_BUF_SIZE` is never used
[INFO] [stdout]   --> src/vision.rs:52:7
[INFO] [stdout]    |
[INFO] [stdout] 52 | const VIS_BUF_SIZE:usize = 16_384;              // Predefined in Squeezelite.
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PEAK_METER_SCALE_HEADROOM` is never used
[INFO] [stdout]   --> src/vision.rs:54:11
[INFO] [stdout]    |
[INFO] [stdout] 54 | pub const PEAK_METER_SCALE_HEADROOM:f32 = 0.8;  // 20% headroom clipping
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `METER_CHANNELS` is never used
[INFO] [stdout]   --> src/vision.rs:55:11
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub const METER_CHANNELS:usize = 2;             // Number of metered channels.
[INFO] [stdout]    |           ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `LEVEL_DECAY_STEPS_PER_FRAME` is never used
[INFO] [stdout]   --> src/vision.rs:59:11
[INFO] [stdout]    |
[INFO] [stdout] 59 | pub const LEVEL_DECAY_STEPS_PER_FRAME: u8 = 1;  // visual fall rate (levels / frame)
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `LOCK_TRY_WINDOW_MS` is never used
[INFO] [stdout]   --> src/vision.rs:60:7
[INFO] [stdout]    |
[INFO] [stdout] 60 | const LOCK_TRY_WINDOW_MS: u32 = 5;              // total budget for try-loop
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `POLL_IDLE` is never used
[INFO] [stdout]   --> src/vision.rs:64:11
[INFO] [stdout]    |
[INFO] [stdout] 64 | pub const POLL_IDLE: Duration    = Duration::from_millis(48); // chill when idle
[INFO] [stdout]    |           ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `reset` is never used
[INFO] [stdout]    --> src/vision.rs:241:12
[INFO] [stdout]     |
[INFO] [stdout] 239 | impl LastVizState {
[INFO] [stdout]     | ----------------- method in this implementation
[INFO] [stdout] 240 |
[INFO] [stdout] 241 |     pub fn reset(&mut self) {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `ensure_band_state_old` is never used
[INFO] [stdout]    --> src/vision.rs:275:8
[INFO] [stdout]     |
[INFO] [stdout] 275 | pub fn ensure_band_state_old(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ReadGuard` is never constructed
[INFO] [stdout]    --> src/vision.rs:409:8
[INFO] [stdout]     |
[INFO] [stdout] 409 | struct ReadGuard {
[INFO] [stdout]     |        ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `VisT` is never constructed
[INFO] [stdout]    --> src/vision.rs:420:8
[INFO] [stdout]     |
[INFO] [stdout] 420 | struct VisT {
[INFO] [stdout]     |        ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `VisFrame` is never constructed
[INFO] [stdout]    --> src/vision.rs:432:12
[INFO] [stdout]     |
[INFO] [stdout] 432 | pub struct VisFrame {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `VisReader` is never constructed
[INFO] [stdout]    --> src/vision.rs:440:12
[INFO] [stdout]     |
[INFO] [stdout] 440 | pub struct VisReader {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/vision.rs:458:12
[INFO] [stdout]     |
[INFO] [stdout] 456 | impl VisReader {
[INFO] [stdout]     | -------------- associated items in this implementation
[INFO] [stdout] 457 |     /// Discover the active Squeezelite shm in /dev/shm and map it.
[INFO] [stdout] 458 |     pub fn new() -> io::Result<Self> {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 494 |     fn sd(&self) -> &VisT {
[INFO] [stdout]     |        ^^
[INFO] [stdout] ...
[INFO] [stdout] 501 |     pub fn snapshot_if_new(&mut self) -> io::Result<Option<VisFrame>> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 565 |     fn unlocked_snapshot_if_new_using_index(&self) -> Option<VisFrame> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 611 |     pub fn with_data<F>(&mut self, f: F) -> io::Result<bool>
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 634 |     pub fn with_data_extended<F>(&mut self, f: F) -> io::Result<bool>
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 654 |     pub fn with_data_swapped<F>(&mut self, swap_lr: bool, f: F) -> std::io::Result<bool>
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 679 |     pub fn reopen_if_stale(&mut self) -> io::Result<()> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 694 |     fn unlocked_snapshot_if_new(&self) -> Option<VisFrame> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `header_looks_good` is never used
[INFO] [stdout]    --> src/vision.rs:745:4
[INFO] [stdout]     |
[INFO] [stdout] 745 | fn header_looks_good(size: usize, idx: usize, rate: u32) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `lock_read_best_effort` is never used
[INFO] [stdout]    --> src/vision.rs:754:11
[INFO] [stdout]     |
[INFO] [stdout] 754 | unsafe fn lock_read_best_effort(
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `peak_and_rms` is never used
[INFO] [stdout]    --> src/vision.rs:783:8
[INFO] [stdout]     |
[INFO] [stdout] 783 | pub fn peak_and_rms(ch: &[i16]) -> (i16, f32) {
[INFO] [stdout]     |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `db_to_level` is never used
[INFO] [stdout]    --> src/vision.rs:799:4
[INFO] [stdout]     |
[INFO] [stdout] 799 | fn db_to_level(db: f32) -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `db_to_level_scale` is never used
[INFO] [stdout]    --> src/vision.rs:806:4
[INFO] [stdout]     |
[INFO] [stdout] 806 | fn db_to_level_scale(db: f32) -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `dbfs` is never used
[INFO] [stdout]    --> src/vision.rs:811:8
[INFO] [stdout]     |
[INFO] [stdout] 811 | pub fn dbfs(x: f32) -> f32 {
[INFO] [stdout]     |        ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `stereo_channel_peak_rms` is never used
[INFO] [stdout]    --> src/vision.rs:816:4
[INFO] [stdout]     |
[INFO] [stdout] 816 | fn stereo_channel_peak_rms(samples_l: &[i16],samples_r: &[i16]) -> ((i16, f32), (i16, f32)) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `stereo_peak_rms` is never used
[INFO] [stdout]    --> src/vision.rs:847:4
[INFO] [stdout]     |
[INFO] [stdout] 847 | fn stereo_peak_rms(samples: &[i16]) -> ((i16, f32), (i16, f32)) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `PeakStereo`, `PeakMono`, `HistStereo`, `HistMono`, `AioHistMono`, and `WaveformSpectrum` are never constructed
[INFO] [stdout]   --> src/visualization.rs:43:5
[INFO] [stdout]    |
[INFO] [stdout] 40 | pub enum Visualization {
[INFO] [stdout]    |          ------------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 43 |     PeakStereo,               // two peak meters with hold/decay
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 44 |     PeakMono,                 // mono peak meter with hold/decay
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 45 |     HistStereo,               // two histogram bars (L/R)
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 46 |     HistMono,                 // mono histogram (downmix)
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 49 |     AioHistMono,              // All In One with downmix histogram
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 50 |     WaveformSpectrum,         // Waveform + Spectrogram (oscilloscope + waterfall)
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Visualization` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `transpose_kind` is never used
[INFO] [stdout]    --> src/visualization.rs:375:8
[INFO] [stdout]     |
[INFO] [stdout] 375 | pub fn transpose_kind(kind: &str) -> Visualization {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_visualizer_panel_with_layout` is never used
[INFO] [stdout]    --> src/visualization.rs:397:8
[INFO] [stdout]     |
[INFO] [stdout] 397 | pub fn get_visualizer_panel_with_layout(kind: Visualization, layout: &LayoutConfig) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_visualizer_panel` is never used
[INFO] [stdout]    --> src/visualization.rs:437:8
[INFO] [stdout]     |
[INFO] [stdout] 437 | pub fn get_visualizer_panel(kind: Visualization, wide: bool) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `ts`, `playing`, `sample_rate`, and `kind` are never read
[INFO] [stdout]   --> src/visualizer.rs:58:9
[INFO] [stdout]    |
[INFO] [stdout] 57 | pub struct VizFrameOut {
[INFO] [stdout]    |            ----------- fields in this struct
[INFO] [stdout] 58 |     pub ts: i64,
[INFO] [stdout]    |         ^^
[INFO] [stdout] 59 |     pub playing: bool,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout] 60 |     pub sample_rate: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 61 |     pub kind: Visualization,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `VizFrameOut` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple variants are never constructed
[INFO] [stdout]   --> src/visualizer.rs:68:5
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub enum VizPayload {
[INFO] [stdout]    |          ---------- variants in this enum
[INFO] [stdout] 68 |     VuStereo { l_db: f32, r_db: f32 },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 69 |     VuMono   { m_db: f32 },
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 70 |     PeakStereo {
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 74 |     PeakMono { m_db: f32, hold: u8 },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 75 |     HistStereo { bands_l: Vec<u8>, bands_r: Vec<u8> },
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 76 |     HistMono   { bands: Vec<u8> },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 77 |     VuStereoWithCenterPeak { l_db: f32, r_db: f32, m_db: f32, peak_hold: u8 },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 78 |     AioVuMono { m_db: f32 },
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 79 |     AioHistMono { bands: Vec<u8> },
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 80 |     WaveformSpectrum {
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 85 |     NoVisualization {},
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `VizPayload` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Enable` and `SetKind` are never constructed
[INFO] [stdout]   --> src/visualizer.rs:91:5
[INFO] [stdout]    |
[INFO] [stdout] 90 | pub enum VizCommand {
[INFO] [stdout]    |          ---------- variants in this enum
[INFO] [stdout] 91 |     Enable(bool),                 // enable/disable publishing
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 92 |     SetKind(Visualization),       // switch viz mode
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `VizCommand` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `spawn`, `enable`, `set_kind`, and `shutdown` are never used
[INFO] [stdout]    --> src/visualizer.rs:107:12
[INFO] [stdout]     |
[INFO] [stdout] 104 | impl Visualizer {
[INFO] [stdout]     | --------------- associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 107 |     pub fn spawn(kind: &str, playing_rx: watch::Receiver<bool>) -> std::io::Result<Self> {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 126 |     pub fn enable(&self, on: bool) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 130 |     pub fn set_kind(&self, k: Visualization) {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 135 |     pub fn shutdown(mut self) {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `visualizer_worker` is never used
[INFO] [stdout]    --> src/visualizer.rs:152:10
[INFO] [stdout]     |
[INFO] [stdout] 152 | async fn visualizer_worker(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `publish` is never used
[INFO] [stdout]    --> src/visualizer.rs:349:4
[INFO] [stdout]     |
[INFO] [stdout] 349 | fn publish(
[INFO] [stdout]     |    ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `db_to_level` is never used
[INFO] [stdout]    --> src/visualizer.rs:363:4
[INFO] [stdout]     |
[INFO] [stdout] 363 | fn db_to_level(db: f32) -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PeakHold` is never constructed
[INFO] [stdout]    --> src/visualizer.rs:368:8
[INFO] [stdout]     |
[INFO] [stdout] 368 | struct PeakHold {
[INFO] [stdout]     |        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `update` is never used
[INFO] [stdout]    --> src/visualizer.rs:375:8
[INFO] [stdout]     |
[INFO] [stdout] 374 | impl PeakHold {
[INFO] [stdout]     | ------------- method in this implementation
[INFO] [stdout] 375 |     fn update(&mut self, leds: &[bool; 19]) -> Option<usize> {
[INFO] [stdout]     |        ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `with_db_range`, `with_arc_degrees`, `with_restitution`, and `with_max_dt` are never used
[INFO] [stdout]    --> src/vuphysics_new.rs:224:12
[INFO] [stdout]     |
[INFO] [stdout] 148 | impl VuMeter {
[INFO] [stdout]     | ------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 224 |     pub fn with_db_range(mut self, scale_min: f64, scale_max: f64) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 234 |     pub fn with_arc_degrees(mut self, sweep_min: f64, sweep_max: f64) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 306 |     pub fn with_restitution(mut self, restitution: f64) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 320 |     pub fn with_max_dt(mut self, max_dt: f64) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `set_db_range`, `set_arc_degrees`, `set_overload_threshold`, and `set_physics` are never used
[INFO] [stdout]    --> src/vuphysics_new.rs:347:12
[INFO] [stdout]     |
[INFO] [stdout] 327 | impl VuMeter {
[INFO] [stdout]     | ------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 347 |     pub fn set_db_range(&mut self, scale_min: f64, scale_max: f64) {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 355 |     pub fn set_arc_degrees(&mut self, sweep_min: f64, sweep_max: f64) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 363 |     pub fn set_overload_threshold(&mut self, threshold_db: f64, hold_s: f64) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 370 |     pub fn set_physics(&mut self, inertia: f64, spring_k: f64, damping_b: f64) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `damping_ratio`, `natural_frequency_rad_s`, `angle_radians`, `db_range`, `arc_degrees`, and `steady_state_degrees` are never used
[INFO] [stdout]    --> src/vuphysics_new.rs:391:12
[INFO] [stdout]     |
[INFO] [stdout] 388 | impl VuMeter {
[INFO] [stdout]     | ------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 391 |     pub fn damping_ratio(&self) -> f64 {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 396 |     pub fn natural_frequency_rad_s(&self) -> f64 {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 406 |     pub fn angle_radians(&self) -> f64 {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 423 |     pub fn db_range(&self) -> (f64, f64) {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 428 |     pub fn arc_degrees(&self) -> (f64, f64) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 434 |     pub fn steady_state_degrees(&self, db: f64) -> f64 {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `RenderingError` is never constructed
[INFO] [stdout]   --> src/svgimage.rs:55:5
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub enum SvgImageError {
[INFO] [stdout]    |          ------------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 55 |     RenderingError(String),
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SvgImageError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `find_squeezelite_shm_path` is never used
[INFO] [stdout]   --> src/shm_path.rs:28:8
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub fn find_squeezelite_shm_path() -> io::Result<PathBuf> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FunctionTimer` is never constructed
[INFO] [stdout]   --> src/func_timer.rs:28:12
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub struct FunctionTimer {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]   --> src/func_timer.rs:34:13
[INFO] [stdout]    |
[INFO] [stdout] 33 | impl FunctionTimer {
[INFO] [stdout]    | ------------------ associated function in this implementation
[INFO] [stdout] 34 |      pub fn new(name: &'static str) -> Self {
[INFO] [stdout]    |             ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `asin_deg` is never used
[INFO] [stdout]   --> src/sun.rs:45:4
[INFO] [stdout]    |
[INFO] [stdout] 45 | fn asin_deg(x: f64) -> f64 { (x).asin() * RAD_TO_DEG }
[INFO] [stdout]    |    ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `to_fixed_offset` is never used
[INFO] [stdout]    --> src/sun.rs:166:8
[INFO] [stdout]     |
[INFO] [stdout] 166 | pub fn to_fixed_offset(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/eggs.rs:457:9
[INFO] [stdout]     |
[INFO] [stdout] 457 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 463 |     ) -> Result<ImageRaw<BinaryColor>, EggsError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout]     = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 463 |     ) -> Result<ImageRaw<'_, BinaryColor>, EggsError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/eggs.rs:469:9
[INFO] [stdout]     |
[INFO] [stdout] 469 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 475 |     ) -> Result<ImageRaw<BinaryColor>, EggsError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 475 |     ) -> Result<ImageRaw<'_, BinaryColor>, EggsError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/eggs.rs:494:9
[INFO] [stdout]     |
[INFO] [stdout] 494 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 500 |     ) -> Result<ImageRaw<Gray4>, EggsError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 500 |     ) -> Result<ImageRaw<'_, Gray4>, EggsError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/visualization.rs:249:9
[INFO] [stdout]     |
[INFO] [stdout] 249 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 260 |     ) -> Result<ImageRaw<BinaryColor>, VizError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 260 |     ) -> Result<ImageRaw<'_, BinaryColor>, VizError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/visualization.rs:277:9
[INFO] [stdout]     |
[INFO] [stdout] 277 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 288 |     ) -> Result<ImageRaw<BinaryColor>, VizError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 288 |     ) -> Result<ImageRaw<'_, BinaryColor>, VizError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/visualization.rs:319:9
[INFO] [stdout]     |
[INFO] [stdout] 319 |         &mut self,
[INFO] [stdout]     |         ^^^^^^^^^ the lifetime is elided here
[INFO] [stdout] ...
[INFO] [stdout] 330 |     ) -> Result<ImageRaw<Gray4>, VizError> {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 330 |     ) -> Result<ImageRaw<'_, Gray4>, VizError> {
[INFO] [stdout]     |                          +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 51.99s
[INFO] running `Command { std: "docker" "inspect" "cfc375cab785161b0df1361f656bcf75ddc58d47caa7dbc6cc4e9e2c304d8fe2", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "cfc375cab785161b0df1361f656bcf75ddc58d47caa7dbc6cc4e9e2c304d8fe2", kill_on_drop: false }`
[INFO] [stdout] cfc375cab785161b0df1361f656bcf75ddc58d47caa7dbc6cc4e9e2c304d8fe2
