annotate visualclient/visclient.py @ 27:c97feb7ef9e9

Strasbourg
author gyorgyf
date Thu, 20 Sep 2012 23:55:48 +0100
parents 858fc44a17c1
children 6022a370c7dd
rev   line source
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