Wybór kanałów do monitorowania wiadomości
Ostatnia zmiana:
Funkcja umożliwia aplikacji wybór kanałów do monitorowania dostępnych wiadomości (w tym wskazań). Aplikacja może podać dowolną kombinację fizycznych i logicznych kanałów komunikacyjnych, minimalną liczbę kanałów z dostępnymi wiadomościami oraz limit czasu.
Funkcja nie zwraca sterowania, dopóki nie wystąpi jedno z poniższych:
TimeoutChannelList z dostępnymi wiadomościami osiągnie lub przekroczy ChannelThresholdlong PassThruSelect(
SCHANNELSET *ChannelSetPtr,
unsigned long SelectType,
unsigned long Timeout
)
PassThruSelect umożliwia aplikacji sprawdzanie i oczekiwanie na dostępność wiadomości na wielu kanałach bez ciągłego wywoływania
PassThruReadMsgs. Minimalizuje to wymianę danych między aplikacją a urządzeniem, zwiększając wydajność.
PassThruSelect NIE zwraca samych wiadomości — jedynie informację o tym, które kanały mają dostępne wiadomości. Aby odebrać wiadomości, należy wywołać PassThruReadMsgs.
Parametr wejściowy. Wskaźnik do struktury SCHANNELSET przydzielonej przez aplikację.
Parametr wejściowy. Określa przeznaczenie wyboru kanałów. Jedyna dopuszczalna wartość:
| Wartość | Opis |
|---|---|
READABLE_TYPE |
Monitorowanie kanałów pod kątem dostępnych wiadomości (wiadomości przychodzących lub wskazań) |
Parametr wejściowy. Minimalny czas oczekiwania (w milisekundach) na dostępność wymaganej liczby wiadomości.
ChannelThreshold = 0)typedef struct {
unsigned long ChannelCount; // Liczba kanałów na liście
unsigned long ChannelThreshold; // Minimalna liczba kanałów z wiadomościami
unsigned long *ChannelList; // Wskaźnik do tablicy ID kanałów
} SCHANNELSET;
| Pole | Wejście/Wyjście | Opis |
|---|---|---|
ChannelCount |
Wejście/Wyjście | Przy wywołaniu: liczba kanałów w ChannelList.Przy zwrocie: liczba kanałów pozostałych w ChannelList (z dostępnymi wiadomościami). |
ChannelThreshold |
Wejście | Minimalna liczba kanałów, które muszą mieć co najmniej jedną dostępną wiadomość. Wartość 0 — funkcja zwraca sterowanie natychmiast (równoważne Timeout = 0). Musi być ≤ ChannelCount. |
ChannelList |
Wejście/Wyjście | Przy wywołaniu: wskaźnik do tablicy ID kanałów (fizycznych i/lub logicznych) do monitorowania. Przy zwrocie: podzbiór pierwotnej listy — tylko kanały z dostępnymi wiadomościami (kolejność nie jest gwarantowana). |
| Kod | Opis |
|---|---|
| STATUS_NOERROR | Funkcja wykonana pomyślnie. ChannelList zawiera kanały z dostępnymi wiadomościami. |
| ERR_CONCURRENT_API_CALL | Funkcja J2534 API została wywołana przed zakończeniem poprzedniego wywołania |
| ERR_DEVICE_NOT_OPEN | PassThruOpen() nie został pomyślnie wywołany |
| ERR_NULL_PARAMETER | ChannelSetPtr lub ChannelList ma wartość NULL |
| ERR_INVALID_CHANNEL_ID | Jeden z ID kanałów w ChannelList jest nieprawidłowy. Struktura SCHANNELSET nie jest modyfikowana. |
| ERR_DEVICE_NOT_CONNECTED | Błąd komunikacji z urządzeniem pass-thru. Urządzenie zostało odłączone. |
| ERR_NOT_SUPPORTED | DLL nie obsługuje tej funkcji |
| ERR_SELECT_TYPE_NOT_SUPPORTED | Wartość SelectType jest nieprawidłowa lub nieznana |
| ERR_EXCEEDED_LIMIT | Wartość ChannelThreshold jest większa niż ChannelCount |
| ERR_BUFFER_EMPTY | Brak dostępnych wiadomości na którymkolwiek ze wskazanych kanałów |
| ERR_TIMEOUT | Limit czasu upłynął, a liczba kanałów z wiadomościami jest mniejsza niż ChannelThreshold. Dotyczy tylko niezerowego Timeout oraz obecności co najmniej jednej wiadomości. |
| ERR_FAILED | Nieokreślony błąd. Użyj PassThruGetLastError(), aby uzyskać opis. |
#include "j2534_dll.hpp"
// ID kanałów uzyskane z PassThruConnect/PassThruLogicalConnect
unsigned long canChannelID = ...;
unsigned long isoChannelID = ...;
// Tablica kanałów do monitorowania
unsigned long channels[2] = { canChannelID, isoChannelID };
// Struktura dla PassThruSelect
SCHANNELSET channelSet;
channelSet.ChannelCount = 2;
channelSet.ChannelThreshold = 1; // Czekamy na co najmniej 1 kanał z wiadomością
channelSet.ChannelList = channels;
// Czekamy na wiadomości do 1000 ms
long ret = PassThruSelect(&channelSet, READABLE_TYPE, 1000);
if (ret == STATUS_NOERROR) {
printf("Kanałów z wiadomościami: %lu\n", channelSet.ChannelCount);
// Odczytujemy wiadomości z kanałów, które mają dane
for (unsigned long i = 0; i < channelSet.ChannelCount; i++) {
unsigned long channelID = channelSet.ChannelList[i];
printf("Kanał %lu ma wiadomości\n", channelID);
// Odczytujemy wiadomości
PASSTHRU_MSG msg[10];
unsigned long numMsgs = 10;
ret = PassThruReadMsgs(channelID, msg, &numMsgs, 0);
// ...obsługa wiadomości...
}
} else if (ret == ERR_BUFFER_EMPTY) {
printf("Brak dostępnych wiadomości\n");
} else if (ret == ERR_TIMEOUT) {
printf("Limit czasu, ale jest %lu kanałów z wiadomościami\n", channelSet.ChannelCount);
} else {
char error[256];
PassThruGetLastError(error);
printf("Błąd: %s\n", error);
}
from ctypes import *
j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")
# Struktura SCHANNELSET
class SCHANNELSET(Structure):
_fields_ = [
("ChannelCount", c_ulong),
("ChannelThreshold", c_ulong),
("ChannelList", POINTER(c_ulong))
]
# ID kanałów
can_channel_id = c_ulong(...) # z PassThruConnect
iso_channel_id = c_ulong(...) # z PassThruLogicalConnect
# Tablica kanałów
channels = (c_ulong * 2)(can_channel_id.value, iso_channel_id.value)
# Struktura dla PassThruSelect
channel_set = SCHANNELSET()
channel_set.ChannelCount = 2
channel_set.ChannelThreshold = 1
channel_set.ChannelList = channels
READABLE_TYPE = 0x01
# Czekamy na wiadomości do 1000 ms
ret = j2534.PassThruSelect(byref(channel_set), READABLE_TYPE, 1000)
if ret == 0: # STATUS_NOERROR
print(f"Kanałów z wiadomościami: {channel_set.ChannelCount}")
for i in range(channel_set.ChannelCount):
print(f"Kanał {channel_set.ChannelList[i]} ma wiadomości")
elif ret == 0x10: # ERR_BUFFER_EMPTY
print("Brak dostępnych wiadomości")
elif ret == 0x09: # ERR_TIMEOUT
print(f"Limit czasu, kanałów z wiadomościami: {channel_set.ChannelCount}")
else:
error = create_string_buffer(256)
j2534.PassThruGetLastError(error)
print(f"Błąd: {error.value.decode()}")
PassThruReadMsgs() - Odczyt wiadomości z kanałuPassThruConnect() - Utworzenie połączenia fizycznegoPassThruLogicalConnect() - Utworzenie kanału logicznego