source: ResearchApps/Measurement/warpnet_coprocessors/phy_logger/examples/warpnet_experiment_structs.py

Last change on this file was 1606, checked in by murphpo, 14 years ago
File size: 15.0 KB
Line 
1# WARPnet Client<->Server Architecture
2# WARPnet Parameter Definitions
3#
4# Author: Siddharth Gupta
5
6import struct, time
7from warpnet_framework.warpnet_common_params import *
8from warpnet_framework.warpnet_client_definitions import *
9from twisted.internet import reactor
10import binascii
11
12RETRANSMIT_COUNT = 10 # Max retries to send the data struct
13WAIT_TIME = 10 # Time to wait before resending data structs
14FILE_REFRESH_TIME = 60 # In seconds, time to wait between file reopens
15
16# Struct IDs
17
18STRUCTID_CONTROL = 0x13
19STRUCTID_CONTROL_ACK = 0x14
20STRUCTID_OBSERVE_REQUEST = 0x15
21STRUCTID_OBSERVE = 0x16
22STRUCTID_COMMAND = 0x17
23STRUCTID_COMMAND_ACK = 0x18
24STRUCTID_RTOBSERVE_REQUEST = 0x1A
25STRUCTID_RTOBSERVE = 0x1B
26
27STRUCTID_CFO = 0x20
28
29STRUCTID_PHYCTRL = 0x22
30STRUCTID_PHYCTRL_ACK = 0x23
31
32STRUCTID_OBSERVE_BER = 0x24
33STRUCTID_OBSERVE_BER_REQ = 0x25
34
35STRUCTID_OBSERVE_COOPBER = 0x28
36STRUCTID_OBSERVE_COOPBER_REQ = 0x29
37
38STRUCTID_OBSERVE_PER = 0x26
39STRUCTID_OBSERVE_PER_REQ = 0x27
40
41STRUCTID_RAW_PKT = 0x30
42
43STRUCTID_LOGPARAMS =    0x32
44STRUCTID_LOGPARAMS_ACK = 0x33
45
46# Command IDs
47COMMANDID_STARTTRIAL = 0x40
48COMMANDID_STOPTRIAL = 0x41
49COMMANDID_RELAYSTATE = 0x42
50COMMANDID_PKTGEN = 0x46
51
52COMMANDID_RESET_PER = 0x50
53
54# Command Params
55COMMANDPARAM_RELAYOFF = 0x43
56COMMANDPARAM_RELAYAF = 0x44
57COMMANDPARAM_RELAYDF = 0x45
58COMMANDPARAM_PKTGEN_ENABLE = 0x47
59COMMANDPARAM_PKTGEN_DISABLE = 0x48
60
61PKTTYPE_NCDATA = 0x00
62PKTTYPE_NCMHOPDATA = 0xA2
63PKTTYPE_DFDATA = 0xEE
64PKTTYPE_AFDATA = 0x55
65PKTTYPE_AFGHDATA = 0xC3
66PKTTYPE_DFGHDATA = 0x3C
67PKTTYPE_INVALID = 0x88
68
69PHYCTRL_BER_EN =        0x1
70PHYCTRL_CFO_EN =        0x2
71PHYCTRL_PHYDUMP_EN =    0x4
72PHYTRCL_EXTPKTDET_EN =  0x8
73PHYCTRL_COOP_EN =       0x10
74PHYCTRL_CFO_CORR_EN =   0x20
75PHYCTRL_SWAP_ANT =      0x40
76
77PHYCTRL_TX_NC =     0x01
78PHYCTRL_TX_DF =     0x02
79PHYCTRL_TX_AF =     0x04
80PHYCTRL_TX_AFGH =   0x08
81PHYCTRL_TX_DFGH =   0x10
82PHYCTRL_TX_NCMHOP = 0x20
83
84class MyDataLogger(DataCollector):
85   
86    def __init__(self, filename):
87        self.filename = filename
88        self.logFile = open(self.filename, 'w')
89       
90    def log(self, dataToLog):
91        self.logFile.write(dataToLog)
92        self.logFile.flush()
93       
94    def closeFile(self):
95        self.logFile.close()
96
97# Struct Definitions
98
99
100# ControlStruct is a ClientStruct that stores some basic parameters to pass to the WARP board. The local variable can be accessed
101# globally by calling ControlStruct.txPower etc. The struct must also understand the conversion from integer values to binary
102# using the prepToSend function; it will be provided with the nodeID.
103class ControlStruct(ClientStruct):
104    txPower = -1
105    channel = -1
106    modOrderHeader = -1
107    modOrderPayload = -1
108    reserved = 0
109    packetGeneratorPeriod = 0
110    packetGeneratorLength = 0
111   
112    def __init__(self):
113        self.structID = STRUCTID_CONTROL
114        self.txPower = 63
115        self.channel = 4
116        self.modOrderHeader = 0
117        self.modOrderPayload = 2
118        self.packetGeneratorPeriod = 0
119        self.packetGeneratorLength = 1300
120        self.expectedReturnStructID = STRUCTID_CONTROL_ACK
121   
122    def prepToSend(self, nodeID):
123        self.updateDone = False
124        return struct.pack('!6BHII', self.structID, nodeID, self.txPower, self.channel, self.modOrderHeader, self.modOrderPayload, self.reserved, self.packetGeneratorPeriod, self.packetGeneratorLength)
125       
126    def updateFromNode(self, rawData, pcapts):
127        dataTuple = struct.unpack('!BBH', rawData[0:4])
128        #print "Control struct successfully applied at node %d" % dataTuple[1]
129
130
131# CommandStruct is a Client struct to send commands or request data from the WARP board. The cmdIDs are defined in warpnet_params.py
132class CommandStruct(ClientStruct):
133    cmdID = -1
134    cmdParam = -1
135   
136    def __init__(self, cmdID, cmdParam):
137        self.structID = STRUCTID_COMMAND
138        self.expectedReturnStructID = STRUCTID_COMMAND_ACK
139        self.cmdID = cmdID
140        self.cmdParam = cmdParam
141   
142    def prepToSend(self, nodeID):
143        self.updateDone = False
144        return struct.pack('!4B', self.structID, nodeID, self.cmdID, self.cmdParam)
145   
146    def updateFromNode(self, rawData, pcapts):
147        pass
148        #print "Successfully executed command %d" % self.cmdID
149
150
151# BER struct that is filled in by the node
152class ObserveStruct(ClientStruct):
153    sourceNode = -1
154    numDataTx = -1
155    numNACKTx = -1
156    numDataRx = -1
157    numNACKRx = -1
158    numBadHeaderRx = -1
159    sumGain = -1
160    sumRSSI = -1
161    packetCountRx = -1
162   
163    def __init__(self, sourceNode, logger=None):
164        ClientStruct.__init__(self, logger)
165        self.structID = STRUCTID_OBSERVE_REQUEST
166        self.expectedReturnStructID = STRUCTID_OBSERVE
167        self.sourceNode = sourceNode
168
169        self.logData("structID=%d, nodeID, cmdID, numDataTx, numNACKTx, numDataRx, numNACKRx, numBadHeaderRx, sumGain, sumRSSI, packetCountRx, trialDuration, time\r\n" % STRUCTID_OBSERVE_REQUEST)
170       
171    def prepToSend(self, nodeID):
172        self.updateDone = False
173        return struct.pack('!BBH', self.structID, nodeID, self.sourceNode)
174       
175    def updateFromNode(self, rawData, pcapts):
176        dataTuple = struct.unpack('!2BH9I', rawData[0:40])
177       
178        self.logData("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\r\n" % (dataTuple[0], dataTuple[1], dataTuple[2], dataTuple[3], dataTuple[4], dataTuple[5], dataTuple[6], dataTuple[7], dataTuple[8], dataTuple[9], dataTuple[10], dataTuple[11], time.time()))
179
180
181class RTObserveStruct(ClientStruct):
182    sequenceNumber = -1
183    pktType = -1
184    srcNode = -1
185    dstNode = -1
186    relayNode = -1
187    state = -1
188    rssi = -1
189    gain = -1
190    timestamp = -1
191   
192    def __init__(self, logger=None):
193        ClientStruct.__init__(self, logger)
194        self.structID = STRUCTID_RTOBSERVE_REQUEST
195        self.expectedReturnStructID = STRUCTID_RTOBSERVE
196       
197        self.logData("sequenceNumber, pktType, srcNode, dstNode, relayNode, state, RSSI, gain, timestamp\r\n")
198   
199    def prepToSend(self, nodeID):
200        self.updateDone = False
201        return struct.pack('!BBH', self.structID, nodeID, 0)
202   
203    def updateFromNode(self, rawData, pcapts):
204        dataTuple = struct.unpack('!2BH6B2HI', rawData[0:18])
205        self.logData("%d, %d, %d, %d, %d, %d, %d, %d, %d\r\n" % (dataTuple[2], dataTuple[3], dataTuple[4], dataTuple[5], dataTuple[6], dataTuple[7], dataTuple[9], dataTuple[10], dataTuple[11]))
206
207
208class CFOStruct(ClientStruct):
209    atten = 0
210    pktLen = 0
211    minMag = 0
212   
213    def __init__(self, logger=None):
214        ClientStruct.__init__(self, logger)
215
216        self.structID = STRUCTID_CFO #Dangerous to reuse structID only if there's another controller
217        self.expectedReturnStructID = STRUCTID_CFO
218
219        self.logData("nodeID, seqNum, cfo_c, cfo_p, cfo_b, txCFO, pktStatus, atten, pktLen, minMag, pcap timestamp\r\n")
220        self.atten = 0
221        self.pktLen = 0
222        self.minMag = 0
223   
224    def prepToSend(self, nodeID):
225        self.updateDone = False
226        return struct.pack('!BBH', self.structID, nodeID, 0)
227   
228    def updateFromNode(self, rawData, pcapts):
229        dataTuple = struct.unpack('!2B H 5i', rawData[0:24])
230        self.logData("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %s\r\n" % (dataTuple[1], dataTuple[2], dataTuple[3], dataTuple[4], dataTuple[5], dataTuple[6], dataTuple[7], self.atten, self.pktLen, self.minMag, pcapts))
231
232class PHYctrlStruct(ClientStruct):
233    param0 = 0
234    param1 = 0
235    param2 = 0
236    param3 = 0
237    param4 = 0
238    param5 = 0
239    param6 = 0
240    param7 = 0
241    param8 = 0
242    param9 = 0
243   
244    def __init__(self, logger=None):
245        ClientStruct.__init__(self, logger)
246
247        self.structID = STRUCTID_PHYCTRL
248        self.expectedReturnStructID = STRUCTID_PHYCTRL_ACK
249        self.param0 = 0 #short - Enable CFO correction
250        self.param1 = 0 #int -   Tx CFO Freq
251        self.param2 = 0 #int
252        self.param3 = 0 #int
253        self.param4 = 0 #int
254        self.param5 = 0 #int
255        self.param6 = 0 #int
256        self.param7 = 0 #int
257        self.param8 = 0 #int
258        self.param9 = 0 #int
259   
260    def prepToSend(self, nodeID):
261        self.updateDone = False
262        #was type "i", but Python complained when MSB of argument was 1...
263        return struct.pack('!BBH9I', self.structID, nodeID, self.param0, self.param1, self.param2, self.param3, self.param4, self.param5, self.param6, self.param7, self.param8, self.param9)
264
265class ObserveBERStruct(ClientStruct):
266#0  unsigned char structID;
267#1  unsigned char nodeID;
268#2  unsigned short sequenceNumber;
269#3  unsigned char nodeID_tx;
270#4  unsigned char nodeID_rx;
271#5  unsigned short mac_seqNum;
272#6  unsigned int bits_rx;
273#7  unsigned int bits_errors;
274
275    totalBitsReceived = 0
276    totalBitErrors = 0
277    nodeID_tx = -1
278    nodeID_rx = -1
279   
280    def __init__(self, logger=None):
281        ClientStruct.__init__(self, logger)
282
283        self.structID = STRUCTID_OBSERVE_BER_REQ
284        self.expectedReturnStructID = STRUCTID_OBSERVE_BER
285
286        self.totalBitsReceived = 0
287        self.totalBitErrors = 0
288       
289    def prepToSend(self, nodeID):
290        self.updateDone = False
291        return struct.pack('!BBH', self.structID, nodeID, 0)
292   
293    def updateFromNode(self, rawData, pcapts):
294        dataTuple = struct.unpack('!2B H 2B H 2I', rawData[0:16])
295        self.nodeID_tx = dataTuple[3]
296        self.nodeID_rx = dataTuple[4]
297        self.totalBitsReceived += dataTuple[6]
298        self.totalBitErrors += dataTuple[7]
299   
300    def clearBitCounts(self):
301        self.totalBitsReceived = 0
302        self.totalBitErrors = 0
303
304class ObserveCoopBERStruct(ClientStruct):
305#0  unsigned char structID;
306#1  unsigned char nodeID;
307#2  unsigned short sequenceNumber;
308#3  unsigned char nodeID_tx;
309#4  unsigned char nodeID_rx;
310#5  unsigned short mac_seqNum;
311#6  unsigned char mac_pktType;
312#7  unsigned char reserved0;
313#8  unsigned char reserved1;
314#9  unsigned char reserved2;
315#10 unsigned int bits_rx;
316#11 unsigned int bits_errors;
317    nodeID_tx = -1
318    nodeID_rx = -1
319
320    totalBitsReceived_NC = 0
321    totalBitsReceived_AF = 0
322    totalBitsReceived_AFGH = 0
323    totalBitsReceived_DF = 0
324    totalBitsReceived_DFGH = 0
325    totalBitsReceived_NCMHOP = 0
326
327    totalBitErrors_NC = 0
328    totalBitErrors_AF = 0
329    totalBitErrors_AFGH = 0
330    totalBitErrors_DF = 0
331    totalBitErrors_DFGH = 0
332    totalBitErrors_NCMHOP = 0
333
334    totalBitsReceived_AF_noNC = 0
335    totalBitsReceived_AFGH_noNC = 0
336    totalBitsReceived_DF_noNC = 0
337    totalBitsReceived_DFGH_noNC = 0
338
339    totalBitErrors_AF_noNC = 0
340    totalBitErrors_AFGH_noNC = 0
341    totalBitErrors_DF_noNC = 0
342    totalBitErrors_DFGH_noNC = 0
343
344    lastSeqNum_NC = -1;
345   
346    def __init__(self, logger=None):
347        ClientStruct.__init__(self, logger)
348
349        self.structID = STRUCTID_OBSERVE_COOPBER_REQ
350        self.expectedReturnStructID = STRUCTID_OBSERVE_COOPBER
351
352        self.totalBitsReceived_NC = 0
353        self.totalBitsReceived_AF = 0
354        self.totalBitsReceived_AFGH = 0
355        self.totalBitsReceived_DF = 0
356        self.totalBitsReceived_DFGH = 0
357        self.totalBitsReceived_NCMHOP = 0
358
359        self.totalBitErrors_NC = 0
360        self.totalBitErrors_AF = 0
361        self.totalBitErrors_AFGH = 0
362        self.totalBitErrors_DF = 0
363        self.totalBitErrors_DFGH = 0
364        self.totalBitErrors_NCMHOP = 0
365
366        self.totalBitsReceived_AF_noNC = 0
367        self.totalBitsReceived_AFGH_noNC = 0
368        self.totalBitsReceived_DF_noNC = 0
369        self.totalBitsReceived_DFGH_noNC = 0
370
371        self.totalBitErrors_AF_noNC = 0
372        self.totalBitErrors_AFGH_noNC = 0
373        self.totalBitErrors_DF_noNC = 0
374        self.totalBitErrors_DFGH_noNC = 0
375       
376        self.lastSeqNum_NC = -1;
377
378    def prepToSend(self, nodeID):
379        self.updateDone = False
380        return struct.pack('!BBH', self.structID, nodeID, 0)
381   
382    def updateFromNode(self, rawData, pcapts):
383        dataTuple = struct.unpack('!2B H 2B H 4B 2I', rawData[0:20])
384        self.nodeID_tx = dataTuple[3]
385        self.nodeID_rx = dataTuple[4]
386        self.coopPktType = dataTuple[6]
387
388        if(dataTuple[6] == PKTTYPE_NCDATA):
389            self.totalBitsReceived_NC += dataTuple[10]
390            self.totalBitErrors_NC += dataTuple[11]
391            self.lastSeqNum_NC = dataTuple[5]
392
393        elif(dataTuple[6] == PKTTYPE_AFDATA):
394            self.totalBitsReceived_AF += dataTuple[10]
395            self.totalBitErrors_AF += dataTuple[11]
396
397            if(self.lastSeqNum_NC != dataTuple[5]):
398                self.totalBitsReceived_AF_noNC += dataTuple[10]
399                self.totalBitErrors_AF_noNC += dataTuple[11]
400
401        elif(dataTuple[6] == PKTTYPE_AFGHDATA):
402            self.totalBitsReceived_AFGH += dataTuple[10]
403            self.totalBitErrors_AFGH += dataTuple[11]
404
405            if(self.lastSeqNum_NC != dataTuple[5]):
406                self.totalBitsReceived_AFGH_noNC += dataTuple[10]
407                self.totalBitErrors_AFGH_noNC += dataTuple[11]
408
409        elif(dataTuple[6] == PKTTYPE_DFDATA):
410            self.totalBitsReceived_DF += dataTuple[10]
411            self.totalBitErrors_DF += dataTuple[11]
412
413            if(self.lastSeqNum_NC != dataTuple[5]):
414                self.totalBitsReceived_DF_noNC += dataTuple[10]
415                self.totalBitErrors_DF_noNC += dataTuple[11]
416
417        elif(dataTuple[6] == PKTTYPE_DFGHDATA):
418            self.totalBitsReceived_DFGH += dataTuple[10]
419            self.totalBitErrors_DFGH += dataTuple[11]
420
421            if(self.lastSeqNum_NC != dataTuple[5]):
422                self.totalBitsReceived_DFGH_noNC += dataTuple[10]
423                self.totalBitErrors_DFGH_noNC += dataTuple[11]
424
425        elif(dataTuple[6] == PKTTYPE_NCMHOPDATA):
426            self.totalBitsReceived_NCMHOP += dataTuple[10]
427            self.totalBitErrors_NCMHOP += dataTuple[11]
428
429        else:
430            print("ObserveCoopBERStruct::updateFromNode: Unknown pktType=%d" % dataTuple[6])
431
432    def clearBitCounts(self):
433        self.totalBitsReceived_NC = 0
434        self.totalBitsReceived_AF = 0
435        self.totalBitsReceived_AFGH = 0
436        self.totalBitsReceived_DF = 0
437        self.totalBitsReceived_DFGH = 0
438        self.totalBitsReceived_NCMHOP = 0
439
440        self.totalBitErrors_NC = 0
441        self.totalBitErrors_AF = 0
442        self.totalBitErrors_AFGH = 0
443        self.totalBitErrors_DF = 0
444        self.totalBitErrors_DFGH = 0
445        self.totalBitErrors_NCMHOP = 0
446
447        self.totalBitsReceived_AF_noNC = 0
448        self.totalBitsReceived_AFGH_noNC = 0
449        self.totalBitsReceived_DF_noNC = 0
450        self.totalBitsReceived_DFGH_noNC = 0
451
452        self.totalBitErrors_AF_noNC = 0
453        self.totalBitErrors_AFGH_noNC = 0
454        self.totalBitErrors_DF_noNC = 0
455        self.totalBitErrors_DFGH_noNC = 0
456       
457        self.lastSeqNum_NC = -1;
458       
459class ObservePERStruct(ClientStruct):
460    #typedef struct {
461    #   unsigned char structID;
462    #   unsigned char nodeID;
463    #   unsigned char reqNum;
464    #   unsigned char reqType;
465    #   unsigned int numPkts_tx;
466    #   unsigned int numPkts_rx_good;
467    #   unsigned int numPkts_rx_goodHdrBadPyld;
468    #   unsigned int numPkts_rx_badHdr;
469    #} warpnetObservePER;
470    numPkts_tx = -1
471    numPkts_rx_good = -1
472    numPkts_rx_goodHdrBadPyld = -1
473    numPkts_rx_badHdr = -1
474    reqNum = -1
475    reqType = -1
476   
477    def __init__(self, logger=None):
478        ClientStruct.__init__(self, logger)
479
480        self.structID = STRUCTID_OBSERVE_PER_REQ
481        self.expectedReturnStructID = STRUCTID_OBSERVE_PER
482
483        self.numPkts_tx = 0
484        self.numPkts_rx_good = 0
485        self.numPkts_rx_goodHdrBadPyld = 0
486        self.numPkts_rx_badHdr = 0
487        self.reqNum = 0
488        self.reqType = 0
489       
490    def prepToSend(self, nodeID):
491        self.updateDone = False
492        return struct.pack('!4B', self.structID, nodeID, self.reqNum, self.reqType)
493   
494    def updateFromNode(self, rawData, pcapts):
495        dataTuple = struct.unpack('!2B 2B 4I', rawData[0:20])
496        self.reqNum = dataTuple[2]
497        self.reqType = dataTuple[3]
498        self.numPkts_tx = dataTuple[4]
499        self.numPkts_rx_good = dataTuple[5]
500        self.numPkts_rx_goodHdrBadPyld = dataTuple[6]
501        self.numPkts_rx_badHdr = dataTuple[7]
502
503class LogParams(ClientStruct):
504#typedef struct {
505#   unsigned char structID;
506#   unsigned char nodeID;
507#
508#   unsigned short fileSuffix;
509#   
510#   unsigned int param0;
511#   unsigned int param1;
512#   unsigned int param2;
513#   unsigned int param3;
514#} warpnetLogParams;   
515    fileSuffix = 0
516    param0 = 0
517    param1 = 0
518    param2 = 0
519    param3 = 0
520   
521    def __init__(self, logger=None):
522        ClientStruct.__init__(self, logger)
523
524        self.structID = STRUCTID_LOGPARAMS
525        self.expectedReturnStructID = STRUCTID_LOGPARAMS_ACK
526        self.fileSuffix = 0
527        self.param0 = 0 #int
528        self.param1 = 0 #int
529        self.param2 = 0 #int
530        self.param3 = 0 #int
531   
532    def prepToSend(self, nodeID):
533        self.updateDone = False
534        #was type "i", but Python complained when MSB of argument was 1...
535        return struct.pack('!BBH4I', self.structID, nodeID, self.fileSuffix, self.param0, self.param1, self.param2, self.param3)
536
537    def updateFromNode(self, rawData, pcapts):
538        pass
Note: See TracBrowser for help on using the repository browser.