gyorgyf@5
|
1 #!/usr/bin/env python
|
gyorgyf@5
|
2 # encoding: utf-8
|
gyorgyf@5
|
3 """
|
gyorgyf@5
|
4 visclient.py
|
gyorgyf@5
|
5
|
gyorgyf@5
|
6 Created by George Fazekas on 2012-06-17.
|
gyorgyf@5
|
7 Copyright (c) 2012 . All rights reserved.
|
gyorgyf@5
|
8 """
|
gyorgyf@5
|
9
|
gyorgyf@12
|
10 import sys,os,math,time,copy
|
gyorgyf@5
|
11 import pygame as pg
|
gyorgyf@5
|
12 from pygame.locals import *
|
gyorgyf@5
|
13 import httplib as ht
|
gyorgyf@5
|
14
|
gyorgyf@5
|
15 import gradients
|
gyorgyf@5
|
16 from gradients import genericFxyGradient
|
gyorgyf@5
|
17
|
gyorgyf@27
|
18 from threading import Thread
|
gyorgyf@27
|
19 from random import random
|
gyorgyf@27
|
20
|
gyorgyf@5
|
21 # from pytagcloud import create_tag_image, make_tags
|
gyorgyf@5
|
22 # from pytagcloud.lang.counter import get_tag_counts
|
gyorgyf@5
|
23
|
gyorgyf@5
|
24 # YOUR_TEXT = "A tag cloud is a visual representation for text data, typically\
|
gyorgyf@5
|
25 # used to depict keyword metadata on websites, or to visualize free form text."
|
gyorgyf@5
|
26 #
|
gyorgyf@5
|
27 # tags = make_tags(get_tag_counts(YOUR_TEXT), maxsize=120)
|
gyorgyf@5
|
28 #
|
gyorgyf@5
|
29 # create_tag_image(tags, 'cloud_large.png', size=(900, 600), fontname='Lobster')
|
gyorgyf@5
|
30
|
gyorgyf@12
|
31 scol = (0,255,0,255)
|
gyorgyf@12
|
32 ecol = (0,0,0,255)
|
gyorgyf@12
|
33
|
gyorgyf@12
|
34 # X,Y=1140,900
|
gyorgyf@27
|
35 # X,Y = 600,400
|
gyorgyf@27
|
36 X,Y = 800,600
|
gyorgyf@27
|
37
|
gyorgyf@27
|
38 NBLOBS = 18
|
gyorgyf@22
|
39 BLOBSIZE = 25
|
gyorgyf@14
|
40 G=110
|
gyorgyf@22
|
41 FADE = 15
|
gyorgyf@27
|
42 DIST = 0.1 # blob equivalence tolerance
|
gyorgyf@27
|
43 FRAMERATE = 60
|
gyorgyf@27
|
44
|
gyorgyf@27
|
45 # Connection:
|
gyorgyf@27
|
46 # IP = "192.168.2.184:8030"
|
gyorgyf@27
|
47 IP = "138.37.95.215"
|
gyorgyf@27
|
48 HTTP_TIMEOUT = 3
|
gyorgyf@27
|
49 SERVER_UPDATE_INTERVAL = 0.8
|
gyorgyf@27
|
50
|
gyorgyf@27
|
51 class Indicator(object):
|
gyorgyf@27
|
52
|
gyorgyf@27
|
53 off_color = pg.Color(110,0,0)
|
gyorgyf@27
|
54 on_color = pg.Color(0,120,0)
|
gyorgyf@27
|
55
|
gyorgyf@27
|
56 def __init__(self,bg,pos):
|
gyorgyf@27
|
57 self.visible = True
|
gyorgyf@27
|
58 self.ison = True
|
gyorgyf@27
|
59 self.x,self.y = pos
|
gyorgyf@27
|
60 self.xs = int(self.x * X)
|
gyorgyf@27
|
61 self.ys = int(Y - (self.y * Y))
|
gyorgyf@27
|
62 self.c = self.off_color
|
gyorgyf@27
|
63 self.size = 6
|
gyorgyf@27
|
64 self.bg = bg
|
gyorgyf@27
|
65
|
gyorgyf@27
|
66 def reinit(self,bg):
|
gyorgyf@27
|
67 self.bg = bg
|
gyorgyf@27
|
68 self.xs = int(self.x * X)
|
gyorgyf@27
|
69 self.ys = int(Y - (self.y * Y))
|
gyorgyf@27
|
70
|
gyorgyf@27
|
71 def draw(self):
|
gyorgyf@27
|
72 if self.visible :
|
gyorgyf@27
|
73 pg.draw.circle(self.bg, self.c, (self.xs,self.ys),self.size,0)
|
gyorgyf@27
|
74
|
gyorgyf@27
|
75 def toggle(self):
|
gyorgyf@27
|
76 if self.ison == True :
|
gyorgyf@27
|
77 self.off()
|
gyorgyf@27
|
78 else :
|
gyorgyf@27
|
79 self.on()
|
gyorgyf@27
|
80 return self
|
gyorgyf@27
|
81
|
gyorgyf@27
|
82 def on(self):
|
gyorgyf@27
|
83 self.c = self.on_color
|
gyorgyf@27
|
84 self.ison = True
|
gyorgyf@27
|
85 return self
|
gyorgyf@27
|
86
|
gyorgyf@27
|
87 def off(self):
|
gyorgyf@27
|
88 self.c = self.off_color
|
gyorgyf@27
|
89 self.ison = False
|
gyorgyf@27
|
90 return self
|
gyorgyf@27
|
91
|
gyorgyf@12
|
92
|
gyorgyf@12
|
93 class Blob(object):
|
gyorgyf@12
|
94
|
gyorgyf@22
|
95 def __init__(self,bg,x,y,color=(255,255,255),mood=None,fade=FADE):
|
gyorgyf@12
|
96 self.x = x
|
gyorgyf@12
|
97 self.y = y
|
gyorgyf@12
|
98 self.xs = x * X
|
gyorgyf@12
|
99 self.ys = Y - (y * Y)
|
gyorgyf@12
|
100 self.bg = bg
|
gyorgyf@14
|
101 self.size = BLOBSIZE
|
gyorgyf@12
|
102 self.time = time.time()
|
gyorgyf@12
|
103 self.alpha = 255
|
gyorgyf@12
|
104 self.c = color
|
gyorgyf@14
|
105 self.count = 1
|
gyorgyf@12
|
106 self.visible = True
|
gyorgyf@22
|
107 self.FADE = fade
|
gyorgyf@12
|
108 if mood and mood.color :
|
gyorgyf@12
|
109 self.c = mood.color
|
gyorgyf@12
|
110
|
gyorgyf@12
|
111 def __cmp__(self,other):
|
gyorgyf@12
|
112 d = math.sqrt( math.pow((self.x-other.x),2) + math.pow((self.y-other.y),2) )
|
gyorgyf@27
|
113 if d < DIST :
|
gyorgyf@12
|
114 return 0
|
gyorgyf@12
|
115 else :
|
gyorgyf@12
|
116 return -1
|
gyorgyf@12
|
117
|
gyorgyf@12
|
118 def draw(self):
|
gyorgyf@27
|
119 if not self.visible : return
|
gyorgyf@14
|
120 d=int(self.size)
|
gyorgyf@14
|
121 self.bg.blit(gradients.radial(self.size, (self.c[0],self.c[1],self.c[2],self.alpha), (0,0,0,self.alpha)), (self.xs-d,self.ys-d))
|
gyorgyf@22
|
122 self.alpha = 255 - int(self.age()*self.FADE)
|
gyorgyf@12
|
123 if self.alpha < 5 :
|
gyorgyf@12
|
124 self.alpha = 1
|
gyorgyf@12
|
125 self.visible = False
|
gyorgyf@12
|
126
|
gyorgyf@12
|
127 def age(self):
|
gyorgyf@12
|
128 return time.time() - self.time
|
gyorgyf@12
|
129
|
gyorgyf@12
|
130 def increment(self,count):
|
gyorgyf@21
|
131 self.time = time.time()
|
gyorgyf@14
|
132 self.count = count
|
gyorgyf@14
|
133 self.size = int(BLOBSIZE * int(self.count/1.5))
|
gyorgyf@12
|
134
|
gyorgyf@12
|
135 def get_distance(self,x,y):
|
gyorgyf@12
|
136 return math.sqrt( math.pow((self.x-x),2) + math.pow((self.y-y),2) )
|
gyorgyf@22
|
137
|
gyorgyf@22
|
138 def fade(self,fade):
|
gyorgyf@22
|
139 if not fade : self.alpha = 255
|
gyorgyf@22
|
140 self.FADE = fade
|
gyorgyf@22
|
141
|
gyorgyf@22
|
142 def reset_time(self):
|
gyorgyf@22
|
143 self.time = time.time()
|
gyorgyf@12
|
144
|
gyorgyf@12
|
145
|
gyorgyf@12
|
146
|
gyorgyf@12
|
147
|
gyorgyf@12
|
148 class Mood():
|
gyorgyf@12
|
149 def __init__(self,word,x,y):
|
gyorgyf@12
|
150 self.word = word
|
gyorgyf@12
|
151 self.x = float(x)
|
gyorgyf@12
|
152 self.y = float(y)
|
gyorgyf@12
|
153 self.color = []
|
gyorgyf@12
|
154
|
gyorgyf@12
|
155 def get_distance(self,x,y):
|
gyorgyf@12
|
156 return math.sqrt( math.pow((self.x-x),2) + math.pow((self.y-y),2) )
|
gyorgyf@12
|
157
|
gyorgyf@12
|
158
|
gyorgyf@12
|
159
|
gyorgyf@12
|
160 class VisualClient(object):
|
gyorgyf@27
|
161 '''Main visualisation client.'''
|
gyorgyf@12
|
162
|
gyorgyf@12
|
163 def __init__(self):
|
gyorgyf@12
|
164 # self.conn = ht.HTTPConnection("192.168.2.184:8030")
|
gyorgyf@27
|
165 # self.conn = ht.HTTPConnection("138.37.95.215")
|
gyorgyf@12
|
166
|
gyorgyf@12
|
167 pg.init()
|
gyorgyf@12
|
168
|
gyorgyf@12
|
169 # fontObj = pg.font.Font("freesansbold.ttf",18)
|
gyorgyf@12
|
170 white = ( 255, 255, 255)
|
gyorgyf@12
|
171 black = ( 0,0,0)
|
gyorgyf@12
|
172
|
gyorgyf@12
|
173 self.fpsClock = pg.time.Clock()
|
gyorgyf@12
|
174 self.screen = pg.display.set_mode((X, Y))
|
gyorgyf@12
|
175 pg.display.set_caption('Mood Conductor')
|
gyorgyf@12
|
176 self.bg = pg.Surface(self.screen.get_size())
|
gyorgyf@12
|
177 self.bg = self.bg.convert()
|
gyorgyf@12
|
178 self.bg.fill((0,0,0))
|
gyorgyf@27
|
179 pg.display.set_gamma(100.0)
|
gyorgyf@12
|
180
|
gyorgyf@12
|
181
|
gyorgyf@12
|
182 self.scol = (0,255,0,255)
|
gyorgyf@12
|
183 self.ecol = (0,0,0,255)
|
gyorgyf@12
|
184 coordstxt = "test"
|
gyorgyf@12
|
185
|
gyorgyf@12
|
186 self.blobs = []
|
gyorgyf@12
|
187 self.moods = []
|
gyorgyf@12
|
188 self.read_mood_data()
|
gyorgyf@12
|
189
|
gyorgyf@22
|
190 self.FADE = FADE
|
gyorgyf@22
|
191
|
gyorgyf@27
|
192 self.indicators = {
|
gyorgyf@27
|
193 "conn":Indicator(self.bg,(0.98,0.02)),
|
gyorgyf@27
|
194 "update":Indicator(self.bg,(0.96,0.02)),
|
gyorgyf@27
|
195 "data":Indicator(self.bg,(0.94,0.02)),
|
gyorgyf@27
|
196 "receive":Indicator(self.bg,(0.92,0.02))}
|
gyorgyf@27
|
197
|
gyorgyf@27
|
198 self.thread = None
|
gyorgyf@27
|
199 self.running = False
|
gyorgyf@27
|
200 self.fullscreen = False
|
gyorgyf@27
|
201 self.init_reconnect = False
|
gyorgyf@12
|
202 pass
|
gyorgyf@12
|
203
|
gyorgyf@27
|
204
|
gyorgyf@12
|
205 def read_mood_data(self):
|
gyorgyf@27
|
206 '''Read the mood position and color information form csv file.'''
|
gyorgyf@12
|
207 with open('moods.csv') as mf:
|
gyorgyf@12
|
208 data = mf.readlines()[1:]
|
gyorgyf@12
|
209 for line in data :
|
gyorgyf@12
|
210 l = line.split(',')
|
gyorgyf@14
|
211 mood = Mood(l[0],l[1],l[2])
|
gyorgyf@12
|
212 self.moods.append(mood)
|
gyorgyf@22
|
213 with open('colors.txt') as ff:
|
gyorgyf@22
|
214 data = ff.readlines()[1:]
|
gyorgyf@22
|
215 data = map(lambda x: x.split(','),data)
|
gyorgyf@12
|
216 for mood in self.moods :
|
gyorgyf@22
|
217 d = cd = sys.float_info.max
|
gyorgyf@12
|
218 for colors in data :
|
gyorgyf@22
|
219 d = mood.get_distance(float(colors[0]),float(colors[1]))
|
gyorgyf@22
|
220 if d < cd :
|
gyorgyf@22
|
221 cd = d
|
gyorgyf@22
|
222 mood.color = tuple(map(lambda x: int(pow(math.atan((float(x)/7.0)),12.5)),(colors[2],colors[3],colors[4])))
|
gyorgyf@27
|
223 # mood.color = tuple(map(lambda x: int(x),(colors[2],colors[3],colors[4])))
|
gyorgyf@27
|
224 return True
|
gyorgyf@27
|
225
|
gyorgyf@22
|
226
|
gyorgyf@27
|
227 def start_update_thread(self):
|
gyorgyf@27
|
228 '''Start the thread that reads data from the server.'''
|
gyorgyf@27
|
229 self.running = True
|
gyorgyf@27
|
230 self.thread = Thread(target = self.update_thread)
|
gyorgyf@27
|
231 self.thread.daemon = True
|
gyorgyf@27
|
232 self.thread.start()
|
gyorgyf@12
|
233
|
gyorgyf@27
|
234 def stop_update_thread(self):
|
gyorgyf@27
|
235 '''Stop the thread and allow some time fot the connections to close.'''
|
gyorgyf@27
|
236 self.running = False
|
gyorgyf@27
|
237 try :
|
gyorgyf@27
|
238 self.thread.join(2)
|
gyorgyf@27
|
239 except :
|
gyorgyf@27
|
240 print "No update thread to join."
|
gyorgyf@27
|
241
|
gyorgyf@27
|
242 def update_thread(self):
|
gyorgyf@27
|
243 '''The server update thread'''
|
gyorgyf@27
|
244 while self.running :
|
gyorgyf@27
|
245 try :
|
gyorgyf@27
|
246 self.update()
|
gyorgyf@27
|
247 # self.indicators["update"].visible = True
|
gyorgyf@27
|
248 except Exception, e:
|
gyorgyf@27
|
249 if str(e).strip() : print "Exception: ", str(e), type(e), len(str(e).strip())
|
gyorgyf@27
|
250 self.indicators["conn"].off()
|
gyorgyf@27
|
251 # self.indicators["update"].visible = False
|
gyorgyf@27
|
252 time.sleep(SERVER_UPDATE_INTERVAL)
|
gyorgyf@27
|
253
|
gyorgyf@12
|
254
|
gyorgyf@12
|
255 def update(self):
|
gyorgyf@27
|
256 '''Update the blob list from the server. This should be in a thread.'''
|
gyorgyf@27
|
257
|
gyorgyf@27
|
258 # indicate connection health by toggling an indictor
|
gyorgyf@27
|
259 self.indicators["update"].toggle()
|
gyorgyf@12
|
260
|
gyorgyf@12
|
261 # delete invisibles
|
gyorgyf@12
|
262 for blob in self.blobs :
|
gyorgyf@12
|
263 if not blob.visible :
|
gyorgyf@12
|
264 self.blobs.remove(blob)
|
gyorgyf@12
|
265
|
gyorgyf@12
|
266 # get new coordinates from the server
|
gyorgyf@12
|
267 self.conn.putrequest("GET","/moodconductor/result", skip_host=True)
|
gyorgyf@12
|
268 self.conn.putheader("Host", "www.isophonics.net")
|
gyorgyf@12
|
269 self.conn.endheaders()
|
gyorgyf@12
|
270 res = self.conn.getresponse()
|
gyorgyf@12
|
271 data = res.read()
|
gyorgyf@27
|
272 data = eval(data)
|
gyorgyf@12
|
273 if not data :
|
gyorgyf@12
|
274 self.conn.close()
|
gyorgyf@27
|
275 self.indicators["data"].toggle()
|
gyorgyf@12
|
276 return False
|
gyorgyf@12
|
277 for d in data :
|
gyorgyf@14
|
278 # coordstxt = "x:%s y:%s c:%s" %d
|
gyorgyf@27
|
279 x,y,count = d
|
gyorgyf@27
|
280 self.add_blob(x,y,count)
|
gyorgyf@27
|
281 self.indicators["receive"].toggle()
|
gyorgyf@12
|
282 self.conn.close()
|
gyorgyf@21
|
283 self.blobs = self.blobs[:NBLOBS]
|
gyorgyf@12
|
284 return True
|
gyorgyf@27
|
285
|
gyorgyf@27
|
286
|
gyorgyf@27
|
287 def add_blob(self,x,y,count=1):
|
gyorgyf@27
|
288 '''Insert a blob to the list of blobs'''
|
gyorgyf@27
|
289 # find mood correxponding to x,y
|
gyorgyf@27
|
290 cmood = None
|
gyorgyf@27
|
291 d = cd = sys.float_info.max
|
gyorgyf@27
|
292 for mood in self.moods :
|
gyorgyf@27
|
293 d = mood.get_distance(x,y)
|
gyorgyf@27
|
294 if d < cd :
|
gyorgyf@27
|
295 cd = d
|
gyorgyf@27
|
296 cmood = mood
|
gyorgyf@27
|
297 # create new blob or increase click count on existing one
|
gyorgyf@27
|
298 new = Blob(self.bg,x,y,mood=cmood,fade=self.FADE)
|
gyorgyf@27
|
299 if not new in self.blobs :
|
gyorgyf@27
|
300 self.blobs.insert(0,new)
|
gyorgyf@27
|
301 elif count > self.blobs[self.blobs.index(new)].count:
|
gyorgyf@27
|
302 self.blobs[self.blobs.index(new)].increment(count)
|
gyorgyf@27
|
303 pass
|
gyorgyf@12
|
304
|
gyorgyf@12
|
305
|
gyorgyf@12
|
306 def draw(self):
|
gyorgyf@27
|
307 self.bg.fill((0,0,0))
|
gyorgyf@12
|
308 # self.bg.blit(gradients.radial(19, self.scol, self.ecol), (rect_x,rect_y))
|
gyorgyf@12
|
309 l = copy.copy(self.blobs)
|
gyorgyf@12
|
310 l.reverse()
|
gyorgyf@12
|
311 for blob in l :
|
gyorgyf@12
|
312 blob.draw()
|
gyorgyf@12
|
313
|
gyorgyf@14
|
314 # axis
|
gyorgyf@14
|
315 pg.draw.line(self.bg, (G,G,G), (int(X/2.0),0),(int(X/2.0),Y), 1)
|
gyorgyf@14
|
316 pg.draw.line(self.bg, (G,G,G), (0,int(Y/2.0)),(X,int(Y/2.0)), 1)
|
gyorgyf@14
|
317
|
gyorgyf@27
|
318 # indicators
|
gyorgyf@27
|
319 for i in self.indicators.itervalues() :
|
gyorgyf@27
|
320 i.draw()
|
gyorgyf@27
|
321
|
gyorgyf@27
|
322 def read_keys(self):
|
gyorgyf@27
|
323 '''Read keys'''
|
gyorgyf@27
|
324 for event in pg.event.get() :
|
gyorgyf@27
|
325 # Quit (event)
|
gyorgyf@27
|
326 if event.type == QUIT:
|
gyorgyf@27
|
327 self.quit()
|
gyorgyf@27
|
328 elif event.type == KEYDOWN :
|
gyorgyf@27
|
329 # Post Quit: Esc, q
|
gyorgyf@27
|
330 if event.key == K_ESCAPE or event.key == K_q :
|
gyorgyf@27
|
331 pg.event.post(pg.event.Event(QUIT))
|
gyorgyf@27
|
332 # Reset: Space
|
gyorgyf@27
|
333 elif event.key == K_SPACE :
|
gyorgyf@27
|
334 self.blobs = []
|
gyorgyf@27
|
335 # Random : r
|
gyorgyf@27
|
336 elif event.key == K_r :
|
gyorgyf@27
|
337 self.add_blob(random(),random(),count=5)
|
gyorgyf@27
|
338 # Connection : c
|
gyorgyf@27
|
339 elif event.key == K_c :
|
gyorgyf@27
|
340 self.init_reconnect = True
|
gyorgyf@27
|
341 self.indicators["conn"].off()
|
gyorgyf@27
|
342 # Fullscreen: f
|
gyorgyf@27
|
343 elif event.key == K_f :
|
gyorgyf@27
|
344 # pg.display.toggle_fullscreen()
|
gyorgyf@27
|
345 self.toggle_screen_mode()
|
gyorgyf@27
|
346 # Toggle fade: s
|
gyorgyf@27
|
347 elif event.key == K_s :
|
gyorgyf@27
|
348 if self.FADE :
|
gyorgyf@27
|
349 print "fade off"
|
gyorgyf@27
|
350 self.indicators["conn"].off()
|
gyorgyf@27
|
351 self.FADE = 0
|
gyorgyf@27
|
352 for blob in self.blobs :
|
gyorgyf@27
|
353 blob.fade(0)
|
gyorgyf@27
|
354 else:
|
gyorgyf@27
|
355 print "fade on"
|
gyorgyf@27
|
356 self.indicators["conn"].on()
|
gyorgyf@27
|
357 self.FADE = 15
|
gyorgyf@27
|
358 for blob in self.blobs :
|
gyorgyf@27
|
359 blob.fade(15)
|
gyorgyf@27
|
360 blob.reset_time()
|
gyorgyf@27
|
361 pass
|
gyorgyf@27
|
362
|
gyorgyf@27
|
363 def toggle_screen_mode(self):
|
gyorgyf@27
|
364 '''Go back and forth between full screen mode.'''
|
gyorgyf@27
|
365 if self.fullscreen == False:
|
gyorgyf@27
|
366 globals()['_X'] = globals()['X']
|
gyorgyf@27
|
367 globals()['_Y'] = globals()['Y']
|
gyorgyf@27
|
368 globals()['X'] = 1440
|
gyorgyf@27
|
369 globals()['Y'] = 900
|
gyorgyf@27
|
370 self.screen = pg.display.set_mode((X, Y))
|
gyorgyf@27
|
371 self.fullscreen = True
|
gyorgyf@27
|
372 self.bg = pg.Surface(self.screen.get_size())
|
gyorgyf@27
|
373 self.bg = self.bg.convert()
|
gyorgyf@27
|
374 self.bg.fill((0,0,0))
|
gyorgyf@27
|
375 for i in self.indicators.itervalues() :
|
gyorgyf@27
|
376 i.reinit(self.bg)
|
gyorgyf@27
|
377 i.draw()
|
gyorgyf@27
|
378 else :
|
gyorgyf@27
|
379 globals()['X'] = globals()['_X']
|
gyorgyf@27
|
380 globals()['Y'] = globals()['_Y']
|
gyorgyf@27
|
381 self.screen = pg.display.set_mode((X, Y))
|
gyorgyf@27
|
382 self.fullscreen = False
|
gyorgyf@27
|
383 self.bg = pg.Surface(self.screen.get_size())
|
gyorgyf@27
|
384 self.bg = self.bg.convert()
|
gyorgyf@27
|
385 self.bg.fill((0,0,0))
|
gyorgyf@27
|
386 for i in self.indicators.itervalues() :
|
gyorgyf@27
|
387 i.reinit(self.bg)
|
gyorgyf@27
|
388 i.draw()
|
gyorgyf@27
|
389 pg.display.toggle_fullscreen()
|
gyorgyf@27
|
390
|
gyorgyf@14
|
391
|
gyorgyf@12
|
392
|
gyorgyf@12
|
393 def run(self):
|
gyorgyf@12
|
394
|
gyorgyf@27
|
395 # setup connection
|
gyorgyf@27
|
396 self.connect()
|
gyorgyf@27
|
397
|
gyorgyf@12
|
398 # main loop
|
gyorgyf@12
|
399 while True :
|
gyorgyf@12
|
400 # pg.draw.circle(screen, pg.Color(255,0,0), (300,50),20,0)
|
gyorgyf@12
|
401 # screen.blit(gradients.radial(99, scol, ecol), (401, 1))
|
gyorgyf@12
|
402
|
gyorgyf@27
|
403 self.read_keys()
|
gyorgyf@12
|
404
|
gyorgyf@12
|
405 # Draw
|
gyorgyf@12
|
406 self.draw()
|
gyorgyf@12
|
407
|
gyorgyf@12
|
408 # update display
|
gyorgyf@12
|
409 self.screen.blit(self.bg, (0, 0))
|
gyorgyf@12
|
410 pg.display.flip()
|
gyorgyf@27
|
411 self.fpsClock.tick(FRAMERATE)
|
gyorgyf@27
|
412
|
gyorgyf@27
|
413 if self.init_reconnect:
|
gyorgyf@27
|
414 self.reconnect()
|
gyorgyf@27
|
415
|
gyorgyf@27
|
416 return True
|
gyorgyf@27
|
417
|
gyorgyf@27
|
418
|
gyorgyf@27
|
419 def connect(self,retry = 5):
|
gyorgyf@27
|
420 '''Connect to the server and test connection.'''
|
gyorgyf@27
|
421 if not retry :
|
gyorgyf@27
|
422 print "Server unreachable"
|
gyorgyf@27
|
423 pg.quit()
|
gyorgyf@27
|
424 raise SystemExit
|
gyorgyf@27
|
425 if retry < 5 :
|
gyorgyf@27
|
426 time.sleep(3)
|
gyorgyf@27
|
427 try :
|
gyorgyf@27
|
428 self.conn = ht.HTTPConnection(IP,timeout=HTTP_TIMEOUT)
|
gyorgyf@27
|
429 # self.start_update_thread()
|
gyorgyf@27
|
430 self.indicators["conn"].on()
|
gyorgyf@27
|
431 except :
|
gyorgyf@27
|
432 self.indicators["conn"].off()
|
gyorgyf@27
|
433 self.connect(retry = retry-1)
|
gyorgyf@27
|
434
|
gyorgyf@27
|
435 try:
|
gyorgyf@27
|
436 self.conn.putrequest("GET","/moodconductor/index.html", skip_host=True)
|
gyorgyf@27
|
437 self.conn.putheader("Host", "www.isophonics.net")
|
gyorgyf@27
|
438 self.conn.endheaders()
|
gyorgyf@27
|
439 res = self.conn.getresponse()
|
gyorgyf@27
|
440 if res.status == 200 :
|
gyorgyf@27
|
441 self.indicators["conn"].on()
|
gyorgyf@27
|
442 else :
|
gyorgyf@27
|
443 print "Server response:", res.status, res.reason
|
gyorgyf@27
|
444 self.indicators["conn"].off()
|
gyorgyf@27
|
445 if not hasattr(self,"noretry") and raw_input("Go offline? ") in ['y',''] :
|
gyorgyf@27
|
446 return False
|
gyorgyf@27
|
447 else :
|
gyorgyf@27
|
448 self.noretry = None
|
gyorgyf@27
|
449 self.connect(retry = retry-1)
|
gyorgyf@27
|
450 except :
|
gyorgyf@27
|
451 print "Exception while testing connection."
|
gyorgyf@27
|
452 self.indicators["conn"].off()
|
gyorgyf@27
|
453 # comment out in offline mode
|
gyorgyf@27
|
454 if not hasattr(self,"noretry") and raw_input("Go offline? ") in ['y',''] :
|
gyorgyf@27
|
455 return False
|
gyorgyf@27
|
456 else :
|
gyorgyf@27
|
457 self.noretry = None
|
gyorgyf@27
|
458 self.connect(retry = retry-1)
|
gyorgyf@27
|
459 self.start_update_thread()
|
gyorgyf@27
|
460 return True
|
gyorgyf@27
|
461
|
gyorgyf@27
|
462
|
gyorgyf@27
|
463
|
gyorgyf@27
|
464 def reconnect(self):
|
gyorgyf@27
|
465 '''Called when c is pressed.'''
|
gyorgyf@27
|
466 self.init_reconnect = False
|
gyorgyf@27
|
467 # self.indicators["conn"].off().draw()
|
gyorgyf@27
|
468 # self.screen.blit(self.bg, (0, 0))
|
gyorgyf@27
|
469 # pg.display.flip()
|
gyorgyf@27
|
470
|
gyorgyf@27
|
471 self.stop_update_thread()
|
gyorgyf@27
|
472 time.sleep(1)
|
gyorgyf@27
|
473 try :
|
gyorgyf@27
|
474 self.conn.close()
|
gyorgyf@27
|
475 except :
|
gyorgyf@27
|
476 self.indicators["conn"].off()
|
gyorgyf@27
|
477 try :
|
gyorgyf@27
|
478 self.conn = ht.HTTPConnection(IP,timeout=HTTP_TIMEOUT)
|
gyorgyf@27
|
479 self.conn.connect()
|
gyorgyf@27
|
480 self.indicators["conn"].on()
|
gyorgyf@27
|
481 print "Reconnected."
|
gyorgyf@27
|
482 except :
|
gyorgyf@27
|
483 self.indicators["conn"].off()
|
gyorgyf@27
|
484 print "Error while reconnecting."
|
gyorgyf@27
|
485 self.start_update_thread()
|
gyorgyf@27
|
486
|
gyorgyf@27
|
487
|
gyorgyf@27
|
488 def quit(self):
|
gyorgyf@27
|
489 print "Quitting.."
|
gyorgyf@27
|
490 self.indicators["conn"].off()
|
gyorgyf@27
|
491 self.stop_update_thread()
|
gyorgyf@27
|
492 self.conn.close()
|
gyorgyf@27
|
493 pg.quit()
|
gyorgyf@27
|
494 sys.exit()
|
gyorgyf@27
|
495
|
gyorgyf@27
|
496
|
gyorgyf@27
|
497
|
gyorgyf@5
|
498
|
gyorgyf@5
|
499
|
gyorgyf@5
|
500 def main():
|
gyorgyf@5
|
501
|
gyorgyf@12
|
502 v = VisualClient()
|
gyorgyf@12
|
503 v.run()
|
gyorgyf@5
|
504
|
gyorgyf@12
|
505 # conn = ht.HTTPConnection("192.168.2.184:8030")
|
gyorgyf@12
|
506 #
|
gyorgyf@12
|
507 # pg.init()
|
gyorgyf@12
|
508 # fontObj = pg.font.Font("freesansbold.ttf",18)
|
gyorgyf@12
|
509 #
|
gyorgyf@12
|
510 # white = ( 255, 255, 255)
|
gyorgyf@12
|
511 # black = ( 0,0,0)
|
gyorgyf@12
|
512 # fpsClock = pg.time.Clock()
|
gyorgyf@12
|
513 # screen = pg.display.set_mode((1024, 768))
|
gyorgyf@12
|
514 # rect_x,rect_y=50,50
|
gyorgyf@12
|
515 # rect_xp,rect_yp=50,50
|
gyorgyf@12
|
516 # rect_change_x,rect_change_y=5,5
|
gyorgyf@12
|
517 # counter = 0
|
gyorgyf@12
|
518 # scol = (0,255,0,255)
|
gyorgyf@12
|
519 # # ecol = (100,0,50,255)
|
gyorgyf@12
|
520 # ecol = (0,0,0,255)
|
gyorgyf@12
|
521 # coordstxt = "test"
|
gyorgyf@12
|
522 #
|
gyorgyf@12
|
523 # while True :
|
gyorgyf@12
|
524 # pg.draw.circle(screen, pg.Color(255,0,0), (300,50),20,0)
|
gyorgyf@12
|
525 # # screen.blit(gradients.radial(99, scol, ecol), (401, 1))
|
gyorgyf@12
|
526 #
|
gyorgyf@12
|
527 # for event in pg.event.get() :
|
gyorgyf@12
|
528 # if event.type == QUIT:
|
gyorgyf@12
|
529 # conn.close()
|
gyorgyf@12
|
530 # pg.quit()
|
gyorgyf@12
|
531 # sys.exit()
|
gyorgyf@12
|
532 # elif event.type == KEYDOWN :
|
gyorgyf@12
|
533 # if event.key == K_ESCAPE :
|
gyorgyf@12
|
534 # pg.event.post(pg.event.Event(QUIT))
|
gyorgyf@12
|
535 #
|
gyorgyf@12
|
536 # # put text
|
gyorgyf@12
|
537 # # txtObj = fontObj.render(coordstxt,True,pg.Color(254,254,254))
|
gyorgyf@12
|
538 # # rectObj = txtObj.get_rect()
|
gyorgyf@12
|
539 # # rectObj.topleft = (10,20)
|
gyorgyf@12
|
540 # # # rectObj.fill(pg.Color(254,254,254))
|
gyorgyf@12
|
541 # # screen.blit(txtObj,rectObj)
|
gyorgyf@12
|
542 #
|
gyorgyf@12
|
543 #
|
gyorgyf@12
|
544 # # Draw the rectangle
|
gyorgyf@12
|
545 # # pg.draw.rect(screen,black,[rect_xp,rect_yp,50,50])
|
gyorgyf@12
|
546 # screen.blit(gradients.radial(19, ecol, ecol), (rect_xp,rect_yp))
|
gyorgyf@12
|
547 #
|
gyorgyf@12
|
548 # rect_xp,rect_yp = rect_x,rect_y
|
gyorgyf@12
|
549 # # pg.draw.rect(screen,white,[rect_x,rect_y,50,50])
|
gyorgyf@12
|
550 # screen.blit(gradients.radial(19, scol, ecol), (rect_x,rect_y))
|
gyorgyf@12
|
551 #
|
gyorgyf@12
|
552 #
|
gyorgyf@12
|
553 # # Move the rectangle starting point
|
gyorgyf@12
|
554 # # rect_x += rect_change_x
|
gyorgyf@12
|
555 # # rect_y += rect_change_y
|
gyorgyf@12
|
556 # counter += 1
|
gyorgyf@12
|
557 # if counter % 12 :
|
gyorgyf@12
|
558 # counter = 0
|
gyorgyf@12
|
559 # try :
|
gyorgyf@12
|
560 # conn.request("GET","/moodconductor/result")
|
gyorgyf@12
|
561 # res = conn.getresponse()
|
gyorgyf@12
|
562 # data = eval(res.read())
|
gyorgyf@12
|
563 # coordstxt = "x:%s y:%s" %data
|
gyorgyf@12
|
564 # rect_x = data[0] * 300
|
gyorgyf@12
|
565 # rect_y = data[1] * 1000
|
gyorgyf@12
|
566 # conn.close()
|
gyorgyf@12
|
567 # except :
|
gyorgyf@12
|
568 # pass
|
gyorgyf@12
|
569 #
|
gyorgyf@12
|
570 #
|
gyorgyf@12
|
571 #
|
gyorgyf@12
|
572 # # Bounce the ball if needed
|
gyorgyf@12
|
573 # if rect_y > 450 or rect_y < 0:
|
gyorgyf@12
|
574 # rect_change_y = rect_change_y * -1
|
gyorgyf@12
|
575 # if rect_x > 650 or rect_x < 0:
|
gyorgyf@12
|
576 # rect_change_x = rect_change_x * -1
|
gyorgyf@12
|
577 #
|
gyorgyf@12
|
578 # # pg.display.update()
|
gyorgyf@12
|
579 # pg.display.flip()
|
gyorgyf@12
|
580 # fpsClock.tick(50)
|
gyorgyf@12
|
581 #
|
gyorgyf@12
|
582 #
|
gyorgyf@12
|
583 # # if raw_input("quit?") in ['y'] :
|
gyorgyf@12
|
584 # # pg.quit()
|
gyorgyf@12
|
585 #
|
gyorgyf@12
|
586 # pass
|
gyorgyf@5
|
587
|
gyorgyf@5
|
588
|
gyorgyf@5
|
589 if __name__ == '__main__':
|
gyorgyf@5
|
590 pass
|
gyorgyf@5
|
591 main()
|
gyorgyf@5
|
592
|