#!/usr/bin/python2.7
import signal
import sys
import time
import serial
import io
import getopt
import threading
interval = '0.1'
class SerialDevice():
def __init__(self, device, interval):
self.interval = interval
self.data = (0,None,None)
self.dataLock = threading.Lock()
self._threadStopFlag = threading.Event()
try:
self.port=serial.Serial(port=device,
baudrate=2400,
bytesize=serial.EIGHTBITS,
stopbits=serial.STOPBITS_ONE,
parity=serial.PARITY_NONE,
timeout=None)
if not self.port.isOpen():
self.port.open()
except IOError,err:
print '\nError:' + str(err) + '\n'
sys.exit(1)
## starting event loop
self.t = threading.Thread(target=self._eventLoop)
self.t.start()
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
self._threadStopFlag.set()
self.t.join()
self.port.flushInput()
self.port.close()
def _eventLoop(self):
while not self._threadStopFlag.isSet():
substr = self._getPacket()
data = self._decodeStream(substr)
self.dataLock.acquire()
self.data = data
self.dataLock.release()
time.sleep(float(self.interval))
self.port.flushInput()
def _getPacket(self):
i = 0
substr = ''
while i<14:
byte = self.port.read(1)
# converting every byte to binary format keeping the low nibble.
substr += '{0:08b}'.format(ord(byte))[4:]
i += 1
return substr
def _decodeStream(self, substr):
ac = int(substr[0:1])
dc = int(substr[1:2])
auto = int(substr[2:3])
pclink = substr[3:4]
minus = int(substr[4:5])
digit1 = substr[5:12]
dot1 = int(substr[12:13])
digit2 = substr[13:20]
dot2 = int(substr[20:21])
digit3 = substr[21:28]
dot3 = int(substr[28:29])
digit4 = substr[29:36]
micro = int(substr[36:37])
nano = int(substr[37:38])
kilo = int(substr[38:39])
diotst = int(substr[39:40])
mili = int(substr[40:41])
percent = int(substr[41:42])
mega = int(substr[42:43])
contst = int(substr[43:44])
cap = int(substr[44:45])
ohm = int(substr[45:46])
rel = int(substr[46:47])
hold = int(substr[47:48])
amp = int(substr[48:49])
volts = int(substr[49:50])
hertz = int(substr[50:51])
lowbat = int(substr[51:52])
minm = int(substr[52:53])
fahrenh = substr[53:54]
celcius = int(substr[54:55])
maxm = int(substr[55:56])
digit = {"1111101":"0",
"0000101":"1",
"1011011":"2",
"0011111":"3",
"0100111":"4",
"0111110":"5",
"1111110":"6",
"0010101":"7",
"1111111":"8",
"0111111":"9",
"0000000":"",
"1101000":"L"}
valueStr = ("-" if minus else " ") +\
digit.get(digit1,"") + ("." if dot1 else "") +\
digit.get(digit2,"") + ("." if dot2 else "") +\
digit.get(digit3,"") + ("." if dot3 else "") +\
digit.get(digit4,"")
try:
valueNum = float(valueStr)
except ValueError:
valueNum = None
flags = ",".join(["AC" if ac else "",
"DC" if dc else "",
"Auto" if auto else "",
"Diode test" if diotst else "",
"Conti test" if contst else "",
"Capacity" if cap else "",
"Rel" if rel else "",
"Hold" if hold else "",
"Min" if minm else "",
"Max" if maxm else "",
"LowBat" if lowbat else ""])
if valueNum == None:
pass
elif nano:
valueNum *= 10e-9
elif micro:
valueNum *= 10e-6
elif mili:
valueNum *= 10e-3
elif kilo:
valueNum *= 10e3
elif mega:
valueNum *= 10e6
units = ("%" if percent else "") +\
("Ohm" if ohm else "") +\
("Amp" if amp else "") +\
("Volt" if volts else "") +\
("Hz" if hertz else "") +\
("C" if celcius else "")
return (valueNum, units, flags)
def _getAllValues(self):
self.dataLock.acquire()
data = self.data
self.dataLock.release()
return data
def getValue(self):
return self._getAllValues()[0]
def getUnit(self):
return self._getAllValues()[1]
def getFlags(self):
return self._getAllValues()[2]