/// <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); }
/// <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(); }
/// <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); } }
/// <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 } }
/// <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; } } }