/// <summary> /// The open method tries to connect to both busses to see if one of them is connected and /// active. The first strategy is to listen for any CAN message. If this fails there is a /// check to see if the application is started after an interrupted flash session. This is /// done by sending a message to set address and length (only for P-bus). /// </summary> /// <returns>OpenResult.OK is returned on success. Otherwise OpenResult.OpenError is /// returned.</returns> override public OpenResult open() { Canlib.canInitializeLibrary(); if (isOpen()) { close(); } // Default to "Allow all" uint code = 0xFFF; uint mask = 0x000; // ID 0x000 will thrash the filter calculation so bypass the whole filter if it's found foreach (var id in AcceptOnlyMessageIds) { if (id == 0) { m_filterBypass = true; } } if (m_filterBypass == false) { foreach (var id in AcceptOnlyMessageIds) { code &= id; mask |= id; } mask = (~mask & 0x7FF) | code; logger.Debug("code: " + code.ToString("X8")); logger.Debug("mask: " + mask.ToString("X8")); } VerifyFilterIntegrity(code, mask); Thread.Sleep(200); m_readThread = new Thread(readMessages) { Name = "KvaserCANDevice.m_readThread" }; if (TrionicECU == ECU.TRIONIC5) { OpenChannelWithParamsC200(out handleWrite, CAN_BAUD_BTR_615K_btr0, CAN_BAUD_BTR_615K_btr1); OpenChannelWithParamsC200(out handleRead, CAN_BAUD_BTR_615K_btr0, CAN_BAUD_BTR_615K_btr1); Canlib.canSetAcceptanceFilter(handleRead, (int)code, (int)mask, 0); if (handleWrite < 0 || handleRead < 0) { return(OpenResult.OpenError); } logger.Debug("P bus connected"); m_endThread = false; if (m_readThread.ThreadState == ThreadState.Unstarted) { m_readThread.Start(); } return(OpenResult.OK); } if (!UseOnlyPBus) { if (TrionicECU == ECU.TRIONIC7) { OpenChannelWithParamsC200(out handleWrite, CAN_BAUD_BTR_47K_btr0, CAN_BAUD_BTR_47K_btr1); OpenChannelWithParamsC200(out handleRead, CAN_BAUD_BTR_47K_btr0, CAN_BAUD_BTR_47K_btr1); Canlib.canSetAcceptanceFilter(handleRead, (int)code, (int)mask, 0); } else if (TrionicECU == ECU.TRIONIC8) { OpenChannelWithParamsC200(out handleWrite, CAN_BAUD_BTR_33K_btr0, CAN_BAUD_BTR_33K_btr1); OpenChannelWithParamsC200(out handleRead, CAN_BAUD_BTR_33K_btr0, CAN_BAUD_BTR_33K_btr1); Canlib.canSetAcceptanceFilter(handleRead, (int)code, (int)mask, 0); } if (handleWrite < 0 || handleRead < 0) { return(OpenResult.OpenError); } logger.Debug("I bus connected"); m_endThread = false; if (m_readThread.ThreadState == ThreadState.Unstarted) { m_readThread.Start(); } return(OpenResult.OK); } OpenChannel(out handleWrite, Canlib.canBITRATE_500K); OpenChannel(out handleRead, Canlib.canBITRATE_500K); Canlib.canSetAcceptanceFilter(handleRead, (int)code, (int)mask, 0); if (handleWrite < 0 || handleRead < 0) { return(OpenResult.OpenError); } logger.Debug("P bus connected"); m_endThread = false; if (m_readThread.ThreadState == ThreadState.Unstarted) { m_readThread.Start(); } return(OpenResult.OK); }