class Frame:
# Sensor types
- ACC_SNS = 0x00
- MAG_SNS = 0x01
- LGT_SNS = 0x02
- TCH_SNS = 0x03
- A2D_SNS = 0x04
+ SNS_ACC = 0x00
+ SNS_MAG = 0x01
+ SNS_LGT = 0x02
+ SNS_TCH = 0x03
+ SNS_A2D = 0x04
SNS_NUM = 0x05
SNS_SHIFT = 4
SNS_MASK = 0xF0
# Data types
- INT = 0
- LONG = 1
- FLOAT = 2
- DOUBLE = 3
-
- TYP_NUM = 4
+ TYP_S8 = 0
+ TYP_S16 = 1
+ TYP_S32 = 2
+ TYP_U8 = 3
+ TYP_U16 = 4
+ TYP_U32 = 5
+ TYP_F32 = 6
+ TYP_F64 = 7
+
+ TYP_NUM = 8
TYP_SHIFT = 0
TYP_MASK = 0x0F
# Command codes
- STOP = 0
- START = 1
- RATE = 2
+ CMD_STOP = 0
+ CMD_START = 1
+ CMD_RATE = 2
- OPER_NUM = 3
- OPER_SHIFT = 0
- OPER_MASK = 0x0F
+ CMD_NUM = 3
+ CMD_SHIFT = 0
+ CMD_MASK = 0x0F
# Frame information
HEADER = 0x02
DATA_POS = 3
# Maps
- snsMap = {ACC_SNS: 'acc',
- MAG_SNS: 'mag',
- LGT_SNS: 'lgt',
- TCH_SNS: 'tch',
- A2D_SNS: 'a2d'}
-
- cmdMap = {START, 'start',
- STOP, 'stop',
- RATE, 'rate'}
-
- sizeMap = {INT: 2,
- LONG: 4,
- FLOAT: 4,
- DOUBLE: 8}
-
- fmtMap = {INT: 'h',
- LONG: 'i',
- FLOAT: 'f',
- DOUBLE: 'd'}
+ snsMap = {SNS_ACC: 'acc',
+ SNS_MAG: 'mag',
+ SNS_LGT: 'lgt',
+ SNS_TCH: 'tch',
+ SNS_A2D: 'a2d'}
+
+ cmdMap = {CMD_START, 'start',
+ CMD_STOP, 'stop',
+ CMD_RATE, 'rate'}
+
+ sizeMap = {TYP_S8: 1, TYP_S16: 2, TYP_S32: 4,
+ TYP_U8: 1, TYP_U16: 2, TYP_U32: 4,
+ TYP_F32: 4, TYP_F64: 8}
+
+ fmtMap = {TYP_S8: 'b', TYP_S16: 'h', TYP_S32: 'i',
+ TYP_U8: 'B', TYP_U16: 'H', TYP_U32: 'I',
+ TYP_F32: 'f', TYP_F64: 'd'}
+
+ sampleNum= {SNS_ACC: 0,
+ SNS_MAG: 0,
+ SNS_LGT: 0,
+ SNS_TCH: 0,
+ SNS_A2D: 0}
# Parser data
index = 0 # read index
fmt = Frame.fmtMap[self.bits_typ] * self.count
sns = Frame.snsMap[self.bits_sns]
self.values = unpack('<'+fmt, self.binary)
- print('convert: %3s = \'%3s\'%%[%s] -> [%s]' %
- (sns, fmt, hexDump(self.binary), fltDump(self.values)))
+
+ # Print debug output
+ self.sampleNum[self.bits_sns] += 1
+ #if self.sampleNum[self.bits_sns] == 1000:
+ if self.sampleNum[self.bits_sns] == 1000:
+ print('convert: %3s = \'%3s\'%%[%s] -> [%s]' %
+ (sns, fmt, hexDump(self.binary), fltDump(self.values)))
+ self.sampleNum[self.bits_sns] = 0
# Create state
state = State()
def set_rate(self, sensor, interval):
sns = Frame.findCode(Frame.snsMap, sensor)
- bits = (sns << Frame.SNS_SHIFT) | \
- (Frame.RATE << Frame.OPER_SHIFT)
+ bits = (sns << Frame.SNS_SHIFT) | \
+ (Frame.CMD_RATE << Frame.CMD_SHIFT)
self._write_binary('Bf', bits, interval)
def set_enable(self, sensor, enabled):
sns = Frame.findCode(Frame.snsMap, sensor)
- oper = Frame.START if enabled else Frame.STOP
- bits = (sns << Frame.SNS_SHIFT) | \
- (oper << Frame.OPER_SHIFT)
+ cmd = Frame.CMD_START if enabled else Frame.CMD_STOP
+ bits = (sns << Frame.SNS_SHIFT) | \
+ (cmd << Frame.CMD_SHIFT)
self._write_binary('B', bits)
def process(self):
- items = []
- count = 0
- limit = 1000
-
if not self.running():
- return items
-
- while self.serial.readable():
- try:
- byte = self.serial.read()
- except Exception as ex:
- # Not sure why this is excepting
- # if it says it's readable
- break
- if len(byte) == 0:
- break
+ return []
+ items = []
+ while self.serial.inWaiting():
+ byte = self.serial.read()
state = self.frame.parse(byte)
if state:
items.append(state)
- if count > limit:
- print('[ERROR] Exceeded Read Limit')
- break
-
- count += 1
-
return items