Project

General

Profile

Revision 918

Added by Tudor Achim over 15 years ago

python stuff

View differences:

trunk/code/projects/mapping/python/map.py
1
#!/usr/bin/env python
2

  
3
from scipy import linalg, array
4
from gtk import *
5
from socket import *
6
from struct import *
7
import gobject
8
import sys, pickle, pygtk, gtk, string, cairo, gobject, math, weakref
9
from random import random
10

  
11
#mine
12
from model import model
13

  
14
pi = 3.1415927
15

  
16
#endmine
17

  
18
class map_model(model):
19
    def __init__(self):
20
        self.eqn = []
21

  
22
    def __setattr__(self,name,value):
23
        self.__dict__[name] = value
24
        self.changed()
25

  
26
    def add_eqn(self, eqn):
27
        self.eqn = [eqn] + self.eqn
28

  
29
hostname = 'localhost'
30

  
31
class Screen(gtk.DrawingArea):
32
    __gsignals__ = { "expose-event" : "override" }
33
    
34
    def __init__ (self, socket):
35
        gtk.DrawingArea.__init__(self)
36

  
37
        self.xres, self.yres = (800,800)
38

  
39
        self.set_size_request(self.xres, self.yres)
40

  
41

  
42
        self.socket = socket
43
        self.bots = []
44

  
45
        self.draw = map_model()
46
        self.draw.bot = [1,1,pi/2] # x y theta
47
        self.draw.add_dependent(self.redraw)
48

  
49
        self.scale_const = 50
50
        self.xdisp = 400
51
        self.ydisp = 400
52
        self.nticks = 21
53
        self.units = 10
54

  
55
    def redraw(self, eqn):
56
        self.clear_area()
57
        self.draw_bot()
58
        self.draw_grid()
59
        
60
    def do_expose_event(self, event):
61
        self.redraw(None)
62

  
63
    def clear_area(self):
64
        self.ctx = self.window.cairo_create()
65
        self.ctx.rectangle(0,0,1000,1000)
66
        self.ctx.set_source_rgb(1,1,1)
67
        self.ctx.fill()
68
        
69

  
70
    def draw_bot(self):
71
        self.ctx = self.window.cairo_create()
72
        self.ctx.new_path()
73
        
74
        x, y, theta = self.draw.bot
75
        y = -y #because we don't want to draw down more units
76
        
77
        #draw blob
78
        self.ctx.set_source_rgb(0,1,0)
79
        xscl = (self.xres - self.xdisp) / self.units
80
        yscl = (self.yres - self.ydisp) / self.units
81

  
82
        cx = x * xscl + self.xdisp
83
        cy = y * yscl + self.ydisp
84
        self.ctx.arc(cx, cy, 20, 0, 2*pi)
85
        self.ctx.fill()
86

  
87
        #draw "arrow"
88
        self.ctx.set_source_rgb(0,0,1)
89
        self.ctx.arc(cx,cy, 5, 0, 2*pi)
90
        self.ctx.fill()
91
        
92
        self.ctx.move_to(cx,cy)
93
        dx = 20 * math.cos(theta + 0.05)
94
        dy = -20 * math.sin(theta + 0.05)
95
        dx = int(dx)
96
        dy = int(dy)
97
        
98
        self.ctx.rel_line_to(dx, dy)
99
        self.ctx.stroke()
100

  
101
    def draw_grid(self):
102

  
103
        self.ctx.set_source_rgb(0,0,0)
104
        self.ctx.new_path()
105
        
106
        #vertical
107
        self.ctx.move_to(400,0)
108
        self.ctx.rel_line_to(0,800)
109
        self.ctx.stroke()
110

  
111
        #vticks
112
        self.ctx.move_to(400,0)
113
        for i in range( self.nticks + 1 ):
114
            self.ctx.rel_line_to(5,0)
115
            self.ctx.stroke()
116
            self.ctx.move_to(400, i * 800 / self.nticks)
117
        
118
        #horiz
119
        self.ctx.move_to(0,400)
120
        self.ctx.rel_line_to(800,0)
