Configuration du filtre de messages
Dernière modification :
Avant de commencer à recevoir ou à transmettre des messages, il est nécessaire de configurer les filtres de messages. Si aucun filtre n'est configuré, tous les messages sont bloqués. Pour le protocole ISO 15765, un seul type de filtre est disponible, FLOW_CONTROL_FILTER. Il ne peut pas être configuré pour d'autres protocoles. Pour chaque ChannelID, il est possible de créer jusqu'à 16 filtres FLOW_CONTROL_FILTER et jusqu'à 10 filtres PASS_FILTER ou BLOCK_FILTER. Pour chaque type de filtre sélectionné, il faut indiquer les paramètres du filtre. Pour FLOW_CONTROL_FILTER, on indique trois paramètres pMaskMsg, pPatternMsg, pFlowControlMsg. Pour PASS_FILTER ou BLOCK_FILTER, on indique deux paramètres pMaskMsg et pPatternMsg. La longueur des paramètres peut être de 1 à 12 octets.
long PassThruStartMsgFilter(unsigned long ChannelID, unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *FilterID)
| Nom de la constante | Description |
|---|---|
| PASS_FILTER | Si les conditions du filtre définies par ses paramètres sont remplies, le message est laissé passer. Ce filtre n'est pas valide pour les protocoles ISO 15765. |
| BLOCK_FILTER | Si les conditions du filtre définies par ses paramètres sont remplies, le message est bloqué. Ce filtre n'est pas valide pour les protocoles ISO 15765. |
| FLOW_CONTROL_FILTER | Si les conditions du filtre définies par ses paramètres sont remplies, le message est laissé passer. Ce filtre est valide uniquement pour les protocoles ISO 15765. |
| Code | Description | Causes possibles et solutions |
|---|---|---|
| STATUS_NOERROR | La fonction s'est exécutée correctement | — |
| ERR_DEVICE_NOT_CONNECTED | Aucune connexion avec l'adaptateur |
|
| ERR_INVALID_DEVICE_ID | Identifiant de périphérique non valide |
|
| ERR_INVALID_CHANNEL_ID | Identifiant de canal non valide |
|
| ERR_INVALID_MSG | Structure de message incorrecte |
|
| ERR_NULL_PARAMETER | NULL transmis à la place d'un pointeur obligatoire |
|
| ERR_NOT_UNIQUE | Le CAN ID est déjà utilisé dans un autre FLOW_CONTROL_FILTER |
|
| ERR_EXCEEDED_LIMIT | Limite de filtres dépassée |
|
| ERR_MSG_PROTOCOL_ID | Incompatibilité de protocole |
|
| ERR_FAILED | Erreur indéterminée |
|
#include "j2534_lib.hpp"
// ... ChannelID obtenu de PassThruConnect ...
PASSTHRU_MSG MaskMsg, PatternMsg, FlowControlMsg;
unsigned long FilterID;
long Ret;
// Masque : nous comparons les 4 premiers octets (CAN ID)
MaskMsg.ProtocolID = ISO15765;
MaskMsg.DataSize = 4;
memset(MaskMsg.Data, 0xFF, 4);
// Modèle : nous recevons les messages avec CAN ID 0x7E8
PatternMsg.ProtocolID = ISO15765;
PatternMsg.DataSize = 4;
PatternMsg.Data[0] = 0x00;
PatternMsg.Data[1] = 0x00;
PatternMsg.Data[2] = 0x07;
PatternMsg.Data[3] = 0xE8;
// Réponse FlowControl : nous envoyons au CAN ID 0x7E0
FlowControlMsg.ProtocolID = ISO15765;
FlowControlMsg.DataSize = 4;
FlowControlMsg.Data[0] = 0x00;
FlowControlMsg.Data[1] = 0x00;
FlowControlMsg.Data[2] = 0x07;
FlowControlMsg.Data[3] = 0xE0;
Ret = PassThruStartMsgFilter(ChannelID, FLOW_CONTROL_FILTER,
&MaskMsg, &PatternMsg, &FlowControlMsg, &FilterID);
if (Ret != STATUS_NOERROR)
{
// Traitement de l'erreur
}
// channelID obtenu précédemment de ptConnect
val mask = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Masque pour CAN ID (nous comparons les 4 octets)
data = byteArrayOf(0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte())
)
val pattern = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Nous recevons les réponses de l'ECU avec CAN ID 0x7E8
data = byteArrayOf(0x00, 0x00, 0x07, 0xE8.toByte())
)
val flowControl = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Nous envoyons FlowControl au CAN ID 0x7E0
data = byteArrayOf(0x00, 0x00, 0x07, 0xE0.toByte())
)
val resFilter = j2534.ptStartMsgFilter(channelID, FLOW_CONTROL_FILTER, mask, pattern, flowControl)
if (resFilter.status == STATUS_NOERROR) {
val filterID = resFilter.filterId
// Filtre configuré correctement
Log.i("J2534", "Filtre FLOW_CONTROL_FILTER configuré, ID: $filterID")
} else {
// Traitement de l'erreur
Log.e("J2534", "Erreur lors de la configuration du filtre: ${resFilter.status}")
}
from ctypes import *
# channelID obtenu précédemment de PassThruConnect
# Nous créons les structures des messages
mask = PASSTHRU_MSG()
mask.ProtocolID = ISO15765
mask.DataSize = 4
mask.Data[0:4] = [0xFF, 0xFF, 0xFF, 0xFF]
pattern = PASSTHRU_MSG()
pattern.ProtocolID = ISO15765
pattern.DataSize = 4
pattern.Data[0:4] = [0x00, 0x00, 0x07, 0xE8]
flow_control = PASSTHRU_MSG()
flow_control.ProtocolID = ISO15765
flow_control.DataSize = 4
flow_control.Data[0:4] = [0x00, 0x00, 0x07, 0xE0]
filter_id = c_ulong()
ret = j2534.PassThruStartMsgFilter(
channel_id, FLOW_CONTROL_FILTER,
byref(mask), byref(pattern), byref(flow_control), byref(filter_id)
)
if ret == 0: # STATUS_NOERROR
print(f"Filtre configuré, ID: {filter_id.value}")
else:
print(f"Erreur: {ret}")
// channelID obtenu précédemment de PassThruConnect
var mask = new PASSTHRU_MSG {
ProtocolID = ISO15765,
DataSize = 4,
Data = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }
};
var pattern = new PASSTHRU_MSG {
ProtocolID = ISO15765,
DataSize = 4,
Data = new byte[] { 0x00, 0x00, 0x07, 0xE8 }
};
var flowControl = new PASSTHRU_MSG {
ProtocolID = ISO15765,
DataSize = 4,
Data = new byte[] { 0x00, 0x00, 0x07, 0xE0 }
};
uint filterId;
int ret = J2534.PassThruStartMsgFilter(
channelId, FLOW_CONTROL_FILTER,
ref mask, ref pattern, ref flowControl, out filterId
);
if (ret == 0) // STATUS_NOERROR
{
Console.WriteLine($"Filtre configuré, ID: {filterId}");
}
#include "j2534_lib.hpp"
// ... ChannelID obtenu de PassThruConnect ...
PASSTHRU_MSG MaskMsg, PatternMsg;
unsigned long FilterID;
long Ret;
// Masque : nous comparons le premier octet (format)
MaskMsg.ProtocolID = ISO14230;
MaskMsg.DataSize = 1;
MaskMsg.Data[0] = 0x80;
// Modèle : nous laissons passer tous les messages avec le bit de format = 1
PatternMsg.ProtocolID = ISO14230;
PatternMsg.DataSize = 1;
PatternMsg.Data[0] = 0x80;
Ret = PassThruStartMsgFilter(ChannelID, PASS_FILTER, &MaskMsg, &PatternMsg, NULL, &FilterID);
if (Ret != STATUS_NOERROR)
{
// Traitement de l'erreur
}