public void OnFrameReceived(CANMessageFrame message) { var wasMessageSet = false; var buffer = rxMessageBuffers.FirstOrDefault(x => x.CanReceiveMessage(message, swapEndian.Value)); if (buffer != null) { wasMessageSet = buffer.TrySetMessage(message); if (!wasMessageSet && buffer.IsLinked) { for (var index = buffer.BufferId + 1; index < BufferCount; index++) { if (rxMessageBuffers[index].AcceptanceMaskData == buffer.AcceptanceMaskData && rxMessageBuffers[index].AcceptanceCodeData == buffer.AcceptanceCodeData) { wasMessageSet = rxMessageBuffers[index].TrySetMessage(message); if (wasMessageSet || !rxMessageBuffers[index].IsLinked) { break; } } } } } if (wasMessageSet) { rxMessageInterruptsStatus.Value = true; } else { this.Log(LogLevel.Warning, "Could not find any empty mailbox for message: {0}", message); rxMessageLossStatus.Value = true; } UpdateInterrupts(); }
public bool TrySetMessage(CANMessageFrame message) { if (Message == null) { Message = message; parent.Log(LogLevel.Info, "Received message {0} in mailbox #{1}", message, BufferId); IsMessageAvailable = true; return(true); } return(false); }
private void Transmit(ICAN sender, CANMessageFrame message) { lock (sync) { if (!started) { return; } foreach (var iface in attached.Where(x => x != sender)) { iface.GetMachine().HandleTimeDomainEvent(iface.OnFrameReceived, message, TimeDomainsManager.Instance.VirtualTimeStamp); } } }
public bool CanReceiveMessage(CANMessageFrame message, bool isSwapped) { if (!Enabled) { return(false); } // AMR/ACR data registers use filters based on 2 first message bytes var data = BitHelper.ToUInt16(message.Data, 0, reverse: isSwapped); var hasIdFilteringPassed = (message.Id == AcceptanceMaskId); var hasDataFilteringPassed = (~AcceptanceMask & (data ^ AcceptanceCode)) == 0; return(hasIdFilteringPassed && hasDataFilteringPassed); }
public bool TrySetMessage(CANMessageFrame message) { if (IsMessageAvailable) { parent.Log(LogLevel.Warning, "Mailbox #{1} already contains a message: {0}", Message.ToString(), BufferId); return(false); } // http://www.seanano.org/projects/canport/27241003.pdf, p.28: // "When the 82527 receives a message, the entire message identifier, the data length code (DLC) // and the Direction bit are stored into the corresponding message object." DataLengthCode = (uint)message.Data.Length; MessageId = message.Id; Message = message; parent.Log(LogLevel.Info, "Received message {0} in mailbox #{1}", message, BufferId); IsMessageAvailable = true; return(true); }
public bool CanReceiveMessage(CANMessageFrame message, bool isSwapped) { if (!Enabled) { return(false); } // AMR/ACR data registers use filters based on 2 first message bytes if (message.Data.Length == 0) { parent.Log(LogLevel.Warning, "Mailbox #{0} cannot receive message with no data.", BufferId); return(false); } var data = BitHelper.ToUInt16(message.Data, 0, reverse: isSwapped); var hasIdFilteringPassed = (~AcceptanceMask & (message.Id ^ AcceptanceCode)) == 0; var hasDataFilteringPassed = (~AcceptanceMaskData & (data ^ AcceptanceCodeData)) == 0; return(hasIdFilteringPassed && hasDataFilteringPassed); }