IR模式/代码和设备代码与设备名称列表

时间:2017-09-12 07:08:46

标签: java android infrared

我想使用红外线制作Android应用程序' Universal Remote Control'我可以从这里找到许多XML格式的IR代码:https://github.com/probonopd/lirc-remotes。以下是密钥的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等。我知道可以获取设备代码,但如何获取设备类型与设备代码?

另一个问题是,是否存在所有上述XML文件的通用Android / Java代码,它只返回我需要传输的IR模式?

1 个答案:

答案 0 :(得分:0)

  1. 不幸的是,&#34;设备代码&#34;之间没有简单的映射。和设备类型。实际上,XML中的设备代码与IR协议有关。虽然有些制造商可能会使用此字段来映射其设备类型,但大多数制造商都没有。即使是制造商使用设备代码映射到实际的设备类型,映射也不是通用的。

  2. 您可以从Pronto Hex格式的ccf字段中提取载波频率和模式。 (参见Pronto's IR Code Format)转换非常简单。

  3. 以下是供您参考的示例类。 (在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;
            }
        }