2017-09-12 4 views
0

Je souhaite créer une application Android 'Universal Remote Control', utilisant l'infrarouge. Je suis capable de trouver de nombreux codes IR au format XML à partir d'ici: https://github.com/probonopd/lirc-remotes. Voici un exemple de code IR pour une clé:Liste des modèles IR/Codes et codes de périphériques vs Noms de périphériques

<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> 

Maintenant, je veux obtenir la cible Type de périphérique, que je veux montrer dans mon application, à partir de ces fichiers XML. Le type de périphérique peut être un lecteur TV ou DVD ou AC, etc. Je sais que le code de périphérique peut être récupéré, mais comment obtenir les types de périphériques par rapport aux codes de périphérique?

Une autre question, y at-il un code Android/Java qui est générique pour tous les fichiers XML ci-dessus et il me renvoie juste le modèle IR que j'ai besoin de transmettre?

Répondre

0
  1. Malheureusement, il n'existe pas de correspondance simple entre le «code de périphérique» et le type de périphérique. En fait, le code de périphérique dans le XML se rapporte au protocole IR. Bien que certains fabricants utilisent ce champ pour mapper leur type d'appareil, ce n'est pas le cas de la plupart des fabricants. Même le fabricant utilise le code de périphérique pour correspondre au type de périphérique réel, le mappage n'est pas universel.

  2. Vous pouvez extraire la fréquence porteuse et le motif du champ ccf au format Pronto Hex. (Voir Pronto's IR Code Format) La conversion est assez simple.

Voici un exemple de classe pour votre référence. (En C#, mais pourrait être facilement converti en 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; 
     } 
    }