121
        self.ctx.stroke()
122

  
123
        #hticks
124
        self.ctx.move_to(0,400)
125
        for i in range(self.nticks + 1):
126
            self.ctx.rel_line_to(0,-5)
127
            self.ctx.stroke()
128
            self.ctx.move_to(i * 800 / self.nticks, 400)
129

  
130
    def draw_graph(self, equations, n):
131
        self.ctx = self.window.cairo_create()
132
        self.ctx.set_source_rgb(0,0,0)
133
        self.ctx.new_path()
134
        
135
        for equn in equations:
136
            xmin, xmax = equn[-2],equn[-1]
137
            eqn = equn[:-2]
138
            dx = float(xmax - xmin) / n
139
            x = xmin
140
            y = 0
141
            for i in range(len(eqn)):
142
                y += eqn[-1 * i - 1] * ( x ** i)
143

  
144
            self.ctx.move_to(self.x_disp + x * self.scale_const,400 - y * self.scale_const)
145
            
146
            for diffel in range(1,n+1):
147
                x = xmin + diffel * dx
148
                y = 0
149
                for i in range(len(eqn)):
150
                    y += eqn[-1 * i - 1] * ( x ** i)
151
                self.ctx.line_to(self.x_disp + int(x * self.scale_const),400 - int(y * self.scale_const))
152
                self.ctx.stroke()
153
                self.ctx.move_to(self.x_disp + int(x * self.scale_const),400 - int(y * self.scale_const))
154

  
155
    def receive_info(self):
156
        
157
        buf = self.socket.recv(100)
158
        if (buf):
159
            items = unpack('4c2hf5h')
160
            print items
161
        
162
#         info = self.draw.bot
163
#         dx = random() * 2 - 1
164
#         dy = random() * 2 - 1
165
        
166
#         self.draw.bot = [info[0] + dx, info[1] + dx, info[2]]
167
        
168
        return True
169

  
170

  
171
def solve(lisvals):
172
    p0y, p1y, m0y, m1y, x0, x1 = lisvals
173
    A = array([[x0**3 , x0**2 , x0 , 1],
174
               [x1**3 , x1**2 , x1 , 1],
175
               [3 * x0**2 , 2 * x0 , 1 , 0],
176
               [3 * x1**2 , 2 * x1 , 1 , 0]])
177
    
178
    B = array([p0y, p1y, m0y, m1y])
179
    tarr = linalg.solve(A,B)
180
    lis = []
181
    for i in range(4):
182
        lis.append(tarr[i])
183
    return lis + [0,1]
184

  
185
def main():
186
    
187
    window = gtk.Window()
188
    window.connect("delete-event", gtk.main_quit)
189

  
190
    sock = socket()
191
    sock.connect((hostname, int(sys.argv[1])))
192

  
193
#    mywidg = Screen(sock)
194
    
195
    mywidg = Screen(sock)
196

  
197
    bigbox = gtk.HBox()
198
    bigbox.pack_end(mywidg, True, True, 0)
199
    
200
    window.add(bigbox)
201
    bigbox.show()
202
    mywidg.show()
203
    window.show()
204

  
205
    gobject.idle_add(mywidg.receive_info)
206
 #   gobject.timeout_add(250, mywidg.receive_info)
207
    gtk.main()
208

  
209
if __name__=='__main__':
210
    if (len(sys.argv) < 2): #or not str.isdecimal(sys.argv[1])):
211
        print("Usage: %s <portno>" % sys.argv[0])
212
        sys.exit()
213

  
214
    main()
