WebUI bugfixs
This commit is contained in:
parent
12e62bb2f0
commit
4720922ed6
@ -9,13 +9,13 @@ LICENCE : CC BY
|
|||||||
|
|
||||||
A software server with gui for up to 4 lasers live actions. Think creative like Laser "battles", planetarium,...
|
A software server with gui for up to 4 lasers live actions. Think creative like Laser "battles", planetarium,...
|
||||||
|
|
||||||
No .ild file here, you run your client that generate/send point lists to LJ. Any redis capable programming langage is fine.
|
This software is in python 2.7 but you run and write your clients separatly in any redis capable programming langage (50+ : https://redis.io/clients).
|
||||||
|
|
||||||
Needs at least : an etherdream DAC connected to an ILDA laser, RJ 45 IP network (gigabits only !! no wifi, 100 mpbs doesn't work well with several lasers)
|
Needs at least : an etherdream DAC connected to an ILDA laser, RJ 45 IP network (gigabits only !! no wifi, 100 mpbs doesn't work well with several lasers)
|
||||||
|
|
||||||
Nozosc : Semi modular synthetizers from Nozoids can send a lot of their inner sound curves and be displayed in many ways, i.e VCO 1 on X axis and LFO 2 on Y axis.
|
Nozosc : Semi modular synthetizers from Nozoids can send a lot of their inner sound curves and be displayed in many ways, i.e VCO 1 on X axis and LFO 2 on Y axis.
|
||||||
|
|
||||||
The server approach is based on redis. One process per etherdream is spawn to : retrieve the given point list from redis, warp, resample and manage the given etherdream DAC dialog.
|
The server approach is based on redis. One process per etherdream is spawn : to retrieve the given point list from redis, warp, resample and manage the given etherdream dialog.
|
||||||
|
|
||||||
LJ supports Linux and OS X. Windows is unkown but welcome, if someone want to jump in and care about it.
|
LJ supports Linux and OS X. Windows is unkown but welcome, if someone want to jump in and care about it.
|
||||||
|
|
||||||
@ -48,10 +48,12 @@ LJ supports Linux and OS X. Windows is unkown but welcome, if someone want to ju
|
|||||||
|
|
||||||
LJ is meant for Live, so a lot of parameters can be changed via OSC/midi, webUI,...
|
LJ is meant for Live, so a lot of parameters can be changed via OSC/midi, webUI,...
|
||||||
|
|
||||||
This is *critical and flickering reason #1* if not managed properly : use static network configuration, especially if you move your gear for different venues.
|
This is *critical and flickering reason #1* if not managed properly, especially you have several lasers.
|
||||||
|
|
||||||
Our "always working solution" :
|
Our "always working solution" :
|
||||||
|
|
||||||
|
We use static network configuration, as we regularly move our gear for different venues.
|
||||||
|
|
||||||
Our Etherdreams controllers have static IPs defined in their SDcard from 192.168.1.1 to 192.168.1.9. Because wifi will always finally sucks for many reasons, our computers are *gigabits wired connected* with 192.168.1.10 and after. Don't trust end user gear marketing on wifi.
|
Our Etherdreams controllers have static IPs defined in their SDcard from 192.168.1.1 to 192.168.1.9. Because wifi will always finally sucks for many reasons, our computers are *gigabits wired connected* with 192.168.1.10 and after. Don't trust end user gear marketing on wifi.
|
||||||
|
|
||||||
We have a big *laser dedicated gigabit switch*. We provide Internet through wifi on a different network address like 192.168.2.x
|
We have a big *laser dedicated gigabit switch*. We provide Internet through wifi on a different network address like 192.168.2.x
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// In compatible LJay string format (pythonic lists)
|
// In compatible LJay string format (pythonic lists)
|
||||||
|
|
||||||
var redis = require("redis"),
|
var redis = require("redis"),
|
||||||
client = redis.createClient(6379,'192.168.1.13');
|
client = redis.createClient(6379,'127.0.0.1');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
29
gstt.py
29
gstt.py
@ -34,11 +34,6 @@ simuPL = 1
|
|||||||
lasersIPS = ['192.168.1.5','192.168.1.6','192.168.1.3','192.168.1.4']
|
lasersIPS = ['192.168.1.5','192.168.1.6','192.168.1.3','192.168.1.4']
|
||||||
|
|
||||||
|
|
||||||
# gstt.laserPLS : What point list is sent to what laser.
|
|
||||||
# ** Will be overridden by the ConfigName (see below) file values **
|
|
||||||
lasersPLS = [0,1,2,0]
|
|
||||||
|
|
||||||
|
|
||||||
# gstt.kpps stores kpps for each laser.
|
# gstt.kpps stores kpps for each laser.
|
||||||
# ** Will be overridden by the ConfigName (see below) file values **
|
# ** Will be overridden by the ConfigName (see below) file values **
|
||||||
kpps = [25000,25000,25000,25000]
|
kpps = [25000,25000,25000,25000]
|
||||||
@ -46,10 +41,6 @@ kpps = [25000,25000,25000,25000]
|
|||||||
# gstt.GridDisplay : if = 1 Curve points actually sent to PL are replaced by a grid
|
# gstt.GridDisplay : if = 1 Curve points actually sent to PL are replaced by a grid
|
||||||
GridDisplay = [0,0,0,0]
|
GridDisplay = [0,0,0,0]
|
||||||
|
|
||||||
# with 4 laser available, 4 PL only are necessary
|
|
||||||
PL = [[],[],[],[]]
|
|
||||||
|
|
||||||
|
|
||||||
# Transformation Matrix for each laser
|
# Transformation Matrix for each laser
|
||||||
EDH = [[], [], [], []]
|
EDH = [[], [], [], []]
|
||||||
|
|
||||||
@ -72,8 +63,8 @@ maxCurvesByLaser = 4
|
|||||||
# For glitch art : change position and decrease number of points added by newdac.py
|
# For glitch art : change position and decrease number of points added by newdac.py
|
||||||
# shortline for lines shorter than 4000 (in etherdream coordinates)
|
# shortline for lines shorter than 4000 (in etherdream coordinates)
|
||||||
# i.e (0.25,3) means add 3 points at 25% on the line.
|
# i.e (0.25,3) means add 3 points at 25% on the line.
|
||||||
stepshortline = [ (1.0, 8)]
|
stepshortline = [(1.0, 8)]
|
||||||
stepslongline = [ (0.25, 3), (0.75, 3), (1.0, 10)]
|
stepslongline = [(0.25, 3), (0.75, 3), (1.0, 10)]
|
||||||
|
|
||||||
|
|
||||||
#curveColor = [255,0,0] * maxCurvesByLaser
|
#curveColor = [255,0,0] * maxCurvesByLaser
|
||||||
@ -91,8 +82,6 @@ YTimeAxe=30000
|
|||||||
#curveX = [255,255,255] * maxCurvesByLaser
|
#curveX = [255,255,255] * maxCurvesByLaser
|
||||||
#curveY = [255,255,255] * maxCurvesByLaser
|
#curveY = [255,255,255] * maxCurvesByLaser
|
||||||
|
|
||||||
Mode = 5
|
|
||||||
|
|
||||||
point = [0,0,0]
|
point = [0,0,0]
|
||||||
|
|
||||||
# gstt.colormode select what to display. Can be changed with /noteon 57-64
|
# gstt.colormode select what to display. Can be changed with /noteon 57-64
|
||||||
@ -125,22 +114,8 @@ cc[22]= 60
|
|||||||
fov = 4 * cc[22]
|
fov = 4 * cc[22]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
'''
|
|
||||||
Also vailable with args : -v Value
|
|
||||||
|
|
||||||
if debug = 1 you get :
|
|
||||||
|
|
||||||
|
|
||||||
if debug = 2 you get :
|
|
||||||
- dac errors
|
|
||||||
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
JumpFlag =0
|
JumpFlag =0
|
||||||
|
|
||||||
|
|
||||||
# nice X (cc 5) Y (cc 6) curve at first
|
# nice X (cc 5) Y (cc 6) curve at first
|
||||||
cc[5] = cc[6] = 60
|
cc[5] = cc[6] = 60
|
||||||
|
|
||||||
|
@ -221,16 +221,21 @@ def newEDH(mylaser):
|
|||||||
|
|
||||||
# EDH matrix is H x Hwarp
|
# EDH matrix is H x Hwarp
|
||||||
#gstt.EDH[mylaser] = np.dot(H,Hwarp)
|
#gstt.EDH[mylaser] = np.dot(H,Hwarp)
|
||||||
print "Laser",mylaser,"NEW EDH computed, sending to redis..."
|
print "Laser",mylaser,"New EDH computed, sending to redis..."
|
||||||
r.set('/EDH/'+str(mylaser), np.array2string(gstt.EDH[mylaser], separator=','))
|
if r.set('/EDH/'+str(mylaser), np.array2string(gstt.EDH[mylaser], separator=',')) == True:
|
||||||
|
r.set('/order/'+str(mylaser), 1)
|
||||||
|
print "New EDH sent."
|
||||||
|
else:
|
||||||
|
print "New EDH not sent."
|
||||||
|
'''
|
||||||
# Laser bit 0 = 0 and bit 1 = 1 : New EDH
|
# Laser bit 0 = 0 and bit 1 = 1 : New EDH
|
||||||
order = r.get('/order')
|
order = r.get('/order')
|
||||||
print order
|
print order
|
||||||
neworder = order & ~(1<< mylaser*2)
|
neworder = order & ~(1<< mylaser*2)
|
||||||
neworder = neworder | (1<< 1+mylaser*2)
|
neworder = neworder | (1<< 1+mylaser*2)
|
||||||
r.set('/order', str(neworder))
|
r.set('/order', str(neworder))
|
||||||
|
'''
|
||||||
|
|
||||||
if gstt.debug >1:
|
if gstt.debug >1:
|
||||||
print ""
|
print ""
|
||||||
print "laser ", mylaser
|
print "laser ", mylaser
|
||||||
|
49
las.py
49
las.py
@ -39,9 +39,11 @@ def UserOn(laser):
|
|||||||
|
|
||||||
def NewEDH(laser):
|
def NewEDH(laser):
|
||||||
|
|
||||||
|
print "New EDH requested for laser ", laser
|
||||||
settings.Write()
|
settings.Write()
|
||||||
print "New EDH for laser ", laser
|
homographyp.newEDH(laser)
|
||||||
r.set('/order/'+str(laser), 1)
|
|
||||||
|
#r.set('/order/'+str(laser), 1)
|
||||||
# Laser bit 0 = 0 and bit 1 = 1 : New EDH
|
# Laser bit 0 = 0 and bit 1 = 1 : New EDH
|
||||||
#order = r.get('/order')
|
#order = r.get('/order')
|
||||||
#neworder = order & ~(1<< laser*2)
|
#neworder = order & ~(1<< laser*2)
|
||||||
@ -69,22 +71,21 @@ def GridOn(laser):
|
|||||||
#r.set('/order', str(neworder))
|
#r.set('/order', str(neworder))
|
||||||
|
|
||||||
|
|
||||||
def Resampler(laser):
|
def Resampler(laser,lsteps):
|
||||||
|
|
||||||
|
# lsteps is a string like : "[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]"
|
||||||
print "Resampler change for laser ", laser
|
print "Resampler change for laser ", laser
|
||||||
|
r.set('/resampler/' + str(laser), lsteps)
|
||||||
r.set('/order/'+str(laser), 4)
|
r.set('/order/'+str(laser), 4)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def handler(oscpath, args):
|
def handler(oscpath, args):
|
||||||
|
|
||||||
pathlength = len(oscpath)
|
pathlength = len(oscpath)
|
||||||
if pathlength == 2:
|
if pathlength == 3:
|
||||||
laser = int(oscpath[2])
|
laser = int(oscpath[2])
|
||||||
else:
|
else:
|
||||||
laser = int(oscpath[2])
|
laser = int(oscpath[3])
|
||||||
|
|
||||||
|
|
||||||
# /grid/lasernumber value (0 or 1)
|
# /grid/lasernumber value (0 or 1)
|
||||||
if oscpath[1] == "grid":
|
if oscpath[1] == "grid":
|
||||||
@ -113,31 +114,35 @@ def handler(oscpath, args):
|
|||||||
if oscpath[1] == "ip":
|
if oscpath[1] == "ip":
|
||||||
print "New IP for laser ", laser
|
print "New IP for laser ", laser
|
||||||
gstt.lasersIPS[laser]= args[0]
|
gstt.lasersIPS[laser]= args[0]
|
||||||
NewEDH(laser)
|
settings.Write()
|
||||||
|
|
||||||
|
|
||||||
# /kpps/lasernumber value
|
# /kpps/lasernumber value
|
||||||
# Live change of kpps is not implemented in newdac.py. Change will effect next startup.
|
# Live change of kpps is not implemented in newdac.py. Change will effect next startup.
|
||||||
if oscpath[1] == "kpps":
|
if oscpath[1] == "kpps":
|
||||||
print "New kpps for laser ", laser, " next startup", args[0]
|
print "New kpps for laser ", laser, " next startup", args[0]
|
||||||
gstt.kpps[laser]= int(args[0])
|
gstt.kpps[laser]= int(args[0])
|
||||||
NewEDH(laser)
|
settings.Write()
|
||||||
|
|
||||||
# /angle/lasernumber value
|
# /angle/lasernumber value
|
||||||
if oscpath[1] == "angle":
|
if oscpath[1] == "angle":
|
||||||
print "New Angle modification for laser ", oscpath[2], ":", args[0]
|
print "New Angle modification for laser ", oscpath[2], ":", args[0]
|
||||||
gstt.finANGLE[laser] += int(args[0])
|
gstt.finANGLE[laser] += int(args[0])
|
||||||
homographyp.newEDH(laser)
|
|
||||||
NewEDH(laser)
|
NewEDH(laser)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# /intens/lasernumber value
|
# /intens/lasernumber value
|
||||||
if oscpath[1] == "intens":
|
if oscpath[1] == "intens":
|
||||||
print "New intensity requested for laser ", oscpath[2], ":", args[0]
|
print "New intensity requested for laser ", laser, ":", args[0]
|
||||||
print "Change not implemented yet"
|
print "Change not implemented yet"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# /resampler/lasernumber lsteps
|
||||||
|
# lsteps is a string like "[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]"
|
||||||
|
if oscpath[1] == "resampler":
|
||||||
|
Resampler(laser,args[0])
|
||||||
|
|
||||||
|
|
||||||
# /mouse/lasernumber value (0 or 1)
|
# /mouse/lasernumber value (0 or 1)
|
||||||
if oscpath[1] == "mouse":
|
if oscpath[1] == "mouse":
|
||||||
|
|
||||||
@ -154,13 +159,11 @@ def handler(oscpath, args):
|
|||||||
if args[0] == "0":
|
if args[0] == "0":
|
||||||
print "swap X : -1 for laser ", laser
|
print "swap X : -1 for laser ", laser
|
||||||
gstt.swapX[laser]= -1
|
gstt.swapX[laser]= -1
|
||||||
homographyp.newEDH(laser)
|
|
||||||
NewEDH(laser)
|
NewEDH(laser)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print "swap X : 1 for laser ", laser
|
print "swap X : 1 for laser ", laser
|
||||||
gstt.swapX[laser]= 1
|
gstt.swapX[laser]= 1
|
||||||
homographyp.newEDH(laser)
|
|
||||||
NewEDH(laser)
|
NewEDH(laser)
|
||||||
|
|
||||||
# /swap/Y/lasernumber value (0 or 1)
|
# /swap/Y/lasernumber value (0 or 1)
|
||||||
@ -168,41 +171,35 @@ def handler(oscpath, args):
|
|||||||
if args[0] == "0":
|
if args[0] == "0":
|
||||||
print "swap Y : -1 for laser ", laser
|
print "swap Y : -1 for laser ", laser
|
||||||
gstt.swapY[laser]= -1
|
gstt.swapY[laser]= -1
|
||||||
homographyp.newEDH(laser)
|
|
||||||
NewEDH(laser)
|
NewEDH(laser)
|
||||||
else:
|
else:
|
||||||
print "swap Y : 1 for laser ", laser
|
print "swap Y : 1 for laser ", laser
|
||||||
gstt.swapY[laser]= 1
|
gstt.swapY[laser]= 1
|
||||||
homographyp.newEDH(laser)
|
|
||||||
NewEDH(laser)
|
NewEDH(laser)
|
||||||
|
|
||||||
# /loffset/X/lasernumber value
|
# /loffset/X/lasernumber value
|
||||||
if oscpath[1] == "loffset" and oscpath[2] == "X":
|
if oscpath[1] == "loffset" and oscpath[2] == "X":
|
||||||
print "offset/X laser ", laser, "modified : ", args[0]
|
print "offset/X laser", laser, "modified to", args[0]
|
||||||
gstt.centerX[laser] -= int(args[0])
|
gstt.centerX[laser] -= int(args[0])
|
||||||
homographyp.newEDH(laser)
|
|
||||||
NewEDH(laser)
|
NewEDH(laser)
|
||||||
|
|
||||||
# /loffset/Y/lasernumber value
|
# /loffset/Y/lasernumber value
|
||||||
if oscpath[1] == "loffset" and oscpath[2] == "Y":
|
if oscpath[1] == "loffset" and oscpath[2] == "Y":
|
||||||
print "offset/Y laser ", laser, "modified : ", args[0]
|
print "offset/Y laser", laser, "modified to", args[0]
|
||||||
gstt.centerY[laser] -= int(args[0])
|
gstt.centerY[laser] -= int(args[0])
|
||||||
homographyp.newEDH(laser)
|
|
||||||
NewEDH(laser)
|
NewEDH(laser)
|
||||||
|
|
||||||
|
|
||||||
# /scale/X/lasernumber value
|
# /scale/X/lasernumber value
|
||||||
if oscpath[1] == "scale" and oscpath[2] == "X":
|
if oscpath[1] == "scale" and oscpath[2] == "X":
|
||||||
print "scale/X laser ", laser , "modified : ", args[0]
|
print "scale/X laser", laser , "modified to", args[0]
|
||||||
gstt.zoomX[laser] += int(args[0])
|
gstt.zoomX[laser] += int(args[0])
|
||||||
homographyp.newEDH(laser)
|
|
||||||
NewEDH(laser)
|
NewEDH(laser)
|
||||||
|
|
||||||
# /scale/Y/lasernumber value
|
# /scale/Y/lasernumber value
|
||||||
if oscpath[1] == "scale" and oscpath[2] == "Y":
|
if oscpath[1] == "scale" and oscpath[2] == "Y":
|
||||||
print "scale/Y laser ", laser, "modified : ", args[0]
|
print "scale/Y laser", laser, "modified to", args[0]
|
||||||
gstt.zoomY[laser] += int(args[0])
|
gstt.zoomY[laser] += int(args[0])
|
||||||
homographyp.newEDH(laser)
|
|
||||||
NewEDH(laser)
|
NewEDH(laser)
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
16
mainy.conf
16
mainy.conf
@ -2,32 +2,31 @@
|
|||||||
set = 5
|
set = 5
|
||||||
curve = 0
|
curve = 0
|
||||||
lasernumber = 1
|
lasernumber = 1
|
||||||
debug = 0
|
debug = 1
|
||||||
ljayserverip = 127.0.0.1
|
ljayserverip = 127.0.0.1
|
||||||
nozoscip = 127.0.0.1
|
nozoscip = 127.0.0.1
|
||||||
bhoroscip = 127.0.0.1
|
bhoroscip = 127.0.0.1
|
||||||
|
|
||||||
[laser0]
|
[laser0]
|
||||||
pl = 0
|
|
||||||
color = -1
|
color = -1
|
||||||
ip = 192.168.1.4
|
ip = 192.168.1.4
|
||||||
kpps = 25000
|
kpps = 25000
|
||||||
centerx = 0
|
centerx = 0
|
||||||
centery = 0
|
centery = -650
|
||||||
zoomx = 49.2
|
zoomx = 49.2
|
||||||
zoomy = 49.0
|
zoomy = 65.0
|
||||||
sizex = 31450
|
sizex = 31450
|
||||||
sizey = 32000
|
sizey = 32000
|
||||||
finangle = 0.0
|
finangle = 0.0
|
||||||
swapx = 1
|
swapx = 1
|
||||||
swapy = -1
|
swapy = 1
|
||||||
|
lsteps = [ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
|
||||||
warpdest = [[-1500., 1500.],
|
warpdest = [[-1500., 1500.],
|
||||||
[ 1500., 1500.],
|
[ 1500., 1500.],
|
||||||
[ 1500.,-1500.],
|
[ 1500.,-1500.],
|
||||||
[-1500.,-1500.]]
|
[-1500.,-1500.]]
|
||||||
|
|
||||||
[laser1]
|
[laser1]
|
||||||
pl = 1
|
|
||||||
color = -1
|
color = -1
|
||||||
ip = 192.168.1.5
|
ip = 192.168.1.5
|
||||||
kpps = 25000
|
kpps = 25000
|
||||||
@ -40,13 +39,13 @@ sizey = 32000
|
|||||||
finangle = 0.0
|
finangle = 0.0
|
||||||
swapx = 1
|
swapx = 1
|
||||||
swapy = 1
|
swapy = 1
|
||||||
|
lsteps = [ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
|
||||||
warpdest = [[-1500., 1500.],
|
warpdest = [[-1500., 1500.],
|
||||||
[ 1500., 1500.],
|
[ 1500., 1500.],
|
||||||
[ 1500.,-1500.],
|
[ 1500.,-1500.],
|
||||||
[-1500.,-1500.]]
|
[-1500.,-1500.]]
|
||||||
|
|
||||||
[laser2]
|
[laser2]
|
||||||
pl = 2
|
|
||||||
color = -1
|
color = -1
|
||||||
ip = 192.168.1.6
|
ip = 192.168.1.6
|
||||||
kpps = 25000
|
kpps = 25000
|
||||||
@ -59,13 +58,13 @@ sizey = 32000
|
|||||||
finangle = -0.008
|
finangle = -0.008
|
||||||
swapx = 1
|
swapx = 1
|
||||||
swapy = 1
|
swapy = 1
|
||||||
|
lsteps = [(1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
|
||||||
warpdest = [[-1500., 1500.],
|
warpdest = [[-1500., 1500.],
|
||||||
[ 1500., 1500.],
|
[ 1500., 1500.],
|
||||||
[ 1500.,-1500.],
|
[ 1500.,-1500.],
|
||||||
[-1500.,-1500.]]
|
[-1500.,-1500.]]
|
||||||
|
|
||||||
[laser3]
|
[laser3]
|
||||||
pl = 3
|
|
||||||
color = -1
|
color = -1
|
||||||
ip = 192.168.1.3
|
ip = 192.168.1.3
|
||||||
kpps = 25000
|
kpps = 25000
|
||||||
@ -78,6 +77,7 @@ sizey = 32000
|
|||||||
finangle = 0.0
|
finangle = 0.0
|
||||||
swapx = -1
|
swapx = -1
|
||||||
swapy = -1
|
swapy = -1
|
||||||
|
lsteps = [(1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
|
||||||
warpdest = [[-1500., 1500.],
|
warpdest = [[-1500., 1500.],
|
||||||
[ 1500., 1500.],
|
[ 1500., 1500.],
|
||||||
[ 1500.,-1500.],
|
[ 1500.,-1500.],
|
||||||
|
@ -8,10 +8,6 @@ Laser server + webUI servers (ws + OSC)
|
|||||||
|
|
||||||
todo :
|
todo :
|
||||||
|
|
||||||
r.set('/resampler/0', '[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]')
|
|
||||||
r.set('/resampler/1', '[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]')
|
|
||||||
r.set('/resampler/2', '[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]')
|
|
||||||
r.set('/resampler/3', '[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]')
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
@ -45,6 +41,7 @@ from websocket_server import WebsocketServer
|
|||||||
import types, thread, time
|
import types, thread, time
|
||||||
|
|
||||||
r = redis.StrictRedis(host=gstt.LjayServerIP , port=6379, db=0)
|
r = redis.StrictRedis(host=gstt.LjayServerIP , port=6379, db=0)
|
||||||
|
args =[0,0]
|
||||||
|
|
||||||
def dac_process(number, pl):
|
def dac_process(number, pl):
|
||||||
while True:
|
while True:
|
||||||
@ -93,7 +90,7 @@ wsPORT = 9001
|
|||||||
|
|
||||||
# With Bhorosc
|
# With Bhorosc
|
||||||
# OSC Server : relay OSC message from Bhorosc outport 8002 to UI
|
# OSC Server : relay OSC message from Bhorosc outport 8002 to UI
|
||||||
#oscIPin = "192.168.1.10"
|
#oscIPin = "192.168.1.10"s
|
||||||
bhoroscIPin = serverIP
|
bhoroscIPin = serverIP
|
||||||
bhoroscPORTin = 8002
|
bhoroscPORTin = 8002
|
||||||
|
|
||||||
@ -107,6 +104,8 @@ bhoroscPORTout = 8001
|
|||||||
NozoscIPout = nozoscIP
|
NozoscIPout = nozoscIP
|
||||||
NozoscPORTout = 8003
|
NozoscPORTout = 8003
|
||||||
|
|
||||||
|
|
||||||
|
print bhoroscIPin
|
||||||
oscserver = OSCServer( (bhoroscIPin, bhoroscPORTin) )
|
oscserver = OSCServer( (bhoroscIPin, bhoroscPORTin) )
|
||||||
oscserver.timeout = 0
|
oscserver.timeout = 0
|
||||||
OSCRunning = True
|
OSCRunning = True
|
||||||
@ -162,7 +161,7 @@ def sendnozosc(oscaddress,oscargs=''):
|
|||||||
pass
|
pass
|
||||||
#time.sleep(0.001)
|
#time.sleep(0.001)
|
||||||
|
|
||||||
# NOT USED see las.py
|
|
||||||
# OSC default path handler : send OSC message from Bhorosc 8002 to UI via websocket 9001
|
# OSC default path handler : send OSC message from Bhorosc 8002 to UI via websocket 9001
|
||||||
def handler(path, tags, args, source):
|
def handler(path, tags, args, source):
|
||||||
|
|
||||||
@ -173,17 +172,7 @@ def handler(path, tags, args, source):
|
|||||||
print "default handler"
|
print "default handler"
|
||||||
print "Bhorosc said : ", path, oscpath, args
|
print "Bhorosc said : ", path, oscpath, args
|
||||||
sendWSall(path + " " + str(args[0]))
|
sendWSall(path + " " + str(args[0]))
|
||||||
|
|
||||||
las.handler(oscpath,args)
|
las.handler(oscpath,args)
|
||||||
|
|
||||||
'''
|
|
||||||
# /lstt/number value
|
|
||||||
if oscpath[1] == "lstt":
|
|
||||||
sendWSall(path + " " + str(args[0]))
|
|
||||||
# /status string
|
|
||||||
if oscpath[1] == "status":
|
|
||||||
sendWSall(path + " " + str(args[0]))
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
# RAW OSC Frame available ?
|
# RAW OSC Frame available ?
|
||||||
@ -213,9 +202,7 @@ def osc_thread():
|
|||||||
|
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
osc_frame()
|
osc_frame()
|
||||||
|
for laserid in range(0,gstt.LaserNumber): # Laser not used -> led is not lit
|
||||||
|
|
||||||
for laserid in range(0,lasernumber): # Laser not used -> led is not lit
|
|
||||||
|
|
||||||
lstt = r.get('/lstt/'+ str(laserid))
|
lstt = r.get('/lstt/'+ str(laserid))
|
||||||
#print "laserid", laserid,"lstt",lstt
|
#print "laserid", laserid,"lstt",lstt
|
||||||
@ -226,9 +213,9 @@ def osc_thread():
|
|||||||
if lstt == "2": # Dac PLAYING (2) -> led is green (1)
|
if lstt == "2": # Dac PLAYING (2) -> led is green (1)
|
||||||
sendWSall("/lstt/" + str(laserid) + " 1")
|
sendWSall("/lstt/" + str(laserid) + " 1")
|
||||||
|
|
||||||
# This is used not working : lack never change. Todo : retest.
|
|
||||||
lack= r.get('/lack/'+str(laserid))
|
lack= r.get('/lack/'+str(laserid))
|
||||||
#print "laserid", laserid,"lack",lack
|
print "laserid", laserid,"lack",lack
|
||||||
if lack == 'a': # Dac sent ACK ("a") -> led is green (1)
|
if lack == 'a': # Dac sent ACK ("a") -> led is green (1)
|
||||||
sendWSall("/lack/" + str(laserid) +" 1")
|
sendWSall("/lack/" + str(laserid) +" 1")
|
||||||
if lack == 'F': # Dac sent FULL ("F") -> led is orange (5)
|
if lack == 'F': # Dac sent FULL ("F") -> led is orange (5)
|
||||||
@ -247,7 +234,7 @@ def osc_thread():
|
|||||||
# last number of points sent to etherdream buffer
|
# last number of points sent to etherdream buffer
|
||||||
sendWSall("/points/" + str(laserid) + " " + str(r.get('/cap/'+str(laserid))))
|
sendWSall("/points/" + str(laserid) + " " + str(r.get('/cap/'+str(laserid))))
|
||||||
|
|
||||||
#sendWSall("/plframe/" + str(laserid) ) # + " " + str(r.get('/pl/'+str(laserid))))
|
sendWSall("/plframe/" + str(laserid) + " " + str(r.get('/pl/'+str(laserid))))
|
||||||
|
|
||||||
# WIP Too much packets -> flood webUI : Draw all PL point lists in JS canvas in WebUI
|
# WIP Too much packets -> flood webUI : Draw all PL point lists in JS canvas in WebUI
|
||||||
|
|
||||||
@ -276,6 +263,7 @@ def osc_thread():
|
|||||||
|
|
||||||
# Called for every WS client connecting (after handshake)
|
# Called for every WS client connecting (after handshake)
|
||||||
def new_client(client, server):
|
def new_client(client, server):
|
||||||
|
|
||||||
print("New WS client connected and was given id %d" % client['id'])
|
print("New WS client connected and was given id %d" % client['id'])
|
||||||
sendWSall("/status Hello %d" % client['id'])
|
sendWSall("/status Hello %d" % client['id'])
|
||||||
|
|
||||||
@ -284,14 +272,14 @@ def new_client(client, server):
|
|||||||
sendWSall("/kpps/" + str(laserid)+ " " + str(gstt.kpps[laserid]))
|
sendWSall("/kpps/" + str(laserid)+ " " + str(gstt.kpps[laserid]))
|
||||||
|
|
||||||
if gstt.swapX[laserid] == 1:
|
if gstt.swapX[laserid] == 1:
|
||||||
sendWSall("swap/X/" + str(laserid)+ " 1")
|
sendWSall("/swap/X/" + str(laserid)+ " 1")
|
||||||
else:
|
else:
|
||||||
sendWSall("swap/X/" + str(laserid)+ " 0")
|
sendWSall("/swap/X/" + str(laserid)+ " 0")
|
||||||
|
|
||||||
if gstt.swapY[laserid] == 1:
|
if gstt.swapY[laserid] == 1:
|
||||||
sendWSall("swap/Y/" + str(laserid)+ " 1")
|
sendWSall("/swap/Y/" + str(laserid)+ " 1")
|
||||||
else:
|
else:
|
||||||
sendWSall("swap/Y/" + str(laserid)+ " 0")
|
sendWSall("/swap/Y/" + str(laserid)+ " 0")
|
||||||
|
|
||||||
# Called for every WS client disconnecting
|
# Called for every WS client disconnecting
|
||||||
def client_left(client, server):
|
def client_left(client, server):
|
||||||
@ -302,19 +290,24 @@ def client_left(client, server):
|
|||||||
def message_received(client, server, message):
|
def message_received(client, server, message):
|
||||||
if len(message) > 200:
|
if len(message) > 200:
|
||||||
message = message[:200]+'..'
|
message = message[:200]+'..'
|
||||||
|
|
||||||
if gstt.debug >0:
|
if gstt.debug >0:
|
||||||
|
print ("")
|
||||||
print("WS Client(%d) said: %s" % (client['id'], message))
|
print("WS Client(%d) said: %s" % (client['id'], message))
|
||||||
|
|
||||||
oscpath = message.split(" ")
|
oscpath = message.split(" ")
|
||||||
|
args[0] = float(oscpath[1])
|
||||||
|
#print oscpath[0].split("/"),oscpath[1]
|
||||||
|
las.handler(oscpath[0].split("/"),args)
|
||||||
|
|
||||||
# current UI has no dedicated off button so /on 0 trigs /off to bhorosc
|
# current UI has no dedicated off button so /on 0 trigs /off to bhorosc
|
||||||
if oscpath[0] == "/on":
|
if oscpath[0] == "/on":
|
||||||
if oscpath[1] == "1":
|
if oscpath[1] == "1":
|
||||||
|
|
||||||
|
|
||||||
sendbhorosc("/on")
|
sendbhorosc("/on")
|
||||||
else:
|
else:
|
||||||
sendbhorosc("/off")
|
sendbhorosc("/off")
|
||||||
else:
|
else:
|
||||||
|
|
||||||
print "sending to bhorosc",oscpath[0],oscpath[1]
|
print "sending to bhorosc",oscpath[0],oscpath[1]
|
||||||
sendbhorosc(oscpath[0],oscpath[1])
|
sendbhorosc(oscpath[0],oscpath[1])
|
||||||
|
|
||||||
@ -354,7 +347,7 @@ if r.set('/pl/3', str(random_points)) == True:
|
|||||||
print "/pl/3 ", ast.literal_eval(r.get('/pl/3'))
|
print "/pl/3 ", ast.literal_eval(r.get('/pl/3'))
|
||||||
|
|
||||||
# Order all lasers to show these random shapes at startup -> tell all 4 laser process to USER PLs
|
# Order all lasers to show these random shapes at startup -> tell all 4 laser process to USER PLs
|
||||||
for laserid in range(0,lasernumber+1):
|
for laserid in range(0,gstt.LaserNumber):
|
||||||
r.set('/order/'+str(laserid), 0)
|
r.set('/order/'+str(laserid), 0)
|
||||||
|
|
||||||
|
|
||||||
@ -429,7 +422,7 @@ finally:
|
|||||||
|
|
||||||
|
|
||||||
for laserid in range(0,lasernumber+1):
|
for laserid in range(0,lasernumber+1):
|
||||||
print "Redis Etherdream",laserid,"feedback reset."
|
print "Laser",laserid,"feedbacks reset."
|
||||||
r.set('/lack/'+str(laserid),64)
|
r.set('/lack/'+str(laserid),64)
|
||||||
r.set('/lstt/'+str(laserid),64)
|
r.set('/lstt/'+str(laserid),64)
|
||||||
r.set('/cap/'+str(laserid),0)
|
r.set('/cap/'+str(laserid),0)
|
||||||
|
23
newdacp.py
23
newdacp.py
@ -3,10 +3,10 @@
|
|||||||
# -*- mode: Python -*-
|
# -*- mode: Python -*-
|
||||||
|
|
||||||
'''
|
'''
|
||||||
LJay v0.8.0
|
LJay/LJ v0.8.0
|
||||||
|
|
||||||
newdacp.py
|
newdacp.py
|
||||||
Unhanced version (redis and process style) of the etherdream python library from j4cDAC.
|
Enhanced version (redis and process style) of the etherdream python library from j4cDAC.
|
||||||
|
|
||||||
LICENCE : CC
|
LICENCE : CC
|
||||||
Sam Neurohack, pclf
|
Sam Neurohack, pclf
|
||||||
@ -38,7 +38,7 @@ Geometric corrections :
|
|||||||
import socket
|
import socket
|
||||||
import time
|
import time
|
||||||
import struct
|
import struct
|
||||||
from gstt import debug, PL
|
#from gstt import debug
|
||||||
import gstt
|
import gstt
|
||||||
import math
|
import math
|
||||||
from itertools import cycle
|
from itertools import cycle
|
||||||
@ -157,13 +157,13 @@ class DAC(object):
|
|||||||
if math.hypot(delta_x, delta_y) < 4000:
|
if math.hypot(delta_x, delta_y) < 4000:
|
||||||
|
|
||||||
# For glitch art : decrease lsteps
|
# For glitch art : decrease lsteps
|
||||||
l_steps = [ (1.0, 8)]
|
#l_steps = [ (1.0, 8)]
|
||||||
#l_steps = gstt.stepshortline
|
l_steps = gstt.stepshortline
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# For glitch art : decrease lsteps
|
# For glitch art : decrease lsteps
|
||||||
l_steps = [ (0.25, 3), (0.75, 3), (1.0, 10)]
|
#l_steps = [ (0.25, 3), (0.75, 3), (1.0, 10)]
|
||||||
#_steps = gstt.stepslongline
|
l_steps = gstt.stepslongline
|
||||||
|
|
||||||
for e in l_steps:
|
for e in l_steps:
|
||||||
step = e[0]
|
step = e[0]
|
||||||
@ -255,11 +255,11 @@ class DAC(object):
|
|||||||
#print "pl :", self.pl
|
#print "pl :", self.pl
|
||||||
#print "EDH/"+str(self.mylaser),r.get('/EDH/'+str(self.mylaser))
|
#print "EDH/"+str(self.mylaser),r.get('/EDH/'+str(self.mylaser))
|
||||||
if r.get('/EDH/'+str(self.mylaser)) == None:
|
if r.get('/EDH/'+str(self.mylaser)) == None:
|
||||||
#print "Laser",self.mylaser,"NO EDH !! Computing one..."
|
print "Laser",self.mylaser,"NO EDH !! Computing one..."
|
||||||
homographyp.newEDH(self.mylaser)
|
homographyp.newEDH(self.mylaser)
|
||||||
else:
|
else:
|
||||||
gstt.EDH[self.mylaser] = np.array(ast.literal_eval(r.get('/EDH/'+str(self.mylaser))))
|
gstt.EDH[self.mylaser] = np.array(ast.literal_eval(r.get('/EDH/'+str(self.mylaser))))
|
||||||
#print "Laser",self.mylaser,"found its EDH in redis"
|
print "Laser",self.mylaser,"found its EDH in redis"
|
||||||
#print gstt.EDH[self.mylaser]
|
#print gstt.EDH[self.mylaser]
|
||||||
|
|
||||||
'''
|
'''
|
||||||
@ -358,7 +358,7 @@ class DAC(object):
|
|||||||
self.pl = ast.literal_eval(r.get('/pl/'+str(self.mylaser)))
|
self.pl = ast.literal_eval(r.get('/pl/'+str(self.mylaser)))
|
||||||
else:
|
else:
|
||||||
|
|
||||||
# recompute EDH
|
# Get the new EDH
|
||||||
if order == 1:
|
if order == 1:
|
||||||
print "Laser",self.mylaser,"new EDH ORDER in redis"
|
print "Laser",self.mylaser,"new EDH ORDER in redis"
|
||||||
gstt.EDH[self.mylaser]= np.array(ast.literal_eval(r.get('/EDH/'+str(self.mylaser))))
|
gstt.EDH[self.mylaser]= np.array(ast.literal_eval(r.get('/EDH/'+str(self.mylaser))))
|
||||||
@ -379,7 +379,7 @@ class DAC(object):
|
|||||||
# Resampler Modification
|
# Resampler Modification
|
||||||
if order == 4:
|
if order == 4:
|
||||||
self.resampler = ast.literal_eval(r.get('/resampler/'+str(self.mylaser)))
|
self.resampler = ast.literal_eval(r.get('/resampler/'+str(self.mylaser)))
|
||||||
print "resampler for", self.mylaser, ":",self.resampler
|
print "newdacp resetting lsteps for", self.mylaser, ":",self.resampler
|
||||||
gstt.stepshortline = self.resampler[0]
|
gstt.stepshortline = self.resampler[0]
|
||||||
gstt.stepslongline[0] = self.resampler[1]
|
gstt.stepslongline[0] = self.resampler[1]
|
||||||
gstt.stepslongline[1] = self.resampler[2]
|
gstt.stepslongline[1] = self.resampler[2]
|
||||||
@ -445,6 +445,7 @@ class DAC(object):
|
|||||||
# print "Took %f" % (t1 - t0, )
|
# print "Took %f" % (t1 - t0, )
|
||||||
|
|
||||||
if not started:
|
if not started:
|
||||||
|
print "starting laser", self.mylaser, "with", gstt.kpps[self.mylaser],"kpps"
|
||||||
self.begin(0, gstt.kpps[self.mylaser])
|
self.begin(0, gstt.kpps[self.mylaser])
|
||||||
started = 1
|
started = 1
|
||||||
|
|
||||||
|
@ -58,7 +58,6 @@ def Read():
|
|||||||
for i in range(4):
|
for i in range(4):
|
||||||
laser = 'laser' + str(i)
|
laser = 'laser' + str(i)
|
||||||
gstt.lasersIPS[i]= config.get(laser, 'ip')
|
gstt.lasersIPS[i]= config.get(laser, 'ip')
|
||||||
gstt.lasersPLS[i] = config.getint(laser, 'PL')
|
|
||||||
gstt.kpps[i] = config.getint(laser, 'kpps')
|
gstt.kpps[i] = config.getint(laser, 'kpps')
|
||||||
#gstt.lasersPLcolor[i] = config.getint(laser, 'color')
|
#gstt.lasersPLcolor[i] = config.getint(laser, 'color')
|
||||||
gstt.centerX[i]= config.getint(laser, 'centerx')
|
gstt.centerX[i]= config.getint(laser, 'centerx')
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
},
|
},
|
||||||
onMessage: function (e) {
|
onMessage: function (e) {
|
||||||
var res = e.data.split(" ");
|
var res = e.data.split(" ");
|
||||||
|
var pl = ""
|
||||||
//console.log(e.data)
|
//console.log(e.data)
|
||||||
//console.log(res[0].substring(0,6))
|
//console.log(res[0].substring(0,6))
|
||||||
switch (res[0].substring(0,6)) {
|
switch (res[0].substring(0,6)) {
|
||||||
@ -49,12 +50,13 @@
|
|||||||
_WS.showstatus(e.data.slice(8));
|
_WS.showstatus(e.data.slice(8));
|
||||||
break;
|
break;
|
||||||
case "/plfra":
|
case "/plfra":
|
||||||
console.log(e.data.slice(11));
|
pl = e.data.slice(11)
|
||||||
|
console.log(pl);
|
||||||
break;
|
break;
|
||||||
case "/plpoi":
|
case "/plpoi":
|
||||||
//console.log("plpoint");
|
//console.log("plpoint");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
console.log(res[0] + " " + res[1])
|
console.log(res[0] + " " + res[1])
|
||||||
//console.log(res[1])
|
//console.log(res[1])
|
||||||
document.getElementById(res[0].slice(1)).value = res[1];
|
document.getElementById(res[0].slice(1)).value = res[1];
|
||||||
|
Loading…
Reference in New Issue
Block a user