embassy-st7789v-plot
Moteur de tracé de graphiques cartésiens (X, Y) adaptatifs et configurables pour écrans TFT LCD ST7789V 240×320, construit au-dessus de embassy-st7789v.
Caractéristiques
#![no_std]+#![forbid(unsafe_code)]: Entièrement sûr et embarqué- Zéro allocation dynamique : Buffers statiques uniquement (ring buffer fixe)
- Historique circulaire : Jusqu'à 240 points (limite physique écran 240px)
- Axes configurables : Graduations statiques avec pas personnalisable
- Grille configurable : Grille horizontale/verticale avec labels personnalisés
- Détection automatique du zéro : La ligne zéro est surlignée en vert
- Protection stricte des bordures : Clamping des primitives à l'espace interne
- Rendu ligne Bresenham : Courbes lisses entre points de données
- Rendu intelligent (Double Phase) : Cadre, étiquettes et titres tracés une seule fois
- Deux modes de rendu :
LineChart+render(): async, direct SPILineChartBuffered+render_buf()+flush(): sync RAM, zéro clignotement
Installation
[]
= "0.3"
= "0.2"
= "0.2"
= "1.0"
= "1.0"
Utilisation rapide
Mode direct async (LineChart)
Simple mais peut produire un clignotement si le graphique est redessiné fréquemment.
use ;
use ;
let x_axis = new;
let y_axis = new;
let config = PlotConfig ;
let mut chart: = new;
chart.push;
chart.push;
let mut gfx = new_no_rst;
chart.render.await;
Mode framebuffer sync (LineChartBuffered) — zéro clignotement
Toutes les opérations de dessin écrivent en RAM. Un seul flush() envoie tout à l'écran.
Nécessite St7789vBuffered du crate embassy-st7789v (150 Ko RAM).
use ;
use ;
let mut ecran = new;
ecran.driver.init.await.unwrap;
let config = PlotConfig ;
let mut chart: = new;
loop
Configuration des axes
// Temps 0–60 s, graduation tous les 10 s
let time_axis = new;
// Température -10 à +50 °C, graduation tous les 10 °C
let temp_axis = new;
// Tension 0–3.3 V, graduation tous les 0.5 V
let volt_axis = new;
// Nombre de graduations
assert_eq!; // 0, 10, 20, 30, 40, 50, 60
Schéma de positionnement
(x, y) ┌──────────────────────────────────┐ │ margin_top │ │ ┌──────────────────────────┐ │ │ │ Label Y │ │ margin │ │ 50 ┼──────────• │ │ margin left │ │ 25 │ • • │ │ right │ │ 0 └────────────────── │ │ │ │ 0 2 4 6 8 10 │ │ │ │ Label X │ │ │ └──────────────────────────┘ │ │ margin_bottom │ └──────────────────────────────────┘
Workflow de rendu (Double Phase)
Phase d'initialisation (une seule fois) :
- Nettoyage global de l'espace d'affichage
- Labels Y — valeurs des graduations (vert si zéro détecté)
- Labels X — valeurs des graduations
- Titres des axes
- Bordures fixes (axis_color)
Phase dynamique (à chaque rendu) :
- Nettoyage intérieur strict (sans toucher aux bordures)
- Grille Y — lignes horizontales (vert pour le zéro)
- Grille X — lignes verticales
- Courbe — lignes Bresenham reliant les points
Ring buffer (historique circulaire)
array[100], head=3, count=100 (plein) data[0] = 97e valeur data[1] = 98e valeur data[2] = 99e valeur ← head (prochaine écriture) data[3] = 1ère valeur ← oldest ...
Cas d'usage
Oscilloscope 1 canal
let config = PlotConfig ;
let mut osc: = new;
Moniteur de température
let config = PlotConfig ;
let mut temp: = new;
Graphique de pression
let config = PlotConfig ;
let mut pres: = new;
API complète
LineChart<N> et LineChartBuffered<N>
| Méthode | LineChart |
LineChartBuffered |
|---|---|---|
new(config) |
✓ | ✓ |
push(value) |
✓ | ✓ |
clear() |
✓ | ✓ |
config() |
✓ | — |
render(&mut gfx) |
✓ async | — |
render_buf(&mut ecran) |
— | ✓ sync |
AxisConfig
| Méthode | Description |
|---|---|
new(start, end, step, label) |
Crée une config d'axe |
is_valid() |
Vérifie cohérence |
tick_count() |
Nombre de graduations |
Graphics<'a, SPI, DC, RST>
| Méthode | Description |
|---|---|
new(display) |
Crée contexte avec RST |
new_no_rst(display) |
Crée contexte sans RST |
pixel(x, y, color) |
Trace pixel (async) |
Fonctions globales
| Fonction | Mode | Description |
|---|---|---|
line(gfx, x0, y0, x1, y1, color) |
async | Bresenham direct SPI |
Limitations
- Nombre de points : Maximum 240 (largeur physique écran)
- Précision : Axes en virgule flottante, pixels en entier
- Pas non-adaptatif : Graduations statiques, pas de zoom automatique
- RAM framebuffer :
LineChartBufferednécessite 150 Ko (RP2350 ✓, RP2040 ✓, STM32F103 ✗)
Licence
GPL-2.0-or-later — Copyright (C) 2026 Jorge Andre Castro
Dépendances
embassy-st7789v— Driver ST7789V + framebufferembassy-st7789v-graphics— Primitives géométriquesembedded-hal— Traits HALembedded-hal-async— Traits async HAL