Pour illustrer les possibilités - certes limitées - de filtrage CAN de l'ESP32, la bibliothèque ESP32_CAN propose des exemples correspondant aux cas ci-dessus :
Ils sont traduits de la documentation acan-esp32.pdf qui se trouve dans le dossier "extra" de la bibliothèque.
Dans chaque cas, la définition des filtres et masques tient en une seule ligne dans le
setup :
ESP32CANAcceptOnlyStandardFilterDemo
const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::acceptStandardFrames () ;
Dans ce cas, les messages étendus sont rejetés et tous les messages standards sont acceptés.
ESP32CANAcceptOnlyExtendedFilterDemo
const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::acceptExtendedFrames () ;
Dans ce cas les messages standards sont rejetés et tous les messages étendus sont acceptés.
ESP32CANSingleStandardFilterDemo
const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::singleStandardFilter (ACAN_ESP32_Filter::data, 0x123, 0x404) ;
Le premier argument indique si on veut recevoir :
- data: uniquement des messages de données
- remote: uniquement des message de remote
- dataAndRemote: les deux.
Les bits de 0x404 sont le #2 et #10. Les bits #2 et #10 de 0x123 sont ignorés dans le filtrage. En conséquence les messages d'identifiants 0x123, 0x127, 0x523 et 0x527 sont reçus.
un "0" comme dernier argument indique que le seul message accepté sera celui dont l'identifiant est égal au 2ème argument.
ESP32CANDualStandardFilterDemo
const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::dualStandardFilter (
ACAN_ESP32_Filter::data, 0x123, 0x110,
ACAN_ESP32_Filter::remote, 0x456, 0x022
) ;
Pour le 1er filtre, les bits de 0x110 sont les #4 et #8: bits 4 et 8 de 0x123 sont ignorés dans le filtrage. Donc les identifiants 0x023, 0x033, 0x123 and 0x133 sont recevables.
Pour le 2eme filtre, les bits de 0x022 sont les #1 et #5: bits 1 et 5 de 0x456 sont ignorés dans le filtrage. Donc les identifiants 0x454, 0x456, 0x474 et 0x476 sont recevables et s'ajoutent à ceux du 1er filtre.
ESP32CANSingleExtendedFilterDemo
const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::singleExtendedFilter (ACAN_ESP32_Filter::data, 0x12345678, 0x20202) ;
Le 1er argument est "date" ou"remote" ou "dataAndRemote"
Le 3eme argument si "0" indique que le seul message accepté sera celui dont l'identifiant est égal au 2ème argument.
Les bits de 0x20202 sont le #1 , #9 et #17: ils sont ignorés dans le filtrage de 0x12345678.
Donc les identifiants 0x12345478, 0x1234547A, 0x12345678, 0x1234567A, 0x12365478, 0x1236547A, 0x12365678 et 0x1236567A seront acceptés.
ESP32CANDualExtendedFilterDemo
const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::dualExtendedFilter (
0x12345678, 0x00060000, // First filter
0x19876543, 0x00009000 // Second filter
) ;
Noter que les bits 0 to 12 dans les paramètres sont toujours ignorés par ce type de filtre.
Par exemple, le 1er filtre compris entre 0x12344000 et 0x12345FFF donnera toujours le même résultat.
Dans le 2ème masque 0x00009000, le bit #12 est toujours ignoré, donc toutes les valeurs entre 0x00008000 et 0x00009FFF donneront le même résultat. Finallement, ce filtre accepte des messages data et remote étendus dont l'identifiant est de la forme 1 0010 0011 0xx0 010x xxxx xxxx xxxx (215 étendus et 215 remote) ou 1 1001 1000 0111 x00x xxxx xxxx xxxx (214 étendus, 214 remote).
après chaque définition de filtre et masque suit le
begin du Can:
const uint32_t errorCode = ACAN_ESP32::can.begin (settings, filter);