private void detectSignals() { Stopwatch stopWatch = new Stopwatch(); while (true) { GpioPinValue currentValue = _inputPin.Read(); // Wir müssen nur zwischen 2 Zuständen unterscheiden. // 1. Wir warten auf ein Low-Signal und beginnen dann die Zeitmessung // 2. Wir stoppen die im ersten Schritt gestartete Zeitmessung und werten anschließend die Zeit aus. // Da im ersten Schritt die Zeitmessung gestoppt ist und im zweiten nicht, benutzen wir hier die entsprechende Eigenschaft, // um zwischen den jeweiligen Schritten zu unterscheiden. if (!stopWatch.IsRunning) { if (currentValue == GpioPinValue.Low) { stopWatch.Restart(); } } else if (currentValue == GpioPinValue.High) { stopWatch.Stop(); var duration = stopWatch.ElapsedMilliseconds; stopWatch.Reset(); // Unter dem Schwellwert von Short werten wir das Signal als zu kurz und damit ungültig. // Ansonsten ordnen wir das Signal anhand der festgelegten Schwellwerte dem jeweiligen Typ zu. if (duration >= TIME_SHORT) { SignalTypes signalType = SignalTypes.Short; if (duration >= TIME_PAUSE) { signalType = SignalTypes.Pause; } else if (duration >= TIME_LONG) { signalType = SignalTypes.Long; } // Normalerweise würden wir hier ein entsprechendes Event feuern. // Aber in diesem Fall helfen wir uns mit einer einfachen Ausgabe. Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { lb_Output.Items.Add(String.Format("{0}: {1} ({2} ms)", DateTime.Now.ToString("HH:mm:ss"), signalType.ToString(), duration)); if (lb_Output.Items.Count > 10) { lb_Output.Items.RemoveAt(0); } }) .AsTask().Wait(); } } // Damit verhindern wir, dass der arme Raspi heiß läuft ;-) // 100 Abtastungen pro Sekunde sollten in diesem Fall genügen. Task.Delay(10); } }
public override string ToString() { return(m_type.ToString()); }