Quantex GmbH
Su región: Europa

PassThruSelect v5.0

Selección de canales para la monitorización de mensajes

Última modificación:

Descripción

La función permite a la aplicación seleccionar canales para monitorizar los mensajes disponibles (incluidas las indicaciones). La aplicación puede indicar cualquier combinación de canales de comunicación físicos y lógicos, el número mínimo de canales con mensajes disponibles y un tiempo de espera.

La función no devuelve el control hasta que ocurra una de las siguientes condiciones:

long PassThruSelect(
    SCHANNELSET *ChannelSetPtr,
    unsigned long SelectType,
    unsigned long Timeout
)
Finalidad: PassThruSelect permite a la aplicación comprobar y esperar la disponibilidad de mensajes en varios canales sin llamar continuamente a PassThruReadMsgs. Esto minimiza el intercambio de datos entre la aplicación y el dispositivo, aumentando el rendimiento.
Importante: PassThruSelect NO devuelve los mensajes en sí, solo información sobre qué canales tienen mensajes disponibles. Para recibir los mensajes es necesario llamar a PassThruReadMsgs.

Parámetros

ChannelSetPtr

Parámetro de entrada. Puntero a una estructura SCHANNELSET asignada por la aplicación.

SelectType

Parámetro de entrada. Indica la finalidad de la selección de canales. El único valor admitido es:

Valor Descripción
READABLE_TYPE Monitorización de canales para detectar mensajes disponibles (mensajes entrantes o indicaciones)

Timeout

Parámetro de entrada. Tiempo mínimo de espera (en milisegundos) para la disponibilidad del número requerido de mensajes.

Estructura SCHANNELSET

typedef struct {
    unsigned long ChannelCount;      // Número de canales en la lista
    unsigned long ChannelThreshold;  // Número mínimo de canales con mensajes
    unsigned long *ChannelList;      // Puntero al array de ID de canales
} SCHANNELSET;

Campos de la estructura

Campo Entrada/Salida Descripción
ChannelCount Entrada/Salida En la llamada: número de canales en ChannelList.
En el retorno: número de canales que quedan en ChannelList (con mensajes disponibles).
ChannelThreshold Entrada Número mínimo de canales que deben tener al menos un mensaje disponible. Valor 0 — la función devuelve el control inmediatamente (equivalente a Timeout = 0). Debe ser ≤ ChannelCount.
ChannelList Entrada/Salida En la llamada: puntero al array de ID de canales (físicos y/o lógicos) que se van a monitorizar.
En el retorno: subconjunto de la lista original — solo los canales con mensajes disponibles (no se garantiza el orden).

Códigos de error devueltos

Código Descripción
STATUS_NOERROR La función se ejecutó correctamente. ChannelList contiene los canales con mensajes disponibles.
ERR_CONCURRENT_API_CALL Se llamó a una función de la J2534 API antes de finalizar la llamada anterior
ERR_DEVICE_NOT_OPEN PassThruOpen() no se llamó correctamente
ERR_NULL_PARAMETER ChannelSetPtr o ChannelList es NULL
ERR_INVALID_CHANNEL_ID Uno de los ID de canales en ChannelList no es válido. La estructura SCHANNELSET no se modifica.
ERR_DEVICE_NOT_CONNECTED Error de comunicación con el dispositivo pass-thru. El dispositivo se ha desconectado.
ERR_NOT_SUPPORTED La DLL no admite esta función
ERR_SELECT_TYPE_NOT_SUPPORTED El valor de SelectType no es válido o es desconocido
ERR_EXCEEDED_LIMIT El valor de ChannelThreshold es mayor que ChannelCount
ERR_BUFFER_EMPTY No hay mensajes disponibles en ninguno de los canales indicados
ERR_TIMEOUT El tiempo de espera ha transcurrido y el número de canales con mensajes es menor que ChannelThreshold. Solo se aplica con un Timeout distinto de cero y la presencia de al menos un mensaje.
ERR_FAILED Error no especificado. Use PassThruGetLastError() para obtener la descripción.

Ejemplos

Ejemplo en C/C++

#include "j2534_dll.hpp"

// ID de canales obtenidos de PassThruConnect/PassThruLogicalConnect
unsigned long canChannelID = ...;
unsigned long isoChannelID = ...;

// Array de canales para monitorizar
unsigned long channels[2] = { canChannelID, isoChannelID };

// Estructura para PassThruSelect
SCHANNELSET channelSet;
channelSet.ChannelCount = 2;
channelSet.ChannelThreshold = 1;  // Esperamos al menos 1 canal con mensaje
channelSet.ChannelList = channels;

// Esperamos mensajes hasta 1000 ms
long ret = PassThruSelect(&channelSet, READABLE_TYPE, 1000);

if (ret == STATUS_NOERROR) {
    printf("Canales con mensajes: %lu\n", channelSet.ChannelCount);

    // Leemos mensajes de los canales que tienen datos
    for (unsigned long i = 0; i < channelSet.ChannelCount; i++) {
        unsigned long channelID = channelSet.ChannelList[i];
        printf("El canal %lu tiene mensajes\n", channelID);

        // Leemos los mensajes
        PASSTHRU_MSG msg[10];
        unsigned long numMsgs = 10;
        ret = PassThruReadMsgs(channelID, msg, &numMsgs, 0);
        // ...procesamiento de los mensajes...
    }
} else if (ret == ERR_BUFFER_EMPTY) {
    printf("No hay mensajes disponibles\n");
} else if (ret == ERR_TIMEOUT) {
    printf("Tiempo de espera agotado, pero hay %lu canales con mensajes\n", channelSet.ChannelCount);
} else {
    char error[256];
    PassThruGetLastError(error);
    printf("Error: %s\n", error);
}

Ejemplo en Python (ctypes)

from ctypes import *

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

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

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

# Array de canales
channels = (c_ulong * 2)(can_channel_id.value, iso_channel_id.value)

# Estructura para PassThruSelect
channel_set = SCHANNELSET()
channel_set.ChannelCount = 2
channel_set.ChannelThreshold = 1
channel_set.ChannelList = channels

READABLE_TYPE = 0x01

# Esperamos mensajes hasta 1000 ms
ret = j2534.PassThruSelect(byref(channel_set), READABLE_TYPE, 1000)

if ret == 0:  # STATUS_NOERROR
    print(f"Canales con mensajes: {channel_set.ChannelCount}")
    for i in range(channel_set.ChannelCount):
        print(f"El canal {channel_set.ChannelList[i]} tiene mensajes")
elif ret == 0x10:  # ERR_BUFFER_EMPTY
    print("No hay mensajes disponibles")
elif ret == 0x09:  # ERR_TIMEOUT
    print(f"Tiempo de espera agotado, canales con mensajes: {channel_set.ChannelCount}")
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Error: {error.value.decode()}")

Funciones relacionadas