#! /usr/bin/env python
# process Chofu heat pump remote control code, use with TSOP1738 circuit where idle state = 1 and output is inverted
# 16.5.2011 mstr

import sys, time, serial
i = ones = se = 0
v = ('0000','0001','0010','0011','0100','0101','0110','0111','1000','1001','1010','1011','1100','1101','1110','1111')
ser = serial.Serial('/dev/ttyUSB1', 115200)
ser.flushInput()

print "Enter sampling frequency (3000 Hz) multiplier: 1, 2, 3 ... 9"
m = raw_input()
mi = int(m) * 3
cyc = 1.0 / mi
print '%5.2f'%(cyc)
ser.write(m)
ser.write("\n")
fv = open ('irdd1.txt','w') 		# edit path and file name as wished
fw = open ('irdd2.txt','w') 		# edit path and file name as wished, the second file is for the 2. group of data if needed

try:
 while 1:
    line = ser.readline()
    if line [0:1] == 'I':		# test if line contains info text
      print line
    else:
      n1 = line[0:1]
      n2 = line[1:2]
      n = len(line)
      if n == 3:			# leading zero has been dropped, must reinsert it
	n2 = n1
	n1 = '0'
      b1 = int(n1,16)
      b2 = int(n2,16)
      if ((b1 == 15) and (b2 == 15)):
	ones = ones + 1
      else:
	ones = 0
      if ((ones < 32) and (se == 0)): # in the first group of samples se = 0
	c1 = v[b1]
	c2 = v[b2]
      	for n in range(4):
	  i = i + 1
	  t = str('%5.2f'%(i * cyc)) + '  ' + c1[n] + '\n'
	  ta = str('%5.2f'%((i + 0.99) * cyc)) + '  ' + c1[n] + '\n' # format square pulses for the graph
	  fv.write (t)
	  fv.write (ta)
	for n in range(4):
	  i = i + 1
	  t = str('%5.2f'%(i * cyc)) + '  ' + c2[n] + '\n'
	  ta = str('%5.2f'%((i + 0.99) * cyc)) + '  ' + c2[n] + '\n'
	  fv.write (t)
	  fv.write (ta)
      elif ((ones < 32) and (se == 1)): # in the second group of samples se = 1
	c1 = v[b1]
	c2 = v[b2]
      	for n in range(4):
	  i = i + 1
	  t = str('%5.2f'%(i * cyc)) + '  ' + c1[n] + '\n'
	  ta = str('%5.2f'%((i + 0.99) * cyc)) + '  ' + c1[n] + '\n'
	  fw.write (t)
	  fw.write (ta)
	for n in range(4):
	  i = i + 1
	  t = str('%5.2f'%(i * cyc)) + '  ' + c2[n] + '\n'
	  ta = str('%5.2f'%((i + 0.99) * cyc)) + '  ' + c2[n] + '\n'
	  fw.write (t)
	  fw.write (ta)
      else: 				# when at least 256 consecutive '1' bits detected
 	i = 0
 	se = 1

except KeyboardInterrupt:
  fv.close()
  fw.close()
  ser.close()
  sys.exit(0)
