Beispiel #1
0
 /// <summary>
 /// Handle the given message
 /// </summary>
 /// <returns>True if handled</returns>
 protected virtual bool ReceivePeerXferResponse(PeerXferResponse msg)
 {
     if (msg.SvAddress == 0)
     {
         if (!msg.IsSourcePC)
         {
             var entry = new LocoIO(msg, lb);
             LocoIOFound.Fire(this, new PropertyEventArgs <ILocoIO>(entry));
         }
     }
     return(true);
 }
Beispiel #2
0
 private void LnStateLocoIoFound(object sender, LocoIOEventArgs e)
 {
     if (LocoIOFound != null)
     {
         if (ui.InvokeRequired)
         {
             ui.BeginInvoke(new EventHandler <LocoIOEventArgs>(LnStateLocoIoFound), sender, e);
         }
         else
         {
             LocoIOFound.Fire(this, e);
         }
     }
 }
        /// <summary>
        /// Process a loconet message and update the state accordingly.
        /// </summary>
        private bool ProcessMessage(byte[] message, Message decoded)
        {
            var response = Response.Decode(message);

            lastPreviewMessageTime = DateTime.Now;

            SwitchState sw = null;

            lock (stateLock)
            {
                var inpRep           = response as InputReport;
                var swRep            = response as SwitchReport;
                var peerXferResponse = response as PeerXferResponse;

                if (inpRep != null)
                {
                    //var item = GetItem(inpRep.Address);
                }
                else if (swRep != null)
                {
                    sw = GetSwitch(swRep.Address);
                    if (sw.Direction != swRep.SensorLevel)
                    {
                        // State change
                        sw.Direction = swRep.SensorLevel;
                        Monitor.PulseAll(stateLock);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else if (peerXferResponse != null)
                {
                    if (peerXferResponse.SvAddress == 0)
                    {
                        if (peerXferResponse.IsSourcePC)
                        {
                            if (peerXferResponse.IsDestinationBroadcast)
                            {
                                // Query request
                                locoIOs.Clear();
                                LocoIOQuery.Fire(this);
                            }
                        }
                        else
                        {
                            var entry = new LocoIO(peerXferResponse.Source, peerXferResponse.LocoIOVersion);
                            if (!locoIOs.ContainsKey(entry.Address))
                            {
                                locoIOs[entry.Address] = entry;
                                LocoIOFound.Fire(this, new LocoIOEventArgs(entry));
                            }
                        }
                    }
                }
            }

            // Notify listeners
            if (sw != null)
            {
                StateChanged.Fire(this, new StateMessage(sw));
            }
            return(false);
        }