Revision 918
| trunk/code/projects/mapping/python/map.py (revision 918) | ||
|---|---|---|
| 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 (revision 918) | ||
|---|---|---|
| 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 (revision 918) | ||
|---|---|---|
| 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 (revision 918) | ||
|---|---|---|
| 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 (revision 918) | ||
|---|---|---|
| 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