[1519] | 1 | # WARPnet Client<->Server Architecture |
---|
| 2 | # WARPnet Parameter Definitions |
---|
| 3 | # |
---|
| 4 | # Author: Siddharth Gupta |
---|
| 5 | |
---|
| 6 | import struct, time |
---|
[1564] | 7 | from warpnet_common_params import * |
---|
| 8 | from warpnet_client_definitions import * |
---|
[1519] | 9 | from twisted.internet import reactor |
---|
[1561] | 10 | import binascii |
---|
[1519] | 11 | |
---|
| 12 | # Struct IDs |
---|
| 13 | |
---|
| 14 | STRUCTID_CONTROL = 0x13 |
---|
| 15 | STRUCTID_CONTROL_ACK = 0x14 |
---|
| 16 | STRUCTID_COMMAND = 0x17 |
---|
| 17 | STRUCTID_COMMAND_ACK = 0x18 |
---|
[1561] | 18 | STRUCTID_OBSERVE_PER = 0x26 |
---|
| 19 | STRUCTID_OBSERVE_PER_REQ = 0x27 |
---|
| 20 | |
---|
[1519] | 21 | # Command IDs |
---|
| 22 | COMMANDID_STARTTRIAL = 0x40 |
---|
| 23 | COMMANDID_STOPTRIAL = 0x41 |
---|
[1561] | 24 | COMMANDID_RESET_PER = 0x50 |
---|
| 25 | |
---|
[1563] | 26 | ######################## |
---|
| 27 | ## Struct Definitions ## |
---|
| 28 | ######################## |
---|
[1519] | 29 | |
---|
| 30 | # ControlStruct is a ClientStruct that stores some basic parameters to pass to the WARP board. The local variable can be accessed |
---|
| 31 | # globally by calling ControlStruct.txPower etc. The struct must also understand the conversion from integer values to binary |
---|
| 32 | # using the prepToSend function; it will be provided with the nodeID. |
---|
[1563] | 33 | # typedef struct { |
---|
| 34 | # char structID; |
---|
| 35 | # char nodeID; |
---|
| 36 | # char txPower; |
---|
| 37 | # char channel; |
---|
| 38 | # char modOrderHeader; |
---|
| 39 | # char modOrderPayload; |
---|
| 40 | # short reserved; |
---|
| 41 | # int pktGen_period; |
---|
| 42 | # int pktGen_length; |
---|
| 43 | # } warpnetControl; |
---|
[1561] | 44 | class ControlStruct(ClientStruct): |
---|
[1519] | 45 | txPower = -1 |
---|
| 46 | channel = -1 |
---|
| 47 | modOrderHeader = -1 |
---|
| 48 | modOrderPayload = -1 |
---|
| 49 | reserved = 0 |
---|
[1561] | 50 | packetGeneratorPeriod = 0 |
---|
| 51 | packetGeneratorLength = 0 |
---|
[1519] | 52 | |
---|
[1561] | 53 | def __init__(self): |
---|
[1519] | 54 | self.structID = STRUCTID_CONTROL |
---|
| 55 | self.txPower = 63 |
---|
| 56 | self.channel = 4 |
---|
| 57 | self.modOrderHeader = 0 |
---|
| 58 | self.modOrderPayload = 2 |
---|
[1561] | 59 | self.packetGeneratorPeriod = 0 |
---|
| 60 | self.packetGeneratorLength = 1300 |
---|
| 61 | self.expectedReturnStructID = STRUCTID_CONTROL_ACK |
---|
[1519] | 62 | |
---|
| 63 | def prepToSend(self, nodeID): |
---|
| 64 | self.updateDone = False |
---|
[1561] | 65 | return struct.pack('!6BHII', self.structID, nodeID, self.txPower, self.channel, self.modOrderHeader, self.modOrderPayload, self.reserved, self.packetGeneratorPeriod, self.packetGeneratorLength) |
---|
[1519] | 66 | |
---|
| 67 | def updateFromNode(self, rawData, pcapts): |
---|
| 68 | dataTuple = struct.unpack('!BBH', rawData[0:4]) |
---|
[1561] | 69 | #print "Control struct successfully applied at node %d" % dataTuple[1] |
---|
[1519] | 70 | |
---|
| 71 | |
---|
[1563] | 72 | #CommandStruct is used to send commands or requests to the WARP nodes |
---|
| 73 | # The cmdIDs are defined above |
---|
| 74 | # Matching C code definition: |
---|
| 75 | # typedef struct { |
---|
| 76 | # char structID; |
---|
| 77 | # char nodeID; |
---|
| 78 | # char cmdID; |
---|
| 79 | # char cmdParam; |
---|
| 80 | # } warpnetCommand; |
---|
[1519] | 81 | class CommandStruct(ClientStruct): |
---|
| 82 | cmdID = -1 |
---|
| 83 | cmdParam = -1 |
---|
| 84 | |
---|
[1561] | 85 | def __init__(self, cmdID, cmdParam): |
---|
[1519] | 86 | self.structID = STRUCTID_COMMAND |
---|
| 87 | self.expectedReturnStructID = STRUCTID_COMMAND_ACK |
---|
| 88 | self.cmdID = cmdID |
---|
| 89 | self.cmdParam = cmdParam |
---|
| 90 | |
---|
| 91 | def prepToSend(self, nodeID): |
---|
| 92 | self.updateDone = False |
---|
| 93 | return struct.pack('!4B', self.structID, nodeID, self.cmdID, self.cmdParam) |
---|
| 94 | |
---|
| 95 | def updateFromNode(self, rawData, pcapts): |
---|
[1561] | 96 | pass |
---|
| 97 | #print "Successfully executed command %d" % self.cmdID |
---|
[1519] | 98 | |
---|
[1563] | 99 | #ObservePERStruct collects packet error rate (PER) data from WARP nodes |
---|
| 100 | # Matching C code definition: |
---|
| 101 | # typedef struct { |
---|
| 102 | # unsigned char structID; |
---|
| 103 | # unsigned char nodeID; |
---|
| 104 | # unsigned char reqNum; |
---|
| 105 | # unsigned char reqType; |
---|
| 106 | # unsigned int numPkts_tx; |
---|
| 107 | # unsigned int numPkts_rx_good; |
---|
| 108 | # unsigned int numPkts_rx_goodHdrBadPyld; |
---|
| 109 | # unsigned int numPkts_rx_badHdr; |
---|
| 110 | # } warpnetObservePER; |
---|
[1561] | 111 | class ObservePERStruct(ClientStruct): |
---|
| 112 | numPkts_tx = -1 |
---|
| 113 | numPkts_rx_good = -1 |
---|
| 114 | numPkts_rx_goodHdrBadPyld = -1 |
---|
| 115 | numPkts_rx_badHdr = -1 |
---|
| 116 | reqNum = -1 |
---|
| 117 | reqType = -1 |
---|
| 118 | |
---|
| 119 | def __init__(self, logger=None): |
---|
| 120 | ClientStruct.__init__(self, logger) |
---|
[1519] | 121 | |
---|
[1561] | 122 | self.structID = STRUCTID_OBSERVE_PER_REQ |
---|
| 123 | self.expectedReturnStructID = STRUCTID_OBSERVE_PER |
---|
| 124 | |
---|
| 125 | self.numPkts_tx = 0 |
---|
| 126 | self.numPkts_rx_good = 0 |
---|
| 127 | self.numPkts_rx_goodHdrBadPyld = 0 |
---|
| 128 | self.numPkts_rx_badHdr = 0 |
---|
| 129 | self.reqNum = 0 |
---|
| 130 | self.reqType = 0 |
---|
| 131 | |
---|
| 132 | def prepToSend(self, nodeID): |
---|
| 133 | self.updateDone = False |
---|
| 134 | return struct.pack('!4B', self.structID, nodeID, self.reqNum, self.reqType) |
---|
| 135 | |
---|
| 136 | def updateFromNode(self, rawData, pcapts): |
---|
| 137 | dataTuple = struct.unpack('!2B 2B 4I', rawData[0:20]) |
---|
| 138 | self.reqNum = dataTuple[2] |
---|
| 139 | self.reqType = dataTuple[3] |
---|
| 140 | self.numPkts_tx = dataTuple[4] |
---|
| 141 | self.numPkts_rx_good = dataTuple[5] |
---|
| 142 | self.numPkts_rx_goodHdrBadPyld = dataTuple[6] |
---|
| 143 | self.numPkts_rx_badHdr = dataTuple[7] |
---|
| 144 | |
---|