Exemple #1
0
        /// <summary>
        /// Check to see if the received message is valid. Override this to add your own validation rules.
        /// </summary>
        protected virtual bool CheckMessage(IRPulseMessage message)
        {
            for (int i = 0; i < LeadInPattern.Count; i++)
            {
                if (message.PulseSpaceUnits[i] != LeadInPattern[i])
                {
                    // Lead-in pattern is wrong, assume this is noise.
                    return(false);
                }
            }

            return(true);
        }
        /// <summary>
        /// Capture one message that seems to be valid. Anything that is obviously noise will be filtered out. You can add additional checking by overriding <see cref="CleanedUpIRCapture.CheckMessage"/>
        /// </summary>
        protected IRPulseMessage CaptureSingleMessage()
        {
            if (UnitDurationMicrosecs <= 0)
            {
                throw new InvalidOperationException($"Must set a value for {nameof(UnitDurationMicrosecs)}.");
            }

            if (LeadInPattern == null || LeadInPattern.Count <= 0)
            {
                throw new InvalidOperationException($"The {nameof(LeadInPattern)} must be set. Without this background noise would keep triggering the IR sensor.");
            }

            _message = null;
            base.CaptureFromDevice();
            return(_message);
        }
 protected override bool OnReceiveIRPulseMessage(PulseSpaceDurationList rawDataBuffer, IRPulseMessage message)
 {
     if (CheckMessage(message))
     {
         if (_message != null)
         {
             throw new Exception("Message already has a value.");
         }
         _message = message;
         return(false); // Got the message, stop receiving IR.
     }
     else
     {
         Miss?.Invoke(this, EventArgs.Empty);
         return(true); // Not a good IR signal, keep trying.
     }
 }
        public void Constructor_FromDuration()
        {
            // ACT
            IRPulseMessage message = new IRPulseMessage(new PulseSpaceDurationList()
            {
                88,
                106,
                200
            },
                                                        100);

            // ASSERT
            Assert.That(message.PulseSpaceDurations[0], Is.EqualTo(100));
            Assert.That(message.PulseSpaceDurations[1], Is.EqualTo(100));
            Assert.That(message.PulseSpaceDurations[2], Is.EqualTo(200));
            Assert.That(message.PulseSpaceUnits[0], Is.EqualTo(1));
            Assert.That(message.PulseSpaceUnits[1], Is.EqualTo(1));
            Assert.That(message.PulseSpaceUnits[2], Is.EqualTo(2));
            Assert.That(message.UnitCount, Is.EqualTo(4));
            Assert.That(message.UnitDuration, Is.EqualTo(100));
        }
 public void Send(IRPulseMessage message)
 {
     Send(message.PulseSpaceDurations);
 }
Exemple #6
0
 /// <summary>
 /// Handle in incoming IR message. Typically the first thing to do is to call <see cref="CheckMessage"/> to see if it is any good.
 /// </summary>
 /// <param name="rawDataBuffer">The raw PULSE/SPACE data received from the IR driver without any rounding. Typically only useful for diagnostics. Note this buffer is not yours to keep! Once this method returns this buffer will be reused by the calling code. So copy the data if you want to keep it.</param>
 /// <param name="message">The rounded data. This one you can keep.</param>
 /// <returns>
 /// Return TRUE to continue capturing IR or FALSE to stop.
 /// </returns>
 protected abstract bool OnReceiveIRPulseMessage(PulseSpaceDurationList rawDataBuffer, IRPulseMessage message);
        protected override bool OnReceiveIRPulseMessage(PulseSpaceDurationList rawDataBuffer, IRPulseMessage message)
        {
            if (CheckMessage(message))
            {
                bool pulse = true; // or space.

                if (rawDataBuffer.Count != message.PulseSpaceDurations.Count)
                {
                    throw new Exception("These should be the same length.");
                }

                var merged = rawDataBuffer
                             .Zip(message.PulseSpaceDurations, (r, m) => new { Raw = r, Clean = m })
                             .Zip(message.PulseSpaceUnits, (durations, units) => new { Raw = durations.Raw, Clean = durations.Clean, Units = units });

                foreach (var item in merged)
                {
                    string type = pulse ? "PULSE" : "SPACE";

                    ConsoleWriteLine($"{type} {item.Raw.ToString().PadLeft(5)} {item.Clean.ToString().PadLeft(5)} {item.Units}");

                    pulse = !pulse;
                }
                ConsoleWriteLine($"----------------------   UnitCount:{message.UnitCount}");
            }

            return(true);
        }