2017-02-10 37 views
1

我喜歡在Windows 10 IoT上使用C#解碼Raspberry Pi上的X10代碼,但我沒有使用RF解碼的經驗,所以這對我來說是一個新領域。C#解碼X10代碼

我碰到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; 
          } 
         } 
        }; 
       } 
      }); 
     } 

回答

0

這是我目前使用的代碼,但是ValueChanged事件 不叫。

使用C#「using」語句導致調用Dispose()的語句導致此問題。這與Close()相同。一旦Dispose被調用,它也會導致對象本身超出範圍。

爲安全起見,你可以移動pinSniff方法是這樣的:

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

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

        ... 
        ... 
+0

好吧,這解決了第一個問題,現在究竟如何我interprete這個值?我找不到任何圖案。 –

+0

你可以參考[這個C#庫](https://github.com/genielabs/x10-lib-dotnet)。 –