Quantex GmbH
Votre région : Europe

PassThruSelect v5.0

Sélection des canaux pour la surveillance des messages

Dernière modification :

Description

La fonction permet à l'application de sélectionner des canaux afin de surveiller les messages disponibles (y compris les indications). L'application peut indiquer n'importe quelle combinaison de canaux de communication physiques et logiques, le nombre minimal de canaux ayant des messages disponibles et un délai d'attente.

La fonction ne rend pas le contrôle tant que l'une des conditions suivantes ne se produit pas :

long PassThruSelect(
    SCHANNELSET *ChannelSetPtr,
    unsigned long SelectType,
    unsigned long Timeout
)
Finalité : PassThruSelect permet à l'application de vérifier et d'attendre la disponibilité de messages sur plusieurs canaux sans appeler en continu PassThruReadMsgs. Cela réduit l'échange de données entre l'application et le dispositif, ce qui améliore les performances.
Important : PassThruSelect NE renvoie PAS les messages eux-mêmes, uniquement l'information sur les canaux ayant des messages disponibles. Pour récupérer les messages, il faut appeler PassThruReadMsgs.

Paramètres

ChannelSetPtr

Paramètre d'entrée. Pointeur vers une structure SCHANNELSET allouée par l'application.

SelectType

Paramètre d'entrée. Indique la finalité de la sélection des canaux. La seule valeur admise est :

Valeur Description
READABLE_TYPE Surveillance des canaux pour détecter les messages disponibles (messages entrants ou indications)

Timeout

Paramètre d'entrée. Temps d'attente minimal (en millisecondes) pour la disponibilité du nombre requis de messages.

Structure SCHANNELSET

typedef struct {
    unsigned long ChannelCount;      // Nombre de canaux dans la liste
    unsigned long ChannelThreshold;  // Nombre minimal de canaux avec des messages
    unsigned long *ChannelList;      // Pointeur vers le tableau d'ID de canaux
} SCHANNELSET;

Champs de la structure

Champ Entrée/Sortie Description
ChannelCount Entrée/Sortie À l'appel : nombre de canaux dans ChannelList.
Au retour : nombre de canaux restant dans ChannelList (ayant des messages disponibles).
ChannelThreshold Entrée Nombre minimal de canaux devant avoir au moins un message disponible. Valeur 0 — la fonction rend le contrôle immédiatement (équivalent à Timeout = 0). Doit être ≤ ChannelCount.
ChannelList Entrée/Sortie À l'appel : pointeur vers le tableau d'ID de canaux (physiques et/ou logiques) à surveiller.
Au retour : sous-ensemble de la liste d'origine — uniquement les canaux ayant des messages disponibles (l'ordre n'est pas garanti).

Codes d'erreur renvoyés

Code Description
STATUS_NOERROR La fonction s'est exécutée avec succès. ChannelList contient les canaux ayant des messages disponibles.
ERR_CONCURRENT_API_CALL Une fonction de la J2534 API a été appelée avant la fin de l'appel précédent
ERR_DEVICE_NOT_OPEN PassThruOpen() n'a pas été appelé correctement
ERR_NULL_PARAMETER ChannelSetPtr ou ChannelList est NULL
ERR_INVALID_CHANNEL_ID L'un des ID de canaux dans ChannelList n'est pas valide. La structure SCHANNELSET n'est pas modifiée.
ERR_DEVICE_NOT_CONNECTED Erreur de communication avec le dispositif pass-thru. Le dispositif a été déconnecté.
ERR_NOT_SUPPORTED La DLL ne prend pas en charge cette fonction
ERR_SELECT_TYPE_NOT_SUPPORTED La valeur de SelectType n'est pas valide ou est inconnue
ERR_EXCEEDED_LIMIT La valeur de ChannelThreshold est supérieure à ChannelCount
ERR_BUFFER_EMPTY Aucun message disponible sur aucun des canaux indiqués
ERR_TIMEOUT Le délai d'attente a expiré et le nombre de canaux avec des messages est inférieur à ChannelThreshold. Ne s'applique qu'avec un Timeout non nul et la présence d'au moins un message.
ERR_FAILED Erreur non spécifiée. Utilisez PassThruGetLastError() pour obtenir la description.

Exemples

Exemple en C/C++

#include "j2534_dll.hpp"

// ID de canaux obtenus de PassThruConnect/PassThruLogicalConnect
unsigned long canChannelID = ...;
unsigned long isoChannelID = ...;

// Tableau de canaux à surveiller
unsigned long channels[2] = { canChannelID, isoChannelID };

// Structure pour PassThruSelect
SCHANNELSET channelSet;
channelSet.ChannelCount = 2;
channelSet.ChannelThreshold = 1;  // On attend au moins 1 canal avec un message
channelSet.ChannelList = channels;

// On attend des messages jusqu'à 1000 ms
long ret = PassThruSelect(&channelSet, READABLE_TYPE, 1000);

if (ret == STATUS_NOERROR) {
    printf("Canaux avec des messages : %lu\n", channelSet.ChannelCount);

    // On lit les messages des canaux qui ont des données
    for (unsigned long i = 0; i < channelSet.ChannelCount; i++) {
        unsigned long channelID = channelSet.ChannelList[i];
        printf("Le canal %lu a des messages\n", channelID);

        // On lit les messages
        PASSTHRU_MSG msg[10];
        unsigned long numMsgs = 10;
        ret = PassThruReadMsgs(channelID, msg, &numMsgs, 0);
        // ...traitement des messages...
    }
} else if (ret == ERR_BUFFER_EMPTY) {
    printf("Aucun message disponible\n");
} else if (ret == ERR_TIMEOUT) {
    printf("Délai d'attente expiré, mais il y a %lu canaux avec des messages\n", channelSet.ChannelCount);
} else {
    char error[256];
    PassThruGetLastError(error);
    printf("Erreur : %s\n", error);
}

Exemple en Python (ctypes)

from ctypes import *

j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")

# Structure SCHANNELSET
class SCHANNELSET(Structure):
    _fields_ = [
        ("ChannelCount", c_ulong),
        ("ChannelThreshold", c_ulong),
        ("ChannelList", POINTER(c_ulong))
    ]

# ID de canaux
can_channel_id = c_ulong(...)  # de PassThruConnect
iso_channel_id = c_ulong(...)  # de PassThruLogicalConnect

# Tableau de canaux
channels = (c_ulong * 2)(can_channel_id.value, iso_channel_id.value)

# Structure pour PassThruSelect
channel_set = SCHANNELSET()
channel_set.ChannelCount = 2
channel_set.ChannelThreshold = 1
channel_set.ChannelList = channels

READABLE_TYPE = 0x01

# On attend des messages jusqu'à 1000 ms
ret = j2534.PassThruSelect(byref(channel_set), READABLE_TYPE, 1000)

if ret == 0:  # STATUS_NOERROR
    print(f"Canaux avec des messages : {channel_set.ChannelCount}")
    for i in range(channel_set.ChannelCount):
        print(f"Le canal {channel_set.ChannelList[i]} a des messages")
elif ret == 0x10:  # ERR_BUFFER_EMPTY
    print("Aucun message disponible")
elif ret == 0x09:  # ERR_TIMEOUT
    print(f"Délai d'attente expiré, canaux avec des messages : {channel_set.ChannelCount}")
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Erreur : {error.value.decode()}")

Fonctions associées