Skip to content

Commit 061d755

Browse files
committed
feat: new ssupports_hot_reload for trait ProcessingNode
1 parent 13cdc6f commit 061d755

File tree

13 files changed

+248
-40
lines changed

13 files changed

+248
-40
lines changed

docs/audit_config_dynamique.md

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,11 @@ Permettre la mise à jour dynamique de la configuration via un endpoint POST `/a
3939
1. **GainNode** - Gain en décibels (`gain_db`)
4040
2. **ChannelSelectorNode** - Sélection de canal (`target_channel`)
4141
3. **ChannelMixerNode** - Stratégie de mixage (`mix_strategy`)
42-
4. **FilterNode** - Canalisation (`target_channel`) + paramètres des filtres sous-jacents
42+
4. **FilterNode** - **ENTIÈREMENT IMPLÉMENTÉ ✅**
43+
- **Canalisation** : `target_channel` (ChannelA, ChannelB, Both)
44+
- **Filtres numériques** : Tous paramètres avec validation complète
45+
- **LowpassFilter/HighpassFilter** : `cutoff_freq`, `sample_rate`, `order`
46+
- **BandpassFilter** : `center_freq`, `bandwidth`, `sample_rate`, `order`
4347

4448
**Nœuds avec Infrastructure Préparée** :
4549
5. **DifferentialNode** - Infrastructure `update_config()` en place, en attente de paramètres configurables
@@ -49,18 +53,21 @@ Permettre la mise à jour dynamique de la configuration via un endpoint POST `/a
4953
- **3 types de filtres numériques hot-reloadables** avec validation complète des paramètres
5054
- **Validation robuste** : fréquences < Nyquist, ordre > 0, ordre pair pour bandpass
5155
- **Recalcul automatique des coefficients** pour BandpassFilter après mise à jour
56+
- **Propagation via trait Filter** : Interface uniforme pour tous les filtres
57+
- **FilterNode complet** : `target_channel` + propagation aux filtres sous-jacents
5258
- **Base architecturale solide** pour étendre le hot-reload à d'autres nœuds
5359
- **Pattern validé** : `update_config()` + validation + gestion d'erreurs + recalcul de coefficients
5460

5561
### 📈 Impact sur la Configuration Dynamique
5662

57-
1. **Quatre nœuds avec hot-reload dans le ProcessingGraph** (vs 0 précédemment) :
58-
- **3 nœuds entièrement hot-reloadables** : GainNode, ChannelSelectorNode, ChannelMixerNode
63+
1. **Quatre nœuds avec hot-reload complet dans le ProcessingGraph** (vs 0 précédemment) :
64+
- **4 nœuds entièrement hot-reloadables** : GainNode, ChannelSelectorNode, ChannelMixerNode, **FilterNode ✅**
5965
- **3 filtres hot-reloadables** : LowpassFilter, HighpassFilter, BandpassFilter (via FilterNode)
6066
- **1 nœud avec infrastructure préparée** : DifferentialNode
61-
2. **Réduction drastique des interruptions de service** pour les ajustements de traitement audio
62-
3. **Architecture extensible** pour ajouter le hot-reload à d'autres nœuds
63-
4. **Validation robuste du pattern** `update_config()` pour la configuration dynamique
67+
2. **FilterNode entièrement implémenté** avec support complet des filtres numériques et propagation via trait Filter
68+
3. **Réduction drastique des interruptions de service** pour les ajustements de traitement audio
69+
4. **Architecture extensible** pour ajouter le hot-reload à d'autres nœuds
70+
5. **Validation robuste du pattern** `update_config()` pour la configuration dynamique
6471

6572
---
6673

