示例#1
0
        /// <summary>
        /// Checks the status of the CAN.
        /// </summary>
        /// <param name="ForceErr">If true, force an error even if there is none.</param>
        private static void CANCheckStatus(bool ForceErr)
        {
            int Result;

            if (CANInterfaceStatus == CANSTAT.OK && !ForceErr)
            {
                byte[] DataBuffer = new byte[10];

                Result = C4UFX.ReadReg(0, 0, 0x2D, 1, ref DataBuffer); // EFLG
                if (Result == C4UFX.Resp_Ack)
                {
                    InterfaceWarning?.Invoke(Warning.OK, DataBuffer[0] == 0);
                    InterfaceWarning?.Invoke(Warning.RxWarning, (DataBuffer[0] & 0x02) > 0);
                    InterfaceWarning?.Invoke(Warning.TxWarning, (DataBuffer[0] & 0x04) > 0);
                    InterfaceWarning?.Invoke(Warning.Buffer0Warning, (DataBuffer[0] & 0x08) > 0);
                    InterfaceWarning?.Invoke(Warning.Buffer1Warning, (DataBuffer[0] & 0x10) > 0);
                    InterfaceWarning?.Invoke(Warning.RxPassive, (DataBuffer[0] & 0x20) > 0);
                    InterfaceWarning?.Invoke(Warning.TxPassive, (DataBuffer[0] & 0x40) > 0);
                    InterfaceWarning?.Invoke(Warning.BussOff, (DataBuffer[0] & 0x80) > 0);

                    if ((DataBuffer[0] & 0x40) > 0 || (DataBuffer[0] & 0x80) > 0)
                    {
                        errorResetTmr.Start();
                    }
                }
            }
            else
            {
                C4UFX.CANMessage errorMessage = new C4UFX.CANMessage();
                int errorCode;

                errorMessage.ID  = 0;
                errorMessage.DLC = 0;
                for (int i = 0; i < 8; i++)
                {
                    errorMessage.Data[i] = 0;
                }
                errorMessage.EID        = true;
                errorMessage.RTR        = false;
                errorMessage.MO         = 0;
                errorMessage.SendOption = 7;

                Result = C4UFX.SendCANMess(0, 0, errorMessage, out errorCode);

                switch (Result)
                {
                case C4UFX.Resp_Ack:
                    CANStatus?.Invoke(CANSTAT.OK);
                    break;

                case C4UFX.Resp_NAck:
                    // message was transmitted but there was an error, so reset
                    CANInit();
                    CANStatus?.Invoke(CANSTAT.SENDERROR);
                    break;

                case C4UFX.Resp_ErrImproperResponse:
                    CANStatus?.Invoke(CANSTAT.NOINTERFACE);
                    break;

                default:
                    CANStatus?.Invoke(CANSTAT.ERROR);
                    break;
                }
            }
        }