Exemple #1
0
        /// <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);
        }