-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathrepowered.py
More file actions
167 lines (138 loc) · 4.43 KB
/
repowered.py
File metadata and controls
167 lines (138 loc) · 4.43 KB
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
import serial
from ctypes import *
HDDR_LEN = 2
STOP_BYTE = 0xA5
NUM_FIELDS = 8
CONFIG_FIELD_SIZE = 1
FIELD_SIZE = 4
FIELD_SELF_ID = 0x00
FIELD_MODE = 0x01
FIELD_CHANNEL = 0x02
FIELD_SAMPLES_PER_RANGE = 0x03
FIELD_NUMBER_OF_ANCHORS = 0x04
FIELD_X = 0x05
FIELD_Y = 0x06
FIELD_Z = 0x07
CMD_READ_CONFIG = 0x11
CMD_READ_ANCHORS = 0x12
CMD_SET_CONFIG = 0x22
CMD_SET_COORDS = 0x23
CMD_RANGE = 0x33
CMD_RESTART = 0x44
CMD_RESET = 0x55
CMD_SAVE_CONFIG = 0x66
class UwbConfig:
def __init__(self, comport):
self.ser = serial.Serial(comport)
self.ser.timeout = 1.0
self.ser.baudrate = 115200
self.id = 0
self.mode = 0
self.channel = 2
self.samples_per_range = 0
self.number_of_anchors = 0
self.x = 0.0
self.y = 0.0
self.z = 0.0
fields = property(lambda self: [\
c_uint(self.id), \
c_uint(self.mode), \
c_uint(self.channel), \
c_uint(self.samples_per_range), \
c_uint(self.number_of_anchors), \
c_float(self.x), \
c_float(self.y), \
c_float(self.z)], \
None, None, None)
def set_config(self):
packet = bytearray(HDDR_LEN + NUM_FIELDS*(FIELD_SIZE+1) + 1)
ind = 0
packet[ind] = CMD_SET_CONFIG
ind += 1
packet[ind] = NUM_FIELDS*(FIELD_SIZE+1)
ind += 1
for i in range(0, NUM_FIELDS):
packet[ind] = i # id of the field to read
ind += 1
field = pointer(self.fields[i]) # get a pointer to the field
field = cast(field, POINTER(c_ubyte))
packet[ind] = field[3]
ind += 1
packet[ind] = field[2]
ind += 1
packet[ind] = field[1]
ind += 1
packet[ind] = field[0]
ind += 1
packet[ind] = STOP_BYTE
print(packet)
self.ser.write(packet)
try:
hddr = self.ser.read(HDDR_LEN)
body = self.ser.read(hddr[1])
stop = self.ser.read(1)
return hddr + body + stop
except IndexError:
print("Header didn't come through")
return None
def read_config(self):
packet = bytearray(HDDR_LEN + NUM_FIELDS + 1)
ind = 0
packet[ind] = CMD_READ_CONFIG
ind += 1
packet[ind] = NUM_FIELDS
ind += 1
for i in range(0, NUM_FIELDS):
packet[ind] = i # id of the field to read
ind += 1
packet[ind] = STOP_BYTE
print(packet)
self.ser.write(packet)
try:
hddr = self.ser.read(HDDR_LEN)
body = self.ser.read(hddr[1])
stop = self.ser.read(1)
retval = hddr + body + stop
except IndexError:
print("Header didn't come through")
retval = None
print(len(retval))
return retval
def config_to_str(arr):
print(arr)
retval = "self id : {:d}\r\n"
retval += "mode : {:d}\r\n"
retval += "channel : {:d}\r\n"
retval += "samples-per-range : {:d}\r\n"
retval += "number of anchors : {:d}\r\n"
retval = retval.format(arr[FIELD_SELF_ID + HDDR_LEN], arr[FIELD_MODE + HDDR_LEN], arr[FIELD_CHANNEL + HDDR_LEN], arr[FIELD_SAMPLES_PER_RANGE + HDDR_LEN], arr[FIELD_NUMBER_OF_ANCHORS + HDDR_LEN])
return retval
def read_config(ser):
packet = bytearray(3)
packet[0] = CMD_READ_CONFIG
packet[1] = 0x00
packet[2] = STOP_BYTE
if ser.is_open and ser.timeout != None:
written = ser.write(packet)
print("{:d} bytes written".format(written))
rx_hddr = ser.read(2) # read the header
if rx_hddr[0] == CMD_READ_CONFIG:
rx_body = ser.read(rx_hddr[1] + 1) # include the stop byte
rx_packet = rx_hddr + rx_body
print("read {:d} bytes from {:s}".format(len(rx_packet), ser.port))
print(rx_packet)
return rx_packet
else:
print("Port {:s} not ready yet".format(ser.port))
return bytearray()
def set_config(uwb_config, ser):
packet = bytearray(HDDR_LEN + CONFIG_FIELD_SIZE*NUM_FIELDS + 1)
packet[0] = CMD_SET_CONFIG
packet[1] = CONFIG_FIELD_SIZE*NUM_FIELDS
print(uwb_config.fields)
for i in range(0,NUM_FIELDS):
packet[HDDR_LEN + i] = uwb_config.fields[i]
packet[len(packet)-1] = STOP_BYTE
print(packet)
ser.write(packet)
print(ser.read(3))