<< Click to Display Table of Contents >> Navigation: Plug-ins > User-Plug-ins > User-Plug-in erstellen > Beispiele |
Die folgenden Beispiele zeigen nur Vorschläge zur Implementierung einer bestimmten Funktionalität und keinen Lösungsansatz zur Implementierung eines vollständigen User-Plug-ins.
Reaktion auf Änderung der Datenbasis
Um auf Änderung der Datenbasis reagieren zu können, muss eine entsprechende Callback-Funktion (OnDatabaseChanged) registriert werden. Dies kann beispielsweise in der Export-Funktion DLL_vInit geschehen. Bei laufender Simulation ist dies nicht möglich.
// OnDatabaseChanged registrieren. if(CAND_enRegisterCallback(OnDatabaseChanged, CAND_enDBChanged, CAND_hNullHandle(), 0) == CAND_nERR_OK) { // Registrierung war erfolgreich. } |
Die Deregistrierung kann in der Export-Funktion DLL_vDeInit vorgenommen werden.
// OnDatabaseChanged deregistrieren. if(CAND_enUnRegisterCallback(OnDatabaseChanged, CAND_enDBChanged, CAND_hNullHandle(), 0) == CAND_nERR_OK) { // Deregistrierung war erfolgreich. } |
Die Callback-Funktion muss den folgenden Aufbau haben:
ANSI_C void USERDLL_CALL OnDatabaseChanged(CAND_tenDBChangedReason iReason, CAND_tHandle hObject) { // Hier Code einfügen zur Reaktion auf Änderung der Datenbasis. } |
Jedes Mal, wenn nun die Datenbasis verändert wird, wird diese Funktion aufgerufen, z.B. wenn eine neue geladen oder wenn ein Datenbasis-Objekt verändert wird.
Beispiel: Aktionen vor Senden einer Botschaft
Für Benachrichtigungen bevor eine Botschaft auf dem Bus versendet wird, kann ein sogenannter Pre-Transmit-Callback registriert werden:
// OnPreTransmitMsg registrieren. if(CAND_enRegisterCallback(OnPreTransmitMsg, CAND_enPreTransmit, m_hRegMsg, 0) == CAND_nERR_OK) { // Registrierung war erfolgreich. } |
Wird der Callback nicht mehr verwendet, muss dieser abgemeldet werden:
if(CAND_enUnRegisterCallback(OnPreTransmitMsg, CAND_enPreTransmit, m_hRegMsg, 0) == CAND_nERR_OK) { // Deregistrierung war erfolgreich. } |
Die folgende Implementation der Callback-Funktion bewirkt, dass vor dem Senden der Botschaft MS_308h der Signalwert des Signals NMOT inkrementiert wird.
ANSI_C unsigned char USERDLL_CALL OnPreTransmitMsg( CAND_tHandle hMsg, CAND_tstCanMessage* pstMsg, DWORD dwUserData) { // Handle auf Botschaft "MS_308h" holen. CAND_tHandle hMs308h = CAND_hFindObject(NULL, NULL, "MS_308h", -1, NULL, CAND_hNullHandle());
// Handle zum Signal aus der Botschaft holen. CAND_tHandle hAliveCounter = CAND_hGetSignalByName(hMs308h, "NMOT");
// Signalwert holen QWORD qwSigVal = 0; if (CAND_enGetSigData(hAliveCounter, &qwSigVal, sizeof(qwSigVal)) == CAND_nERR_OK) { // Signalwert erhöhen und zurückschreiben qwSigVal++;
if(CAND_enSetSigDataHex(hAliveCounter, qwSigVal) == CAND_nERR_OK) { // Signalwert wurde gesetzt. } } return 1; } |