DShot : construction d’une trame (C)

Écrit par

dans

/* Construit une trame DShot de 16 bits.
   valeur    : 0 = arrêt, 1..47 = commande, 48..2047 = gaz
   telemetrie: bit de demande de télémétrie
   bidir     : true en DShot bidirectionnel (CRC inversé) */
uint16_t dshot_trame(uint16_t valeur, bool telemetrie, bool bidir)
{
    uint16_t v = (uint16_t)((valeur << 1) | (telemetrie ? 1u : 0u));
    uint16_t crc = (v ^ (v >> 4) ^ (v >> 8)) & 0x0F;
    if (bidir)
        crc = (~crc) & 0x0F;
    return (uint16_t)((v << 4) | crc);
}