示例#1
0
        /// <summary>
        /// Initializes the CAN.
        /// </summary>
        /// <returns>If successful, return [true].</returns>
        private static bool CANInit()
        {
            int Result;

            Result = C4UFX.EnableTS(0, 0);
            Result = C4UFX.ResetInterface(0, 0);          // clear out any misc messages

            if (Result != C4UFX.Resp_Ack)
            {
                CANCheckStatus(true);
                return(false);
            }
            Result = C4UFX.ClearCANMess(0, 0);            // clear out any misc messages

            if (Result != C4UFX.Resp_Ack)
            {
                CANCheckStatus(true);
                return(false);
            }
            Result = C4UFX.SetCANBaud(0, 0, CANBAUD);

            if (Result != C4UFX.Resp_Ack)
            {
                CANCheckStatus(true);
                return(false);
            }
            Result = C4UFX.ClearCANMess(0, 0);

            if (Result != C4UFX.Resp_Ack)
            {
                CANCheckStatus(true);
                return(false);
            }
            Result = C4UFX.RecCANMess(0, 0, (long)Filters.MESS0, 0x0C + 1); //'//MO0 + enable rollover bit

            if (Result != C4UFX.Resp_Ack)
            {
                CANCheckStatus(true);
                return(false);
            }

            Result = C4UFX.RecCANMess(0, 0, (long)Filters.MESS1, 0x1C);
            if (Result != C4UFX.Resp_Ack)
            {
                CANCheckStatus(true);
                return(false);
            }

            for (int i = 0; i < 6; i++)
            {
                Result = C4UFX.SetFilters(0, 0, (byte)i, (long)Filters.FILTER0, true);
                if (Result != C4UFX.Resp_Ack)
                {
                    CANCheckStatus(true);
                    return(false);
                }
            }

            return(true);
        }
示例#2
0
        /// <summary>
        /// Handles the Tick event of the ErrorResetTmr control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        private static void ErrorResetTmr_Tick(object sender, EventArgs e)
        {
            int Result;

            byte[] Buf = new Byte[4];
            Buf[0] = 0;
            Result = C4UFX.WriteReg(0, 0, 0x2D, 1, Buf);
            errorResetTmr.Stop();
        }
示例#3
0
 /// <summary>
 /// Sends the oldest message in the queue to the CAN.
 /// </summary>
 private static void SendNextInQueue()
 {
     if (messageQueue.Count > 0)
     {
         int error             = 0;
         C4UFX.CANMessage mess = messageQueue.Dequeue();
         C4UFX.SendCANMess(0, 0, mess, out error);
         MessageSent?.Invoke(mess);
     }
 }
示例#4
0
        /// <summary>
        /// Checks the CAN for incoming messages.
        /// </summary>
        private static void GetIncomingMessages()
        {
            try
            {
                int Result = C4UFX.Resp_Ack;
                C4UFX.CANMessage CANMess = new C4UFX.CANMessage();

                while (Result == C4UFX.Resp_Ack)
                {
                    Result = C4UFX.GetCANMess(0, 0, ref CANMess);
                    if (Result == C4UFX.Resp_Ack)
                    {
                        MessageReceived?.Invoke(CANMess);
                    }
                }
            }
            catch
            {
                CANStatus?.Invoke(CANSTAT.NOINTERFACE); //Error found by not connecting interface, unsure if that's the only possible reason
            }
        }
示例#5
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;
                }
            }
        }