C#解码X10代码

时间:2017-02-10 19:53:46

标签: c# raspberry-pi windowsiot x10

我喜欢在Windows 10 IoT上使用C#在Raspberry Pi上解码X10 Code,但我没有使用RF解码的经验,所以这对我来说是个新领域。

我遇到了this帖子,我试图将其转换为C#代码,但我没有成功。有没有人知道如何使用C#正确解码这个X10代码,或者有人能指出我正确的协议规范。

以下是我目前使用的代码,但未调用ValueChanged事件。

public static void Sniff(uint gpioPinNumb)
        {
            Task.Run(() => {
                using (GpioPin pin = GpioController.GetDefault().OpenPin((int)gpioPinNumb, GpioSharingMode.Exclusive))
                {
                    pin.SetDriveMode(GpioPinDriveMode.Input);

                    Stopwatch sw = Stopwatch.StartNew();
                    long elapsedMicrons = 0;
                    int[] states = new int[67];
                    int[] durations = new int[67];
                    uint changeCount = 0;
                    bool lockPassed = false;
                    bool isLock = false;

                    pin.ValueChanged += (GpioPin sender, GpioPinValueChangedEventArgs args) =>
                    {
                        elapsedMicrons = sw.ElapsedTicks / 10;
                        sw.Restart();

                        //Debug.WriteLine(elapsedMicrons);

                        if (elapsedMicrons > 25000 && !lockPassed && !isLock)
                        {
                            //X10 lock started
                            changeCount = 0;
                            durations[changeCount++] = (int)elapsedMicrons;
                            isLock = true;
                            Debug.WriteLine("Lock Started");
                            Debug.WriteLine("");
                        }
                        else if (isLock)
                        {
                            if (changeCount >= durations.Length)
                            {
                                isLock = false;
                                changeCount = 0;
                                Debug.WriteLine("===============================");
                                for (int i = 0; i < durations.Length; i++)
                                {
                                    Debug.Write(durations[i++]);
                                    Debug.Write(" ");
                                }
                                Debug.WriteLine("");
                            }
                            else
                            {
                                durations[changeCount++] = (int)elapsedMicrons;
                            }
                        }
                    };
                }
            });
        }

1 个答案:

答案 0 :(得分:0)

  

这是我目前使用的代码,但是ValueChanged事件   不被称为。

这个问题是由于使用C#&#34;使用&#34;语句导致调用Dispose()。这与Close()相同。一旦调用Dispose,它还会导致对象本身超出范围。

为了安全起见,您可以pin移出Sniff方法,如下所示:

    private static GpioPin pin;
    public static void Sniff(uint gpioPinNumb)
    {
        Task.Run(() => {

                pin = GpioController.GetDefault().OpenPin((int)gpioPinNumb, GpioSharingMode.Exclusive);
                pin.SetDriveMode(GpioPinDriveMode.Input);

                    ...
                    ...