-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrobust_serial.py
130 lines (108 loc) · 2.82 KB
/
robust_serial.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from __future__ import print_function, division, unicode_literals, absolute_import
import struct
from enum import Enum
class Order(Enum):
"""
Pre-defined orders
"""
HELLO = 0
SPEEDS = 1
MOTOR = 2
ALREADY_CONNECTED = 3
ERROR = 4
RECEIVED = 5
STOP = 6
MOTOR1 = 11
MOTOR2 = 12
MOTOR3 = 13
MOTOR4 = 14
MOTOR5 = 15
MOTOR6 = 16
ALLSTOP = 20
ALLSTART = 21
def read_order(f):
"""
:param f: file handler or serial file
:return: (Order Enum Object)
"""
return Order(read_i8(f))
def read_i8(f):
"""
:param f: file handler or serial file
:return: (int8_t)
"""
return struct.unpack('<b', bytearray(f.read(1)))[0]
def read_i16(f):
"""
:param f: file handler or serial file
:return: (int16_t)
"""
return struct.unpack('<h', bytearray(f.read(2)))[0]
def read_i32(f):
"""
:param f: file handler or serial file
:return: (int32_t)
"""
return struct.unpack('<l', bytearray(f.read(4)))[0]
def write_i8(f, value):
"""
:param f: file handler or serial file
:param value: (int8_t)
"""
if -128 <= value <= 127:
f.write(struct.pack('<b', value))
else:
print("Value error:{}".format(value))
def write_order(f, order):
"""
:param f: file handler or serial file
:param order: (Order Enum Object)
"""
write_i8(f, order.value)
def write_i16(f, value):
"""
:param f: file handler or serial file
:param value: (int16_t)
"""
f.write(struct.pack('<h', value))
def write_i32(f, value):
"""
:param f: file handler or serial file
:param value: (int32_t)
"""
f.write(struct.pack('<l', value))
def decode_order(f, byte, debug=False):
"""
:param f: file handler or serial file
:param byte: (int8_t)
:param debug: (bool) whether to print or not received messages
"""
try:
order = Order(byte)
if order == Order.HELLO:
msg = "HELLO"
elif order == Order.SERVO:
angle = read_i16(f)
# Bit representation
# print('{0:016b}'.format(angle))
msg = "SERVO {}".format(angle)
elif order == Order.MOTOR:
speed = read_i8(f)
msg = "motor {}".format(speed)
elif order == Order.ALREADY_CONNECTED:
msg = "ALREADY_CONNECTED"
elif order == Order.ERROR:
error_code = read_i16(f)
msg = "Error {}".format(error_code)
elif order == Order.RECEIVED:
msg = "RECEIVED"
elif order == Order.STOP:
msg = "STOP"
else:
msg = ""
print("Unknown Order", byte)
if debug:
print(msg)
except Exception as e:
print("Error decoding order {}: {}".format(byte, e))
print('byte={0:08b}'.format(byte))