2016-11-02 22:29:13 +08:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
# coding=utf-8
|
2016-11-11 16:20:31 +08:00
|
|
|
#
|
|
|
|
|
# created by strawmanbobi 2016-11-10
|
2016-11-02 22:29:13 +08:00
|
|
|
|
|
|
|
|
import struct
|
|
|
|
|
import sys
|
|
|
|
|
import xml.dom.minidom
|
|
|
|
|
|
|
|
|
|
flag_tab = ("boot", "stop", "separator", "one", "zero", "flip", "two", "three")
|
|
|
|
|
|
|
|
|
|
class IRDAData:
|
|
|
|
|
def __init__(self, bits, lsb, mode, index):
|
|
|
|
|
self.bits = bits
|
|
|
|
|
self.lsb = lsb
|
|
|
|
|
self.mode = mode
|
|
|
|
|
self.index = index
|
|
|
|
|
|
|
|
|
|
def printf(self):
|
|
|
|
|
print "%d %d %d %d" % (self.bits, self.lsb, self.mode, self.index)
|
|
|
|
|
|
|
|
|
|
def packIRData(self):
|
|
|
|
|
return struct.pack("BBBB", self.bits, self.lsb, self.mode, self.index)
|
|
|
|
|
|
|
|
|
|
class IRDAFlag:
|
|
|
|
|
def __init__(self, name, mask, space):
|
|
|
|
|
self.name = name
|
|
|
|
|
self.mask = mask
|
|
|
|
|
self.space = space
|
|
|
|
|
|
|
|
|
|
def printf(self):
|
|
|
|
|
print "%s %d %d" % (self.name, self.mask, self.space)
|
|
|
|
|
|
|
|
|
|
def packFlag(self):
|
|
|
|
|
return struct.pack("HH", self.mask, self.space)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def printProtocol(file):
|
|
|
|
|
print file
|
|
|
|
|
dom = xml.dom.minidom.parse(file)
|
|
|
|
|
root = dom.documentElement
|
|
|
|
|
freqnode = root.getElementsByTagName('frequency')
|
|
|
|
|
freq = freqnode[0].firstChild.data
|
|
|
|
|
inverseflag = 0
|
|
|
|
|
|
|
|
|
|
protnode = root.getAttribute('name')
|
|
|
|
|
|
|
|
|
|
print protnode
|
|
|
|
|
protname = protnode.split('_')
|
|
|
|
|
|
|
|
|
|
binary = open(sys.argv[2], 'wb')
|
|
|
|
|
|
|
|
|
|
bytes = struct.pack('20s', protnode.encode("ascii"))
|
|
|
|
|
binary.write(bytes)
|
|
|
|
|
|
|
|
|
|
bit = root.getElementsByTagName('bit')
|
|
|
|
|
for n in range(len(flag_tab)):
|
|
|
|
|
for b in range(len(bit)):
|
|
|
|
|
name = bit[b].getAttribute('name')
|
|
|
|
|
cycles = bit[b].getAttribute('cycles')
|
|
|
|
|
if name and cycles:
|
|
|
|
|
if cmp(flag_tab[n], name) == 0:
|
|
|
|
|
bytes = struct.pack('B', int(cycles))
|
|
|
|
|
binary.write(bytes)
|
|
|
|
|
break
|
|
|
|
|
if b == (len(bit) - 1):
|
|
|
|
|
bytes = struct.pack('B', 0)
|
|
|
|
|
binary.write(bytes)
|
|
|
|
|
for m in range(len(flag_tab)):
|
|
|
|
|
found = 0
|
|
|
|
|
for i in range(len(bit)):
|
|
|
|
|
name = bit[i].getAttribute('name')
|
|
|
|
|
cycles = bit[i].getAttribute('cycles')
|
|
|
|
|
if name and cycles and cmp(flag_tab[m], name) == 0:
|
|
|
|
|
found = 1
|
|
|
|
|
cycle = bit[i].getElementsByTagName('cycle')
|
|
|
|
|
for c in range(len(cycle)):
|
|
|
|
|
normal = cycle[c].getAttribute('flag')
|
|
|
|
|
mask = cycle[c].getAttribute('mask')
|
|
|
|
|
space = cycle[c].getAttribute('space')
|
|
|
|
|
if cmp(normal, "normal") == 0:
|
|
|
|
|
inverseflag = 0
|
|
|
|
|
else:
|
|
|
|
|
inverseflag = 1
|
|
|
|
|
print "{\"%s\", \"cycle:%s\", 0x%04x, 0x%04x, 0x%02x}" % (
|
|
|
|
|
name, c, int(mask), int(space), int(cycles))
|
|
|
|
|
bytes = struct.pack('B', inverseflag)
|
|
|
|
|
binary.write(bytes)
|
|
|
|
|
bytes = struct.pack('HH', int(mask), int(space))
|
|
|
|
|
binary.write(bytes)
|
|
|
|
|
|
|
|
|
|
frame = root.getElementsByTagName('frame')
|
|
|
|
|
|
|
|
|
|
index = 0
|
|
|
|
|
lsb = 0
|
|
|
|
|
mode = 0
|
|
|
|
|
flag = 0
|
|
|
|
|
irda_frame = []
|
|
|
|
|
flag_tab_dict = {"boot": 0, "stop": 1, "separator": 2, "one": 3, "zero": 4, "flip": 5, "two": 6, "three": 7}
|
|
|
|
|
for i in frame[0].childNodes:
|
|
|
|
|
if i.nodeType == i.ELEMENT_NODE:
|
|
|
|
|
index += 1
|
|
|
|
|
if i.getAttribute('type'):
|
|
|
|
|
print "{%d, \"%s\", 0, 0, 0}" % (index, i.getAttribute('type'))
|
|
|
|
|
flag = IRDAData(1, 0, 0, flag_tab_dict[i.getAttribute('type').encode("ascii")])
|
|
|
|
|
irda_frame.append(flag)
|
|
|
|
|
if i.getAttribute('bits'):
|
|
|
|
|
if cmp(i.getAttribute('ending'), "lsb") == 0:
|
|
|
|
|
lsb = 0
|
|
|
|
|
else:
|
|
|
|
|
lsb = 1
|
|
|
|
|
|
|
|
|
|
if cmp(i.getAttribute('mode'), "normal") == 0:
|
|
|
|
|
mode = 0
|
|
|
|
|
else:
|
|
|
|
|
mode = 1
|
|
|
|
|
|
2016-11-13 13:52:57 +08:00
|
|
|
print "{%d, \"%s\", %d, %d, %s}" % (index, i.getAttribute('bits'),
|
2016-11-02 22:29:13 +08:00
|
|
|
lsb, mode, i.firstChild.data)
|
|
|
|
|
flag = IRDAData(int(i.getAttribute('bits')), lsb, mode, int(i.firstChild.data))
|
|
|
|
|
irda_frame.append(flag)
|
|
|
|
|
|
|
|
|
|
binary.write(struct.pack("B", len(irda_frame)))
|
|
|
|
|
|
|
|
|
|
for i in range(len(irda_frame)):
|
|
|
|
|
irda_frame[i].printf()
|
|
|
|
|
binary.write(irda_frame[i].packIRData())
|
|
|
|
|
binary.close()
|
|
|
|
|
|
|
|
|
|
printProtocol(sys.argv[1])
|