source: ResearchApps/Measurement/examples/TxPower_vs_PER/warpnet_experiment_structs.py

Last change on this file was 1564, checked in by murphpo, 14 years ago
File size: 4.0 KB
Line 
1# WARPnet Client<->Server Architecture
2# WARPnet Parameter Definitions
3#
4# Author: Siddharth Gupta
5
6import struct, time
7from warpnet_common_params import *
8from warpnet_client_definitions import *
9from twisted.internet import reactor
10import binascii
11
12# Struct IDs
13
14STRUCTID_CONTROL = 0x13
15STRUCTID_CONTROL_ACK = 0x14
16STRUCTID_COMMAND = 0x17
17STRUCTID_COMMAND_ACK = 0x18
18STRUCTID_OBSERVE_PER = 0x26
19STRUCTID_OBSERVE_PER_REQ = 0x27
20
21# Command IDs
22COMMANDID_STARTTRIAL = 0x40
23COMMANDID_STOPTRIAL = 0x41
24COMMANDID_RESET_PER = 0x50
25
26########################
27## Struct Definitions ##
28########################
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.
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;
44class ControlStruct(ClientStruct):
45    txPower = -1
46    channel = -1
47    modOrderHeader = -1
48    modOrderPayload = -1
49    reserved = 0
50    packetGeneratorPeriod = 0
51    packetGeneratorLength = 0
52   
53    def __init__(self):
54        self.structID = STRUCTID_CONTROL
55        self.txPower = 63
56        self.channel = 4
57        self.modOrderHeader = 0
58        self.modOrderPayload = 2
59        self.packetGeneratorPeriod = 0
60        self.packetGeneratorLength = 1300
61        self.expectedReturnStructID = STRUCTID_CONTROL_ACK
62   
63    def prepToSend(self, nodeID):
64        self.updateDone = False
65        return struct.pack('!6BHII', self.structID, nodeID, self.txPower, self.channel, self.modOrderHeader, self.modOrderPayload, self.reserved, self.packetGeneratorPeriod, self.packetGeneratorLength)
66       
67    def updateFromNode(self, rawData, pcapts):
68        dataTuple = struct.unpack('!BBH', rawData[0:4])
69        #print "Control struct successfully applied at node %d" % dataTuple[1]
70
71
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;
81class CommandStruct(ClientStruct):
82    cmdID = -1
83    cmdParam = -1
84   
85    def __init__(self, cmdID, cmdParam):
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):
96        pass
97        #print "Successfully executed command %d" % self.cmdID
98
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;
111class 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)
121
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
Note: See TracBrowser for help on using the repository browser.