commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] gnuradio-examples/python/networking measurement...


From: Eric Blossom
Subject: [Commit-gnuradio] gnuradio-examples/python/networking measurement...
Date: Thu, 22 Jun 2006 19:55:15 +0000

CVSROOT:        /sources/gnuradio
Module name:    gnuradio-examples
Changes by:     Eric Blossom <eb>       06/06/22 19:55:15

Modified files:
        python/networking: measurement_slave.py 

Log message:
        work-in-progress

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnuradio-examples/python/networking/measurement_slave.py?cvsroot=gnuradio&r1=1.1&r2=1.2

Patches:
Index: measurement_slave.py
===================================================================
RCS file: 
/sources/gnuradio/gnuradio-examples/python/networking/measurement_slave.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- measurement_slave.py        22 Jun 2006 00:18:51 -0000      1.1
+++ measurement_slave.py        22 Jun 2006 19:55:15 -0000      1.2
@@ -35,6 +35,7 @@
 
 PKT_HEADER_SIZE = 4      # 32-bit int
 
+logfile = None
 
 def unpack_header(s):
     (len,) = struct.unpack('!i', s)
@@ -44,8 +45,8 @@
     return struct.pack('!i', len)
 
 
-class listener(asyncore.dispatcher):
-    def __init__(self, port=CONTROL_PORT, verbose=False):
+class control_port_listener(asyncore.dispatcher):
+    def __init__(self, port=CONTROL_PORT, udp_socket=None, verbose=False):
         """
         @param port: TCP port to listen on.
         @type port: int
@@ -72,8 +73,7 @@
         print "handle_accept:", addr
         if not(socket is None):
             # instantiate a server
-            # FIXME check for multiple connects.
-            s = server(socket, addr, self._verbose)
+            s = control_server(socket, addr, udp_socket, self._verbose)
         
 
 class gr_dispatcher(asyncore.dispatcher):
@@ -91,7 +91,7 @@
         (payload_len,) = unpack_header(s)
 
         payload_len = int(payload_len)
-        print "payload_len =", payload_len
+        #print "payload_len =", payload_len
         
         if payload_len == 0:
             payload = ''
@@ -114,8 +114,35 @@
         return result
 
 
-class server(gr_dispatcher):
-    def __init__(self, socket, addr, verbose=False):
+class udp_listener(asyncore.dispatcher):
+    """
+    Listens for datatrams on UDP broadcast socket.
+    Writes note to log file for each packet received.
+    """
+    def __init__(self, udp_socket):
+        asyncore.dispatcher.__init__(self, sock=udp_socket)
+        
+    def writable(self):
+        return False
+
+    def handle_read(self):
+        pkt, sender = self.recvfrom(10000)
+        if pkt:
+            if len(pkt > 2):
+                t = struct.unpack('!H', pkt[0:2])
+                seqno = t[0]
+            else:
+                seqno = -1
+                
+            logfile.write('RCVD seqno %4d len %4d from %s\n' % (seqno, 
len(pkt), sender))
+            logfile.flush()
+
+    def handle_close(self):
+        self.close()
+
+
+class control_server(gr_dispatcher):
+    def __init__(self, socket, addr, udp_socket, verbose=False):
         gr_dispatcher.__init__(self, sock=socket)
         
         self.verbose = verbose
@@ -127,23 +154,85 @@
     def handle_read(self):
         pkt = self.read_packet()
         if pkt:
-            print "Control: %s\n" % (pkt,)
+            annotate = 'ANNOTATE'
+            if pkt.startswith(annotate):
+                logfile.write(pkt[len(annotate):])
+                logfile.write('\n')
+                logfile.flush()
+            if pkt.startswith('SEND'):
+                tokens = pkt.split()
+                if len(tokens) < 4:
+                    invalid_packet(pkt)
+                else:
+                    npkts = int(tokens[1])
+                    size = int(tokens[2])
+                    power = float(tokens[3])
+                    send_test_packets(udp_socket, npkts, size, power)
+            else:
+                invalid_packet(pkt)
 
     def handle_close(self):
         self.close()
 
 
+def invalid_packet(pkt):
+    sys.stderr.write('received unrecognized packet: %s\n' % (pkt,))
+
+
+def make_random_payload(self, size):
+    p = [0] * size
+    if 1:
+        for i in range(size):
+            p[i] = chr(random.randint(0, 255))
+    else:
+        for i in range(size):
+            p[i] = chr(i % 256)
+    return ''.join(p)
+
+
+def send_test_packets(udp_socket, npkts, size, power):
+    # we ignore power for now...
+    size = max(2, size)
+    payload = make_random_payload(size - 2)
+    for n in range(npkts):
+        pkt = struct.pack('!H', n) + payload
+        r = udp_socket.sendall(pkt)
+        if r != len(pkt):
+            sys.stderr.write('Short write on sendall: request = %d, actual = 
%d\n' % (len(pkt), r))
+
+
+def open_udp_broadcast_socket(gr0_host_ip, port):
+    s  = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    s.bind((gr0_host_ip, port))
+    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
+    s.connect((BROADCAST_ADDR, port))
+    return s
+
+
 def main():
-    parser = optparse.OptionParser (option_class=eng_option)
-    parser.add_option ('-v', '--verbose', action="store_true", default=False,
+    global logfile
+    
+    usage = 'usage: %prog [options] gr0-ip-addr'
+    parser = optparse.OptionParser (option_class=eng_option, usage=usage)
+    parser.add_option('-l', '--logfile', type='string', default=None,
+                      help="specify log file name [default=<stdout>]")
+    parser.add_option('-v', '--verbose', action="store_true", default=False,
                        help="enable verbose diagnostics")
 
     (options, args) = parser.parse_args ()
-    if len(args) != 0:
+    if len(args) != 1:
         parser.print_help()
         sys.exit(1)
 
-    L = listener(CONTROL_PORT, verbose=options.verbose)
+    gr0_ip_addr = args[0]
+    if options.logfile is None:
+        logfile = sys.stdout
+    else:
+        logfile = file(options.logfile, 'w')
+
+    udp_socket = open_udp_broadcast_socket(gr0_ip_addr, BROADCAST_PORT)
+    U = udp_listener(udp_socket)
+    L = control_port_listener(CONTROL_PORT, udp_socket=udp_socket, 
verbose=options.verbose)
     asyncore.loop(LOOP_TIMEOUT)
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]