2017-09-12 8 views
0

赤外線を使用してAndroidアプリ「ユニバーサルリモコン」を作りたいと思います。私は、ここからXML形式の多くのIRコードを見つけることができます:https://github.com/probonopd/lirc-remotes。ここで重要なのためのIRコードの例です:IRパターン/コードとデバイスコードのリストとデバイス名の比較

<code name="KEY_PLAY" codeno="0x0000000000000059"> 
     <decoding protocol="Sony12" device="17" subdevice="-1" obc="50" hex0="76" hex1="77" hex2="-1" hex3="-1" misc="no repeat" error=""/> 
     <ccf>0000 006d 000d 0000 005c 0016 0017 0016 002e 0016 0017 0016 0017 0016 002e 0016 002e 0016 0017 0016 002e 0016 0017 0016 0017 0016 0017 0016 002e 03d4</ccf> 
    </code> 

は今、私はこれらのXMLファイルから、私のアプリで表示することを、ターゲットデバイスタイプを取得したいです。デバイスタイプはテレビやDVDプレーヤー、ACなどがあります。私はデバイスコードを取得できるのは知っていますが、デバイスコードをデバイスコードからどうやって取得するのですか?

もう1つの質問は、上記のすべてのXMLファイルの一般的なAndroid/Javaコードはありますか?送信する必要があるIRパターンが返されますか?

答えて

0
  1. 残念ながら、「デバイスコード」とデバイスタイプの間には単純なマッピングはありません。実際、XMLのデバイスコードはIRプロトコルに関係しています。メーカーによっては、このフィールドを使用してデバイスタイプにマッピングすることができますが、ほとんどのメーカーはこのフィールドを使用しません。メーカーが実際のデバイスタイプにマップするためにデバイスコードを使用しても、マッピングは普遍的なものではありません。

  2. キャリア周波数とパターンは、Pronto Hex形式のccfフィールドから抽出できます。 (Pronto's IR Code Formatを参照してください)変換はかなり簡単です。

参考のためのサンプルクラスです。 (C#で、が、Javaに容易に変換することができる。)

public class ProntoFormat 
{ 
    private int mFrequency = 0; 
    private List<int> mSequence1 = new List<int>(); 
    private List<int> mSequence2 = new List<int>(); 

     public int CarrierFrequency { get { return mFrequency; } } 

     public Boolean LoadData(int[] data) 
     { 
      // reset 
      mFrequency = 0; 
      mSequence1.Clear(); 
      mSequence2.Clear(); 

      // check length 
      if (null == data || data.Length < 6) 
      { 
       return false; 
      } 

      // check preamble: must be 0 for raw data, so far we only handle raw data 
      if (data[0] != 0) 
      { 
       return false; 
      } 

      // check frequency 
      if (data[1] != 0) 
      { 
       mFrequency = (int)(1000000/((double)data[1] * 0.241246)); 

       if (mFrequency > 65000) // so we set the ceiling to 65KHz 
       { 
        return false; 
       } 
      } 
      else 
      { 
       return false; 
      } 

      // check burst pair sequence 1 count 
      int sequenceLen1 = data[2] * 2; 

      // check burst pair sequency 2 count 
      int sequenceLen2 = data[3] * 2; 

      if (data.Length < 4 + sequenceLen1 + sequenceLen2) 
      { 
       return false; 
      } 


      for (int i = 0; i < sequenceLen1; i++) 
      { 
       mSequence1.Add(data[4 + i]); 
      } 

      for (int i = 0; i < sequenceLen2; i++) 
      { 
       mSequence2.Add(data[4 + sequenceLen1 + i]); 
      } 

      return true; 
     } 

     public int[] GetWaveform() 
     { 
      if (CarrierFrequency == 0 || 
       (mSequence1.Count == 0 && mSequence2.Count == 0)) 
      { 
       return new int[0]; 
      } 

      // carrier cycle time 
      int cycleTime = 1000000/CarrierFrequency; 

      int[] waveform = new int[mSequence1.Count + mSequence2.Count]; 
      for (int i = 0; i < mSequence1.Count; i++) 
      { 
       waveform[i] = mSequence1[i] * cycleTime; 
      } 
      for (int i = 0; i < mSequence2.Count; i++) 
      { 
       waveform[i + mSequence1.Count] = mSequence2[i] * cycleTime; 
      } 

      return waveform; 
     } 
    } 

関連する問題