0 215

  
trunk/code/projects/mapping/python/server.c
22 22
int main(int argc, char *argv[])
23 23
{
24 24
     char buffer[256];
25
     int tmp = 0;
25 26
     char outbuf[256];
26 27
     int n, newsockfd, len;
28
     short int tprint;
27 29
     Packet *received;
28

  
29
  
30 30
     if (argc < 2) {
31 31
	  fprintf(stderr,"usage: %s <port number>\n", argv[0]);
32 32
	  exit(1);
33 33
     }
34 34
     newsockfd = make_sock(atoi(argv[1]));
35

  
35
     printf("Made socket\n");
36 36
     make_listener();
37 37
     printf("Robot listener created.\n");
38 38

  
......
40 40

  
41 41
     while (1)
42 42
     {
43
	  bzero(buffer, 256);
43 44
	  wl_do();
44 45
	  
45
	  /* this is a completely useless queue, since wl_do only reads one packet at a time */
46 46
	  received = dequeue();
47
	  /* oh well */
48 47

  
49 48
	  if (received)
50 49
	  {
51
	       fprintf(stdout, "len: %d\n", buffer[1]);
52 50
	       buffer[0] = (char) received->source;
53
	       buffer[1] = (char) received->length-2;
51
	       buffer[1] = (char) received->length;
54 52
	       buffer[2] = (char) received->type;
55
	       memcpy(buffer+3, received->packet, received->length);
53
	       buffer[3] = 0;
54
	       memcpy(buffer+4, received->packet, received->length);
56 55
	       
57
	       n = write(newsockfd, buffer, 200);
56
	       memcpy(&tprint, buffer+4, 2);
57

  
58
	       printf("%d\n", tprint);
59
	       n = write(newsockfd, buffer, 22);
58 60
	       free(received);
59 61
	       bzero(buffer, 256);
60 62
	  }
trunk/code/projects/mapping/python/robots.c
4 4
#include <stdio.h>
5 5
#include "robots.h"
6 6

  
7
#define CHANNEL 0xE
8

  
7 9
typedef struct Node {
8 10
     Packet *info;
9 11
     struct Node *next;
......
18 20
{ 
19 21
     PacketGroupHandler *receiver;
20 22
     printf("wl_init() returned %d\n", wl_init());
21
     wl_set_channel(0xE);
23
     wl_set_channel(CHANNEL);
22 24
     receiver = malloc(sizeof(PacketGroupHandler));
23 25
     receiver->groupCode = GROUP;
24 26
     receiver->handle_response = NULL;
trunk/code/projects/mapping/python/colony.py
1 1
#!/usr/bin/env python3.0
2 2
import sys, time
3 3
from socket import *
4
from struct import *
4 5

  
5 6
hostname='localhost'
6 7

  
......
9 10

  
10 11
def main():
11 12

  
12
    funcs = {31 : 'print_range_info'}
13
    funcs = {1 : 'print_range_info'}
13 14

  
14 15
    buf = []
15 16
    sock = socket()
......
26 27
        
27 28
def print_range_info(packet):
28 29
    print ('Info from %d' % packet[0])
30

  
29 31
    src = packet[0]
30
    len = packet[1]
31
    print(len)
32
    data = packet[3:]
33
    for i in range(len // 2):
34
        bot_id = data[i*2]
35
        max_range_id = data[i*2+1]
36
        print ('Max to bot %d is %d' % (bot_id, max_range_id))
37
    
38 32

  
33
    packet_length = packet[1]
39 34

  
35
    data = packet[3 : 3+packet_length]
36
    print("data length: %d" % len(data))
37
    ranges = unpack('hhhhhhh',data)
40 38

  
39
    print(ranges)
40

  
41

  
41 42
if __name__=='__main__':
42 43

  
43 44
    if len(sys.argv) < 2 or not str.isdecimal(sys.argv[1]):
trunk/code/projects/mapping/python/Makefile
2 2
CFLAGS=-W -Wall -lpthread -g
3 3
INCS=-I../../libwireless/lib
4 4
COMPS=../../libwireless/lib
5
DEFS=-DWL_DEBUG -DXBEE_SPECIAL
5 6

  
6 7

  
7 8
server : clean
8
	$(CC) $(CFLAGS) $(INCS) ../../libwireless/lib/*.c server.c netserv.c robots.c -o server
9
	$(CC) $(CFLAGS) $(INCS) $(DEFS) ../../libwireless/lib/*.c server.c netserv.c robots.c -o server
9 10

  
10 11
clean :
11 12
	rm -f server

Also available in: Unified diff