webui bugfixes
@ -105,7 +105,7 @@ def rPolyLineOneColor(xy_list, c, PL , closed, xpos = 0, ypos =0, resize =0.7, r
|
||||
# 0: point list / 1: Grid
|
||||
def LinesPL(PL):
|
||||
|
||||
if r.set('/pl/'+str(PL), str(pl[PL])) == True:
|
||||
if r.set('/pl/0/'+str(PL), str(pl[PL])) == True:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
@ -83,8 +83,8 @@ console.log(pl0);
|
||||
console.log(pl1);
|
||||
|
||||
// Send points lists to redis server
|
||||
client.set("/pl/0",pl0);
|
||||
client.set("/pl/1",pl1);
|
||||
client.set("/pl/0/0",pl0);
|
||||
client.set("/pl/0/1",pl1);
|
||||
|
||||
// Quit
|
||||
client.quit()
|
||||
|
@ -26,12 +26,12 @@ def rgb2int(r,g,b):
|
||||
pl1 = [(100,300,rgb2int(255,255,255)),(200,300,rgb2int(255,255,255)),(200,200,rgb2int(255,255,255)),(100,200,rgb2int(255,255,255))]
|
||||
|
||||
# Send to laser 0 (see mainy.conf)
|
||||
r.set('/pl/0', str(pl0))
|
||||
r.set('/pl/0/0', str(pl0))
|
||||
|
||||
# Send to laser 1 (see mainy.conf)
|
||||
r.set('/pl/1', str(pl1))
|
||||
|
||||
r.set('/pl/2', str(pl1))
|
||||
r.set('/pl/0/1', str(pl1))
|
||||
# Send to laser 2 (see mainy.conf)
|
||||
r.set('/pl/0/2', str(pl1))
|
||||
|
||||
'''
|
||||
You can also use PolyLineOneColor or rPolylineOneColor to stack n point lists to build a "frame"
|
||||
|
119
font1.py
Executable file
@ -0,0 +1,119 @@
|
||||
# coding=UTF-8
|
||||
"""
|
||||
|
||||
LJ Font 1
|
||||
v0.7.0
|
||||
|
||||
|
||||
LICENCE : CC
|
||||
by Sam Neurohack
|
||||
from /team/laser
|
||||
|
||||
|
||||
"""
|
||||
import gstt
|
||||
|
||||
def DigitsDots(number,color):
|
||||
dots =[]
|
||||
#print ASCII_GRAPHICS[ord(char) - 48]
|
||||
for dot in ASCII_GRAPHICS[number]:
|
||||
#print dot
|
||||
dots.append((gstt.xy_center[0]+dot[0],gstt.xy_center[1]+dot[1],color))
|
||||
#self.point_list.append((xy + (c,)))
|
||||
return dots
|
||||
|
||||
ASCII_GRAPHICS = [
|
||||
|
||||
#implementé
|
||||
|
||||
[(-50,30), (-30,-30), (30,-30), (10,30), (-50,30)], #0
|
||||
[(-20,30), (0,-30), (-20,30)], #1
|
||||
[(-30,-10), (0,-30), (30,-10), (30,0), (-30,30), (30,30)], #2
|
||||
[(-30,-30), (0,-30), (30,-10), (0,0), (30,10), (0,30), (-30,30)], #3
|
||||
[(30,10), (-30,10), (0,-30), (0,30)], #4
|
||||
[(30,-30), (-30,-30), (-30,0), (0,0), (30,10), (0,30), (-30,30)], #5
|
||||
[(30,-30), (0,-30), (-30,-10), (-30,30), (0,30), (30,10), (30,0), (-30,0)], #6
|
||||
[(-30,-30), (30,-30), (-30,30)], #7
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30), (-30,0), (30,0)], #8
|
||||
[(30,0), (-30,0), (-30,-10), (0,-30), (30,-30), (30,10), (0,30), (-30,30)], #9
|
||||
|
||||
# A implementer
|
||||
[(-30,10), (30,-10), (30,10), (0,30), (-30,10), (-30,-10), (0,-30), (30,-10)], #:
|
||||
[(-30,-10), (0,-30), (0,30)], [(-30,30), (30,30)], #;
|
||||
[(-30,-10), (0,-30), (30,-10), (30,0), (-30,30), (30,30)], #<
|
||||
[(-30,-30), (0,-30), (30,-10), (0,0), (30,10), (0,30), (-30,30)], #=
|
||||
[(30,10), (-30,10), (0,-30), (0,30)], #>
|
||||
[(30,-30), (-30,-30), (-30,0), (0,0), (30,10), (0,30), (-30,30)], #?
|
||||
[(30,-30), (0,-30), (-30,-10), (-30,30), (0,30), (30,10), (30,0), (-30,0)], #@
|
||||
|
||||
# Implementé
|
||||
|
||||
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (30,0), (-30,0)], #A
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (30,0), (-30,0)], #A
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30), (-30,0), (30,0)], #B
|
||||
[(30,30), (-30,30), (-30,-30), (30,-30)], #C
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30)], #D
|
||||
[(30,30), (-30,30), (-30,-0), (30,0), (-30,0), (-30,-30), (30,-30)], #E
|
||||
[(-30,30), (-30,-0), (30,0), (-30,0), (-30,-30), (30,-30)], #F
|
||||
[(0,0), (30,0), (30,30), (-30,30), (-30,-30),(30,-30)], #G
|
||||
[(-30,-30), (-30,30), (-30,0), (30,0), (30,30), (30,-30)], #H
|
||||
[(0,30), (0,-30)], #I
|
||||
[(-30,30), (0,-30), (0,-30), (-30,-30), (30,-30)], #J
|
||||
[(-30,-30), (-30,30), (-30,0), (30,-30), (-30,0), (30,30)], #K
|
||||
[(30,30), (-30,30), (-30,-30)], #L
|
||||
[(-30,30), (-30,-30), (0,0), (30,-30), (30,30)], #M
|
||||
[(-30,30), (-30,-30), (30,30), (30,-30)], #N
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30)], #O
|
||||
[(-30,0), (30,0), (30,-30), (-30,-30), (-30,30)], #P
|
||||
[(30,30), (30,-30), (-30,-30), (-30,30), (30,30),(35,35)], #Q
|
||||
[(-30,30), (-30,-30), (30,-30), (30,0), (-30,0), (30,30)], #R
|
||||
[(30,-30), (-30,-30), (-30,0), (30,0), (30,30), (-30,30)], #S
|
||||
[(0,30), (0,-30), (-30,-30), (30,-30)], #T
|
||||
[(-30,-30), (-30,30), (30,30), (30,-30)], #U
|
||||
[(-30,-30), (0,30), (30,-30)], #V
|
||||
[(-30,-30), (-30,30), (0,0), (30,30), (30,-30)], #W
|
||||
[(-30,30), (30,-30)], [(-30,-30), (30,30)], #X
|
||||
[(0,30), (0,0), (30,-30), (0,0), (-30,-30)], #Y
|
||||
[(30,30), (-30,30), (30,-30), (-30,-30)], #Z
|
||||
|
||||
# A implementer
|
||||
|
||||
[(-30,-10), (0,-30), (0,30)], [(-30,30), (30,30)], #[
|
||||
[(-30,-10), (0,-30), (30,-10), (30,0), (-30,30), (30,30)], #\
|
||||
[(-30,-30), (0,-30), (30,-10), (0,0), (30,10), (0,30), (-30,30)], #]
|
||||
[(30,10), (-30,10), (0,-30), (0,30)], #^
|
||||
[(30,-30), (-30,-30), (-30,0), (0,0), (30,10), (0,30), (-30,30)], #_
|
||||
[(30,-30), (0,-30), (-30,-10), (-30,30), (0,30), (30,10), (30,0), (-30,0)], #`
|
||||
|
||||
# Implementé
|
||||
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (20,0), (-20,0)], #a
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (-20,20), (-20,0), (20,0)], #b
|
||||
[(20,20), (-20,20), (-20,-20), (20,-20)], #c
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (-20,20)], #d
|
||||
[(20,20), (-20,20), (-20,-0), (20,0), (-20,0), (-20,-20), (20,-20)], #e
|
||||
[(-20,20), (-20,-0), (20,0), (-20,0), (-20,-20), (20,-20)], #f
|
||||
[(0,0), (20,0), (20,20), (-20,20), (-20,-20),(20,-20)], #g
|
||||
[(-20,-20), (-20,20), (-20,0), (20,0), (20,20), (20,-20)], #H
|
||||
[(0,20), (0,-20)], #I
|
||||
[(-20,20), (0,-20), (0,-20), (-20,-20), (20,-20)], #J
|
||||
[(-20,-20), (-20,20), (-20,0), (20,-20), (-20,0), (20,20)], #K
|
||||
[(20,20), (-20,20), (-20,-20)], #L
|
||||
[(-20,20), (-20,-20), (0,0), (20,-20), (20,20)], #M
|
||||
[(-20,20), (-20,-20), (20,20), (20,-20)], #N
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (-20,20)], #O
|
||||
[(-20,0), (20,0), (20,-20), (-20,-20), (-20,20)], #P
|
||||
[(20,20), (20,-20), (-20,-20), (-20,20), (20,20),(25,25)], #Q
|
||||
[(-20,20), (-20,-20), (20,-20), (20,0), (-20,0), (20,20)], #R
|
||||
[(20,-20), (-20,-20), (-20,0), (20,0), (20,20), (-20,20)], #S
|
||||
[(0,20), (0,-20), (-20,-20), (20,-20)], #T
|
||||
[(-20,-20), (-20,20), (20,20), (20,-20)], #U
|
||||
[(-20,-20), (0,20), (20,-20)], #V
|
||||
[(-20,-20), (-20,20), (0,0), (20,20), (20,-20)], #W
|
||||
[(-20,20), (20,-20)], [(-20,-20), (20,20)], #X
|
||||
[(0,20), (0,0), (20,-20), (0,0), (-20,-20)], #Y
|
||||
[(20,20), (-20,20), (20,-20), (-20,-20)], #Z
|
||||
|
||||
[(-2,15), (2,15)] # Point a la place de {
|
||||
]
|
109
gstt.py
@ -1,9 +1,14 @@
|
||||
# coding=UTF-8
|
||||
'''
|
||||
Etat global (anciennement singleton de la classe GameState + autres VARIABLES nécessaires partout)"
|
||||
'''
|
||||
|
||||
#from globalVars import *
|
||||
LJ Global state
|
||||
v0.8.0
|
||||
|
||||
LICENCE : CC
|
||||
by Sam Neurohack, Loloster, pclf
|
||||
from /team/laser
|
||||
|
||||
'''
|
||||
|
||||
#ConfigName = "setexample.conf"
|
||||
ConfigName = "mainy.conf"
|
||||
@ -24,15 +29,16 @@ nozoscip = '192.168.1.15'
|
||||
|
||||
# gstt.Laser select to what laser modifcation will occur.
|
||||
# Can be changed with /noteon 16-23
|
||||
Laser = 2
|
||||
Laser = 0
|
||||
|
||||
# gstt.simuPL select what point list number to display in pygame simulator
|
||||
# gstt.simuPL select what point list number to display in webUI simulator
|
||||
# Can be changed with /noteon 24-31
|
||||
simuPL = 1
|
||||
|
||||
# gstt.laserIPS. Will be overridden by the ConfigName (see below) file values
|
||||
lasersIPS = ['192.168.1.5','192.168.1.6','192.168.1.3','192.168.1.4']
|
||||
|
||||
ClientNumber = 1
|
||||
|
||||
# gstt.kpps stores kpps for each laser.
|
||||
# ** Will be overridden by the ConfigName (see below) file values **
|
||||
@ -57,54 +63,19 @@ lstt_points = [[0], [0], [0], [0]]
|
||||
swapX = [1,1,1,-1]
|
||||
swapY = [1,1,1,-1]
|
||||
|
||||
maxCurvesByLaser = 4
|
||||
|
||||
|
||||
# For glitch art : change position and decrease number of points added by newdac.py
|
||||
# shortline for lines shorter than 4000 (in etherdream coordinates)
|
||||
# i.e (0.25,3) means add 3 points at 25% on the line.
|
||||
stepshortline = [(1.0, 8)]
|
||||
stepslongline = [(0.25, 3), (0.75, 3), (1.0, 10)]
|
||||
|
||||
|
||||
#curveColor = [255,0,0] * maxCurvesByLaser
|
||||
#curveColor = [[0 for _ in range(3)] for _ in range(maxCurvesByLaser)]
|
||||
curveColor = [[255 for _ in range(3)] for _ in range(maxCurvesByLaser)]
|
||||
colorX = [[255 for _ in range(3)] for _ in range(maxCurvesByLaser)]
|
||||
colorY = [[255 for _ in range(3)] for _ in range(maxCurvesByLaser)]
|
||||
offsetX = [0] * maxCurvesByLaser
|
||||
offsetY = [0] * maxCurvesByLaser
|
||||
curveNumber = 0
|
||||
Curve = curveNumber
|
||||
XTimeAxe=30000
|
||||
YTimeAxe=30000
|
||||
|
||||
#curveX = [255,255,255] * maxCurvesByLaser
|
||||
#curveY = [255,255,255] * maxCurvesByLaser
|
||||
|
||||
point = [0,0,0]
|
||||
|
||||
# gstt.colormode select what to display. Can be changed with /noteon 57-64
|
||||
colormode = 0
|
||||
color = [255,255,255]
|
||||
newcolor = 0
|
||||
|
||||
surpriseoff = 10
|
||||
surpriseon = 50
|
||||
surprisey = -10
|
||||
surprisex = -10
|
||||
|
||||
|
||||
cc = [0] * 256
|
||||
lfo = [0] * 10
|
||||
osc = [0] * 255
|
||||
oscInUse = [0] * 255
|
||||
knob = [0] * 33
|
||||
|
||||
stars0=[]
|
||||
stars1=[]
|
||||
stars2=[]
|
||||
#stars3=[]
|
||||
# Viewer distance (cc 21)
|
||||
cc[21]=60
|
||||
viewer_distance = cc[21] * 8
|
||||
@ -116,33 +87,6 @@ fov = 4 * cc[22]
|
||||
|
||||
JumpFlag =0
|
||||
|
||||
# nice X (cc 5) Y (cc 6) curve at first
|
||||
cc[5] = cc[6] = 60
|
||||
|
||||
# Dot mode start at middle screen
|
||||
cc[1] = cc[2] = 63
|
||||
|
||||
note = 0
|
||||
velocity = 0
|
||||
|
||||
WingHere = -1
|
||||
BhorealHere = -1
|
||||
LaunchHere = -1
|
||||
BhorLeds = [0] * 64
|
||||
|
||||
oscx = 0
|
||||
oscy = 0
|
||||
oscz = 0
|
||||
|
||||
|
||||
# Ai Parameters
|
||||
|
||||
aivelocity = 0.5
|
||||
aiexpressivity = 0.5
|
||||
aisensibility = 0.5
|
||||
aibeauty = 0.5
|
||||
|
||||
|
||||
# OSC ports
|
||||
#temporaray fix hack : iport=nozoport
|
||||
iport = 8001 #LJay (bhorosc) input port
|
||||
@ -152,41 +96,10 @@ nozoport=8001 #nozosc.py sending port to LJay (main.py)
|
||||
nozuport=0 #linux serial usb port connecting nozoid devices ACM0 by default
|
||||
|
||||
|
||||
X = [0] * maxCurvesByLaser
|
||||
Y = [0] * maxCurvesByLaser
|
||||
|
||||
# No rotation X (cc 29) Y (cc 30) Z (cc 31) at first
|
||||
cc[29] = cc[30] = cc[31] = prev_cc29 = 0
|
||||
prev_cc29 = prev_cc30 = prev_cc31 = -1
|
||||
|
||||
angleX = 0
|
||||
angleY = 0
|
||||
angleZ = 0
|
||||
|
||||
tomidi = False # currently tomidi bypass all other directions
|
||||
todmx = False
|
||||
toled = False
|
||||
tolaser = True
|
||||
tosynth = False
|
||||
|
||||
sernozoid = ""
|
||||
nozoid = ""
|
||||
serdmx = ""
|
||||
newnumber = ""
|
||||
oldnumber = ""
|
||||
|
||||
'''
|
||||
# will be overrided but settings.conf values.
|
||||
# legacy one laser only values
|
||||
centerx = LASER_CENTER_X
|
||||
centery = LASER_CENTER_Y
|
||||
zoomx = LASER_ZOOM_X
|
||||
zoomy = LASER_ZOOM_Y
|
||||
sizex = LASER_SIZE_X
|
||||
sizey = LASER_SIZE_Y
|
||||
finangle = LASER_ANGLE
|
||||
'''
|
||||
|
||||
# multilasers arrays
|
||||
# will be overrided but settings.conf values.
|
||||
centerX = [0,0,0,0]
|
||||
|
@ -174,17 +174,18 @@ def EDpoint(mylaser,(pygamex,pygamey)):
|
||||
x = (gstt.xy_center[0] + ((XX * CosANGLE) - (YY * SinANGLE)) - gstt.xy_center[0]) * gstt.zoomX[mylaser] + gstt.centerX[mylaser]
|
||||
y = (gstt.xy_center[1] + ((XX * SinANGLE) + (YY * CosANGLE)) - gstt.xy_center[1]) * gstt.zoomY[mylaser] + gstt.centerY[mylaser]
|
||||
|
||||
if gstt.debug >0:
|
||||
if gstt.debug >1:
|
||||
|
||||
#print "global center :", xy_center
|
||||
|
||||
print "EDpoint computing..."
|
||||
print "Laser :", mylaser, "center at : ", gstt.centerX[mylaser], gstt.centerY[mylaser]
|
||||
print "Pygame point",pygamex,",",pygamey
|
||||
'''
|
||||
print "swaps : ", (gstt.swapX[mylaser]), str(gstt.swapY[mylaser])
|
||||
print "zooms : ", gstt.zoomX[mylaser], gstt.zoomY[mylaser]
|
||||
print "angles : ", gstt.finANGLE[mylaser]
|
||||
'''
|
||||
print "result : ", x * gstt.swapX[mylaser] , y * gstt.swapY[mylaser]
|
||||
print "Result point : ", x * gstt.swapX[mylaser] , y * gstt.swapY[mylaser]
|
||||
return [x * gstt.swapX[mylaser] , y * gstt.swapY[mylaser]]
|
||||
|
||||
'''
|
||||
|
@ -1,16 +1,10 @@
|
||||
#!/bin/bash
|
||||
sudo apt install python-pip
|
||||
sudo apt install git
|
||||
pip uninstall serial
|
||||
pip uninstall rtmidi
|
||||
pip install libasound2-dev python-dev libpython-dev libjack-dev
|
||||
pip install pysimpledmx
|
||||
sudo apt install redis
|
||||
pip install numpy
|
||||
pip install scipy
|
||||
pip install mido
|
||||
pip install python-rtmidi
|
||||
git clone https://github.com/ptone/pyosc --depth 1 /tmp/pyosc && cd /tmp/pyosc && sudo ./setup.py install
|
||||
pip install pyserial
|
||||
pip install redis
|
||||
|
||||
|
||||
|
82
las.py
@ -41,6 +41,9 @@ def NewEDH(laser):
|
||||
|
||||
print "New EDH requested for laser ", laser
|
||||
settings.Write()
|
||||
print "Settings saving swapX ", gstt.swapX[laser]
|
||||
print "Settings saving swapY ", gstt.swapY[laser]
|
||||
|
||||
homographyp.newEDH(laser)
|
||||
|
||||
#r.set('/order/'+str(laser), 1)
|
||||
@ -79,13 +82,59 @@ def Resampler(laser,lsteps):
|
||||
r.set('/order/'+str(laser), 4)
|
||||
|
||||
|
||||
def LasClientChange(clientnumber):
|
||||
|
||||
#
|
||||
if r.get("/pl/"+str(clientnumber)+"/0") != None:
|
||||
|
||||
print "Switching to laser client", clientnumber
|
||||
gstt.ClientNumber = clientnumber
|
||||
r.set('/clientkey', "/pl/"+str(clientnumber)+"/")
|
||||
print "clientkey set to", "/pl/"+str(clientnumber)+"/"
|
||||
for laserid in xrange(0,gstt.LaserNumber):
|
||||
r.set('/order/'+str(laserid), 5)
|
||||
else:
|
||||
print "Error : new laser client",clientnumber,"must send points first to","/pl/"+str(clientnumber)+"/0"
|
||||
|
||||
|
||||
|
||||
def NoteOn(note):
|
||||
print "NoteOn", note
|
||||
|
||||
# Change laser client
|
||||
if note < 8:
|
||||
LasClientChange(note)
|
||||
|
||||
# New PL displayed
|
||||
if note > 23 and note < 32:
|
||||
if note - 24 > gstt.LaserNumber -1:
|
||||
print "Only",gstt.LaserNumber,"asked, you dum ass !"
|
||||
else:
|
||||
gstt.Laser = note -24
|
||||
print "Current Laser switched to",gstt.Laser
|
||||
#LasClientChange(gstt.Laser)
|
||||
|
||||
|
||||
|
||||
def handler(oscpath, args):
|
||||
|
||||
pathlength = len(oscpath)
|
||||
if pathlength == 3:
|
||||
laser = int(oscpath[2])
|
||||
print ""
|
||||
print "Handler"
|
||||
|
||||
if oscpath[1] == "client" or oscpath[1] =="noteon":
|
||||
if oscpath[1] == "client":
|
||||
LasClientChange(int(args[0]))
|
||||
else:
|
||||
NoteOn(int(args[0]))
|
||||
|
||||
else:
|
||||
laser = int(oscpath[3])
|
||||
pathlength = len(oscpath)
|
||||
if pathlength == 3:
|
||||
laser = int(oscpath[2])
|
||||
else:
|
||||
laser = int(oscpath[3])
|
||||
|
||||
print "args[0] :",args[0]," ", type(args[0])
|
||||
|
||||
# /grid/lasernumber value (0 or 1)
|
||||
if oscpath[1] == "grid":
|
||||
@ -102,14 +151,13 @@ def handler(oscpath, args):
|
||||
if oscpath[1] == "black":
|
||||
|
||||
if args[0] == "1":
|
||||
print "Grid requested for laser ", laser
|
||||
print "Black requested for laser ", laser
|
||||
BlackOn(laser)
|
||||
else:
|
||||
print "No grid for laser ", laser
|
||||
print "No black for laser ", laser
|
||||
UserOn(laser)
|
||||
|
||||
|
||||
|
||||
# /ip/lasernumber value
|
||||
if oscpath[1] == "ip":
|
||||
print "New IP for laser ", laser
|
||||
@ -120,19 +168,20 @@ def handler(oscpath, args):
|
||||
# /kpps/lasernumber value
|
||||
# Live change of kpps is not implemented in newdac.py. Change will effect next startup.
|
||||
if oscpath[1] == "kpps":
|
||||
print "New kpps for laser ", laser, " next startup", args[0]
|
||||
print "New kpps for laser ", laser, " next startup", int(args[0])
|
||||
gstt.kpps[laser]= int(args[0])
|
||||
settings.Write()
|
||||
|
||||
# /angle/lasernumber value
|
||||
if oscpath[1] == "angle":
|
||||
print "New Angle modification for laser ", oscpath[2], ":", args[0]
|
||||
gstt.finANGLE[laser] += int(args[0])
|
||||
print "New Angle modification for laser ", oscpath[2], ":", float(args[0])
|
||||
gstt.finANGLE[laser] += float(args[0])
|
||||
NewEDH(laser)
|
||||
"New angle", gstt.finANGLE[laser]
|
||||
|
||||
# /intens/lasernumber value
|
||||
if oscpath[1] == "intens":
|
||||
print "New intensity requested for laser ", laser, ":", args[0]
|
||||
print "New intensity requested for laser ", laser, ":", int(args[0])
|
||||
print "Change not implemented yet"
|
||||
|
||||
|
||||
@ -156,24 +205,27 @@ def handler(oscpath, args):
|
||||
# /swap/X/lasernumber value (0 or 1)
|
||||
if oscpath[1] == "swap" and oscpath[2] == "X":
|
||||
|
||||
print "swapX was", gstt.swapX[laser]
|
||||
if args[0] == "0":
|
||||
print "swap X : -1 for laser ", laser
|
||||
print "swap X -1 for laser ", laser
|
||||
gstt.swapX[laser]= -1
|
||||
NewEDH(laser)
|
||||
|
||||
else:
|
||||
print "swap X : 1 for laser ", laser
|
||||
print "swap X 1 for laser ", laser
|
||||
gstt.swapX[laser]= 1
|
||||
NewEDH(laser)
|
||||
|
||||
# /swap/Y/lasernumber value (0 or 1)
|
||||
if oscpath[1] == "swap" and oscpath[2] == "Y":
|
||||
|
||||
print "swapY was", gstt.swapX[laser]
|
||||
if args[0] == "0":
|
||||
print "swap Y : -1 for laser ", laser
|
||||
print "swap Y -1 for laser ", laser
|
||||
gstt.swapY[laser]= -1
|
||||
NewEDH(laser)
|
||||
else:
|
||||
print "swap Y : 1 for laser ", laser
|
||||
print "swap Y 1 for laser ", laser
|
||||
gstt.swapY[laser]= 1
|
||||
NewEDH(laser)
|
||||
|
||||
|
32
mainy.conf
@ -1,8 +1,8 @@
|
||||
[General]
|
||||
set = 5
|
||||
curve = 0
|
||||
lasernumber = 1
|
||||
debug = 1
|
||||
lasernumber = 2
|
||||
debug = 0
|
||||
ljayserverip = 127.0.0.1
|
||||
nozoscip = 127.0.0.1
|
||||
bhoroscip = 127.0.0.1
|
||||
@ -11,15 +11,15 @@ bhoroscip = 127.0.0.1
|
||||
color = -1
|
||||
ip = 192.168.1.4
|
||||
kpps = 25000
|
||||
centerx = 0
|
||||
centery = -650
|
||||
zoomx = 49.2
|
||||
zoomy = 65.0
|
||||
centerx = -695
|
||||
centery = -2156
|
||||
zoomx = 32.2
|
||||
zoomy = 29.0
|
||||
sizex = 31450
|
||||
sizey = 32000
|
||||
finangle = 0.0
|
||||
finangle = 17.0
|
||||
swapx = 1
|
||||
swapy = 1
|
||||
swapy = -1
|
||||
lsteps = [ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
|
||||
warpdest = [[-1500., 1500.],
|
||||
[ 1500., 1500.],
|
||||
@ -30,20 +30,20 @@ warpdest = [[-1500., 1500.],
|
||||
color = -1
|
||||
ip = 192.168.1.5
|
||||
kpps = 25000
|
||||
centerx = 0
|
||||
centery = 0
|
||||
zoomx = 48.5
|
||||
centerx = -200
|
||||
centery = -357
|
||||
zoomx = 81.5
|
||||
zoomy = 50.1
|
||||
sizex = 32000
|
||||
sizey = 32000
|
||||
finangle = 0.0
|
||||
swapx = 1
|
||||
swapy = 1
|
||||
swapx = -1
|
||||
swapy = -1
|
||||
lsteps = [ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
|
||||
warpdest = [[-1500., 1500.],
|
||||
[ 1500., 1500.],
|
||||
[ 1500.,-1500.],
|
||||
[-1500.,-1500.]]
|
||||
[ 1500., 1500.],
|
||||
[ 1500.,-1500.],
|
||||
[-1500.,-1500.]]
|
||||
|
||||
[laser2]
|
||||
color = -1
|
||||
|
@ -33,6 +33,7 @@ import random, ast
|
||||
import newdacp
|
||||
import homographyp
|
||||
import las
|
||||
import font1
|
||||
|
||||
|
||||
from OSC import OSCServer, OSCClient, OSCMessage
|
||||
@ -43,6 +44,7 @@ import types, thread, time
|
||||
r = redis.StrictRedis(host=gstt.LjayServerIP , port=6379, db=0)
|
||||
args =[0,0]
|
||||
|
||||
|
||||
def dac_process(number, pl):
|
||||
while True:
|
||||
try:
|
||||
@ -68,7 +70,7 @@ def dac_process(number, pl):
|
||||
# webUI server
|
||||
#
|
||||
|
||||
|
||||
print "Laser client number :",gstt.ClientNumber
|
||||
serverIP = gstt.LjayServerIP
|
||||
print "Redis IP :", serverIP
|
||||
|
||||
@ -166,17 +168,20 @@ def sendnozosc(oscaddress,oscargs=''):
|
||||
def handler(path, tags, args, source):
|
||||
|
||||
oscpath = path.split("/")
|
||||
print "debug", gstt.debug
|
||||
print ""
|
||||
print "OSC said : ", path, oscpath, args
|
||||
#print "debug", gstt.debug
|
||||
if gstt.debug >0:
|
||||
print ""
|
||||
print "default handler"
|
||||
print "Bhorosc said : ", path, oscpath, args
|
||||
print "OSC said : ", path, oscpath, args
|
||||
sendWSall(path + " " + str(args[0]))
|
||||
las.handler(oscpath,args)
|
||||
|
||||
|
||||
# RAW OSC Frame available ?
|
||||
def osc_frame():
|
||||
#print 'oscframe'
|
||||
# clear timed_out flag
|
||||
oscserver.timed_out = False
|
||||
# handle all pending requests then return
|
||||
@ -185,17 +190,9 @@ def osc_frame():
|
||||
|
||||
|
||||
|
||||
# OSC Thread. Bhorosc handler and Automated status sender to UI.
|
||||
# OSC Thread. OSC handler and Automated status sender to UI.
|
||||
def osc_thread():
|
||||
|
||||
#print "Will use Redis server IP ", serverIP
|
||||
|
||||
'''
|
||||
r = redis.StrictRedis(host=serverIP, port=6379, db=0)
|
||||
print "Connection to redis server.."
|
||||
print "Running..."
|
||||
'''
|
||||
|
||||
while True:
|
||||
try:
|
||||
while True:
|
||||
@ -234,17 +231,8 @@ def osc_thread():
|
||||
# last number of points sent to etherdream buffer
|
||||
sendWSall("/points/" + str(laserid) + " " + str(r.get('/cap/'+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
|
||||
|
||||
'''
|
||||
for pl in range(0,1):
|
||||
bhorosc.sendosc("/plframe/" + str(pl),"")
|
||||
for plpoint in range(0,len(gstt.PL[pl])):
|
||||
bhorosc.sendosc("/plpoint/" + str(pl),"")
|
||||
'''
|
||||
|
||||
print "Sending simu frame from",'/pl/'+str(gstt.ClientNumber)+'/'+str(gstt.Laser)
|
||||
sendWSall("/plframe" +" "+ r.get('/pl/'+str(gstt.ClientNumber)+'/'+str(gstt.Laser)))
|
||||
|
||||
|
||||
except Exception as e:
|
||||
@ -295,8 +283,9 @@ def message_received(client, server, message):
|
||||
print ("")
|
||||
print("WS Client(%d) said: %s" % (client['id'], message))
|
||||
|
||||
print("WS Client(%d) said: %s" % (client['id'], message))
|
||||
oscpath = message.split(" ")
|
||||
args[0] = float(oscpath[1])
|
||||
args[0] = str(oscpath[1])
|
||||
#print oscpath[0].split("/"),oscpath[1]
|
||||
las.handler(oscpath[0].split("/"),args)
|
||||
|
||||
@ -306,10 +295,6 @@ def message_received(client, server, message):
|
||||
sendbhorosc("/on")
|
||||
else:
|
||||
sendbhorosc("/off")
|
||||
else:
|
||||
|
||||
print "sending to bhorosc",oscpath[0],oscpath[1]
|
||||
sendbhorosc(oscpath[0],oscpath[1])
|
||||
|
||||
# if needed a loop back : WS Client -> server -> WS Client
|
||||
#sendWSall("ws"+message)
|
||||
@ -326,30 +311,23 @@ def sendWSall(message):
|
||||
|
||||
|
||||
|
||||
# Some random lists for all lasers at launch.
|
||||
# Some random lists for all lasers at launch for laser client gstt.ClientNumber
|
||||
print ""
|
||||
print "Creating startup point lists..."
|
||||
print "Creating startup point lists for client",gstt.ClientNumber,"..."
|
||||
|
||||
random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)]
|
||||
if r.set('/pl/0', str(random_points)) == True:
|
||||
print "/pl/0 ", ast.literal_eval(r.get('/pl/0'))
|
||||
|
||||
random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)]
|
||||
if r.set('/pl/1', str(random_points)) == True:
|
||||
print "/pl/1 ", ast.literal_eval(r.get('/pl/1'))
|
||||
digit_points = font1.DigitsDots(gstt.ClientNumber,16711935)
|
||||
|
||||
random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)]
|
||||
if r.set('/pl/2', str(random_points)) == True:
|
||||
print "/pl/2 ", ast.literal_eval(r.get('/pl/2'))
|
||||
|
||||
random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)]
|
||||
if r.set('/pl/3', str(random_points)) == True:
|
||||
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 the laser client number at startup -> tell all 4 laser process to USER PLs
|
||||
for laserid in range(0,gstt.LaserNumber):
|
||||
|
||||
if r.set('/pl/'+str(gstt.ClientNumber)+'/'+str(laserid), str(digit_points)) == True:
|
||||
print "/pl/"+str(gstt.ClientNumber)+"/"+str(laserid)+" ", ast.literal_eval(r.get('/pl/'+str(gstt.ClientNumber)+'/'+str(laserid)))
|
||||
|
||||
r.set('/order/'+str(laserid), 0)
|
||||
|
||||
if r.set("/clientkey","/pl/"+str(gstt.ClientNumber)+"/")==True:
|
||||
print "sent clientkey : /pl/"+str(gstt.ClientNumber)+"/"
|
||||
|
||||
print ""
|
||||
print "Etherdream connection check is NOT DISPLAYED"
|
||||
@ -388,10 +366,12 @@ try:
|
||||
print "Launching OSC server..."
|
||||
print "at", bhoroscIPin, "port",str(bhoroscPORTin)
|
||||
print "Will update webUI dac status every second"
|
||||
thread.start_new_thread(osc_thread, ())
|
||||
|
||||
oscserver.addMsgHandler( "/noteon", las.NoteOn )
|
||||
# Default OSC handler for all OSC incoming message
|
||||
oscserver.addMsgHandler("default", handler)
|
||||
thread.start_new_thread(osc_thread, ())
|
||||
|
||||
|
||||
|
||||
#print server
|
||||
print ""
|
||||
@ -430,6 +410,11 @@ finally:
|
||||
print "Fin des haricots"
|
||||
|
||||
|
||||
'''
|
||||
Some code previously used, for reference :
|
||||
|
||||
random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)]
|
||||
'''
|
||||
|
||||
|
||||
|
||||
|
24
newdacp.py
@ -235,6 +235,8 @@ class DAC(object):
|
||||
|
||||
#print "init"
|
||||
self.mylaser = mylaser
|
||||
self.clientkey = r.get("/clientkey")
|
||||
#print "Laser",self.mylaser,"Got clientkey", self.clientkey
|
||||
#print "DAC", self.mylaser, "Handler process, connecting to", gstt.lasersIPS[mylaser]
|
||||
self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.connstatus = self.conn.connect_ex((gstt.lasersIPS[mylaser], port))
|
||||
@ -249,17 +251,18 @@ class DAC(object):
|
||||
self.PL = PL
|
||||
|
||||
# Lower case pl is the actual point list coordinates
|
||||
self.pl = ast.literal_eval(r.get('/pl/'+str(self.mylaser)))
|
||||
print "Laser",self.mylaser,"asking for ckey", self.clientkey+str(self.mylaser)
|
||||
self.pl = ast.literal_eval(r.get(self.clientkey + str(self.mylaser)))
|
||||
#if self.mylaser ==0:
|
||||
#print "DAC Init Laser", self.mylaser
|
||||
#print "pl :", self.pl
|
||||
#print "EDH/"+str(self.mylaser),r.get('/EDH/'+str(self.mylaser))
|
||||
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)
|
||||
else:
|
||||
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]
|
||||
|
||||
'''
|
||||
@ -355,7 +358,8 @@ class DAC(object):
|
||||
if order == 0:
|
||||
|
||||
# USER point list
|
||||
self.pl = ast.literal_eval(r.get('/pl/'+str(self.mylaser)))
|
||||
self.pl = ast.literal_eval(r.get(self.clientkey+str(self.mylaser)))
|
||||
|
||||
else:
|
||||
|
||||
# Get the new EDH
|
||||
@ -376,7 +380,7 @@ class DAC(object):
|
||||
self.pl = grid_points
|
||||
|
||||
|
||||
# Resampler Modification
|
||||
# Resampler Change
|
||||
if order == 4:
|
||||
self.resampler = ast.literal_eval(r.get('/resampler/'+str(self.mylaser)))
|
||||
print "newdacp resetting lsteps for", self.mylaser, ":",self.resampler
|
||||
@ -384,6 +388,16 @@ class DAC(object):
|
||||
gstt.stepslongline[0] = self.resampler[1]
|
||||
gstt.stepslongline[1] = self.resampler[2]
|
||||
gstt.stepslongline[2] = self.resampler[3]
|
||||
# Back to user point list order
|
||||
r.set('/order/'+str(self.mylaser), 0)
|
||||
|
||||
# Client Key change
|
||||
if order == 5:
|
||||
print "Laser",self.mylaser,"new clientkey",
|
||||
self.clientkey = r.get('/clientkey')
|
||||
# Back to user point list order
|
||||
r.set('/order/'+str(self.mylaser), 0)
|
||||
|
||||
|
||||
|
||||
'''
|
||||
|
31
settings.py
@ -40,7 +40,6 @@ def Write():
|
||||
config.set(laser, 'swapx', str(gstt.swapX[i]))
|
||||
config.set(laser, 'swapy', str(gstt.swapY[i]))
|
||||
config.set(laser, 'warpdest', np.array2string(gstt.warpdest[i], precision=2, separator=',',suppress_small=True))
|
||||
|
||||
config.write(open(gstt.ConfigName,'w'))
|
||||
|
||||
|
||||
@ -76,33 +75,3 @@ print "* Reading", gstt.ConfigName, "setup file.*"
|
||||
config = ConfigParser.ConfigParser()
|
||||
config.read(gstt.ConfigName)
|
||||
|
||||
|
||||
|
||||
# Save all points for a given "shape" (=['Windows','0']) shapecoord is a list
|
||||
# in any section of the mapping conf file
|
||||
def MappingWrite(sections, shape, shapecoord):
|
||||
|
||||
shapestr = " ".join(str(x) for x in shapecoord)
|
||||
config.set(sections[gstt.CurrentSection], shape, shapestr.replace("] [","],["))
|
||||
config.write(open(gstt.ConfigName,'w'))
|
||||
|
||||
def MappingWriteSection(sections, shape, shapecoord):
|
||||
|
||||
shapestr = " ".join(str(x) for x in shapecoord)
|
||||
shapestr = "[" + shapestr.replace("] [","],[") + "]"
|
||||
config.set(sections, shape, shapestr)
|
||||
config.write(open(gstt.ConfigName,'w'))
|
||||
|
||||
# Get a list of all points (="Corners") for a given "shape" = [section,option] like ['Windows','0']
|
||||
def MappingRead(shape):
|
||||
archi = ast.literal_eval(config.get(shape[0], shape[1]))
|
||||
return archi
|
||||
|
||||
|
||||
# Get shape numbers (i.e of windows in Windows section)
|
||||
def Mapping(shape):
|
||||
return len(config.options(shape))
|
||||
|
||||
# Get a list of all sections
|
||||
def MappingSections():
|
||||
return config.sections()
|
||||
|
243
webui/LJ.js
Normal file
@ -0,0 +1,243 @@
|
||||
//
|
||||
// LJ.js v0.7.0
|
||||
//
|
||||
|
||||
|
||||
|
||||
// Web Audio buttons handler
|
||||
|
||||
|
||||
// add a listener for each element.
|
||||
var message="";
|
||||
var log=[];
|
||||
var knobs = document.getElementsByTagName('webaudio-knob');
|
||||
for(var i = 0; i < knobs.length; i++){
|
||||
knobs[i].addEventListener("input",Dump,false);
|
||||
knobs[i].addEventListener("change",Dump,false);
|
||||
}
|
||||
var sliders = document.getElementsByTagName('webaudio-slider');
|
||||
for(var i = 0; i < sliders.length; i++){
|
||||
sliders[i].addEventListener("input",Dump,false);
|
||||
sliders[i].addEventListener("change",Dump,false);
|
||||
}
|
||||
var switches = document.getElementsByTagName('webaudio-switch');
|
||||
for(var i = 0; i < switches.length; i++) {
|
||||
switches[i].addEventListener("change",Dump,false);
|
||||
}
|
||||
// Process button events
|
||||
function Dump(e) {
|
||||
var str="";
|
||||
str=e.type + " : " + e.target.id + " : " + e.target.value + " ";
|
||||
//console.log(str);
|
||||
log.unshift(str);
|
||||
log.length=1;
|
||||
str="";
|
||||
for(var i=19;i>=0;--i) {
|
||||
if(log[i])
|
||||
str+=log[i]+"<br/>";
|
||||
}
|
||||
var evview=document.getElementById("events");
|
||||
evview.innerHTML=str;
|
||||
|
||||
if (e.target.id === "noteon" && e.type ==="input")
|
||||
{
|
||||
console.log("only noteon change are sent not input");
|
||||
}
|
||||
else
|
||||
{
|
||||
console.log(e.target.id)
|
||||
_WS.send("/" + e.target.id + " " + e.target.value);
|
||||
}
|
||||
|
||||
// for /scale : after a change (knob is released) reset knob value to 0
|
||||
if (e.target.id.substring(0,5) === "scale" && e.type === "change") {
|
||||
e.target.value = 0;
|
||||
console.log(e.target.id + "set to 0")
|
||||
_WS.send("/" + e.target.id + " " + e.target.value);
|
||||
}
|
||||
// for /loffset : after a change (knob is released) reset knob value to 0
|
||||
if (e.target.id.substring(0,7) === "loffset" && e.type === "change") {
|
||||
e.target.value = 0;
|
||||
console.log(e.target.id + "set to 0")
|
||||
_WS.send("/" + e.target.id + " " + e.target.value);
|
||||
}
|
||||
// for /angle : after a change (knob is released) reset knob value to 0
|
||||
if (e.target.id.substring(0,5) === "angle" && e.type === "change") {
|
||||
e.target.value = 0;
|
||||
console.log(e.target.id + "set to 0")
|
||||
_WS.send("/" + e.target.id + " " + e.target.value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Websocket Handler
|
||||
|
||||
var pl = "";
|
||||
var pl2 = new Array();
|
||||
var _WS = {
|
||||
uri: 'ws://127.0.0.1:9001/',
|
||||
ws: null,
|
||||
|
||||
|
||||
init : function (e) {
|
||||
_WS.s = new WebSocket(_WS.uri);
|
||||
_WS.s.onopen = function (e) { _WS.onOpen(e); };
|
||||
_WS.s.onclose = function (e) { _WS.onClose(e); };
|
||||
_WS.s.onmessage = function (e) { _WS.onMessage(e); };
|
||||
_WS.s.onerror = function (e) { _WS.onError(e); };
|
||||
},
|
||||
|
||||
onOpen: function () {
|
||||
_WS.showout(_WS.uri);
|
||||
_WS.showout('CONNECTED');
|
||||
},
|
||||
|
||||
onClose: function () {
|
||||
_WS.showout('DISCONNECTED');
|
||||
},
|
||||
|
||||
onMessage: function (e) {
|
||||
var res = e.data.split(" ");
|
||||
//console.log(e.data)
|
||||
switch (res[0].substring(0,6)) {
|
||||
case "/statu":
|
||||
_WS.showstatus(e.data.slice(8));
|
||||
break;
|
||||
case "/plfra":
|
||||
pl = e.data.slice(9);
|
||||
//console.log(pl);
|
||||
pl2 = eval(pl.replace(/[()]/g, ''));
|
||||
//console.log(pl2);
|
||||
break;
|
||||
case "/plpoi":
|
||||
console.log("plpoint");
|
||||
break;
|
||||
case "/clien":
|
||||
console.log("New Client : "+res[1])
|
||||
break
|
||||
default:
|
||||
//console.log(res[0] + " " + res[1])
|
||||
//console.log(res[1])
|
||||
document.getElementById(res[0].slice(1)).value = res[1];
|
||||
_WS.showin(e.data);
|
||||
}
|
||||
//_WS.showin(e.data);
|
||||
},
|
||||
|
||||
onError: function (e) {
|
||||
_WS.showin('<span style="color: red;">ERROR:</span> ' + e.data);
|
||||
},
|
||||
|
||||
showin: function (message) {
|
||||
var divtext = document.getElementById('showin');
|
||||
divtext.innerHTML="";
|
||||
divtext.innerHTML= message.toString();
|
||||
},
|
||||
|
||||
showout: function (message) {
|
||||
var divtext = document.getElementById('showout');
|
||||
divtext.innerHTML="";
|
||||
divtext.innerHTML= message.toString();
|
||||
},
|
||||
|
||||
showstatus: function (message) {
|
||||
var divtext = document.getElementById('showstatus');
|
||||
divtext.innerHTML="";
|
||||
divtext.innerHTML= message.toString();
|
||||
},
|
||||
|
||||
send: function (message) {
|
||||
if (!message.length) {
|
||||
alert('Empty message not allowed !');
|
||||
} else {
|
||||
_WS.showout(message);
|
||||
_WS.s.send(message);
|
||||
}
|
||||
},
|
||||
|
||||
close: function () {
|
||||
_WS.showout('GOODBYE !');
|
||||
_WS.s.close();
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener('load', _WS.init, false);
|
||||
|
||||
|
||||
// Menu Handler
|
||||
|
||||
function noMenu() {
|
||||
// Set all menu button with normal button style
|
||||
var x = document.getElementById("showalign");
|
||||
x.className = "button";
|
||||
|
||||
var x = document.getElementById("showrun");
|
||||
x.className = "button";
|
||||
|
||||
var x = document.getElementById("showcanvas");
|
||||
x.className = "button";
|
||||
|
||||
var x = document.getElementById("showlive");
|
||||
x.className = "button";
|
||||
|
||||
// Hide all possible main central grids.
|
||||
var x = document.getElementById("mgalign");
|
||||
x.style.display = "none";
|
||||
|
||||
var x = document.getElementById("mgcanvas");
|
||||
x.style.display = "none";
|
||||
|
||||
var x = document.getElementById("mgrun");
|
||||
x.style.display = "none";
|
||||
|
||||
var x = document.getElementById("mglive");
|
||||
x.style.display = "none";
|
||||
}
|
||||
|
||||
function showAlign() {
|
||||
noMenu();
|
||||
var x = document.getElementById("mgalign");
|
||||
x.style.display = "grid";
|
||||
|
||||
var x = document.getElementById("showalign");
|
||||
x.className = "button:checked";
|
||||
}
|
||||
|
||||
function showRun() {
|
||||
noMenu();
|
||||
var x = document.getElementById("mgrun");
|
||||
x.style.display = "grid";
|
||||
|
||||
var x = document.getElementById("showrun");
|
||||
x.className = "button:checked";
|
||||
}
|
||||
|
||||
function showCanvas() {
|
||||
noMenu();
|
||||
var x = document.getElementById("mgcanvas");
|
||||
x.style.display = "block";
|
||||
|
||||
var x = document.getElementById("showcanvas");
|
||||
x.className = "button:checked";
|
||||
}
|
||||
|
||||
function showLive() {
|
||||
noMenu();
|
||||
var x = document.getElementById("mglive");
|
||||
x.style.display = "grid";
|
||||
|
||||
var x = document.getElementById("showlive");
|
||||
x.className = "button:checked";
|
||||
}
|
||||
|
||||
function buttonClicked(clicked_id) {
|
||||
_WS.send("/" + clicked_id);
|
||||
}
|
||||
|
||||
function onSubmit(clicked_id) {
|
||||
var input = document.getElementById(clicked_id);
|
||||
console.log("/" + clicked_id + " " + input.value);
|
||||
_WS.send("/" + clicked_id + " " + input.value);
|
||||
_WS.showout("/" + clicked_id + " " + input.value);
|
||||
}
|
||||
|
230
webui/index.html
@ -3,7 +3,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>LJay</title>
|
||||
<title>LJ</title>
|
||||
|
||||
<!-- Web audio defaults -->
|
||||
<script src="webcomponents-lite.js"></script>
|
||||
@ -22,7 +22,8 @@
|
||||
|
||||
<!-- Webscoket handler -->
|
||||
<script type="text/javascript">
|
||||
|
||||
var pl = "";
|
||||
var pl2 = new Array();
|
||||
var _WS = {
|
||||
uri: 'ws://127.0.0.1:9001/',
|
||||
ws: null,
|
||||
@ -42,7 +43,6 @@
|
||||
},
|
||||
onMessage: function (e) {
|
||||
var res = e.data.split(" ");
|
||||
var pl = ""
|
||||
//console.log(e.data)
|
||||
//console.log(res[0].substring(0,6))
|
||||
switch (res[0].substring(0,6)) {
|
||||
@ -50,14 +50,17 @@
|
||||
_WS.showstatus(e.data.slice(8));
|
||||
break;
|
||||
case "/plfra":
|
||||
pl = e.data.slice(11)
|
||||
console.log(pl);
|
||||
console.log(e.data.slice(11));
|
||||
pl = e.data.slice(9);
|
||||
//console.log(pl);
|
||||
pl2 = eval(pl.replace(/[()]/g, ''));
|
||||
//console.log(pl2);
|
||||
break;
|
||||
case "/plpoi":
|
||||
case "/plpoi":
|
||||
//console.log("plpoint");
|
||||
break;
|
||||
default:
|
||||
console.log(res[0] + " " + res[1])
|
||||
default:
|
||||
//console.log(res[0] + " " + res[1])
|
||||
//console.log(res[1])
|
||||
document.getElementById(res[0].slice(1)).value = res[1];
|
||||
}
|
||||
@ -204,7 +207,7 @@
|
||||
<webaudio-switch id="swap/Y/0" value="0" height="25" width="21" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
|
||||
</div>
|
||||
<!-- Lasergrid 0 -->
|
||||
<div class="lasergrid" style="background-image: url(knobs/lasergrid0.png);">
|
||||
<div class="lasergrid" style="background-image: url(lasergrid0.png);">
|
||||
|
||||
<div><webaudio-param id="kpps/0" link="kpps/0" ></webaudio-param></div>
|
||||
<div><webaudio-param id="points/0" link="points/0"></webaudio-param></div>
|
||||
@ -254,7 +257,7 @@
|
||||
<webaudio-switch id="swap/Y/1" value="0" height="25" width="21" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
|
||||
</div>
|
||||
<!-- Lasergrid 1 -->
|
||||
<div class="lasergrid" style="background-image: url(knobs/lasergrid1.png);">
|
||||
<div class="lasergrid" style="background-image: url(lasergrid1.png);">
|
||||
<div><webaudio-param id="kpps/1" link="kpps/1"></webaudio-param></div>
|
||||
<div><webaudio-param id="points/1" link="points/1"></webaudio-param></div>
|
||||
<div class="lasertext">kPPS</div>
|
||||
@ -303,7 +306,7 @@
|
||||
<webaudio-switch id="swap/Y/2" value="0" height="25" width="21" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
|
||||
</div>
|
||||
<!-- Laser 2 grid -->
|
||||
<div class="lasergrid" style="background-image: url(knobs/lasergrid2.png)">
|
||||
<div class="lasergrid" style="background-image: url(lasergrid2.png)">
|
||||
<div><webaudio-param id="kpps/2" link="kpps/2"></webaudio-param></div>
|
||||
<div><webaudio-param id="points/2" link="points/2"></webaudio-param></div>
|
||||
<div class="lasertext">kPPS</div>
|
||||
@ -352,7 +355,7 @@
|
||||
<webaudio-switch id="swap/Y/3" value="0" height="25" width="21" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
|
||||
</div>
|
||||
<!-- Laser 3 grid -->
|
||||
<div class="lasergrid" style="background-image: url(knobs/lasergrid3.png)">
|
||||
<div class="lasergrid" style="background-image: url(lasergrid3.png)">
|
||||
<div><webaudio-param id="kpps/3" link="kpps/3" ></webaudio-param></div>
|
||||
<div><webaudio-param id="points/3" link="points/3"></webaudio-param></div>
|
||||
<div class="lasertext">kPPS</div>
|
||||
@ -480,67 +483,32 @@
|
||||
</div>
|
||||
|
||||
<!-- mg run icons grid -->
|
||||
<div id="mgrun"class="mgrun">
|
||||
<!-- Curve selection grid -->
|
||||
<div><img src="img/iconljay2.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconljay2.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconastro.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconljay2.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconllstr.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconastro.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconljay2.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconpose.png" alt=" " class="icongrid" /></div>
|
||||
<div><button id ="noteon 0" onclick ="buttonClicked(this.id)" class="button">Map.</button></div>
|
||||
<div><button id ="noteon 1" onclick ="buttonClicked(this.id)" class="button">xPLS</button></div>
|
||||
<div><button id ="noteon 2" onclick ="buttonClicked(this.id)" class="button">Orbits</button></div>
|
||||
<div><button id ="noteon 3" onclick ="buttonClicked(this.id)" class="button">Dot</button></div>
|
||||
<div><button id ="noteon 4" onclick ="buttonClicked(this.id)" class="button">Sine</button></div>
|
||||
<div><button id ="noteon 5" onclick ="buttonClicked(this.id)" class="button">Astro</button></div>
|
||||
<div><button id ="noteon 6" onclick ="buttonClicked(this.id)" class="button:checked">Text</button></div>
|
||||
<div><button id ="noteon 7" onclick ="buttonClicked(this.id)" class="button">Pose</button></div>
|
||||
<!-- Set selection grid -->
|
||||
<div><img src="img/iconljay1.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconljay1.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconllstr.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconpose.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconljay1.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconljay1.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconljay1.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconljay1.png" alt=" " class="icongrid" /></div>
|
||||
<div><button id ="noteon 8" onclick ="buttonClicked(this.id)" class="button:checked">Set 0</button></div>
|
||||
<div><button id ="noteon 9" onclick ="buttonClicked(this.id)" class="button">Set 1</button></div>
|
||||
<div><button id ="noteon 10" onclick ="buttonClicked(this.id)" class="button">LLSTR</button></div>
|
||||
<div><button id ="noteon 11" onclick ="buttonClicked(this.id)" class="button">Franken</button></div>
|
||||
<div><button id ="noteon 12" onclick ="buttonClicked(this.id)" class="button">Ex.</button></div>
|
||||
<div><button id ="noteon 13" onclick ="buttonClicked(this.id)" class="button">5.</button></div>
|
||||
<div><button id ="noteon 14" onclick ="buttonClicked(this.id)" class="button">6</button></div>
|
||||
<div><button id ="noteon 15" onclick ="buttonClicked(this.id)" class="button">7</button></div>
|
||||
<!-- Laser selection grid -->
|
||||
<div><img src="img/iconlaser.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconlaser.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconlaser.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconlaser.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><button id ="noteon 16" onclick ="buttonClicked(this.id)" class="button:checked">0</button></div>
|
||||
<div><button id ="noteon 17" onclick ="buttonClicked(this.id)" class="button">1</button></div>
|
||||
<div><button id ="noteon 18" onclick ="buttonClicked(this.id)" class="button">2</button></div>
|
||||
<div><button id ="noteon 19" onclick ="buttonClicked(this.id)" class="button">3</button></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div id="mgrun"class="mgrun"> <!-- Laser Client selection grid -->
|
||||
<div><img src="knobs/iconljay2.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconljay2.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconljay2.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconljay2.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/client.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/client.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/client.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/client.png" alt=" " class="icongrid" /></div>
|
||||
<div><button id ="noteon 0" onclick ="buttonClicked(this.id)" class="button:checked">0</button></div>
|
||||
<div><button id ="noteon 1" onclick ="buttonClicked(this.id)" class="button">1</button></div>
|
||||
<div><button id ="noteon 2" onclick ="buttonClicked(this.id)" class="button">2</button></div>
|
||||
<div><button id ="noteon 3" onclick ="buttonClicked(this.id)" class="button">3</button></div>
|
||||
<div><button id ="noteon 4" onclick ="buttonClicked(this.id)" class="button">4</button></div>
|
||||
<div><button id ="noteon 5" onclick ="buttonClicked(this.id)" class="button">5</button></div>
|
||||
<div><button id ="noteon 6" onclick ="buttonClicked(this.id)" class="button">6</button></div>
|
||||
<div><button id ="noteon 7" onclick ="buttonClicked(this.id)" class="button">7</button></div>
|
||||
<!-- Simulator PL selection grid -->
|
||||
<div><img src="img/iconsimu.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconsimu.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconsimu.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconsimu.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="img/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconpl.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconpl.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconpl.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconpl.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><button id ="noteon 24" onclick ="buttonClicked(this.id)" class="button:checked">PL 0</button></div>
|
||||
<div><button id ="noteon 25" onclick ="buttonClicked(this.id)" class="button">PL 1</button></div>
|
||||
<div><button id ="noteon 26" onclick ="buttonClicked(this.id)" class="button">PL 2</button></div>
|
||||
@ -549,7 +517,41 @@
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
</div>
|
||||
<!-- Laser selection grid -->
|
||||
<div><img src="knobs/iconlaser.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconlaser.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconlaser.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconlaser.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><button id ="noteon 16" onclick ="buttonClicked(this.id)" class="button:checked">0</button></div>
|
||||
<div><button id ="noteon 17" onclick ="buttonClicked(this.id)" class="button">1</button></div>
|
||||
<div><button id ="noteon 18" onclick ="buttonClicked(this.id)" class="button">2</button></div>
|
||||
<div><button id ="noteon 19" onclick ="buttonClicked(this.id)" class="button">3</button></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<!-- Hidden grid -->
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div><img src="knobs/iconblack.png" alt=" " class="icongrid" /></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
</div>
|
||||
|
||||
<!-- mg : footer display events for debug -->
|
||||
<div class="mgfooter">
|
||||
@ -688,88 +690,42 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Point list draw -->
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
|
||||
// Store Reference To The Canvas & Set Context
|
||||
var canvas = document.getElementById("canvas");
|
||||
var ctx = canvas.getContext("2d");
|
||||
|
||||
//var re = document.getElementById('speed');
|
||||
//re.addEventListener('change', function(){
|
||||
// speed = re.value;
|
||||
// });
|
||||
|
||||
var lastpoint = { x: 0, y: 0 };
|
||||
|
||||
function draw() {
|
||||
|
||||
// Clear Canvas At The Start Of Every Frame
|
||||
ctx.clearRect(0,0,400,400);
|
||||
if (pl2.length > 0)
|
||||
{
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(lastpoint.x , lastpoint.y );
|
||||
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(Math.random() * 220, Math.random() * 220);
|
||||
// Draw Lines
|
||||
for (var i = 0; i < pl2.length/3; i++) {
|
||||
ctx.lineTo(pl2[i*3]*0.7, pl2[1+(i*3)]*0.7);
|
||||
}
|
||||
|
||||
// var xA = new Array();
|
||||
// var yA = new Array();
|
||||
//for (var i=0; i<=100, i++){
|
||||
//xA[i] = ;
|
||||
//yA[i] = ;
|
||||
//}
|
||||
|
||||
// Draw Additional Randomly Placed Lines
|
||||
for (var i = 0; i < 25; i++) {
|
||||
ctx.lineTo(Math.random() * 400, Math.random() * 400);
|
||||
}
|
||||
ctx.strokeStyle = "#888";
|
||||
ctx.stroke();
|
||||
|
||||
// Call Draw Function Again To Continue
|
||||
// Drawing To Canvas To Create Animation
|
||||
ctx.strokeStyle = "#888";
|
||||
ctx.stroke();
|
||||
lastpoint.x = pl2[i*3];
|
||||
lastpoint.y = pl2[1+(i*3)];
|
||||
}
|
||||
// Call Draw Function Again To Create Animation
|
||||
window.requestAnimationFrame(draw);
|
||||
}
|
||||
|
||||
<!--
|
||||
|
||||
//var speed = 100;
|
||||
var lastpoint = { x: 0, y: 0 };
|
||||
var pt = { x: 0, y: 0 };
|
||||
|
||||
// fade background a bit...
|
||||
ctx.globalAlpha = 0.1;
|
||||
ctx.fillStyle = '#000';
|
||||
ctx.fillRect(0, 0, 400, 400);
|
||||
ctx.globalAlpha = 1.0;
|
||||
for (var i=0; i<=100; i++){
|
||||
//var pt = seg.points[point];
|
||||
pt.x = Math.random() * 400;
|
||||
pt.y = Math.random() * 400;
|
||||
// console.log('draw', pt);
|
||||
var newpoint = {
|
||||
x: pt.x,
|
||||
y: pt.y
|
||||
//x: 200 + 190 * pt.x / 32768,
|
||||
//y: 200 - 190 * pt.y / 32768
|
||||
};
|
||||
ctx.strokeStyle = "#888";
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(lastpoint.x, lastpoint.y);
|
||||
ctx.lineTo(newpoint.x, newpoint.y);
|
||||
ctx.closePath();
|
||||
ctx.stroke();
|
||||
|
||||
lastpoint.x = newpoint.x;
|
||||
lastpoint.y = newpoint.y;
|
||||
}
|
||||
|
||||
-->
|
||||
|
||||
|
||||
|
||||
// Initialize The Draw Function
|
||||
draw();
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
<!-- non displayed items, for code reference
|
||||
|
BIN
webui/knobs/client.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
webui/knobs/iconamiral.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
webui/knobs/iconastro.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
webui/knobs/iconblack.png
Normal file
After Width: | Height: | Size: 604 B |
BIN
webui/knobs/iconlaser.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
webui/knobs/iconljay1.png
Normal file
After Width: | Height: | Size: 6.5 KiB |
BIN
webui/knobs/iconljay2.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
webui/knobs/iconllstr.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
webui/knobs/iconpl.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
webui/knobs/iconpong.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
webui/knobs/iconpose.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
webui/knobs/iconsimu.png
Normal file
After Width: | Height: | Size: 25 KiB |
324
webui/ljaygrid.css
Normal file
@ -0,0 +1,324 @@
|
||||
|
||||
.maingrid {
|
||||
display: grid;
|
||||
grid-template-columns: 900px;
|
||||
grid-template-raw: 1fr 1fr 1fr 1fr;
|
||||
grid-gap: 1px;
|
||||
background-color: #222;
|
||||
padding: 5px;
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
.mgtitle {
|
||||
display: grid;
|
||||
height: 90px;
|
||||
grid-template-columns: 130px 70px 80px 600px;
|
||||
background-color: #111;
|
||||
transition: all .3s ease;
|
||||
padding-top: 10px;
|
||||
border-color: #445;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
}
|
||||
.mgstatus {
|
||||
display: grid;
|
||||
grid-template-columns: 250px 150px 1fr;
|
||||
grid-template-raw: 30px;
|
||||
grid-column-gap: 1px;
|
||||
grid-row-gap: 1px;
|
||||
border-color: #334;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
background-color: #111;
|
||||
font-size: small;
|
||||
color:#444;
|
||||
font-family: sans-serif, Helvetica, Verdana, Arial;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
font-family: 'hobeaux-rococeaux-background', Helvetica;
|
||||
}
|
||||
.mgalign {
|
||||
display: grid;
|
||||
height: 400px;
|
||||
grid-template-columns: 144px 144px 138px 138px 10px;
|
||||
grid-template-rows: 1Fr;
|
||||
background-color: #151515;
|
||||
border-color: #445;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
}
|
||||
.mgcanvas {
|
||||
display: none;
|
||||
height: 400px;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-template-rows: 1Fr;
|
||||
background-color: #151515;
|
||||
border-color: #445;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
}
|
||||
.mglive {
|
||||
display: none;
|
||||
height: 400px;
|
||||
grid-template-columns: 138px 138px 512px 1Fr;
|
||||
grid-template-rows: 1Fr;
|
||||
background-color: #151515;
|
||||
border-color: #445;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
}
|
||||
.mgrun {
|
||||
display: none;
|
||||
height: 400px;
|
||||
grid-template-columns: 66px 66px 66px 66px 66px 66px 66px 66px;
|
||||
grid-template-rows: 66px 17px 69px 17px 66px 17px 66px 17px;
|
||||
background-color: #000;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
border-color: #445;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
grid-gap: 1px;
|
||||
transition: all .3s ease;
|
||||
}
|
||||
.mgfooter {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
grid-template-raw: 25px;
|
||||
grid-column-gap: 1px;
|
||||
grid-row-gap: 1px;
|
||||
border-color: #334;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
background-color: #111;
|
||||
font-size: small;
|
||||
font-family: sans-serif, Helvetica, Verdana, Arial;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
font-family: 'hobeaux-rococeaux-background', Helvetica;
|
||||
}
|
||||
.topgrid {
|
||||
display: grid;
|
||||
height: 80px;
|
||||
grid-template-columns: 60px 75px 40px 60px 75px 60px 75px 60px 75px;
|
||||
background-color: #111;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
grid-gap: 1px;
|
||||
border-color: #445;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
transition: all .3s ease;
|
||||
}
|
||||
.laserbox {
|
||||
display: grid;
|
||||
height: 390px;
|
||||
width: 132px;
|
||||
grid-template-columns: 124px;
|
||||
grid-template-rows: 15px 32px 325px;
|
||||
background-color: #111;
|
||||
line-height: 1;
|
||||
padding: 4px;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
border-color: #334;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
}
|
||||
.lasergrid {
|
||||
display: grid;
|
||||
height: 323px;
|
||||
width: 124px;
|
||||
grid-template-columns: 62px 62px;
|
||||
grid-template-rows: 30px 19px 8px 55px 20px 19px 8px 55px 25px 19px 8px 55px 19px;
|
||||
background-color: #111;
|
||||
line-height: 1;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
color:#88c;
|
||||
}
|
||||
.lissabox {
|
||||
display: grid;
|
||||
height: 353px;
|
||||
width: 126px;
|
||||
grid-template-columns: 124px;
|
||||
grid-template-rows: 15px 338px;
|
||||
background-color: #111;
|
||||
line-height: 1;
|
||||
padding: 6px;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
border-color: #334;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
}
|
||||
.spacer {
|
||||
display: grid;
|
||||
height: 8px;
|
||||
}
|
||||
|
||||
.lissagrid {
|
||||
display: grid;
|
||||
height: 323px;
|
||||
width: 124px;
|
||||
grid-template-columns: 60px 60px ;
|
||||
grid-template-rows: 55px 25px 15px 8px 55px 25px 15px 8px 55px 25px 15px;
|
||||
background-color: #111;
|
||||
line-height: 1;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
}
|
||||
.withaibox {
|
||||
display: grid;
|
||||
height: 353px;
|
||||
width: 126px;
|
||||
grid-template-columns: 124px;
|
||||
grid-template-rows: 15px 338px;
|
||||
background-color: #111;
|
||||
line-height: 1;
|
||||
padding: 6px;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
border-color: #334;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
}
|
||||
.withaigrid {
|
||||
display: grid;
|
||||
height: 323px;
|
||||
width: 124px;
|
||||
grid-template-columns: 60px 60px ;
|
||||
grid-template-rows: 55px 25px 15px 8px 55px 25px 15px 8px 55px 25px 15px;
|
||||
background-color: #111;
|
||||
line-height: 1;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
}
|
||||
.projgrid {
|
||||
display: grid;
|
||||
height: 140px;
|
||||
width: 194px;
|
||||
grid-template-columns: 1Fr 1Fr 1Fr;
|
||||
grid-template-rows: 25px 8px 55px 25px 15px;
|
||||
background-color: #111;
|
||||
line-height: 1;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
border-color: #334;
|
||||
border-style: groove;
|
||||
border-width: 1px;
|
||||
}
|
||||
|
||||
.lasertext {
|
||||
font-size: small;
|
||||
font-family: Helvetica, Verdana, Arial, sans-serif;
|
||||
color: #bbb;
|
||||
}
|
||||
.lasertextxs {
|
||||
font-size: x-small;
|
||||
font-family: Helvetica, Verdana, Arial, sans-serif;
|
||||
color: #bbb;
|
||||
}
|
||||
|
||||
.lsttgrid {
|
||||
display: grid;
|
||||
height: 20px;
|
||||
grid-template-columns: 10px 10px 25px 25px;
|
||||
grid-template-rows: 15px 15px 15px 15px 15px;
|
||||
grid-gap: 1px;
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
transition: all .3s ease;
|
||||
}
|
||||
.onoffgrid {
|
||||
display: grid;
|
||||
height: 14px;
|
||||
grid-template-columns: 1Fr;
|
||||
grid-template-rows: 15px 110px;
|
||||
justify-items: center;
|
||||
transition: all .3s ease;
|
||||
}
|
||||
.icongrid {
|
||||
padding: 2px;
|
||||
width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
#showin {
|
||||
font-family: Helvetica, Verdana, Arial, sans-serif;
|
||||
color :#444;
|
||||
width: 150px;
|
||||
height: 25px;
|
||||
padding-top: 4px;
|
||||
|
||||
}
|
||||
#showout {
|
||||
font-family: Helvetica, Verdana, Arial, sans-serif;
|
||||
color: #444;
|
||||
width: 150px;
|
||||
height: 25px;
|
||||
padding-top: 4px;
|
||||
}
|
||||
#events {
|
||||
font-family: Helvetica, Verdana, Arial, sans-serif;
|
||||
color: #444;
|
||||
width: 150px;
|
||||
height: 25px;
|
||||
padding-top: 4px;
|
||||
}
|
||||
.button {
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
padding: 8px 5px;
|
||||
border: 1px solid #404040;
|
||||
background: #141414;
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#141414), to(#141414));
|
||||
background: -moz-linear-gradient(top, #141414, #141414);
|
||||
background: linear-gradient(to bottom, #141414, #141414);
|
||||
font: normal normal normal 11px arial;
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
}
|
||||
.button:hover,
|
||||
.button:focus {
|
||||
padding: 8px 5px;
|
||||
border: 1px solid #b6b6b6;
|
||||
background: #181818;
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#181818), to(#181818));
|
||||
background: -moz-linear-gradient(top, #181818, #181818);
|
||||
background: linear-gradient(to bottom, #181818, #181818);
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
}
|
||||
.button:active {
|
||||
padding: 8px 5px;
|
||||
background: #0c0c0c;
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#0c0c0c), to(#141414));
|
||||
background: -moz-linear-gradient(top, #0c0c0c, #141414);
|
||||
background: linear-gradient(to bottom, #0c0c0c, #141414);
|
||||
border: 1px solid #6666B6;
|
||||
}
|
||||
.button:checked {
|
||||
padding: 8px 5px;
|
||||
background: #c0c0c0;
|
||||
color: #0c0c0c;
|
||||
border: 1px solid #6666B6;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
border-radius: 5px;
|
||||
font: normal normal normal 11px arial;
|
||||
text-decoration: none;
|
||||
}
|
||||
.submit {
|
||||
background: #0c0c0c;
|
||||
color: #c0c0c0;
|
||||
width: 90px;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
height: 15px;
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#0c0c0c), to(#141414));
|
||||
background: -moz-linear-gradient(top, #0c0c0c, #141414);
|
||||
background: linear-gradient(to bottom, #0c0c0c, #141414);
|
||||
border: 1px solid #445;
|
||||
}
|
||||
|