forked from kirbybri/femb_udp
/
femb_udp_cmdline.py
215 lines (187 loc) · 7.42 KB
/
femb_udp_cmdline.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
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#!/usr/bin/env python33
import struct
import sys
import string
import socket
from socket import AF_INET, SOCK_DGRAM
class FEMB_UDP:
def write_reg(self, reg , data ):
regVal = int(reg)
if (regVal < 0) or (regVal > self.MAX_REG_NUM):
print "Error write_reg: Invalid register number"
return None
dataVal = int(data)
if (dataVal < 0) or (dataVal > self.MAX_REG_VAL):
print "Error write_reg: Invalid data value"
return None
#crazy packet structure require for UDP interface
dataValMSB = ((dataVal >> 16) & 0xFFFF)
dataValLSB = dataVal & 0xFFFF
WRITE_MESSAGE = struct.pack('HHHHHHHHH',socket.htons( self.KEY1 ), socket.htons( self.KEY2 ),socket.htons(regVal),socket.htons(dataValMSB),
socket.htons(dataValLSB),socket.htons( self.FOOTER ), 0x0, 0x0, 0x0 )
#send packet to board, don't do any checks
sock_write = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Internet, UDP
sock_write.setblocking(0)
sock_write.sendto(WRITE_MESSAGE,(self.UDP_IP, self.UDP_PORT_WREG ))
sock_write.close()
def write_reg_bits(self, reg , pos, mask, data ):
regVal = int(reg)
if (regVal < 0) or (regVal > self.MAX_REG_NUM):
print "Error write_reg_bits: Invalid register number"
return None
posVal = int(pos)
if (posVal < 0 ) or (posVal > 31):
print "Error write_reg_bits: Invalid register position"
return None
maskVal = int(mask)
if (maskVal < 0 ) or (maskVal > 31):
print "Error write_reg_bits: Invalid bit mask"
return None
dataVal = int(data)
if (dataVal < 0) or (dataVal > self.MAX_REG_VAL):
print "Error write_reg_bits: Invalid data value"
return None
if dataVal > maskVal :
print "Error write_reg_bits: Write value does not fit within mask"
return None
if (maskVal << posVal) > self.MAX_REG_VAL:
print "Error write_reg_bits: Write range exceeds register size"
return None
#get initial register value
initReg = self.read_reg( regVal )
initRegVal = int(initReg)
if (initRegVal < 0) or (initRegVal > self.MAX_REG_VAL):
print "Error write_reg_bits: Invalid initial register value"
return None
shiftVal = (dataVal & maskVal)
regMask = (maskVal << posVal)
newRegVal = ( (initRegVal & ~(regMask)) | (shiftVal << posVal) )
if (newRegVal < 0) or (newRegVal > self.MAX_REG_VAL):
print "Error write_reg_bits: Invalid new register value"
return None
#crazy packet structure require for UDP interface
dataValMSB = ((newRegVal >> 16) & 0xFFFF)
dataValLSB = newRegVal & 0xFFFF
WRITE_MESSAGE = struct.pack('HHHHHHHHH',socket.htons( self.KEY1 ), socket.htons( self.KEY2 ),socket.htons(regVal),socket.htons(dataValMSB),
socket.htons(dataValLSB),socket.htons( self.FOOTER ), 0x0, 0x0, 0x0 )
#send packet to board, don't do any checks
sock_write = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Internet, UDP
sock_write.setblocking(0)
sock_write.sendto(WRITE_MESSAGE,(self.UDP_IP, self.UDP_PORT_WREG ))
sock_write.close()
def read_reg(self, reg ):
regVal = int(reg)
if (regVal < 0) or (regVal > self.MAX_REG_NUM):
print "Error read_reg: Invalid register number"
return None
#set up listening socket, do before sending read request
sock_readresp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Internet, UDP
sock_readresp.bind(('', self.UDP_PORT_RREGRESP ))
sock_readresp.settimeout(2)
#crazy packet structure require for UDP interface
READ_MESSAGE = struct.pack('HHHHHHHHH',socket.htons(self.KEY1), socket.htons(self.KEY2),socket.htons(regVal),0,0,socket.htons(self.FOOTER),0,0,0)
sock_read = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Internet, UDP
sock_read.setblocking(0)
sock_read.sendto(READ_MESSAGE,(self.UDP_IP,self.UDP_PORT_RREG))
sock_read.close()
#try to receive response packet from board, store in hex
data = []
try:
data = sock_readresp.recv(4096)
except socket.timeout:
print "Error read_reg: No read packet received from board, quitting"
sock_readresp.close()
return -1
dataHex = data.encode('hex')
sock_readresp.close()
#extract register value from response
if int(dataHex[0:4],16) != regVal :
print "Error read_reg: Invalid response packet"
return None
dataHexVal = int(dataHex[4:12],16)
return dataHexVal
def get_data(self):
#set up listening socket
sock_data = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Internet, UDP
sock_data.bind(('',self.UDP_PORT_HSDATA))
sock_data.settimeout(2)
#receive data, don't pause if no response
data = []
try:
data = sock_data.recv(1024)
except socket.timeout:
print "Error get_data: No data packet received from board, quitting"
sock_data.close()
return []
#extract 496 data words from binary buffer, first 16 bytes are header
#dataNtuple = struct.unpack_from(">496H",data[16:])
dataNtuple = struct.unpack_from(">512H",data)
sock_data.close()
return dataNtuple[8:]
#return dataNtuple
def get_data_packets(self, val):
numVal = int(val)
if (numVal < 0) or (numVal > self.MAX_NUM_PACKETS):
print "Error record_hs_data: Invalid number of data packets requested"
return None
#set up listening socket
sock_data = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Internet, UDP
sock_data.bind(('',self.UDP_PORT_HSDATA))
sock_data.settimeout(2)
#write N data packets to file
rawdataPackets = []
for packet in range(0,numVal,1):
data = []
try:
data = sock_data.recv(1024)
except socket.timeout:
print "Error get_data_packets: No data packet received from board, quitting"
sock_data.close()
return []
rawdataPackets.append(data)
sock_data.close()
dataPackets = []
for rawdata in rawdataPackets:
data = struct.unpack_from(">512H",rawdata)
data = data[8:]
dataPackets.append(data)
return dataPackets
def record_binary_data(self, val):
numVal = int(val)
if (numVal < 0) or (numVal > self.MAX_NUM_PACKETS):
print "Error record_hs_data: Invalid number of data packets requested"
return None
#set up listening socket
sock_data = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Internet, UDP
sock_data.bind(('',self.UDP_PORT_HSDATA))
sock_data.settimeout(2)
#set up output file
FILE = open("testfile.dat","wb")
#write N data packets to file
for packet in range(0,numVal,1):
data = []
try:
data = sock_data.recv(1024)
except socket.timeout:
print "Error record_binary_data: No data packet received from board, quitting"
sock_data.close()
FILE.close()
return
#dataNtuple = struct.unpack_from(">512H",data)
#print dataNtuple[8:]
FILE.write(data)
FILE.close()
sock_data.close()
#__INIT__#
def __init__(self):
self.UDP_IP = "192.168.121.1"
self.KEY1 = 0xDEAD
self.KEY2 = 0xBEEF
self.FOOTER = 0xFFFF
self.UDP_PORT_WREG = 32000
self.UDP_PORT_RREG = 32001
self.UDP_PORT_RREGRESP = 32002
self.UDP_PORT_HSDATA = 32003
self.MAX_REG_NUM = 666
self.MAX_REG_VAL = 0xFFFFFFFF
self.MAX_NUM_PACKETS = 1000