Example #1
0
        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);
            }
Example #5
0
            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);
            }
Example #6
0
            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);
            }