@@ -237,6 +244,29 @@ Le `ProcessingGraph` contient différents types de nœuds de traitement, chacun
237244
"mix_strategy": "Average" // ← Modifiable dynamiquement
238245
// ou: { "a_weight": 0.7, "b_weight": 0.3 } pour Weighted
239246
}
247+
},
248+
{
249+
"id": "bandpass_filter",
250+
"type": "FilterNode",
251+
"parameters": {
252+
"filter_type": "BandpassFilter",
253+
"center_freq": 1000.0, // ← Modifiable dynamiquement
254+
"bandwidth": 100.0, // ← Modifiable dynamiquement
255+
"order": 4, // ← Modifiable dynamiquement (doit être pair)
256+
"sample_rate": 44100, // ← Modifiable dynamiquement
257+
"target_channel": "Both" // ← Modifiable dynamiquement (ChannelA/ChannelB/Both)
258+
}
259+
},
260+
{
261+
"id": "lowpass_filter",
262+
"type": "FilterNode",
263+
"parameters": {
264+
"filter_type": "LowpassFilter",
265+
"cutoff_freq": 5000.0, // ← Modifiable dynamiquement
266+
"order": 2, // ← Modifiable dynamiquement
267+
"sample_rate": 44100, // ← Modifiable dynamiquement
268+
"target_channel": "ChannelA" // ← Modifiable dynamiquement
269+
}
240270
}
241271
]
242272
}
@@ -253,11 +283,14 @@ Le `ProcessingGraph` contient différents types de nœuds de traitement, chacun
253283
- **GainNode** : Met à jour `gain_db` de manière thread-safe
254284
- **ChannelSelectorNode** : Change `target_channel` instantanément
255285
- **ChannelMixerNode** : Modifie `mix_strategy` sans interruption
286+
- **FilterNode** : ✅ **Met à jour `target_channel` ET propage les paramètres aux filtres sous-jacents**
287+
- **BandpassFilter** : `center_freq`, `bandwidth`, `order`, `sample_rate` avec recalcul automatique des coefficients
288+
- **LowpassFilter/HighpassFilter** : `cutoff_freq`, `order`, `sample_rate`
256289
6. Les nouveaux échantillons audio sont traités avec les nouveaux paramètres
257290

258291
#### 2.7.3. Autres Nœuds du ProcessingGraph
259292

260-
- **FilterNode** : **LARGEMENT SUPPORTÉ ✅** - Hot-reload pour tous les paramètres des filtres individuels (`cutoff_freq`, `center_freq`, `bandwidth`, `order`, `sample_rate`) + `target_channel`
293+
- **FilterNode** : **ENTIÈREMENT SUPPORTÉ ✅** - Hot-reload complet pour tous les paramètres des filtres individuels (`cutoff_freq`, `center_freq`, `bandwidth`, `order`, `sample_rate`) + `target_channel` avec propagation via trait Filter
261294
- **RecordNode, etc.** : Support partiel ou aucun support de hot-reload selon le paramètre modifié
262295
- **Modifications structurelles** : Ajout/suppression de nœuds ou modification des connexions nécessitent une reconstruction complète du graphe
263296

