/* This file is generated by BUSMASTER */ /* VERSION [1.1] */ /* BUSMASTER VERSION [2.6.4] */ /* PROTOCOL [CAN] */ /* Start BUSMASTER include header */ #include #include #include // 20.01.2017 (c) by geier99 /* End BUSMASTER include header */ /* Start BUSMASTER global variable */ typedef unsigned short int u16; typedef unsigned char u8; typedef volatile unsigned char vu8; const u8 DEBUG_ON=0; // simulated OBD data #define SPEED (49) // in km/h #define RPM (1900) // #define COOLANT_TEMP (76) // in °C #define MIL_STATUS (1) // on Bit 7 of first Byte from response // maximal nur 10 eingeben, da zum TEsten das Array mit den DTC auf 10 Fehlercodes bege #define MAX_DTC_ERRORS (10) #define DTC_CODE_ERRORS (3) // A6...A0 from first Byte ANzahl der DTC Fehler #define ENGINE_LOAD (80) // 66% Motorlast: A*100/255 ==> 168.3 #define VIN "WAUZZZ8K1AA070865" // Mariuzs // end simulated OBD data #define FirstFrame (0x10) #define CFrame (0x20) //#define SUPPORTED_PIDS ( 0xBE1FA813 ) // T4: 983F8010 =>> Funktionen 1, 4, 5, 11, 12, 13, 14, 15, 16, 17, 28. #define SUPPORTED_PIDS ( 0x98180000 ) // PID 1,4,5,12,13 #define SUPPORTED_PIDS_2 ( 0xBE1FA813 ) #define SUPPORTED_PIDS_3 ( 0xBE1FA812 ) #define SUPPORTED_PID_SVERVICE_9 (0xC0000000) //#define SUPPORTED_PIDS ( 0x983F8010 ) // T4: 983F8010 =>> Funktionen 1, 4, 5, 11, 12, 13, 14, 15, 16, 17, 28. #define TESTER_ID (0x7E8) // V4-MMI #define TESTER_FLOW_CONTROLL_ID (0x7E0) // Botschaft and Auto #define OBD_RQUEST (0x7DF) // reqauest an auto #define SID_FLAG (1<<6) // Bit von der SID, welches bei der Antwort gesetzt wird typedef enum DTC_request_mode_en { DTC_request_UNKNOWN , DTC_request_DTC , DTC_request_PENDING } DTC_request_mode_t; typedef struct dtc_err_st { unsigned char error_code[2]; } dtcErrors_t; typedef enum DTC_first_char_en { // for ascci conversion A7,A6 dtc_Powertrain , dtc_Chassis , dtc_Body , dtc_Network , dtc_SIZE } DTC_first_char_t; // Transportprotokoll CAN typedef enum tp_frametyp_en { // Bit 7..4 vom PCI (Protocol Control INformation) D1 bzw. D1undD2 bei FirstFrame tp_SF=0 // PCI SingleFrametyp , tp_FF // PCI FirstFrame , tp_CF // PCI Consecutive Frame , tp_FC // PCI Flow Control Frame } tp_frametyp_t; typedef enum diag_SID_en { //Enumeration der Diagnose PIDs , bei der Resonse wird das Bit6 von der SID gesetzt diag_SID_REQUEST_DATA = 0x01 // mode , diag_SID_REQUEST_FREEZE_FRAME , diag_SID_REQUEST_DTC , diag_SID_CLEAR_DTC , diag_SID_REQUEST_OXYGEN , diag_SID_REQUEST_OBM , diag_SID_REQUEST_DTC_DRIVE , diag_SID_REQUEST_CONTROL , diag_SID_REQUEST_VEHICLE_INFO } diag_SID_t; typedef enum diag_PID_en { //Enumeration der Diagnose PIDs , bei der Resonse wird das Bit6 von der SID gesetzt diag_PID_SUPPORTED_PIDS = 0x0 , diag_PID_MIL , diag_PID_ENGIGE_LOAD = 0x04 // errechnet Motorlast 0-100% könnte man ansteht Motordrehmoment nehmen , diag_PID_COOLING_TEMPERATURE = 0x05 , diag_PID_RPM = 0x0C , diag_PID_SPEED = 0x0D , diag_PID_SUPPORTED_PIDS_2 = diag_PID_SUPPORTED_PIDS + 0x20 , diag_PID_SUPPORTED_PIDS_3 = diag_PID_SUPPORTED_PIDS_2 + 0x20 } diag_PID_t; // Standard ISO Protokoll typedef enum tp_SID_en { //Enumeration der Diagnose Servic ID (SID) , bei der Resonse wird das Bit6 von der SID gesetzt tp_SID_START_DIAG_SESSION = 0x10 , tp_SID_ECU_RESET = 0x11 , tp_SID_READ_ECU_INFO = 0x1A , tp_SID_READ_DATA_BY_LOCAL_IDENTIFIER = 0x21 , tp_SID_READ_DATA_BY_IDENTIFIER = 0x22 , tp_SID_SECURITY_ACCESS = 0x27 // Para 01=Request Seed, 0x02= Send Key , tp_SID_WRITE_DATA_BY_IDENTIFIER = 0x2E , tp_SID_WRITE_DATA_BY_LOCAL_IDENTIFIER = 0x3B , tp_SID_TESTER_PRESENT = 0x3E // UDS } tp_SID_t; tp_frametyp_t tpFrameTyp; static struct { u16 ID; u8 DLC; u8 Data[8]; tp_frametyp_t tpFrameTyp; // muss bei der Zuweisung gesetzt werden u8 tpDataLength; // muss bei der Zuweisung gesetztn werden, nur bei } CurrentDiagnoseRxMsg; struct obddata_st { unsigned long supported_PIDs; unsigned long supported_PIDs_2; unsigned long supported_PIDs_3; unsigned char MIL; // 0:0ff 1:on unsigned char coolant_temp; unsigned int speed ; unsigned int rpm ; unsigned char engine_load; } obdata = {SUPPORTED_PIDS,SUPPORTED_PIDS_2,SUPPORTED_PIDS_3, (MIL_STATUS<<7)| DTC_CODE_ERRORS,COOLANT_TEMP+40, SPEED,RPM*4, (ENGINE_LOAD*255)/100}; //const unsigned char sVin[] = VIN; struct vin_simu_st { unsigned char sVin[sizeof(VIN)]; u8 requestVinReceived: 1 ; u8 flowConrollReceived: 1; u8 sendSecondVinPart :1 ; } vin_simu = {VIN,0,0,0}; static dtcErrors_t dtcErrors[MAX_DTC_ERRORS]= { { 0x01,0x21} , { 0x02,0x22} , { 0x03,0x33} , { 0x04,0x44} , { 0x05,0x55} , { 0x06,0x66} , { 0x07,0x77} , { 0x08,0x88} , { 0x09,0x99} , { 0x0A,0xAA} }; const unsigned char dtcFirstChar[dtc_SIZE]= { 'P','C','B','U' }; struct dtc_simu_st { dtcErrors_t* pDtcCodes; DTC_request_mode_t dtcRequestMode; u8 requestDtcReceived: 1 ; u8 flowConrollDtcReceived: 1; u8 sendSecondDtcPart :1 ; } dtc_simu = {&dtcErrors[0],DTC_request_UNKNOWN,0,0,0}; // 2.DTC= dtcErrors[1].error_code[0] und dtcErrors[1].error_code[1] static unsigned char dtcFrameCounter=0; // die Multiframe verarbeitung static unsigned char dtcIndex=0; //unsigned char sendSecondVinPart = 0 ; // wenn 1 dann den 2.teil der Vin Senden /* End BUSMASTER global variable */ /* Start BUSMASTER Function Prototype */ GCC_EXTERN void GCC_EXPORT OnMsgID_7df(STCAN_MSG RxMsg); void Utils_DiagHandler(STCAN_MSG * pRxMsg); GCC_EXTERN void GCC_EXPORT OnMsgID_7e0(STCAN_MSG RxMsg); GCC_EXTERN void GCC_EXPORT OnTimer_vinSecondPart_50( ); GCC_EXTERN void GCC_EXPORT OnDLL_Load(); /* End BUSMASTER Function Prototype */ /* Start BUSMASTER generated function - OnMsgID_7df */ void OnMsgID_7df(STCAN_MSG RxMsg) { /* TODO */ if(RxMsg.cluster ==1) Utils_DiagHandler(&RxMsg); // nur auf CAN1 reagieren } /* End BUSMASTER generated function - OnMsgID_7df */ /* Start BUSMASTER generated function - Utils_DiagHandler */ void Utils_DiagHandler(STCAN_MSG * pRxMsg) { unsigned char i=0; unsigned long ltemp=0; unsigned char data_len=0; diag_SID_t sid; diag_PID_t pid; static STCAN_MSG sMsg; // Initialise message structure sMsg.id = TESTER_ID; // Message ID sMsg.isExtended = FALSE; // Standard Message type sMsg.isRtr = FALSE; // Not RTR type sMsg.dlc = 8; // Length is 8 Bytes sMsg.data[0] = 6; // Anzahl Datenbytes , sMsg.data[1] = sid | SID_FLAG ; sMsg.data[2] = 0; // Parameter sMsg.data[3] = 0; sMsg.data[4] = 0; sMsg.data[5] = 0; sMsg.data[6] = 0; sMsg.data[7] = 0; sMsg.cluster = 1; // First CAN channel //Trace ("Diagnose request Received"); if (pRxMsg!= NULL) { // Handler wurde wegen einer empfangener Diagnosemesasge aufgerufen ==> ISO-TP-Protokoll handeln sid = (diag_SID_en)pRxMsg->data[1]; if (!(pRxMsg->data[0] & 0xF0)) { // Single Frame?? data_len = pRxMsg->data[0] & 0x0F; sMsg.data[1] = sid | SID_FLAG ; if (sid==diag_SID_REQUEST_DATA) { // data request mode 01 pid = (diag_PID_en)pRxMsg->data[2]; if (DEBUG_ON) Trace ("ReadOBD(SID=%d , PID=%d )",sid,pid); Trace ("ReadOBD(SID=%d , PID=%d )",sid,pid); switch (pid) { case diag_PID_SUPPORTED_PIDS: // supported PIDs // send back A4 8K status sMsg.data[0] = 6; // Anzahl Datenbytes sMsg.data[2] = pid; sMsg.data[3] = (unsigned char)(obdata.supported_PIDs>>24); sMsg.data[4] = (unsigned char)(obdata.supported_PIDs>>16); sMsg.data[5] = (unsigned char)(obdata.supported_PIDs>>8); sMsg.data[6] = (unsigned char)(obdata.supported_PIDs); ltemp= obdata.supported_PIDs; // 32 damitau for (i=0; i<31;i++) { // 32-Bit maske MSB steht für PID 01 A7....D0 => PID01....PID32 (PID32 bedeuete more PIDs ?? if (ltemp & 0x80000000 ) { Trace ("PID = %d supported",i+1); } ltemp <<=1; } if (ltemp & 0x80000000 ) { Trace ("Weitere Pids vorhanden (PID32)"); } else { Trace ("Keine weiteren PIDs vorhanden"); } if (DEBUG_ON) Trace("Response ReadOBD(SID=%d , PID=%d ) == 0x%X",sid,pid, obdata.supported_PIDs); break; case diag_PID_SUPPORTED_PIDS_2: // überprüfen mit den richtigen Daten!!!!!!!!!!!! // send back A4 8K status sMsg.data[0] = 6; // Anzahl Datenbytes sMsg.data[2] = pid; sMsg.data[3] = (unsigned char)(obdata.supported_PIDs_2 >>24); sMsg.data[4] = (unsigned char)(obdata.supported_PIDs_2 >>16); sMsg.data[5] = (unsigned char)(obdata.supported_PIDs_2 >>8); sMsg.data[6] = (unsigned char)(obdata.supported_PIDs); ltemp= obdata.supported_PIDs_2; // 32 damitau for (i=0; i<31;i++) { // 32-Bit maske MSB steht für PID 01 A7....D0 => PID01....PID32 (PID32 bedeuete more PIDs ?? if (ltemp & 0x80000000 ) { Trace ("PID = %d supported",(i+1)+0x20); } ltemp <<=1; } if (ltemp & 0x80000000 ) { Trace ("Weitere Pids vorhanden (PID64)"); } else { Trace ("Keine weiteren PIDs vorhanden"); } if (DEBUG_ON) Trace("Response ReadOBD(SID=%d , PID=%d ) == 0x%X",sid,pid, obdata.supported_PIDs_2); break; case diag_PID_SUPPORTED_PIDS_3: // überprüfen mit den richtigen Daten!!!!!!!!!!!! // send back A4 8K status sMsg.data[0] = 6; // Anzahl Datenbytes sMsg.data[2] = pid; sMsg.data[3] = (unsigned char)(obdata.supported_PIDs_3 >>24); sMsg.data[4] = (unsigned char)(obdata.supported_PIDs_3 >>16); sMsg.data[5] = (unsigned char)(obdata.supported_PIDs_3 >>8); sMsg.data[6] = (unsigned char)(obdata.supported_PIDs); ltemp= obdata.supported_PIDs_3; // 32 damitau for (i=0; i<31;i++) { // 32-Bit maske MSB steht für PID 01 A7....D0 => PID01....PID32 (PID32 bedeuete more PIDs ?? if (ltemp & 0x80000000 ) { Trace ("PID = %d supported",(i+1)+0x40); } ltemp <<=1; } if (ltemp & 0x80000000 ) { Trace ("Weitere Pids vorhanden (PID98)"); } else { Trace ("Keine weiteren PIDs vorhanden"); } if (DEBUG_ON) Trace("Response ReadOBD(SID=%d , PID=%d ) == 0x%X",sid,pid, obdata.supported_PIDs_3); break; case diag_PID_MIL: sMsg.data[0] = 6; // Anzahl Datenbytes sMsg.data[2] = pid; sMsg.data[3] = (unsigned char) (obdata.MIL); // MIL Status und Anzahl Fehlercodes sMsg.data[4] = (unsigned char) 0; // todo restliche werte simulieren sMsg.data[5] = (unsigned char) 0; sMsg.data[6] = (unsigned char) 0; if (DEBUG_ON) Trace("Response ReadOBD(SID=%d , PID=%d ) == 0x%X ==> MIL-Status: MIL-Lampe (1:on, 0:off) = %d , aktuelle Fehler= %d ",sid,pid,obdata.MIL, (unsigned char)((obdata.MIL & 0x80)>>7),(unsigned char)(obdata.MIL&0x7F)); break; case diag_PID_ENGIGE_LOAD: sMsg.data[0] = 3; // Anzahl Datenbytes sMsg.data[2] = pid; sMsg.data[3] = obdata.engine_load; if (DEBUG_ON) Trace("Response ReadOBD(SID=%d , PID=%d ) == 0x%X ==> engine load = %i %%",sid,pid, obdata.engine_load, obdata.engine_load*100/255); break; case diag_PID_COOLING_TEMPERATURE: sMsg.data[0] = 3; // Anzahl Datenbytes sMsg.data[2] = pid; sMsg.data[3] = obdata.coolant_temp; if (DEBUG_ON) Trace("Response ReadOBD(SID=%d , PID=%d ) == 0x%X ==> Coolant TEmp = %i °C",sid,pid, obdata.coolant_temp, obdata.coolant_temp-40); break; case diag_PID_SPEED: sMsg.data[0] = 3; // Anzahl Datenbytes sMsg.data[2] = pid; sMsg.data[3] = obdata.speed; if (DEBUG_ON) Trace("Response ReadOBD(SID=%d , PID=%d ) == 0x%X ==> Speed = %d km/h",sid,pid, obdata.speed, obdata.speed); break; case diag_PID_RPM: sMsg.data[0] = 4; // Anzahl Datenbytes sMsg.data[2] = pid; sMsg.data[3] = (unsigned char) ((obdata.rpm>>8) & 0xFF); sMsg.data[4] = (unsigned char) obdata.rpm; if (DEBUG_ON) Trace("Response ReadOBD(SID=%d , PID=%d ) == 0x%X ==> RPM = %d U/min",sid,pid, obdata.rpm, obdata.rpm/4); break; default: Trace ("Not handled PID = %d", pid); return; break; }; SendMsg(sMsg); // } else { if (sid==diag_SID_REQUEST_VEHICLE_INFO) { // data request mode 09 pid = (diag_PID_en)pRxMsg->data[2]; if (DEBUG_ON) Trace ("ReadOBD(SID=%d , PID=%d ) (VIN)",sid,pid); switch (pid) { case diag_PID_SUPPORTED_PIDS: // supported PIDS sMsg.data[0] = 6; // Anzahl Datenbytes sMsg.data[2] = pid; sMsg.data[3] = (unsigned char)(SUPPORTED_PID_SVERVICE_9>>24); sMsg.data[4] = (unsigned char)(SUPPORTED_PID_SVERVICE_9>>16); sMsg.data[5] = (unsigned char)(SUPPORTED_PID_SVERVICE_9>>8); sMsg.data[6] = (unsigned char)(SUPPORTED_PID_SVERVICE_9); ltemp= SUPPORTED_PID_SVERVICE_9; // 32 damitau for (i=0; i<31;i++) { // 32-Bit maske MSB steht für PID 01 A7....D0 => PID01....PID32 (PID32 bedeuete more PIDs ?? if (ltemp & 0x80000000 ) { Trace ("PID = %d supported",i+1); } ltemp <<=1; } if (ltemp & 0x80000000 ) { Trace ("Weitere Pids vorhanden (PID32)"); } else { Trace ("Keine weiteren PIDs vorhanden"); } if (DEBUG_ON) Trace("Response ReadOBD(SID=%d , PID=%d ) == 0x%X",sid,pid, SUPPORTED_PID_SVERVICE_9); break; case 2: // PID for VIN Trace ("ReadOBD(SID=%d , PID=%d ) (VIN)",sid,pid); // Start Frame 31,710 7E8 8 10 14 49 02 01 57 41 55 Firsfram sMsg.data[0] = FirstFrame; sMsg.data[1] = sizeof(vin_simu.sVin)+2 ; // Anzahl zeichen sMsg.data[2] = sid | SID_FLAG; // sMsg.data[3] = 0; sMsg.data[3] = pid; sMsg.data[4] = 0x01; sMsg.data[5] = vin_simu.sVin[0]; sMsg.data[6] = vin_simu.sVin[1]; sMsg.data[7] = vin_simu.sVin[2]; SendMsg(sMsg); // vin_simu.requestVinReceived =1; // Trace ("ReadOBD(SID=%d , PID=%d ) (VIN)",sid,pid); break; default: Trace("PID : %d not supported",pid); break; } // ned sitch } // end mod = 09 else { if (sid==diag_SID_REQUEST_DTC) { // data request mode 3 , hier gibt es keine sid, if (DEBUG_ON) Trace ("ReadOBD-->DTC: (SID=%d ) (DTC)",sid); if(DTC_CODE_ERRORS <= 2) { // bis 3 DTC nur eine SF senden somit keine Multiframe sMsg.data[0] = 2+(DTC_CODE_ERRORS*2); // Anzahl Datenbytes + errorcounter sMsg.data[2] = DTC_CODE_ERRORS; for(unsigned char i=0; iDTC: (SID=%d ) (DTC) ==> Send Single Frame Response with %d DTC codes",sid,DTC_CODE_ERRORS); } else { // todo First Frram senden sMsg.data[0] = FirstFrame; sMsg.data[1] = (DTC_CODE_ERRORS*2)+1+1 ; // Anzahl zeichen, tOdo prüfen ob korretk sMsg.data[2] = sid | SID_FLAG; // sMsg.data[3] = DTC_CODE_ERRORS; // anzahl Fehler codes sMsg.data[4] = dtcErrors[0].error_code[0]; sMsg.data[5] = dtcErrors[0].error_code[1]; sMsg.data[6] = dtcErrors[1].error_code[0]; sMsg.data[7] = dtcErrors[1].error_code[1]; //sMsg.data[7] = dtcErrors[2].error_code[0]; dtc_simu.requestDtcReceived = 1; dtc_simu.dtcRequestMode = DTC_request_DTC; dtcFrameCounter=0; // First Frame wird nach if gesendet dtcIndex = 5; Trace ("ReadOBD-->DTC: (SID=%d ) (DTC) ==> Send Multi Frame Response with %d DTC codes",sid,DTC_CODE_ERRORS); } SendMsg(sMsg); // // Trace ("ReadOBD-->DTC: (SID=%d ) (DTC)",sid); } // end DTC request else { if (sid== diag_SID_REQUEST_DTC_DRIVE) { // data request mode 7 =>Pending DTC if (DEBUG_ON) Trace ("ReadOBD-->Pending DTC: (SID=%d ) (DTC Pending)",sid); Trace ("ReadOBD-->Pending DTC: (SID=%d ) (DTC Pending)",sid); if(DTC_CODE_ERRORS <= 2) { // bis 3 DTC nur eine SF senden somit keine Multiframe sMsg.data[0] = 2+(DTC_CODE_ERRORS*2); // Anzahl Datenbytes + errorcounter sMsg.data[2] = DTC_CODE_ERRORS; for(unsigned char i=0; iPending DTC: (SID=%d ) (DTC) ==> Send Single Frame Response with %d DTC codes",sid,DTC_CODE_ERRORS); } else { // todo First Frram senden sMsg.data[0] = FirstFrame; sMsg.data[1] = (DTC_CODE_ERRORS*2)+1+1 ; // Anzahl zeichen, tOdo prüfen ob korretk sMsg.data[2] = sid | SID_FLAG; // sMsg.data[3] = DTC_CODE_ERRORS; // anzahl Fehler codes sMsg.data[4] = dtcErrors[0].error_code[0]+0x10; //Pending mit 1 starten sMsg.data[5] = dtcErrors[0].error_code[1]; sMsg.data[6] = dtcErrors[1].error_code[0]+0x10; //Pending mit 1 starten sMsg.data[7] = dtcErrors[1].error_code[1]; //sMsg.data[7] = dtcErrors[2].error_code[0]; dtc_simu.requestDtcReceived = 1; dtc_simu.dtcRequestMode = DTC_request_PENDING; dtcFrameCounter=0; // First Frame wird nach if gesendet dtcIndex = 5; Trace ("ReadOBD-->Pending DTC: (SID=%d ) (DTC) ==> Send Multi Frame Response with %d DTC codes",sid,DTC_CODE_ERRORS); } SendMsg(sMsg); // // Trace ("ReadOBD-->DTC: (SID=%d ) (DTC)",sid); } } } } } else { // kein Singleframe if( (pRxMsg->data[0] == 0x30) && vin_simu.requestVinReceived ) { // flow controll für Vin, nur wenn vorher VIN requested wurde verarbeiten if (DEBUG_ON) Trace ("Flow Controll Botschaft für VIN Request empfangen!"); vin_simu.flowConrollReceived = 1; /* Trace ("Flow Controll recieved ==> send VIN = %s",vin_simu.sVin); sMsg.data[0] = CFrame +1 ; for (i=0;i<7;i++) { sMsg.data[i+1] = vin_simu.sVin[i+3]; } SendMsg(sMsg); // */ /* vin_simu.sendSecondVinPart = 1; // jetzt in der Timer Funktion sMsg.data[0] = CFrame +2 ; for (i=0;i<7;i++) { sMsg.data[i+1] = vin_simu.sVin[i+3 +7]; } SendMsg(sMsg); // */ } if( (pRxMsg->data[0] == 0x30) && dtc_simu.requestDtcReceived ) { // flow controll für DTC, nur wenn vorher DTC requested wurde verarbeiten if (DEBUG_ON) Trace ("########Flow Controll Botschaft für DTC Request empfangen!"); dtc_simu.flowConrollDtcReceived = 1; } } } } /* End BUSMASTER generated function - Utils_DiagHandler */ /* Start BUSMASTER generated function - OnMsgID_7e0 */ void OnMsgID_7e0(STCAN_MSG RxMsg) { /* TODO */ Utils_DiagHandler(&RxMsg); }/* End BUSMASTER generated function - OnMsgID_7e0 */ /* Start BUSMASTER generated function - OnTimer_vinSecondPart_50 */ void OnTimer_vinSecondPart_50( ) { static STCAN_MSG sMsg; unsigned char i; static unsigned char *pData; // für DTC daaten auf die Errocodes if ( (vin_simu.requestVinReceived == 0) && (dtc_simu.requestDtcReceived == 0) )return; // nix zu tun if ( vin_simu.requestVinReceived ) { //Trace(" VIM_ Halllllllllllllllllllllllllo"); sMsg.id = TESTER_ID; // Message ID sMsg.isExtended = FALSE; // Standard Message type sMsg.isRtr = FALSE; // Not RTR type sMsg.dlc = 8; // Length is 8 Bytes sMsg.cluster = 1; // First CAN channel if (vin_simu.sendSecondVinPart) { vin_simu.sendSecondVinPart = 0; vin_simu.flowConrollReceived = 0; vin_simu.requestVinReceived=0; sMsg.data[0] = CFrame +2 ; for (i=0;i<7;i++) { sMsg.data[i+1] = vin_simu.sVin[i+3 +7]; } SendMsg(sMsg); if (DEBUG_ON) Trace ("VIN gesendet ==> VIN = %s",vin_simu.sVin); } if (vin_simu.flowConrollReceived) { vin_simu.sendSecondVinPart = 1; sMsg.data[0] = CFrame +1 ; for (i=0;i<7;i++) { sMsg.data[i+1] = vin_simu.sVin[i+3]; } SendMsg(sMsg); // } } if ( dtc_simu.requestDtcReceived ) { sMsg.id = TESTER_ID; // Message ID sMsg.isExtended = FALSE; // Standard Message type sMsg.isRtr = FALSE; // Not RTR type sMsg.dlc = 8; // Length is 8 Bytes sMsg.cluster = 1; // First CAN channel // Trace(" DTC_ Halllllllllllllllllllllllllo"); // todo: bei folgende IF-Bloecke zusammenfassen if (dtc_simu.sendSecondDtcPart==1) { dtcFrameCounter++; dtcFrameCounter%=0x0F; Trace ("Framecounter: %d Index: %d",dtcFrameCounter,dtcIndex); dtc_simu.flowConrollDtcReceived=0; // auf Flow wurde schon reagiert // daten abarbeiten sMsg.data[0] = CFrame +dtcFrameCounter ; for (i=0;i<7;i++) { if ( dtcIndex < (DTC_CODE_ERRORS*2)+1 ) { sMsg.data[i+1] = *(pData+dtcIndex++-1); if ( (dtc_simu.dtcRequestMode == DTC_request_PENDING) && (sMsg.data[i+1]<0x10) ){ sMsg.data[i+1]+=0x10; // für DTC Pending mit 1 starten } } else { sMsg.data[i+1] = 0x00; // restlichen Bytes mit 0x00 füllen } } Trace("DTC-Index(mulit neuer): %d",dtcIndex); if ( dtcIndex >= (DTC_CODE_ERRORS*2) ) { // keine weiteren Daten , flags zurücksetzen dtc_simu.flowConrollDtcReceived=0; // auf Flow wurde schon reagiert dtc_simu.requestDtcReceived=0; dtc_simu.dtcRequestMode = DTC_request_UNKNOWN; dtc_simu.sendSecondDtcPart=0; dtcFrameCounter=0; dtcIndex=5; } SendMsg(sMsg); // // dtc_simu.requestDtcReceived=0; // hier nur zum Test damit der Workflow beendet iwrd // dtc_simu.sendSecondDtcPart = 0 ;// dies muss bei dem letzen Datensatz gesetz werden } if (dtc_simu.flowConrollDtcReceived) { Trace("Flow recieved"); dtcFrameCounter++; dtcFrameCounter%=0x0F; Trace ("Framecounter: %d Index: %d",dtcFrameCounter,dtcIndex); pData = (unsigned char*) dtc_simu.pDtcCodes; dtc_simu.sendSecondDtcPart = 1; // Flag das jetzt die Multiframe daten gesendet werden sMsg.data[0] = CFrame +dtcFrameCounter ; for (i=0;i<7;i++) { if ( dtcIndex < (DTC_CODE_ERRORS*2)+1 ) { sMsg.data[i+1] = *(pData+dtcIndex++-1); if ( (dtc_simu.dtcRequestMode == DTC_request_PENDING) && (sMsg.data[i+1]<0x10) ){ sMsg.data[i+1]+=0x10; // für DTC Pending mit 1 starten } } else { sMsg.data[i+1] = 0x00; // restlichen Bytes mit 0x00 füllen } } Trace("DTC-Index: %d",dtcIndex); if ( dtcIndex >= (DTC_CODE_ERRORS*2)+1 ) { // keine weiteren Daten , flags zurücksetzen dtc_simu.flowConrollDtcReceived=0; // auf Flow wurde schon reagiert dtc_simu.requestDtcReceived=0; dtc_simu.dtcRequestMode = DTC_request_UNKNOWN; dtc_simu.sendSecondDtcPart=0; dtcFrameCounter=0; dtcIndex=5; } SendMsg(sMsg); // } } }/* End BUSMASTER generated function - OnTimer_vinSecondPart_50 */ /* Start BUSMASTER generated function - OnDLL_Load */ void OnDLL_Load() { /* TODO */ Trace ("CAN1 fuer die Simulation verwenden und Filter auf CAN1 für die Anzeige setzen"); Trace ("Nicht vergessen Message/Timer-Handler zu aktivieren"); //Trace ("TEst Errocorcod 1 : 0x%02X , 0x%02X", dtcErrors[1].error_code[0] , dtcErrors[1].error_code[1]); }/* End BUSMASTER generated function - OnDLL_Load */