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
- ✅ API asynchrone : Intégration complète Embassy pour non-bloquant
- ✅ Détection automatique du zéro : La ligne zéro est surlignée en vert quand elle traverse la grille
- ✅ Protection stricte des bordures : Clamping des primitives géométriques à l'espace interne utile
- ✅ Rendu ligne Bresenham : Courbes lisses entre points de données
- ✅ Rendu intelligent (Double Phase) : Le cadre, les étiquettes et les titres ne sont tracés qu'une seule fois à l'initialisation. Seuls la grille interne et le signal sont rafraîchis dynamiquement.
Changelog
Voir CHANGELOG.md pour l'historique des versions et modifications.
📦 Installation
[]
= "0.2.0"
= "0.1"
= "1.0"
= "1.0"
🚀 Utilisation rapide
Exemple basique : Single plot
use ;
use ;
async
Configuration des axes
// Axe X : temps de 0 à 60s, graduations tous les 10s
let time_axis = new;
// Axe Y : température -10 à +50°C, graduations tous les 10°C
let temp_axis = new;
// Axe Y : tensions 0 à 3.3V, graduations tous les 0.5V
let voltage_axis = new;
// Nombre de graduations affiché
assert_eq!; // 0, 10, 20, 30, 40, 50, 60
Validation de configuration
let axis = new;
assert!; // step > 0 && end > start
let invalid = new;
assert!; // end <= start
🎨 Schéma de positionnement
┌─────────────────────────────────┐ y
│ (x, y) │
│ ┌──────────────────────────┐ │
│ │ Label Y (amplitude) │ │ margin_top
│ │ ┌────────────────────┐ │ │
│ │ │ 100 ┼────────┐ │ │ │
│ │ │ 80 │ • │ │ │ │
│ │ │ 60 │ • │ │ │ │
│ │ │ 40 │ •–┤ │ │ │
│ │ │ 20 │ │ │ │ │
│ │ │ 0 └────────┘ │ │ │
│ │ │ 0 2 4 6 8 10 │ margin_bottom
│ │ │ Time (s) │
│ │ └──────────────────────── │
│ └──────────────────────────────┘
↑ ↑
margin_left margin_right
📊 Structure de données
Ring buffer (historique circulaire)
Stockage interne : array[100]
head = 3, count = 100 (buffer plein)
data[0] = valeur 97e
data[1] = valeur 98e
data[2] = valeur 99e ← head (prochaine écriture)
data[3] = valeur 1ère ← oldest (plus ancienne)
data[4] = valeur 2e
...
Workflow de rendu (Double Phase)
Phase d'initialisation (une seule fois):
- Nettoyage global → Effacement de l'espace d'affichage
- Labels Y → Texte des graduations Y (vert si zéro détecté)
- Labels X → Texte des graduations X
- Titres des axes → Labels des axes X et Y
- Bordures fixes → Cadre (axis_color)
Phase dynamique (à chaque rendu):
- Nettoyage interne → Effacement strict de l'intérieur (sans toucher aux bordures)
- Grille Y → Lignes horizontales (vert pour le zéro, couleur grille sinon)
- Grille X → Lignes verticales
- Courbe → Lignes Bresenham reliant les points de données
🔧 Cas d'usage
Oscilloscope 1 canal
let config = PlotConfig ;
let mut oscilloscope: = new;
Moniteur de température
let config = PlotConfig ;
let mut temp_chart: = new;
Graphique de pression
let config = PlotConfig ;
let mut pressure_chart: = new;
🛠️ API complète
LineChart<N>
| Méthode | Description |
|---|---|
new(config) |
Crée un nouveau graphique |
push(value) |
Ajoute une valeur à l'historique |
clear() |
Efface l'historique |
config() |
Retourne la configuration |
render(gfx) |
Affiche le graphique (async) |
AxisConfig
| Méthode | Description |
|---|---|
new(start, end, step, label) |
Crée une config d'axe |
is_valid() |
Vérifie cohérence (step > 0 && end > start) |
tick_count() |
Nombre de graduations affiché |
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) |
Fonction globale
| Fonction | Description |
|---|---|
line(gfx, x0, y0, x1, y1, color) |
Trace ligne Bresenham (async) |
⚠️ Limitations
- Nombre de points : Maximum 240 (largeur écran ST7789V)
- Précision : Axes en virgule flottante, pixel en entier
- Pas non-adaptatif : Les graduations sont statiques (pas de zoom ou rescaling automatique)
- Labels : Texte ASCII personnalisable pour les axes, valeurs flottantes pour les graduations
📝 Exemple complet avec boucle acquisition
async
📜 License
GPL-2.0-or-later
Copyright (C) 2026 Jorge Andre Castro
🔗 Dépendances
embassy-st7789v— Driver ST7789Vembedded-hal— Traits HALembedded-hal-async— Traits async HAL