annotate visualclient/visclient.py @ 28:6022a370c7dd

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