Skip to main content

haptic_skin_firmware/tasks/
power_guard.rs

1//! Plafond courant : limite le nombre de moteurs simultanés à 6, plafonnés à
2//! 60 % de duty, pour rester sous les 500 mA USB (cf. `hardware/README.md`).
3
4use crate::config::{MOTOR_COUNT, POWER_GUARD_DUTY_CAP, POWER_GUARD_MAX_CONCURRENT};
5
6pub fn apply(intensities: &mut [u8; MOTOR_COUNT]) {
7    let mut indexed: heapless::Vec<(usize, u8), MOTOR_COUNT> = heapless::Vec::new();
8    for (idx, &v) in intensities.iter().enumerate() {
9        if v > 0 {
10            let _ = indexed.push((idx, v));
11        }
12    }
13    // sort_unstable_by : pas d'alloc (dispo dans core), contrairement à sort_by.
14    indexed.sort_unstable_by(|a, b| b.1.cmp(&a.1));
15
16    // 1) Cap duty cycle par moteur
17    for v in intensities.iter_mut() {
18        if *v > POWER_GUARD_DUTY_CAP {
19            *v = POWER_GUARD_DUTY_CAP;
20        }
21    }
22
23    // 2) Cap nombre de moteurs simultanés : garder les N plus forts, couper le reste
24    for &(idx, _) in indexed.iter().skip(POWER_GUARD_MAX_CONCURRENT) {
25        intensities[idx] = 0;
26    }
27}