docs/audit_impact_reload_daemon.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ Pour chaque composant, l\'analyse considère :
7474
- **✅ OUI - IMPLÉMENTÉ** pour les paramètres du `ChannelSelectorNode` : Le `ChannelSelectorNode` supporte le hot-reload de son paramètre `target_channel` (ChannelA/ChannelB) permettant de changer dynamiquement le canal sélectionné.
7575
- **✅ OUI - IMPLÉMENTÉ** pour les paramètres du `ChannelMixerNode` : Le `ChannelMixerNode` supporte le hot-reload de sa `mix_strategy` (Add, Subtract, Average, Weighted) permettant de changer dynamiquement la stratégie de mixage des canaux.
7676
- **✅ OUI - IMPLÉMENTÉ** pour les paramètres des filtres numériques : `LowpassFilter`, `HighpassFilter`, et `BandpassFilter` supportent le hot-reload de leurs paramètres principaux (`cutoff_freq`, `center_freq`, `bandwidth`, `sample_rate`, `order`) avec validation complète et recalcul automatique des coefficients.
77-
- **✅ OUI - IMPLÉMENTÉ** pour les paramètres du `FilterNode` : Le `FilterNode` supporte le hot-reload de son paramètre `target_channel` (ChannelA, ChannelB, Both) permettant de rediriger dynamiquement l'application du filtre.
77+
- **✅ OUI - ENTIÈREMENT IMPLÉMENTÉ** pour les paramètres du `FilterNode` : Le `FilterNode` supporte le hot-reload complet de son paramètre `target_channel` (ChannelA, ChannelB, Both) ET la propagation des paramètres aux filtres sous-jacents via le trait Filter unifié. Tous les paramètres de filtrage (`cutoff_freq`, `center_freq`, `bandwidth`, `sample_rate`, `order`) peuvent être mis à jour dynamiquement avec validation complète.
7878
- **⚠️ PRÉPARÉ** pour le `DifferentialNode` : Infrastructure `update_config()` en place mais pas de paramètres hot-reloadables actuellement. Nécessite reconstruction du nœud pour tout changement.
7979
- **NON** pour `enabled` : Géré par le `DaemonManager`.
8080
- **Conclusion** :
@@ -83,14 +83,14 @@ Pour chaque composant, l\'analyse considère :
8383
- **✅ Hot-Reload Entièrement Supporté** pour les paramètres du `GainNode` - aucun redémarrage requis.
8484
- **✅ Hot-Reload Entièrement Supporté** pour les paramètres du `ChannelSelectorNode` et `ChannelMixerNode` - aucun redémarrage requis.
8585
- **✅ Hot-Reload Entièrement Supporté** pour les paramètres des filtres numériques (`LowpassFilter`, `HighpassFilter`, `BandpassFilter`) - aucun redémarrage requis.
86-
- **✅ Hot-Reload Entièrement Supporté** pour les paramètres du `FilterNode` (`target_channel`) - aucun redémarrage requis.
86+
- **✅ Hot-Reload Entièrement Supporté** pour les paramètres du `FilterNode` (`target_channel` + propagation complète aux filtres sous-jacents) - aucun redémarrage requis.
8787
- **Stratégie de Mise à Jour Recommandée** :
8888
- Le `DaemonManager` redémarre le `ProcessingConsumer` si la structure du graphe change fondamentalement.
8989
- Pour les changements de paramètres de nœuds, le `ProcessingConsumer` (ou les nœuds directement) doit gérer le rechargement. Une notification du `DaemonManager` au `ProcessingConsumer` peut initier ce processus.
9090
- **Pour le `GainNode`** : Simple notification au `ProcessingConsumer` qui peut appeler `node.update_config()` avec les nouveaux paramètres. Aucune interruption de service requise.
9191
- **Pour le `ChannelSelectorNode` et `ChannelMixerNode`** : Même approche - notification au `ProcessingConsumer` qui appelle `node.update_config()`. Changements appliqués instantanément sans interruption.
9292
- **Pour les filtres numériques** : Notification au `ProcessingConsumer` qui peut mettre à jour les filtres via leurs méthodes `update_config()`. Les coefficients sont recalculés automatiquement pour le `BandpassFilter`.
93-
- **Pour le `FilterNode`** : Mise à jour du paramètre `target_channel` via `node.update_config()` pour rediriger l'application du filtre sans interruption.
93+
- **Pour le `FilterNode`** : Mise à jour complète via `node.update_config()` - changement de `target_channel` ET propagation des paramètres de filtrage aux filtres sous-jacents via le trait Filter. Support complet des BandpassFilter, LowpassFilter, et HighpassFilter avec validation et recalcul automatique des coefficients.
9494

9595
### 2.4 Modbus Server
9696

@@ -155,7 +155,7 @@ Pour chaque composant, l\'analyse considère :
155155
|---------------------------|-----------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-----------------------------------------|
156156
| **Visualization Server** | `address`, `port`, `tls` (certs) | Sécurité (HMAC, session), options UI | Oui |
157157
| **Data Acquisition** | `device_name`, `sample_rate`, `channels`, `format` | `buffer_size` (partiel), `polling_interval`, `gain_db` | Oui |
158-
| **Processing Consumer** | Structure du `ProcessingGraph` (nœuds, connexions, types incompatibles) | Paramètres internes des nœuds du graphe (si le nœud supporte le hot-reload), **`GainNode.gain_db`**, **`ChannelSelectorNode.target_channel`**, **`ChannelMixerNode.mix_strategy`**, **Filtres numériques (cutoff_freq, center_freq, bandwidth, etc.) ✅**, **`FilterNode.target_channel`** | Oui |
158+
| **Processing Consumer** | Structure du `ProcessingGraph` (nœuds, connexions, types incompatibles) | Paramètres internes des nœuds du graphe (si le nœud supporte le hot-reload), **`GainNode.gain_db`**, **`ChannelSelectorNode.target_channel`**, **`ChannelMixerNode.mix_strategy`**, **Filtres numériques (cutoff_freq, center_freq, bandwidth, etc.) ✅**, **`FilterNode.target_channel + propagation complète aux filtres`** | Oui |
159159
| **Modbus Server** | `address`, `port` | `registers_mapping` (partiel/complexe), `polling_period_ms` | Oui |
160160
| **Record Consumer** | `output_directory`, `file_format` | `max_file_size_mb`, `max_duration_s`, `rolling_buffer_config` | Oui |
161161
| **Heartbeat Monitoring** | (Rarement des changements structurels majeurs) | `interval_s`, `targets` | Oui (si on peut le désactiver) |

0 commit comments

Comments
 (0)