fireandforget version
This commit is contained in:
parent
4faf53168d
commit
93cbcfefd5
53
LJ.conf
53
LJ.conf
@ -1,8 +1,8 @@
|
|||||||
[General]
|
[General]
|
||||||
lasernumber = 4
|
lasernumber = 1
|
||||||
debug = 0
|
debug = 0
|
||||||
ljayserverip = 0.0.0.0
|
ljayserverip = 0.0.0.0
|
||||||
wwwip = 192.168.2.44
|
wwwip = 127.0.0.1
|
||||||
nozoscip = 127.0.0.1
|
nozoscip = 127.0.0.1
|
||||||
bhoroscip = 127.0.0.1
|
bhoroscip = 127.0.0.1
|
||||||
autostart = artnet
|
autostart = artnet
|
||||||
@ -12,7 +12,7 @@ wsport = 9001
|
|||||||
[laser0]
|
[laser0]
|
||||||
color = -1
|
color = -1
|
||||||
type = DS1000
|
type = DS1000
|
||||||
ip = 192.168.2.3
|
ip = 127.0.0.1
|
||||||
kpps = 25000
|
kpps = 25000
|
||||||
centerx = 0
|
centerx = 0
|
||||||
centery = 0
|
centery = 0
|
||||||
@ -21,7 +21,7 @@ zoomy = 50.0
|
|||||||
sizex = 32000
|
sizex = 32000
|
||||||
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)]
|
lsteps = [ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
|
||||||
warpdest = [[-1500., 1500.],
|
warpdest = [[-1500., 1500.],
|
||||||
@ -36,8 +36,8 @@ ip = 192.168.2.5
|
|||||||
kpps = 25000
|
kpps = 25000
|
||||||
centerx = 0
|
centerx = 0
|
||||||
centery = 0
|
centery = 0
|
||||||
zoomx = 80.0
|
zoomx = 50.0
|
||||||
zoomy = 80.0
|
zoomy = 50.0
|
||||||
sizex = 32000
|
sizex = 32000
|
||||||
sizey = 32000
|
sizey = 32000
|
||||||
finangle = 0.0
|
finangle = 0.0
|
||||||
@ -45,9 +45,9 @@ swapx = -1
|
|||||||
swapy = -1
|
swapy = -1
|
||||||
lsteps = [ (1.0, 2),(0.25, 1), (0.75, 1), (1.0, 5)]
|
lsteps = [ (1.0, 2),(0.25, 1), (0.75, 1), (1.0, 5)]
|
||||||
warpdest = [[-1500., 1500.],
|
warpdest = [[-1500., 1500.],
|
||||||
[ 1500., 1500.],
|
[ 1500., 1500.],
|
||||||
[ 1500.,-1500.],
|
[ 1500.,-1500.],
|
||||||
[-1500.,-1500.]]
|
[-1500.,-1500.]]
|
||||||
|
|
||||||
[laser2]
|
[laser2]
|
||||||
color = -1
|
color = -1
|
||||||
@ -65,14 +65,14 @@ swapx = -1
|
|||||||
swapy = -1
|
swapy = -1
|
||||||
lsteps = [(1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
|
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]
|
||||||
color = -1
|
color = -1
|
||||||
type = LUKE400
|
type = LUKE400
|
||||||
ip = 192.168.2.4
|
ip = 192.168.1.5
|
||||||
kpps = 25000
|
kpps = 25000
|
||||||
centerx = 0
|
centerx = 0
|
||||||
centery = 0
|
centery = 0
|
||||||
@ -81,34 +81,19 @@ zoomy = 50.0
|
|||||||
sizex = 32000
|
sizex = 32000
|
||||||
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)]
|
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.]]
|
||||||
|
|
||||||
[plugins]
|
[plugins]
|
||||||
plugins = {
|
plugins = {
|
||||||
"aurora": {"OSC": 8090, "command": "python3 plugins/aurora/aurora.py", "display": True},
|
"aurora": {"OSC": 8090, "command": "python3 plugins/aurora/aurora.py", "display": True},
|
||||||
"nozoid": {"OSC": 8003, "command": "python3 plugins/audio/nozoids3.py", "display": True},
|
|
||||||
"glyph": {"OSC": 8004, "command": "python3 plugins/laserglyph.py", "display": True},
|
|
||||||
"planet": {"OSC": 8005, "command": "python3 plugins/planetarium/main.py", "display": True},
|
|
||||||
"words": {"OSC": 8006, "command": "python3 plugins/livewords3.py", "display": True},
|
|
||||||
"cycl": {"OSC": 8007, "command": "python3 plugins/textcycl.py", "display": True},
|
|
||||||
"simu": {"OSC": 8008, "command": "python plugins/pysimu.py", "display": False},
|
|
||||||
"artnet": {"OSC": 8009, "command": "python3 libs3/artnet.py", "display": False},
|
"artnet": {"OSC": 8009, "command": "python3 libs3/artnet.py", "display": False},
|
||||||
"trckr": {"OSC": 8017, "command": "python3 plugins/trckr.py", "display": False},
|
|
||||||
"maxw": {"OSC": 8012, "command": "python3 plugins/maxwell.py", "display": True},
|
|
||||||
"square": {"OSC": 8013, "command": "python3 plugins/square.py", "display": True},
|
"square": {"OSC": 8013, "command": "python3 plugins/square.py", "display": True},
|
||||||
"custom1": {"OSC": 8014, "command": "python3 plugins/custom1.py", "display": True},
|
"custom1": {"OSC": 8014, "command": "python3 plugins/custom1.py", "display": True}
|
||||||
"mitraille": {"OSC": 8015, "command": "python3 plugins/audio/mitraille.py", "display": True},
|
|
||||||
"livecode": {"OSC": 8016, "command": "python3 plugins/livecoding.py", "display": True},
|
|
||||||
"ljpong": {"OSC": 8020, "command": "python plugins/games/ljpong/main.py", "display": True},
|
|
||||||
"ljwars": {"OSC": 8021, "command": "python plugins/games/ljsw/main.py", "display": True},
|
|
||||||
"audiogen": {"OSC": 8030, "command": "python3 plugins/audio/audiogen.py", "display": False},
|
|
||||||
"midigen": {"OSC": 8031, "command": "python3 plugins/audio/midigen.py", "display": False},
|
|
||||||
"viewgen": {"OSC": 8032, "command": "python3 plugins/audio/viewgen.py", "display": True}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
114
LJ_template.conf
114
LJ_template.conf
@ -1,114 +0,0 @@
|
|||||||
[General]
|
|
||||||
lasernumber = 1
|
|
||||||
debug = 0
|
|
||||||
ljayserverip = 0.0.0.0
|
|
||||||
wwwip = 192.168.2.43
|
|
||||||
nozoscip = 127.0.0.1
|
|
||||||
bhoroscip = 127.0.0.1
|
|
||||||
autostart = artnet
|
|
||||||
wstype = ws
|
|
||||||
wsport = 9001
|
|
||||||
|
|
||||||
[laser0]
|
|
||||||
color = -1
|
|
||||||
type = DS1000
|
|
||||||
ip = 192.168.2.3
|
|
||||||
kpps = 25000
|
|
||||||
centerx = 0
|
|
||||||
centery = 0
|
|
||||||
zoomx = 50.0
|
|
||||||
zoomy = 50.0
|
|
||||||
sizex = 32000
|
|
||||||
sizey = 32000
|
|
||||||
finangle = 0.0
|
|
||||||
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.]]
|
|
||||||
|
|
||||||
[laser1]
|
|
||||||
color = -1
|
|
||||||
type = LOCAL
|
|
||||||
ip = 192.168.2.5
|
|
||||||
kpps = 25000
|
|
||||||
centerx = 0
|
|
||||||
centery = 0
|
|
||||||
zoomx = 50.0
|
|
||||||
zoomy = 50.0
|
|
||||||
sizex = 32000
|
|
||||||
sizey = 32000
|
|
||||||
finangle = 0.0
|
|
||||||
swapx = -1
|
|
||||||
swapy = -1
|
|
||||||
lsteps = [ (1.0, 2),(0.25, 1), (0.75, 1), (1.0, 5)]
|
|
||||||
warpdest = [[-1500., 1500.],
|
|
||||||
[ 1500., 1500.],
|
|
||||||
[ 1500.,-1500.],
|
|
||||||
[-1500.,-1500.]]
|
|
||||||
|
|
||||||
[laser2]
|
|
||||||
color = -1
|
|
||||||
type = LUKE400
|
|
||||||
ip = 192.168.2.6
|
|
||||||
kpps = 25000
|
|
||||||
centerx = 0
|
|
||||||
centery = 0
|
|
||||||
zoomx = 50.0
|
|
||||||
zoomy = 50.0
|
|
||||||
sizex = 32000
|
|
||||||
sizey = 32000
|
|
||||||
finangle = 0.0
|
|
||||||
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.]]
|
|
||||||
|
|
||||||
[laser3]
|
|
||||||
color = -1
|
|
||||||
type = LUKE400
|
|
||||||
ip = 192.168.1.5
|
|
||||||
kpps = 25000
|
|
||||||
centerx = 0
|
|
||||||
centery = 0
|
|
||||||
zoomx = 50.0
|
|
||||||
zoomy = 50.0
|
|
||||||
sizex = 32000
|
|
||||||
sizey = 32000
|
|
||||||
finangle = 0.0
|
|
||||||
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.]]
|
|
||||||
|
|
||||||
[plugins]
|
|
||||||
plugins = {
|
|
||||||
"aurora": {"OSC": 8090, "command": "python3 plugins/aurora/aurora.py", "display": True},
|
|
||||||
"nozoid": {"OSC": 8003, "command": "python3 plugins/audio/nozoids3.py", "display": True},
|
|
||||||
"glyph": {"OSC": 8004, "command": "python3 plugins/laserglyph.py", "display": True},
|
|
||||||
"planet": {"OSC": 8005, "command": "python3 plugins/planetarium/main.py", "display": True},
|
|
||||||
"words": {"OSC": 8006, "command": "python3 plugins/livewords3.py", "display": True},
|
|
||||||
"cycl": {"OSC": 8007, "command": "python3 plugins/textcycl.py", "display": True},
|
|
||||||
"simu": {"OSC": 8008, "command": "python plugins/pysimu.py", "display": False},
|
|
||||||
"artnet": {"OSC": 8009, "command": "python3 libs3/artnet.py", "display": False},
|
|
||||||
"trckr": {"OSC": 8017, "command": "python3 plugins/trckr.py", "display": False},
|
|
||||||
"maxw": {"OSC": 8012, "command": "python3 plugins/maxwell.py", "display": True},
|
|
||||||
"square": {"OSC": 8013, "command": "python3 plugins/square.py", "display": True},
|
|
||||||
"custom1": {"OSC": 8014, "command": "python3 plugins/custom1.py", "display": True},
|
|
||||||
"mitraille": {"OSC": 8015, "command": "python3 plugins/audio/mitraille.py", "display": True},
|
|
||||||
"livecode": {"OSC": 8016, "command": "python3 plugins/livecoding.py", "display": True},
|
|
||||||
"ljpong": {"OSC": 8020, "command": "python plugins/games/ljpong/main.py", "display": True},
|
|
||||||
"ljwars": {"OSC": 8021, "command": "python plugins/games/ljsw/main.py", "display": True},
|
|
||||||
"audiogen": {"OSC": 8030, "command": "python3 plugins/audio/audiogen.py", "display": False},
|
|
||||||
"midigen": {"OSC": 8031, "command": "python3 plugins/audio/midigen.py", "display": False},
|
|
||||||
"viewgen": {"OSC": 8032, "command": "python3 plugins/audio/viewgen.py", "display": True}
|
|
||||||
}
|
|
||||||
|
|
BIN
Pd/.DS_Store
vendored
Normal file
BIN
Pd/.DS_Store
vendored
Normal file
Binary file not shown.
23
Pd/LJsender.pd
Normal file
23
Pd/LJsender.pd
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#N canvas 468 143 709 527 10;
|
||||||
|
#X msg 60 237 disconnect;
|
||||||
|
#X floatatom 27 294 0 0 0 0 - - -;
|
||||||
|
#X text 22 315 Outlet is nonzero if connection is open \, zero otherwise.
|
||||||
|
;
|
||||||
|
#X msg 37 60 send mytext trololo;
|
||||||
|
#X obj 28 267 netsend 1;
|
||||||
|
#X msg 51 125 send /pl/0/0 (150 2300 65280) (170 170 65280) (230 170
|
||||||
|
65280) (210 230 65280) (150 230 65280);
|
||||||
|
#X text 258 29 LJ Sender;
|
||||||
|
#X msg 46 84 send /pl/0/0 150 2300 65280 170 170 65280 230 170 65280
|
||||||
|
210 230 65280 150 230 65280;
|
||||||
|
#X msg 26 39 connect 127.0.0.1 8083;
|
||||||
|
#X msg 58 165 send /pl/0/0 [(150.0:230.0:65280) (170.0:170.0:65280)
|
||||||
|
(230.0:170.0:65280) (210.0:230.0:65280) (150.0:230.0:65280)];
|
||||||
|
#X text 444 174 <- le mieux;
|
||||||
|
#X connect 0 0 4 0;
|
||||||
|
#X connect 3 0 4 0;
|
||||||
|
#X connect 4 0 1 0;
|
||||||
|
#X connect 5 0 4 0;
|
||||||
|
#X connect 7 0 4 0;
|
||||||
|
#X connect 8 0 4 0;
|
||||||
|
#X connect 9 0 4 0;
|
106
Pd/ljpd.py
Normal file
106
Pd/ljpd.py
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# -*- mode: Python -*-
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
LJPD
|
||||||
|
|
||||||
|
Udp server to redis
|
||||||
|
v0.1b
|
||||||
|
|
||||||
|
'''
|
||||||
|
import traceback, time
|
||||||
|
import argparse
|
||||||
|
import socket
|
||||||
|
import _thread
|
||||||
|
import redis
|
||||||
|
|
||||||
|
|
||||||
|
print()
|
||||||
|
print ("LJPD")
|
||||||
|
print ("Arguments parsing if needed...")
|
||||||
|
argsparser = argparse.ArgumentParser(description="dumpUDP v0.1b help mode")
|
||||||
|
argsparser.add_argument("-i","--IP",help="IP to bind to (0.0.0.0 by default)", type=str)
|
||||||
|
argsparser.add_argument("-p","--port",help="UDP port to bind to (9000 by default)", type=str)
|
||||||
|
argsparser.add_argument("-l","--lj",help="LJ IP address (127.0.0.1 by default)", type=str)
|
||||||
|
|
||||||
|
|
||||||
|
args = argsparser.parse_args()
|
||||||
|
|
||||||
|
# LJ server IP name
|
||||||
|
if args.IP:
|
||||||
|
ljIP = lj.IP
|
||||||
|
else:
|
||||||
|
ljIP = "127.0.0.1"
|
||||||
|
|
||||||
|
# Server
|
||||||
|
if args.IP:
|
||||||
|
serverIP = args.IP
|
||||||
|
else:
|
||||||
|
serverIP = "0.0.0.0"
|
||||||
|
|
||||||
|
# ORCA destination device
|
||||||
|
if args.port:
|
||||||
|
UDPORT = int(args.port)
|
||||||
|
else:
|
||||||
|
UDPORT = 8083
|
||||||
|
|
||||||
|
print("Connecting to Redis...")
|
||||||
|
|
||||||
|
r = redis.StrictRedis(host= ljIP, port=6379, db=0)
|
||||||
|
|
||||||
|
def GetTime():
|
||||||
|
return time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime())
|
||||||
|
|
||||||
|
|
||||||
|
def udp_thread():
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
payload, client_address = sock.recvfrom(1024)
|
||||||
|
udpath = payload.decode('utf_8')
|
||||||
|
print(GetTime(),"From", str(client_address),"got", udpath )
|
||||||
|
#r.set('/pl/0/0', "/pl/"+str(clientnumber)+"/")
|
||||||
|
#print(udpath[0:1], " ",udpath[1:2], " ",udpath[2:3], " ",udpath[3:4], " " )
|
||||||
|
|
||||||
|
|
||||||
|
# Reply to client
|
||||||
|
bytesToSend = str.encode("ACK :"+str(payload))
|
||||||
|
serverAddressPort = (client_address, UDPORT)
|
||||||
|
bufferSize = 1024
|
||||||
|
#sock.sendto(bytesToSend, serverAddressPort)
|
||||||
|
sock.sendto(bytesToSend, client_address)
|
||||||
|
|
||||||
|
|
||||||
|
time.sleep(0.005)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def Start(serverIP, UDPORT):
|
||||||
|
global sock
|
||||||
|
|
||||||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
server = ( serverIP,UDPORT)
|
||||||
|
sock.bind(server)
|
||||||
|
_thread.start_new_thread(udp_thread, ())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Launch server in another thread.
|
||||||
|
print("Launching UDP Server", serverIP,':', UDPORT)
|
||||||
|
Start(serverIP, UDPORT)
|
||||||
|
|
||||||
|
|
||||||
|
# Do something else
|
||||||
|
try:
|
||||||
|
|
||||||
|
while True:
|
||||||
|
time.sleep(0.005)
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
finally:
|
||||||
|
print("")
|
||||||
|
print("ljpd stopped.")
|
23
README.md
23
README.md
@ -1,4 +1,4 @@
|
|||||||
LJ v0.8.2
|
LJ v0.8.2 'fireandforget'
|
||||||
|
|
||||||
By Sam Neurohack, Loloster, Cocoa
|
By Sam Neurohack, Loloster, Cocoa
|
||||||
|
|
||||||
@ -7,17 +7,26 @@ LICENCE : CC BY
|
|||||||
|
|
||||||
![LJ](https://www.teamlaser.fr/lj/images/lj2.png)
|
![LJ](https://www.teamlaser.fr/lj/images/lj2.png)
|
||||||
|
|
||||||
A software laser framework with GUI, for up to 4 lasers live actions with ethedreams DACs. Think creative like Laser "battles", planetarium, sharing available lasers in demoparties for competition, ...
|
LJ is like a video projector where you fire images and forget. Lasers are dangerous : you can really fire real world objects.
|
||||||
|
|
||||||
|
A software laser framework with webGUI, for up to 4 lasers live actions with ethedreams DACs. Think creative like Laser "battles", planetarium, sharing available lasers in demoparties for competition,...
|
||||||
|
|
||||||
LJ has 5 main components :
|
LJ has 5 main components :
|
||||||
|
|
||||||
- "Plugins" are points generators (to one or more lasers). Lot examples comes with LJ : planetarium, 3D anaglyph animations,... See plugins directory.
|
- "Plugins" are "frames" generators to one or more lasers. Frames goes to different possible frames inputs of the "manager". With laser one frame = one polyline, like in LOGO. Lot examples comes with LJ : planetarium, 3D anaglyph animations,... See plugins directory.
|
||||||
- A "tracer" per etherdream/laser that take its given point list, correct geometry, recompute in laser controller coordinates, send it to its controller and report its status to the "manager".
|
- A "tracer" per etherdream/laser that take its given point list, correct geometry, recompute in laser controller coordinates, send it to its controller and report its status to the "manager".
|
||||||
- A "manager" that talk to all tracers (which client number point lists to draw, new geometry correction,...), handle IOs (webui functions, OSC commands,...) and plugins.
|
- A "manager" that talk to all tracers (which point lists to draw, new geometry correction,...), handle IOs (webui functions, OSC commands,...) and plugins.
|
||||||
- A web GUI in html, css, and vanilla js. This UI can be used in a tablet, computer, whatever. LJ does not come with an html server but absolutely can . This GUI has a (currently slow) simulator, but one can also use an etherdream/laser emulator (see nannou simulator below) to work without physical lasers !!
|
- A web GUI in html, css, and vanilla js. This UI can be used in a tablet, computer, whatever. LJ does not come with an html server but absolutely can . This GUI has a (currently slow) simulator, but one can also use an etherdream/laser emulator (see nannou simulator below) to work without physical lasers !!
|
||||||
- A network available database (redis). "Plugins" can send directly their pointlists to redis. Each "tracer" is instructed to get one of the avalaible pointlist in redis.
|
- A network available database (redis). "Plugins" can send directly their pointlists to redis. Each "tracer" is instructed to get one of the avalaible pointlist in redis.
|
||||||
|
|
||||||
|
"Frames" (actually polylines) inputs are :
|
||||||
|
|
||||||
|
- OSC (port 8002)
|
||||||
|
- Websocket (port 9001)
|
||||||
|
- Cli pipe (see clitools)
|
||||||
|
- Redis keys
|
||||||
|
|
||||||
|
|
||||||
Important : for best performance LJ is meant to run in a dedicated computer especially with multiple lasers and highly multitasked load : if you watch video, use live webcam face recognition, webui simulator,... and run LJ on the same computer, well you need a bunch of cores. If you don't, spread the load : you can use webui on a tablet, the livecam on a phone, run pointlists generators on another computer,...
|
Important : for best performance LJ is meant to run in a dedicated computer especially with multiple lasers and highly multitasked load : if you watch video, use live webcam face recognition, webui simulator,... and run LJ on the same computer, well you need a bunch of cores. If you don't, spread the load : you can use webui on a tablet, the livecam on a phone, run pointlists generators on another computer,...
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -384,6 +393,8 @@ python3 talk3.py -i etherdreamIP
|
|||||||
|
|
||||||
- Switch to simu page. If you don't see anything : check redis server or your points in redis doesn't respect pointlist formatting (see command reference).
|
- Switch to simu page. If you don't see anything : check redis server or your points in redis doesn't respect pointlist formatting (see command reference).
|
||||||
|
|
||||||
|
- Check Leds : for each IRL lasers the two sets of must be green at startup and laser should display their number or the pointlist you want.
|
||||||
|
|
||||||
- If talk3 works but you don't see your points : click on the Grid icon in Align page. This will override your pointlist and display squares. If Grid works : recomputed points by tracers are "bad" with given values in LJ.conf.
|
- If talk3 works but you don't see your points : click on the Grid icon in Align page. This will override your pointlist and display squares. If Grid works : recomputed points by tracers are "bad" with given values in LJ.conf.
|
||||||
|
|
||||||
"Bad points" ?
|
"Bad points" ?
|
||||||
@ -444,8 +455,6 @@ lsteps is a string like "[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]"
|
|||||||
|
|
||||||
/scene/scenenumber/start 0 or 1 : tell all tracers to use given scene
|
/scene/scenenumber/start 0 or 1 : tell all tracers to use given scene
|
||||||
|
|
||||||
/regen : regen webui index html page.
|
|
||||||
|
|
||||||
/scim : change webui simulated laser.
|
/scim : change webui simulated laser.
|
||||||
|
|
||||||
|
|
||||||
|
84
clitools/exports/toUDP.py
Normal file
84
clitools/exports/toUDP.py
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# -*- mode: Python -*-
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
toUDP
|
||||||
|
v0.1.0
|
||||||
|
|
||||||
|
A basic exporter
|
||||||
|
|
||||||
|
LICENCE : CC
|
||||||
|
|
||||||
|
by cocoa
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import argparse
|
||||||
|
import time
|
||||||
|
import socket
|
||||||
|
import ast
|
||||||
|
|
||||||
|
argsparser = argparse.ArgumentParser(description="toUDP v0.1b help mode")
|
||||||
|
argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose output")
|
||||||
|
argsparser.add_argument("-i","--ip",help="IP to bind to (0.0.0.0 by default)",default="0.0.0.0",type=str)
|
||||||
|
argsparser.add_argument("-p","--port",help="UDP port to bind to (9000 by default)",default="9003",type=str)
|
||||||
|
args = argsparser.parse_args()
|
||||||
|
|
||||||
|
verbose = args.verbose
|
||||||
|
ip = args.ip
|
||||||
|
port = int(args.port)
|
||||||
|
verbose = args.verbose
|
||||||
|
|
||||||
|
|
||||||
|
name = "exports::toUDP"
|
||||||
|
|
||||||
|
def debug(*args, **kwargs):
|
||||||
|
if( verbose == False ):
|
||||||
|
return
|
||||||
|
print(*args, file=sys.stderr, **kwargs)
|
||||||
|
|
||||||
|
def ClientStart(ip, port):
|
||||||
|
global sockclient
|
||||||
|
|
||||||
|
sockclient = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
|
||||||
|
|
||||||
|
def ClientSend(msgFromClient):
|
||||||
|
|
||||||
|
bytesToSend = str.encode(str(msgFromClient))
|
||||||
|
serverAddressPort = (ip, port)
|
||||||
|
bufferSize = 1024
|
||||||
|
|
||||||
|
# Send to server using created UDP socket
|
||||||
|
sockclient.sendto(bytesToSend, serverAddressPort)
|
||||||
|
|
||||||
|
'''
|
||||||
|
# If reply :
|
||||||
|
msgFromServer = sockclient.recvfrom(bufferSize)
|
||||||
|
|
||||||
|
msg = "Message from Server {}".format(msgFromServer[0])
|
||||||
|
print(msg)
|
||||||
|
'''
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
ClientStart(ip, port)
|
||||||
|
while True:
|
||||||
|
|
||||||
|
line = sys.stdin.readline()
|
||||||
|
if line == "":
|
||||||
|
time.sleep(0.01)
|
||||||
|
line = line.rstrip('\n')
|
||||||
|
#pointsList = ast.literal_eval(line)
|
||||||
|
debug(name,": "+line)
|
||||||
|
ClientSend(line)
|
||||||
|
|
||||||
|
|
||||||
|
except EOFError:
|
||||||
|
debug("break")# no more information
|
||||||
|
|
@ -163,6 +163,7 @@ try:
|
|||||||
# Do the filter
|
# Do the filter
|
||||||
result = kaleidoscope( pointsList )
|
result = kaleidoscope( pointsList )
|
||||||
print( result, flush=True )
|
print( result, flush=True )
|
||||||
|
|
||||||
looptime = time.time() - start
|
looptime = time.time() - start
|
||||||
# debug(name+" looptime:"+str(looptime))
|
# debug(name+" looptime:"+str(looptime))
|
||||||
if( looptime < optimal_looptime ):
|
if( looptime < optimal_looptime ):
|
||||||
|
126
clitools/generators/fromOSC.py
Normal file
126
clitools/generators/fromOSC.py
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# -*- mode: Python -*-
|
||||||
|
|
||||||
|
'''
|
||||||
|
Forward /pl pointlist to cli
|
||||||
|
|
||||||
|
input OSC in END points format : (x,y,color)
|
||||||
|
output CLI in CLI points format : [x,y,color]
|
||||||
|
|
||||||
|
/pl "[(150.0, 230.0, 255), (170.0, 170.0, 255), (230.0, 170.0, 255), (210.0, 230.0, 255), (150.0, 230.0, 255)]"
|
||||||
|
|
||||||
|
v0.1.0
|
||||||
|
|
||||||
|
LICENCE : CC
|
||||||
|
|
||||||
|
by Cocoa, Sam Neurohack
|
||||||
|
|
||||||
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
from OSC3 import OSCServer, OSCClient, OSCMessage
|
||||||
|
import sys
|
||||||
|
from time import sleep
|
||||||
|
import argparse
|
||||||
|
import ast
|
||||||
|
|
||||||
|
argsparser = argparse.ArgumentParser(description="fromOSC generator")
|
||||||
|
argsparser.add_argument("-i","--ip",help="IP to bind to (0.0.0.0 by default)",default="0.0.0.0",type=str)
|
||||||
|
argsparser.add_argument("-p","--port",help="OSC port to bind to (9002 by default)",default=9002,type=str)
|
||||||
|
argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose output")
|
||||||
|
args = argsparser.parse_args()
|
||||||
|
|
||||||
|
verbose = args.verbose
|
||||||
|
ip = args.ip
|
||||||
|
port = int(args.port)
|
||||||
|
|
||||||
|
def debug(*args, **kwargs):
|
||||||
|
if( verbose == False ):
|
||||||
|
return
|
||||||
|
print(*args, file=sys.stderr, **kwargs)
|
||||||
|
|
||||||
|
oscserver = OSCServer( (ip, port) )
|
||||||
|
oscserver.timeout = 0
|
||||||
|
run = True
|
||||||
|
|
||||||
|
# this method of reporting timeouts only works by convention
|
||||||
|
# that before calling handle_request() field .timed_out is
|
||||||
|
# set to False
|
||||||
|
def handle_timeout(self):
|
||||||
|
self.timed_out = True
|
||||||
|
|
||||||
|
# funny python's way to add a method to an instance of a class
|
||||||
|
import types
|
||||||
|
oscserver.handle_timeout = types.MethodType(handle_timeout, oscserver)
|
||||||
|
|
||||||
|
# RAW OSC Frame available ?
|
||||||
|
def OSC_frame():
|
||||||
|
# clear timed_out flag
|
||||||
|
oscserver.timed_out = False
|
||||||
|
# handle all pending requests then return
|
||||||
|
while not oscserver.timed_out:
|
||||||
|
oscserver.handle_request()
|
||||||
|
|
||||||
|
|
||||||
|
# default handler
|
||||||
|
def OSChandler(oscpath, tags, args, source):
|
||||||
|
|
||||||
|
oscaddress = ''.join(oscpath.split("/"))
|
||||||
|
debug("fromOSC Default OSC Handler got oscpath", oscpath, "from" + str(source[0]), ":", args)
|
||||||
|
#print("OSC address", path)
|
||||||
|
#print("find.. /bhoreal ?", path.find('/bhoreal'))
|
||||||
|
|
||||||
|
if oscpath == "/pl" and len(args)==1:
|
||||||
|
|
||||||
|
debug("correct OSC type :'/pl")
|
||||||
|
|
||||||
|
if validate(args[0]) == True:
|
||||||
|
|
||||||
|
debug("new pl : ", args[0])
|
||||||
|
line = args[0].replace("(",'[')
|
||||||
|
line = line.replace(")",']')
|
||||||
|
line = "[{}]".format(line)
|
||||||
|
print(line, flush=True);
|
||||||
|
|
||||||
|
else:
|
||||||
|
debug("Bad pointlist -> msg trapped.")
|
||||||
|
|
||||||
|
else:
|
||||||
|
debug("BAD OSC Message : " + oscpath +" " +args[0])
|
||||||
|
|
||||||
|
|
||||||
|
oscserver.addMsgHandler( "default", OSChandler )
|
||||||
|
|
||||||
|
|
||||||
|
def validate(pointlist):
|
||||||
|
|
||||||
|
state = True
|
||||||
|
|
||||||
|
if len(pointlist)<9:
|
||||||
|
debug("Not enough characters :", pointlist)
|
||||||
|
state = False
|
||||||
|
|
||||||
|
if pointlist.find("(") == -1:
|
||||||
|
debug("Bad format : use () not [] for points", pointlist)
|
||||||
|
state = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
pl = bytes(pointlist, 'ascii')
|
||||||
|
check = ast.literal_eval(pl.decode('ascii'))
|
||||||
|
|
||||||
|
except:
|
||||||
|
debug("BAD POINTLIST :", pointlist)
|
||||||
|
state = False
|
||||||
|
|
||||||
|
return state
|
||||||
|
|
||||||
|
|
||||||
|
# simulate a "game engine"
|
||||||
|
while run:
|
||||||
|
# do the game stuff:
|
||||||
|
sleep(0.01)
|
||||||
|
# call user script
|
||||||
|
OSC_frame()
|
||||||
|
|
||||||
|
oscserver.close()
|
||||||
|
|
84
clitools/generators/fromUDP.py
Normal file
84
clitools/generators/fromUDP.py
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# -*- mode: Python -*-
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
fromUDP
|
||||||
|
|
||||||
|
Udp server to cli
|
||||||
|
v0.1b
|
||||||
|
|
||||||
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
import traceback, time
|
||||||
|
import argparse
|
||||||
|
import socket
|
||||||
|
import _thread
|
||||||
|
import sys
|
||||||
|
|
||||||
|
name="generator::fromUDP"
|
||||||
|
|
||||||
|
|
||||||
|
def debug(*args, **kwargs):
|
||||||
|
if( verbose == False ):
|
||||||
|
return
|
||||||
|
print(*args, file=sys.stderr, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
argsparser = argparse.ArgumentParser(description="fromUDP v0.1b help mode")
|
||||||
|
argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose output")
|
||||||
|
argsparser.add_argument("-i","--ip",help="IP to bind to (0.0.0.0 by default)",default="0.0.0.0",type=str)
|
||||||
|
argsparser.add_argument("-p","--port",help="UDP port to bind to (9000 by default)",default=9000,type=str)
|
||||||
|
args = argsparser.parse_args()
|
||||||
|
|
||||||
|
verbose = args.verbose
|
||||||
|
ip = args.ip
|
||||||
|
port = int(args.port)
|
||||||
|
verbose = args.verbose
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def udp_thread():
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
payload, client_address = sock.recvfrom(1024)
|
||||||
|
udpath = payload.decode('utf_8')
|
||||||
|
debug(udpath[0:])
|
||||||
|
print(udpath[0:], flush=True);
|
||||||
|
|
||||||
|
'''
|
||||||
|
# Reply to client
|
||||||
|
bytesToSend = str.encode("ACK :"+str(payload))
|
||||||
|
serverAddressPort = (client_address, port)
|
||||||
|
bufferSize = 1024
|
||||||
|
#sock.sendto(bytesToSend, serverAddressPort)
|
||||||
|
sock.sendto(bytesToSend, client_address)
|
||||||
|
'''
|
||||||
|
|
||||||
|
def StartUDP(serverIP, UDPORT):
|
||||||
|
global sock
|
||||||
|
|
||||||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
server = ( serverIP,UDPORT)
|
||||||
|
sock.bind(server)
|
||||||
|
_thread.start_new_thread(udp_thread, ())
|
||||||
|
|
||||||
|
|
||||||
|
StartUDP(ip, port)
|
||||||
|
|
||||||
|
|
||||||
|
# Do something else
|
||||||
|
try:
|
||||||
|
|
||||||
|
while True:
|
||||||
|
time.sleep(0.005)
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
22
ethertools/receivebroadcast.py
Normal file
22
ethertools/receivebroadcast.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# -*- mode: Python -*-
|
||||||
|
|
||||||
|
# or tcpdump -i eth1 port 54545 -XX
|
||||||
|
|
||||||
|
import socket
|
||||||
|
|
||||||
|
|
||||||
|
def find_LJ():
|
||||||
|
"""Listen for broadcast packets."""
|
||||||
|
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
s.bind(("0.0.0.0", 54545))
|
||||||
|
|
||||||
|
while True:
|
||||||
|
data, addr = s.recvfrom(1024)
|
||||||
|
print(" %s " % (data, ))
|
||||||
|
print("Packet from %s: " % (addr, ))
|
||||||
|
|
||||||
|
|
||||||
|
find_LJ()
|
@ -70,12 +70,9 @@ def OSCframe():
|
|||||||
oscserver.handle_request()
|
oscserver.handle_request()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# OSC server Thread : handler, dacs reports and simulator points sender to UI.
|
# OSC server Thread : handler, dacs reports and simulator points sender to UI.
|
||||||
def osc_thread():
|
def osc_thread():
|
||||||
|
|
||||||
|
|
||||||
#print("osc Thread launched")
|
#print("osc Thread launched")
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
@ -92,8 +89,6 @@ def osc_thread():
|
|||||||
print("\n")
|
print("\n")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Properly close the system. Todo
|
# Properly close the system. Todo
|
||||||
def Stop():
|
def Stop():
|
||||||
oscserver.close()
|
oscserver.close()
|
||||||
|
@ -398,6 +398,16 @@ def handler(oscpath, args):
|
|||||||
print()
|
print()
|
||||||
DAChecks()
|
DAChecks()
|
||||||
print("Done.")
|
print("Done.")
|
||||||
|
|
||||||
|
|
||||||
|
if oscpath[2] == "reset":
|
||||||
|
import shutil
|
||||||
|
print()
|
||||||
|
shutil.copyfile(gstt.ljpath+'/templates/LJ_template.conf', gstt.ljpath+'/LJ.conf')
|
||||||
|
print("templates/LJ_template.conf copied to LJ.conf.")
|
||||||
|
print("** RESTART LJ **")
|
||||||
|
#LJautokill()
|
||||||
|
|
||||||
|
|
||||||
if oscpath[2] == "restart":
|
if oscpath[2] == "restart":
|
||||||
print()
|
print()
|
||||||
@ -597,7 +607,7 @@ def UpdateAllwww():
|
|||||||
Updatepage(gstt.ljpath+"/www/LJ.js")
|
Updatepage(gstt.ljpath+"/www/LJ.js")
|
||||||
Updatepage(gstt.ljpath+"/www/trckr/trckrcam1.html")
|
Updatepage(gstt.ljpath+"/www/trckr/trckrcam1.html")
|
||||||
Updatepage(gstt.ljpath+"/www/simu.html")
|
Updatepage(gstt.ljpath+"/www/simu.html")
|
||||||
Updatepage(gstt.ljpath+"/www/align.html")
|
Updatepage(gstt.ljpath+"/www/settings.html")
|
||||||
Updatepage(gstt.ljpath+"/www/auralls.html")
|
Updatepage(gstt.ljpath+"/www/auralls.html")
|
||||||
Updatepage(gstt.ljpath+"/www/index.html")
|
Updatepage(gstt.ljpath+"/www/index.html")
|
||||||
|
|
||||||
|
@ -1012,8 +1012,4 @@ def TextRGB(message, zpos, c, layer, xpos, ypos, resize, rotx, roty, rotz):
|
|||||||
Text(message, zpos, int('0x%02x%02x%02x' % (red,green,blue),0), layer, xpos, ypos, resize, rotx, roty, rotz)
|
Text(message, zpos, int('0x%02x%02x%02x' % (red,green,blue),0), layer, xpos, ypos, resize, rotx, roty, rotz)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -15,7 +15,7 @@ from libs3 import gstt
|
|||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
from socket import *
|
||||||
|
|
||||||
def Init(wserver):
|
def Init(wserver):
|
||||||
global WSserver
|
global WSserver
|
||||||
@ -177,6 +177,14 @@ def OSCsend(name, oscaddress, oscargs =''):
|
|||||||
#PluginStart(name)
|
#PluginStart(name)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def sendbroadcast():
|
||||||
|
|
||||||
|
if gstt.debug > 0:
|
||||||
|
print("Sending broadcast")
|
||||||
|
cs = socket(AF_INET, SOCK_DGRAM)
|
||||||
|
cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
|
||||||
|
cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
|
||||||
|
cs.sendto("LJ 0.8".encode(), ("255.255.255.255", 54545))
|
||||||
|
|
||||||
|
|
||||||
# for each plugin will automatically add /pluginame before oscpath to send like /aurora/scim 1, if oscpath = "/scim 1"
|
# for each plugin will automatically add /pluginame before oscpath to send like /aurora/scim 1, if oscpath = "/scim 1"
|
||||||
|
@ -23,44 +23,44 @@ This tracer include an enhanced version (support for several lasers) of the ethe
|
|||||||
|
|
||||||
- Drawing things :
|
- Drawing things :
|
||||||
|
|
||||||
/pl/Scene/lasernumber [(x,y,color),(x1,y1,color),...] The live list of drawn pygame points. Tracer continously ask redis for key /clientkey+lasernumber
|
/pl/Scene/lasernumber [(x,y,color),(x1,y1,color),...] The live list of drawn pygame points. Tracer continously ask redis for key /clientkey+lasernumber
|
||||||
/resampler/lasernumber [(1.0,8), (0.25,3),(0.75,3),(1.0,10)] : a string for resampling rules.
|
/resampler/lasernumber [(1.0,8), (0.25,3),(0.75,3),(1.0,10)] : a string for resampling rules.
|
||||||
the first tuple (1.0,8) is for short line < 4000 in etherdream space
|
the first tuple (1.0,8) is for short line < 4000 in etherdream space
|
||||||
(0.25,3),(0.75,3),(1.0,10) for long line > 4000
|
(0.25,3),(0.75,3),(1.0,10) for long line > 4000
|
||||||
i.e (0.25,3) means go at 25% position on the line, send 3 times this position to etherdream
|
i.e (0.25,3) means go at 25% position on the line, send 3 times this position to etherdream
|
||||||
/clientkey "/pl/SceneNumber/" What Scene to retrieve from redis
|
/clientkey "/pl/SceneNumber/" What Scene to retrieve from redis
|
||||||
/EDH/lasernumber
|
/EDH/lasernumber
|
||||||
|
|
||||||
- Tracer control :
|
- Tracer control :
|
||||||
|
|
||||||
/order 0-8 Set redis key with new value then issue the order number
|
/order 0-8 Set redis key with new value then issue the order number
|
||||||
|
|
||||||
0 : Draw Normal point list
|
0 : Draw Normal point list
|
||||||
1 : Get the new EDH = reread redis key /EDH/lasernumber
|
1 : Get the new EDH = reread redis key /EDH/lasernumber
|
||||||
2 : Draw BLACK point list
|
2 : Draw BLACK point list
|
||||||
3 : Draw GRID point list
|
3 : Draw GRID point list
|
||||||
4 : Resampler Change (longs and shorts lsteps)
|
4 : Resampler Change (longs and shorts lsteps)
|
||||||
5 : Client Key Change = reread redis key /clientkey
|
5 : Client Key Change = reread redis key /clientkey
|
||||||
6 : Max Intensity Change = reread redis key /intensity
|
6 : Max Intensity Change = reread redis key /intensity
|
||||||
7 : kpps change = reread redis key /kpps
|
7 : kpps change = reread redis key /kpps
|
||||||
8 : color balance change = reread redis keys /red /green /blue
|
8 : color balance change = reread redis keys /red /green /blue
|
||||||
|
|
||||||
|
|
||||||
- Managing Etherdream DACs :
|
- Managing Etherdream DACs :
|
||||||
|
|
||||||
Discrete drawing values
|
Discrete drawing values
|
||||||
|
|
||||||
/kpps 0- DAC output speed to laser, then order 7. Depends of actual angle
|
/kpps 0- DAC output speed to laser, then order 7. Depends of actual angle
|
||||||
/intensity 0-255 Laser output power, then order 6 (for alignement,...)
|
/intensity 0-255 Laser output power, then order 6 (for alignement,...)
|
||||||
/red 0-100 % of full red, then order 8
|
/red 0-100 % of full red, then order 8
|
||||||
/green 0-100 % of full green, then order 8
|
/green 0-100 % of full green, then order 8
|
||||||
/blue 0-100 % of full blue, then order 8
|
/blue 0-100 % of full blue, then order 8
|
||||||
|
|
||||||
DAC status report
|
DAC status report
|
||||||
|
|
||||||
/lstt/lasernumber etherdream last_status.playback_state (0: idle 1: prepare 2: playing)
|
/lstt/lasernumber etherdream last_status.playback_state (0: idle 1: prepare 2: playing)
|
||||||
/cap/lasernumber number of empty points sent to fill etherdream buffer (up to 1799)
|
/cap/lasernumber number of empty points sent to fill etherdream buffer (up to 1799)
|
||||||
/lack/lasernumber "a": ACK "F": Full "I": invalid. 64 or 35 for no connection.
|
/lack/lasernumber "a": ACK "F": Full "I": invalid. 64 or 35 for no connection.
|
||||||
|
|
||||||
|
|
||||||
Geometric corrections
|
Geometric corrections
|
||||||
@ -223,7 +223,7 @@ class DAC(object):
|
|||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
|
||||||
#pdb.set_trace()
|
#pdb.set_trace()
|
||||||
for indexpoint,currentpoint in enumerate(self.pl):
|
for indexpoint,currentpoint in enumerate(self.pl):
|
||||||
#print indexpoint, currentpoint
|
#print indexpoint, currentpoint
|
||||||
xyc = [currentpoint[0],currentpoint[1],currentpoint[2]]
|
xyc = [currentpoint[0],currentpoint[1],currentpoint[2]]
|
||||||
@ -335,7 +335,7 @@ class DAC(object):
|
|||||||
|
|
||||||
# ipconn state is -1 at startup (see gstt) and modified here
|
# ipconn state is -1 at startup (see gstt) and modified here
|
||||||
r.set('/lack/'+str(self.mylaser), self.connstatus)
|
r.set('/lack/'+str(self.mylaser), self.connstatus)
|
||||||
gstt.lstt_ipconn[self.mylaser] = self.connstatus
|
gstt.lstt_ipconn[self.mylaser] = self.connstatus
|
||||||
|
|
||||||
self.buf = b''
|
self.buf = b''
|
||||||
# Upper case PL is the Point List number
|
# Upper case PL is the Point List number
|
||||||
@ -349,7 +349,7 @@ class DAC(object):
|
|||||||
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)).decode('ascii')))
|
gstt.EDH[self.mylaser] = np.array(ast.literal_eval(r.get('/EDH/'+str(self.mylaser)).decode('ascii')))
|
||||||
#print("Laser",self.mylaser,"found its EDH in redis")
|
#print("Laser",self.mylaser,"found its EDH in redis")
|
||||||
@ -447,9 +447,17 @@ class DAC(object):
|
|||||||
if order == 0:
|
if order == 0:
|
||||||
|
|
||||||
# USER point list
|
# USER point list
|
||||||
self.pl = ast.literal_eval(r.get(self.clientkey+str(self.mylaser)).decode('ascii'))
|
|
||||||
|
#self.pl = ast.literal_eval(r.get(self.clientkey+str(self.mylaser)).decode('ascii'))
|
||||||
#print("Tracer : laser", self.mylaser, " order 0 : pl : ",len(self.pl))
|
#print("Tracer : laser", self.mylaser, " order 0 : pl : ",len(self.pl))
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.pl = ast.literal_eval(r.get(self.clientkey+str(self.mylaser)).decode('ascii'))
|
||||||
|
|
||||||
|
except SyntaxError:
|
||||||
|
print("BAD POINTLIST on Tracer : laser", self.mylaser, " order 0 : pl :",self.pl)
|
||||||
|
self.pl = grid_points
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
# Get the new EDH
|
# Get the new EDH
|
||||||
@ -524,13 +532,13 @@ class DAC(object):
|
|||||||
time.sleep(0.001)
|
time.sleep(0.001)
|
||||||
cap += 150
|
cap += 150
|
||||||
|
|
||||||
# print("Writing %d points" % (cap, ))
|
#print("Writing %d points" % (cap, ))
|
||||||
#t0 = time.time()
|
#t0 = time.time()
|
||||||
#if self.mylaser == 2:
|
#if self.mylaser == 2:
|
||||||
# print(points)
|
# print(points)
|
||||||
self.write(points)
|
self.write(points)
|
||||||
#t1 = time.time()
|
#t1 = time.time()
|
||||||
# print("Took %f" % (t1 - t0, )
|
#print("Took %f" % (t1 - t0, )
|
||||||
|
|
||||||
if not started:
|
if not started:
|
||||||
print("Tracer", self.mylaser, "starting with", gstt.kpps[self.mylaser],"kpps")
|
print("Tracer", self.mylaser, "starting with", gstt.kpps[self.mylaser],"kpps")
|
||||||
@ -571,7 +579,7 @@ def find_dac():
|
|||||||
order = r.get('/order')
|
order = r.get('/order')
|
||||||
neworder = order & ~(1<< self.mylaser*2)
|
neworder = order & ~(1<< self.mylaser*2)
|
||||||
neworder = neworder & ~(1<< 1+ self.mylaser*2)
|
neworder = neworder & ~(1<< 1+ self.mylaser*2)
|
||||||
r.set('/order', str(neworder))
|
r.set('/order', str(neworder))
|
||||||
else:
|
else:
|
||||||
|
|
||||||
# Laser bit 0 = 1
|
# Laser bit 0 = 1
|
||||||
|
25
main.py
25
main.py
@ -36,35 +36,32 @@ print("")
|
|||||||
import redis
|
import redis
|
||||||
import os
|
import os
|
||||||
ljpath = r'%s' % os.getcwd().replace('\\','/')
|
ljpath = r'%s' % os.getcwd().replace('\\','/')
|
||||||
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
#sys.path.append('libs3/')
|
#sys.path.append('libs3/')
|
||||||
|
|
||||||
from libs3 import gstt, settings
|
from libs3 import gstt, settings
|
||||||
gstt.ljpath= ljpath
|
gstt.ljpath = ljpath
|
||||||
|
|
||||||
log.info("Reading " + gstt.ConfigName + " setup file...")
|
log.info("Reading " + gstt.ConfigName + " setup file...")
|
||||||
settings.Read()
|
settings.Read()
|
||||||
|
|
||||||
# Arguments may alter .conf file so import settings first then cli
|
# Arguments may alter .conf file so import settings first then cli
|
||||||
from libs3 import cli
|
from libs3 import cli
|
||||||
|
|
||||||
settings.Write()
|
settings.Write()
|
||||||
|
|
||||||
from multiprocessing import Process, set_start_method
|
from multiprocessing import Process, set_start_method
|
||||||
import random, ast
|
import random, ast
|
||||||
|
|
||||||
from libs3 import plugins
|
from libs3 import plugins
|
||||||
|
|
||||||
|
|
||||||
|
#from libs3 import lasytracer as tracer
|
||||||
from libs3 import tracer3 as tracer
|
from libs3 import tracer3 as tracer
|
||||||
|
|
||||||
|
|
||||||
from libs3 import homographyp, commands, font1
|
from libs3 import homographyp, commands, font1
|
||||||
|
|
||||||
#import subprocess
|
#import subprocess
|
||||||
|
|
||||||
import os
|
import os
|
||||||
#import midi
|
#import midi
|
||||||
|
|
||||||
from libs3 import OSC3
|
from libs3 import OSC3
|
||||||
from websocket_server import WebsocketServer
|
from websocket_server import WebsocketServer
|
||||||
#import socket
|
#import socket
|
||||||
@ -264,14 +261,16 @@ def osc_thread():
|
|||||||
|
|
||||||
#print("Sending simu frame from",'/pl/'+str(gstt.SceneNumber)+'/'+str(gstt.Laser))
|
#print("Sending simu frame from",'/pl/'+str(gstt.SceneNumber)+'/'+str(gstt.Laser))
|
||||||
#print(r.get('/pl/'+str(gstt.SceneNumber)+'/'+str(gstt.Laser)))
|
#print(r.get('/pl/'+str(gstt.SceneNumber)+'/'+str(gstt.Laser)))
|
||||||
sendWSall("/simul" +" "+ str(r.get('/pl/'+str(gstt.SceneNumber)+'/'+str(gstt.Laser)).decode('ascii')))
|
sendWSall("/simul" +" "+ str(r.get('/po/'+str(gstt.SceneNumber)+'/'+str(gstt.Laser)).decode('ascii')))
|
||||||
|
if random.randint(0,100)>95:
|
||||||
|
plugins.sendbroadcast()
|
||||||
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
import sys, traceback
|
import sys, traceback
|
||||||
print('\n---------------------')
|
print('\n--------------------------')
|
||||||
print('Exception: %s' % e)
|
print('OSC Thread Exception: %s' % e)
|
||||||
print('- - - - - - - - - - -')
|
print('- - - - - - - - - - - - - - ')
|
||||||
traceback.print_tb(sys.exc_info()[2])
|
traceback.print_tb(sys.exc_info()[2])
|
||||||
print("\n")
|
print("\n")
|
||||||
|
|
||||||
|
@ -181,7 +181,7 @@ log.infog("Aurora v0.1b")
|
|||||||
OSCinPort = 8090
|
OSCinPort = 8090
|
||||||
ljscene = 0
|
ljscene = 0
|
||||||
|
|
||||||
StartFXs = ["anim.Maxwell","anim.Starfield","anim.Starfield", "anim.Word"]
|
StartFXs = ["anim.Starfield","anim.Starfield","anim.Starfield", "anim.Word"]
|
||||||
|
|
||||||
# Useful variables init.
|
# Useful variables init.
|
||||||
white = lj.rgb2int(255,255,255)
|
white = lj.rgb2int(255,255,255)
|
||||||
@ -1125,9 +1125,9 @@ def AllFX():
|
|||||||
dots = eval(LAY['FX']+"(LAY)")
|
dots = eval(LAY['FX']+"(LAY)")
|
||||||
if LAY['FX'] != "Zero" or lent(dots) != 0:
|
if LAY['FX'] != "Zero" or lent(dots) != 0:
|
||||||
#print(dots, LAY['color'])
|
#print(dots, LAY['color'])
|
||||||
for cc in range(15):
|
#for cc in range(15):
|
||||||
ccmidi[cc] = int(lj.fromKey("/midi/cc/1/"+str(cc)))
|
# ccmidi[cc] = int(lj.fromKey("/midi/cc/1/"+str(cc)))
|
||||||
#print(ccmidi)
|
# #print(ccmidi)
|
||||||
lj.rPolyLineOneColor(dots, c = LAY['color'], layer = l, closed = LAY['closed'], xpos = LAY['Xcoord'] + LAY['stepvals'][LAY['step']] - (LAY['lineSize']/2), ypos = Layer[l]['Ycoord'], resize = LAY['scale'] * audioR, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
|
lj.rPolyLineOneColor(dots, c = LAY['color'], layer = l, closed = LAY['closed'], xpos = LAY['Xcoord'] + LAY['stepvals'][LAY['step']] - (LAY['lineSize']/2), ypos = Layer[l]['Ycoord'], resize = LAY['scale'] * audioR, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
|
||||||
#lj.rPolyLineOneColor(dots, c = LAY['color'], layer = l, closed = LAY['closed'], xpos = LAY['Xcoord'] - (ccmidi[0]-64)*4 - (LAY['lineSize']/2), ypos = Layer[l]['Ycoord'] + (ccmidi[1]-64)*4, resize = LAY['scale'] * audioR * (ccmidi[2])/50, rotx = LAY['Xrotdirec']+(ccmidi[3]*3), roty = LAY['Yrotdirec']+(ccmidi[3]*3), rotz = LAY['Zrotdirec']+(ccmidi[3]*3))
|
#lj.rPolyLineOneColor(dots, c = LAY['color'], layer = l, closed = LAY['closed'], xpos = LAY['Xcoord'] - (ccmidi[0]-64)*4 - (LAY['lineSize']/2), ypos = Layer[l]['Ycoord'] + (ccmidi[1]-64)*4, resize = LAY['scale'] * audioR * (ccmidi[2])/50, rotx = LAY['Xrotdirec']+(ccmidi[3]*3), roty = LAY['Yrotdirec']+(ccmidi[3]*3), rotz = LAY['Zrotdirec']+(ccmidi[3]*3))
|
||||||
else:
|
else:
|
||||||
|
937
www/align.html
937
www/align.html
@ -1,937 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Align Rack</title>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="apple-mobile-web-app-title" content="Align">
|
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
||||||
<link rel="apple-touch-startup-image" href="/launch.png">
|
|
||||||
<link rel="apple-touch-icon" href="touch-icon-iphone.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="152x152" href="touch-icon-ipad.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="touch-icon-iphone-retina.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="167x167" href="touch-icon-ipad-retina.png">
|
|
||||||
|
|
||||||
<!-- Page specific styles -->
|
|
||||||
|
|
||||||
<style>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<!-- Web audio buttons defaults -->
|
|
||||||
<script type="application/javascript" src="webcomponents-lite.js"></script>
|
|
||||||
<script type="application/javascript" src="config.js"></script>
|
|
||||||
<script>
|
|
||||||
WebAudioControlsOptions={
|
|
||||||
useMidi:1,
|
|
||||||
knobSrc:"knobs/simplegray.png",
|
|
||||||
knobSprites:100,
|
|
||||||
switchSrc:"knobs/switch_toggle.png",
|
|
||||||
sliderSrc:"knobs/vsliderbody.png",
|
|
||||||
sliderKnobsrc:"knobs/vsliderknob.png",
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<script src="webaudio-controls.js"></script>
|
|
||||||
<!-- link rel="stylesheet" href="LJgrid.css" / -->
|
|
||||||
<link rel="stylesheet" type="text/css" href="selector.min.css">
|
|
||||||
<script type="application/javascript" src="selector.min.js"></script>
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="css/common.css" />
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body style="background-color:#222;">
|
|
||||||
<div class="Rackcontent">
|
|
||||||
<!--
|
|
||||||
Navigation Rack
|
|
||||||
-->
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<div class="buttons-7container">
|
|
||||||
|
|
||||||
<a href="index.html">
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled">
|
|
||||||
Index
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="align.html">
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled">
|
|
||||||
Align
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="auralls.html">
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled">
|
|
||||||
Aurora
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="trckr/trckrcam1.html">
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled">
|
|
||||||
Lasercam
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="simu.html">
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled">
|
|
||||||
Simu
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<button type="button" class="navled" style="border : #222222 1px;" onclick="onSubmit(this.id)" id="settings/restart lj" >
|
|
||||||
restrt LJ
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<button type="button" class="navled" style="border : #222222 1px;" onclick="onSubmit(this.id)" id="settings/restart aurora" >
|
|
||||||
restrt AU
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Display Rack
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<div class="TopRackGrid">
|
|
||||||
<div>
|
|
||||||
<h2>
|
|
||||||
/TL Align
|
|
||||||
<span class="shade"> </span>
|
|
||||||
</h2>
|
|
||||||
<webaudio-switch id="on" value="1" tooltip="Switch-B" height="35" width="85" src="knobs/switch1.png">
|
|
||||||
</webaudio-switch>
|
|
||||||
</div>
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" id="line1" class="busled">
|
|
||||||
Align Rack
|
|
||||||
</div>
|
|
||||||
<div align="center" id="status" class="busled">
|
|
||||||
/team/laser
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="etherled" style="margin-left: 30px;margin-top: 1px;">
|
|
||||||
Stt
|
|
||||||
<webaudio-knob id="lstt/0" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
|
|
||||||
<webaudio-knob id="lstt/1" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
|
|
||||||
<webaudio-knob id="lstt/2" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
|
|
||||||
<webaudio-knob id="lstt/3" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
|
|
||||||
</div>
|
|
||||||
<div class="etherled" style="margin-left: 30px;margin-top: 1px;">
|
|
||||||
Ack
|
|
||||||
<webaudio-knob id="lack/0" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
|
|
||||||
<webaudio-knob id="lack/1" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
|
|
||||||
<webaudio-knob id="lack/2" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
|
|
||||||
<webaudio-knob id="lack/3" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Scene choice Rack
|
|
||||||
-->
|
|
||||||
<div class="content">
|
|
||||||
<div class="Settingrid">
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<h2>Scene</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="webaudiobut" align="center" style="width: 83px;">
|
|
||||||
<button type="button" class="navled" style="border: 1px solid #002020; text-align: middle;" onclick="onSubmit(this.id)" id="scene/0/start 1" >
|
|
||||||
0
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="webaudiobut" align="center" style="width: 83px;">
|
|
||||||
<button type="button" class="navled" style="border: 1px solid #002020; text-align: middle;" onclick="onSubmit(this.id)" id="scene/1/start 1" >
|
|
||||||
1
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="webaudiobut" align="center" style="width: 83px;">
|
|
||||||
<button type="button" class="navled" style="border: 1px solid #002020; text-align: middle;" onclick="onSubmit(this.id)" id="scene/2/start 1" >
|
|
||||||
2
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="webaudiobut" align="center" style="width: 83px;">
|
|
||||||
<button type="button" class="navled" style="border: 1px solid #002020; text-align: middle;" onclick="onSubmit(this.id)" id="scene/3/start 1" >
|
|
||||||
3
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div></div>
|
|
||||||
<div></div>
|
|
||||||
<div></div>
|
|
||||||
<div> </div>
|
|
||||||
<div></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Settings Rack
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<div class="Settingrid">
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<h2>Settings</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled" style="border: 1px solid #222;">
|
|
||||||
Lasers
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<form onsubmit="onSubmit(); return false;">
|
|
||||||
<select name="settings/lasers" class = "submitalign" onchange = "onSubmit(this.id)" type="text" id="settings/lasers">
|
|
||||||
<option value="1" selected>1</option>
|
|
||||||
<option value="2">2</option>
|
|
||||||
<option value="3">3</option>
|
|
||||||
<option value="4">4</option>
|
|
||||||
</select>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div class="webaudiobut" align="center" style="width: 83px;">
|
|
||||||
<button type="button" class="navled" style="border: 1px solid #002020; text-align: middle;" onclick="onSubmit(this.id)" id="settings/rescan" >
|
|
||||||
Rescan
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<form onsubmit="onSubmit(); return false;">
|
|
||||||
<select name="settings/debug" class = "submitalign" onchange = "onSubmit(this.id)" type="text" id="settings/debug">
|
|
||||||
<option value="0" selected>0</option>
|
|
||||||
<option value="1">1</option>
|
|
||||||
<option value="2">2</option>
|
|
||||||
</select>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled" style="border: 1px solid #222;">
|
|
||||||
Debug
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<form onsubmit="onSubmit(); return false;">
|
|
||||||
<input class = "submite" onchange = "onSubmit(this.id)" type="text" id="settings/IP">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="webaudiobut" align="center" style="width: 73px;">
|
|
||||||
<button type="button" class="navled" style="border: 1px solid #002020;" onclick="onSubmit(this.id)" id="settings/regen" >
|
|
||||||
Regen
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div></div>
|
|
||||||
<div></div>
|
|
||||||
<div></div>
|
|
||||||
<div> </div>
|
|
||||||
<div></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Align Rack
|
|
||||||
-->
|
|
||||||
<div class="content" style="height: 500px">
|
|
||||||
|
|
||||||
<div class="TextGrid">
|
|
||||||
|
|
||||||
<div class="mgalign" style="margin-left:0px;">
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Laser 0
|
|
||||||
-->
|
|
||||||
<div class="laserbox" align="center">
|
|
||||||
<!-- IP laser 0 -->
|
|
||||||
<div>
|
|
||||||
<form onsubmit="onSubmit(); return false;">
|
|
||||||
<input class = "submite" onchange = "onSubmit(this.id)" type="text" id="ip/0">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Laser type
|
|
||||||
<div class="spacer" style="height: 10px;"></div>
|
|
||||||
<div >
|
|
||||||
|
|
||||||
<form onsubmit="onSubmit(); return false;">
|
|
||||||
<select name="lasertype" class = "submite" onchange = "onSubmit(this.id)" type="text" id="lasertype/0">
|
|
||||||
<option value="DS1000" selected>DS1000</option>
|
|
||||||
<option value="Luke400">Luke400</option>
|
|
||||||
<option value="Spectra">Spectra</option>
|
|
||||||
<option value="Fire500">Fire500</option>
|
|
||||||
</select>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
<div class="spacer" style="height: 8px;"></div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<!-- Align Icons -->
|
|
||||||
<webaudio-switch id="grid/0" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/grid.png"></webaudio-switch>
|
|
||||||
<webaudio-switch id="mouse/0" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/mouse.png"></webaudio-switch>
|
|
||||||
<!-- Blackout icon -->
|
|
||||||
<webaudio-switch id="black/0" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/blackout.png"></webaudio-switch>
|
|
||||||
<!-- Swap Icons -->
|
|
||||||
<webaudio-switch id="swap/X/0" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapx.png"></webaudio-switch>
|
|
||||||
<webaudio-switch id="swap/Y/0" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="spacer" style="height: 6px;"></div>
|
|
||||||
|
|
||||||
<!-- kpps knob -->
|
|
||||||
<div><webaudio-knob id="kpps/0" diameter="60" min="100" max="40000" value="25000"></webaudio-knob></div>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Lasergrid 0 -->
|
|
||||||
<div class="lasergrid" style="background-image: url(knobs/lasergrid0.png);">
|
|
||||||
<!-- kPPS & Points-->
|
|
||||||
<div></div>
|
|
||||||
<div><webaudio-param id="kpps/0" link="kpps/0" ></webaudio-param></div>
|
|
||||||
<div><webaudio-param id="points/0" link="points/0"></webaudio-param></div>
|
|
||||||
|
|
||||||
<div></div>
|
|
||||||
<div class="lasertext">kPPS</div>
|
|
||||||
<div class="lasertext">Buffer</div>
|
|
||||||
<div></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
|
|
||||||
<!-- Angle, Offset X, Offset Y -->
|
|
||||||
<div><webaudio-knob id="angle/0" diameter="60" min="0" max="360" value="0"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="loffset/X/0" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="loffset/Y/0" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
|
|
||||||
<div class="lasertext">Angle</div>
|
|
||||||
<div class="lasertext">Offset X</div>
|
|
||||||
<div class="lasertext">Offset Y</div>
|
|
||||||
<div><webaudio-param link="angle/0" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="loffset/X/0" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="loffset/Y/0" value="0"></webaudio-param></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
|
|
||||||
<!-- Max global intensity, Scale X, Scale Y -->
|
|
||||||
<div><webaudio-knob id="intens/0" diameter="60" min="0" max="255" value="255"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="scale/X/0" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="scale/Y/0" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
|
|
||||||
<div class="lasertext"style="color: #ddd;">Intens</div>
|
|
||||||
<div class="lasertext">Scale X</div>
|
|
||||||
<div class="lasertext">Scale X</div>
|
|
||||||
<div><webaudio-param link="intens/0" value="255"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="scale/X/0" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="scale/Y/0" value="0"></webaudio-param></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
|
|
||||||
<!-- Red green blue % Intensity for color balancing -->
|
|
||||||
<div><webaudio-knob id="red/0" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="green/0" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="blue/0" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div class="lasertext" style="color: #cbb;">Red</div>
|
|
||||||
<div class="lasertext" style="color: #bcb;">Green</div>
|
|
||||||
<div class="lasertext" style="color: #bbc;">Blue</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Laser 1
|
|
||||||
-->
|
|
||||||
<div class="laserbox" align="center">
|
|
||||||
<!-- IP laser 1 -->
|
|
||||||
<div>
|
|
||||||
<form onsubmit="onSubmit(); return false;">
|
|
||||||
<input class = "submite" onchange = "onSubmit(this.id)" type="text" id="ip/1">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div class="spacer" style="height: 8px;"></div>
|
|
||||||
<div >
|
|
||||||
|
|
||||||
<!-- Align Icons -->
|
|
||||||
<webaudio-switch id="grid/1" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/grid.png"></webaudio-switch>
|
|
||||||
<webaudio-switch id="mouse/1" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/mouse.png"></webaudio-switch>
|
|
||||||
|
|
||||||
<!-- Blackout icon -->
|
|
||||||
<webaudio-switch id="black/1" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/blackout.png"></webaudio-switch>
|
|
||||||
|
|
||||||
<!-- Swap Icons -->
|
|
||||||
<webaudio-switch id="swap/X/1" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapx.png"></webaudio-switch>
|
|
||||||
<webaudio-switch id="swap/Y/1" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
|
|
||||||
</div>
|
|
||||||
<div class="spacer" style="height: 6px;"></div>
|
|
||||||
|
|
||||||
<!-- kpps knob -->
|
|
||||||
<div><webaudio-knob id="kpps/1" diameter="60" min="100" max="40000" value="25000"></webaudio-knob></div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Lasergrid 1 -->
|
|
||||||
<div class="lasergrid" style="background-image: url(knobs/lasergrid1.png);">
|
|
||||||
|
|
||||||
<!-- kPPS & Points-->
|
|
||||||
<div></div>
|
|
||||||
<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></div>
|
|
||||||
<div class="lasertext">kPPS</div>
|
|
||||||
<div class="lasertext">Buffer</div>
|
|
||||||
<div></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
|
|
||||||
<!-- Angle, Offset X, Offset Y -->
|
|
||||||
<div><webaudio-knob id="angle/1" diameter="60" min="0" max="360"value="0"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="loffset/X/1" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="loffset/Y/1" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
|
|
||||||
<div class="lasertext">Angle</div>
|
|
||||||
<div class="lasertext">Offset X</div>
|
|
||||||
<div class="lasertext">Offset Y</div>
|
|
||||||
<div><webaudio-param link="angle/1" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="loffset/X/1" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="loffset/Y/1" value="0"></webaudio-param></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
|
|
||||||
<!-- Max global intensity, Scale X, Scale Y -->
|
|
||||||
<div><webaudio-knob id="intens/1" diameter="60" min="0" max="255" value="255"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="scale/X/1" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="scale/Y/1" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
|
|
||||||
<div class="lasertext"style="color: #ddd;">Intens</div>
|
|
||||||
<div class="lasertext">Scale X</div>
|
|
||||||
<div class="lasertext">Scale X</div>
|
|
||||||
<div><webaudio-param link="intens/1" value="255"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="scale/X/1" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="scale/Y/1" value="0"></webaudio-param></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
|
|
||||||
<!-- Red green blue % Intensity for color balancing -->
|
|
||||||
<div><webaudio-knob id="red/1" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="green/1" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="blue/1" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div class="lasertext" style="color: #cbb;">Red</div>
|
|
||||||
<div class="lasertext" style="color: #bcb;">Green</div>
|
|
||||||
<div class="lasertext" style="color: #bbc;">Blue</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Laser 2
|
|
||||||
-->
|
|
||||||
<div class="laserbox" align="center">
|
|
||||||
<!-- IP laser 2 -->
|
|
||||||
<div>
|
|
||||||
<form onsubmit="onSubmit(); return false;">
|
|
||||||
<input class = "submite" onchange = "onSubmit(this.id)" type="text" id="ip/2">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div class="spacer" style="height: 8px;"></div>
|
|
||||||
<div>
|
|
||||||
|
|
||||||
<!-- Align Icons -->
|
|
||||||
<webaudio-switch id="grid/2" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/grid.png"></webaudio-switch>
|
|
||||||
<webaudio-switch id="mouse/2" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/mouse.png"></webaudio-switch>
|
|
||||||
|
|
||||||
<!-- Blackout icon -->
|
|
||||||
<webaudio-switch id="black/2" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/blackout.png"></webaudio-switch>
|
|
||||||
|
|
||||||
<!-- Swap Icons -->
|
|
||||||
<webaudio-switch id="swap/X/2" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapx.png"></webaudio-switch>
|
|
||||||
<webaudio-switch id="swap/Y/2" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
|
|
||||||
</div>
|
|
||||||
<div class="spacer" style="height: 6px;"></div>
|
|
||||||
<!-- kpps knob -->
|
|
||||||
|
|
||||||
<div><webaudio-knob id="kpps/2" diameter="60" min="100" max="40000" value="25000"></webaudio-knob></div>
|
|
||||||
|
|
||||||
<!-- Laser 2 grid -->
|
|
||||||
<div class="lasergrid" style="background-image: url(knobs/lasergrid2.png)">
|
|
||||||
|
|
||||||
<!-- kPPS & Points-->
|
|
||||||
<div></div>
|
|
||||||
<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></div>
|
|
||||||
<div class="lasertext">kPPS</div>
|
|
||||||
<div class="lasertext">Buffer</div>
|
|
||||||
<div></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
|
|
||||||
<!-- Angle, Offset X, Offset Y -->
|
|
||||||
<div><webaudio-knob id="angle/2" diameter="60" min="0" max="360" value="0"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="loffset/X/2" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="loffset/Y/2" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
|
|
||||||
<div class="lasertext">Angle</div>
|
|
||||||
<div class="lasertext">Offset X</div>
|
|
||||||
<div class="lasertext">Offset Y</div>
|
|
||||||
<div><webaudio-param link="angle/2" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="loffset/X/2" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="loffset/Y/2" value="0"></webaudio-param></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
|
|
||||||
<!-- Max global intensity, Scale X, Scale Y -->
|
|
||||||
<div><webaudio-knob id="intens/2" diameter="60" min="0" max="255" value="255"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="scale/X/2" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="scale/Y/2" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
|
|
||||||
<div class="lasertext"style="color: #ddd;">Intens</div>
|
|
||||||
<div class="lasertext">Scale X</div>
|
|
||||||
<div class="lasertext">Scale X</div>
|
|
||||||
<div><webaudio-param link="intens/2" value="255"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="scale/X/2" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="scale/Y/2" value="0"></webaudio-param></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
|
|
||||||
<!-- Red green blue % Intensity for color balancing -->
|
|
||||||
<div><webaudio-knob id="red/2" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="green/2" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="blue/2" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div class="lasertext" style="color: #cbb;">Red</div>
|
|
||||||
<div class="lasertext" style="color: #bcb;">Green</div>
|
|
||||||
<div class="lasertext" style="color: #bbc;">Blue</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Laser 3
|
|
||||||
-->
|
|
||||||
<div class="laserbox" align="center">
|
|
||||||
<!-- IP laser 3 -->
|
|
||||||
<div>
|
|
||||||
<form onsubmit="onSubmit(); return false;">
|
|
||||||
<input class = "submite" onchange = "onSubmit(this.id)" type="text" id="ip/3">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div class="spacer" style="height: 8px;"></div>
|
|
||||||
<div>
|
|
||||||
|
|
||||||
<!-- Align Icons -->
|
|
||||||
<webaudio-switch id="grid/3" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/grid.png"></webaudio-switch>
|
|
||||||
<webaudio-switch id="mouse/3" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/mouse.png"></webaudio-switch>
|
|
||||||
|
|
||||||
<!-- Blackout icon -->
|
|
||||||
<webaudio-switch id="black/3" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/blackout.png"></webaudio-switch>
|
|
||||||
|
|
||||||
<!-- Swap Icons -->
|
|
||||||
<webaudio-switch id="swap/X/3" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapx.png"></webaudio-switch>
|
|
||||||
<webaudio-switch id="swap/Y/3" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
|
|
||||||
</div>
|
|
||||||
<div class="spacer" style="height: 6px;"></div>
|
|
||||||
|
|
||||||
<!-- kpps knob -->
|
|
||||||
<div><webaudio-knob id="kpps/3" diameter="60" min="100" max="40000" value="25000"></webaudio-knob></div>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Laser 3 grid -->
|
|
||||||
<div class="lasergrid" style="background-image: url(knobs/lasergrid3.png)">
|
|
||||||
|
|
||||||
<!-- kPPS & Points-->
|
|
||||||
<div></div>
|
|
||||||
<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></div>
|
|
||||||
<div class="lasertext">kPPS</div>
|
|
||||||
<div class="lasertext">Buffer</div>
|
|
||||||
<div></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
|
|
||||||
<!-- Angle, Offset X, Offset Y -->
|
|
||||||
<div><webaudio-knob id="angle/3" diameter="60" min="0" max="360" value="0"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="loffset/X/3" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="loffset/Y/3" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
|
|
||||||
<div class="lasertext">Angle</div>
|
|
||||||
<div class="lasertext">Offset X</div>
|
|
||||||
<div class="lasertext">Offset Y</div>
|
|
||||||
<div><webaudio-param link="angle/3" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="loffset/X/3" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="loffset/Y/3" value="0"></webaudio-param></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
<div class="spacer" style="height: 5px;"></div>
|
|
||||||
|
|
||||||
<!-- Max global intensity, Scale X, Scale Y -->
|
|
||||||
<div><webaudio-knob id="intens/3" diameter="60" min="0" max="255" value="255"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="scale/X/3" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="scale/Y/3" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
|
|
||||||
<div class="lasertext"style="color: #ddd;">Intens</div>
|
|
||||||
<div class="lasertext">Scale X</div>
|
|
||||||
<div class="lasertext">Scale X</div>
|
|
||||||
<div><webaudio-param link="intens/3" value="255"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="scale/X/3" value="0"></webaudio-param></div>
|
|
||||||
<div><webaudio-param link="scale/Y/3" value="0"></webaudio-param></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
<div class="spacer"></div>
|
|
||||||
|
|
||||||
<!-- Red green blue % Intensity for color balancing -->
|
|
||||||
<div><webaudio-knob id="red/3" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="green/3" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div><webaudio-knob id="blue/3" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
|
|
||||||
<div class="lasertext" style="color: #cbb;">Red</div>
|
|
||||||
<div class="lasertext" style="color: #bcb;">Green</div>
|
|
||||||
<div class="lasertext" style="color: #bbc;">Blue</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Encoders Line
|
|
||||||
|
|
||||||
# /aurora/radius layernumber radius [0-1]
|
|
||||||
# /aurora/rotdirec layer axe direc
|
|
||||||
# /aurora/linesize layer value
|
|
||||||
# /aurora/rotdirec layer axe direc
|
|
||||||
# /aurora/rotspeed layernumber axe speed
|
|
||||||
# /aurora/transpeed layernumber axe transpeed
|
|
||||||
# /aurora/transamt layernumber axe maxposition
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
JS
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- LJ style WS : A nettoyer ! -->
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
var LJ = websocket_uri
|
|
||||||
|
|
||||||
var _WS = {
|
|
||||||
uri: LJ,
|
|
||||||
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.showstatus("Connected to "+LJ);
|
|
||||||
document.getElementById("on").value = 1;
|
|
||||||
},
|
|
||||||
|
|
||||||
onClose: function () {
|
|
||||||
_WS.showline1('<span style="color: red;">LJ DISCONNECTED</span> ');
|
|
||||||
document.getElementById("on").value = 0;
|
|
||||||
document.getElementById("lstt/0").value = 0;
|
|
||||||
document.getElementById("lstt/1").value = 0;
|
|
||||||
document.getElementById("lstt/2").value = 0;
|
|
||||||
document.getElementById("lstt/3").value = 0;
|
|
||||||
document.getElementById("lack/0").value = 0;
|
|
||||||
document.getElementById("lack/1").value = 0;
|
|
||||||
document.getElementById("lack/2").value = 0;
|
|
||||||
document.getElementById("lack/3").value = 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
onMessage: function (e) {
|
|
||||||
var res = e.data.split(" ");
|
|
||||||
//console.log(e.data)
|
|
||||||
//console.log(res[0].substring(0,6))
|
|
||||||
//console.log(res)
|
|
||||||
//console.log(res[0].slice(1))
|
|
||||||
var divtext = document.getElementById('status');
|
|
||||||
var divtextp = document.getElementById('players');
|
|
||||||
|
|
||||||
|
|
||||||
switch (res[0].substring(0,6)) {
|
|
||||||
|
|
||||||
case "/statu":
|
|
||||||
_WS.showline1("connected to "+LJ);
|
|
||||||
if (res[2]==="Disconnected"){
|
|
||||||
_WS.showstatus(res[1]+" "+'<span style="color: red;">'+ res[2]+'</span> ');
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
_WS.showstatus(res[1]+" "+res[2]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/redst":
|
|
||||||
//console.log("red"+res[1]+" "+res[2]);
|
|
||||||
_WS.showstatus('<span style="color: red;">'+res[1]+" "+ res[2]+'</span> ');
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/line1":
|
|
||||||
//divtext.innerHTML="connected to "+LJ;
|
|
||||||
divtext1.innerHTML=res[1]+" "+res[2];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/redline1":
|
|
||||||
//divtext.innerHTML="connected to "+LJ;
|
|
||||||
divtext1.innerHTML='<span style="color: red;">'+ res[1]+" "+res[2]+'</span>';
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/lack/":
|
|
||||||
console.log("/lack "+res[1])
|
|
||||||
document.getElementById(res[0].slice(1)).value = res[1];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/lstt/":
|
|
||||||
console.log("/lstt "+res[1])
|
|
||||||
document.getElementById(res[0].slice(1)).value = res[1];
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
//console.log("test "+res[0].slice(1)+" "+res[1]);
|
|
||||||
document.getElementById(res[0].slice(1)).value = res[1];
|
|
||||||
//_WS.showstatus(e.data);
|
|
||||||
break
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onError: function (e) {
|
|
||||||
_WS.showstatus('<span style="color: red;">ERROR:</span> ' + e.data);
|
|
||||||
},
|
|
||||||
|
|
||||||
showin: function (message) {
|
|
||||||
var divtext = document.getElementById('status');
|
|
||||||
divtext.innerHTML="";
|
|
||||||
divtext.innerHTML= message.toString();
|
|
||||||
},
|
|
||||||
|
|
||||||
showout: function (message) {
|
|
||||||
var divtext = document.getElementById('status');
|
|
||||||
divtext.innerHTML="";
|
|
||||||
divtext.innerHTML= message.toString();
|
|
||||||
},
|
|
||||||
|
|
||||||
showstatus: function (message) {
|
|
||||||
var divtext = document.getElementById('status');
|
|
||||||
divtext.innerHTML="";
|
|
||||||
divtext.innerHTML= message.toString();
|
|
||||||
},
|
|
||||||
|
|
||||||
showline1: function (message) {
|
|
||||||
var divtext = document.getElementById('line1');
|
|
||||||
divtext.innerHTML="";
|
|
||||||
divtext.innerHTML= message.toString();
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
send: function (message) {
|
|
||||||
if (!message.length) {
|
|
||||||
alert('Empty message not allowed !');
|
|
||||||
} else {
|
|
||||||
_WS.showstatus(message);
|
|
||||||
_WS.s.send(message);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
close: function () {
|
|
||||||
_WS.showstatus('GOODBYE !');
|
|
||||||
_WS.s.close();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
window.addEventListener('load', _WS.init, false);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Forms submits
|
|
||||||
//
|
|
||||||
|
|
||||||
function onSubmit(clicked_id) {
|
|
||||||
var input = document.getElementById(clicked_id);
|
|
||||||
console.log("/" + clicked_id + " " + input.value);
|
|
||||||
_WS.send("/" + clicked_id + " " + input.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
web audio encoders scripts
|
|
||||||
-->
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function newlaser(id) {
|
|
||||||
|
|
||||||
console.log("newlaser")
|
|
||||||
nolaser();
|
|
||||||
nofx();
|
|
||||||
|
|
||||||
laserid = "noteon "+(24-id);
|
|
||||||
console.log("laserid "+laserid);
|
|
||||||
|
|
||||||
var x = document.getElementById(laserid);
|
|
||||||
x.value = 1 ;
|
|
||||||
console.log("laser "+id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function nofx0() {
|
|
||||||
console.log("nofx0")
|
|
||||||
var x = document.getElementById("aurora/fx/0 ScanH");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/fx/0 ScanV");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/fx/0 Wave");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/fx/0 Circle");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/fx/0 Starfield");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/fx/0 Word");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/fx/0 Trckr");
|
|
||||||
x.value = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function nocolor0() {
|
|
||||||
console.log("nocolor0")
|
|
||||||
var x = document.getElementById("aurora/color/0 red");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/color/0 yellow");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/color/0 green");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/color/0 blue");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/color/0 cyan");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("aurora/color/0 white");
|
|
||||||
x.value = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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/>";
|
|
||||||
}
|
|
||||||
|
|
||||||
_WS.send("/" + e.target.id + " " + e.target.value);
|
|
||||||
|
|
||||||
var res = e.target.id.split(" ");
|
|
||||||
|
|
||||||
// on off
|
|
||||||
if (e.target.id === "on" && e.type === "change") {
|
|
||||||
window.location.reload();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Go to index
|
|
||||||
if (e.target.id === "index" && e.type === "change") {
|
|
||||||
window.location.assign("index.html");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fx
|
|
||||||
if (res[0].substring(7,9) === "fx" && e.type === "change") {
|
|
||||||
|
|
||||||
var layer = res[0].substring(10,12);
|
|
||||||
nofx0();
|
|
||||||
var x = document.getElementById(e.target.id);
|
|
||||||
x.value = 1 ;
|
|
||||||
_WS.showstatus(e.target.id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Colors
|
|
||||||
if (res[0].substring(7,9) === "co" && e.type === "change") {
|
|
||||||
|
|
||||||
var layer = res[0].substring(13,14);
|
|
||||||
console.log(layer)
|
|
||||||
nocolor0();
|
|
||||||
var x = document.getElementById(e.target.id);
|
|
||||||
x.value = 1 ;
|
|
||||||
_WS.showstatus(e.target.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -59,10 +59,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="align.html">
|
<a href="settings.html">
|
||||||
<div class="webaudiobut">
|
<div class="webaudiobut">
|
||||||
<div align="center" class="navled">
|
<div align="center" class="navled">
|
||||||
Align
|
Settings
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
@ -93,8 +93,8 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="webaudiobut">
|
<div class="webaudiobut">
|
||||||
<button type="button" class="navled" style="border : #222222 1px;" onclick="onSubmit(this.id)" id="settings/restart lj" >
|
<button type="button" class="navled" style="border : #222222 1px;" onclick="onSubmit(this.id)" id="settings/reset" >
|
||||||
rstrt LJ
|
Reset
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -101,15 +101,15 @@
|
|||||||
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Align Rack
|
Settings Rack
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<a href="align.html">
|
<a href="settings.html">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="TopRackGrid">
|
<div class="TopRackGrid">
|
||||||
<div>
|
<div>
|
||||||
<h2>
|
<h2>
|
||||||
Align
|
Settings
|
||||||
<span class="shade"> </span>
|
<span class="shade"> </span>
|
||||||
</h2>
|
</h2>
|
||||||
<webaudio-switch id="on" value="1" tooltip="Switch-B" height="35" width="85" src="knobs/switch1.png">
|
<webaudio-switch id="on" value="1" tooltip="Switch-B" height="35" width="85" src="knobs/switch1.png">
|
||||||
@ -117,7 +117,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="webaudiobut">
|
<div class="webaudiobut">
|
||||||
<div align="center" class="busled">
|
<div align="center" class="busled">
|
||||||
Align
|
Settings
|
||||||
</div>
|
</div>
|
||||||
<div align="center" class="busled">
|
<div align="center" class="busled">
|
||||||
|
|
||||||
|
@ -56,10 +56,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="align.html">
|
<a href="settings.html">
|
||||||
<div class="webaudiobut">
|
<div class="webaudiobut">
|
||||||
<div align="center" class="navled">
|
<div align="center" class="navled">
|
||||||
Align
|
Settings
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
@ -90,8 +90,8 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="webaudiobut">
|
<div class="webaudiobut">
|
||||||
<button type="button" class="navled" style="border : #222222 1px;" onclick="onSubmit(this.id)" id="settings/restart lj" >
|
<button type="button" class="navled" style="border : #222222 1px;" onclick="onSubmit(this.id)" id="settings/reset" >
|
||||||
rstrt LJ
|
reset
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,680 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<title>LASERCam 1</title>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<link href="./styles/bootstrap.min.css" rel="stylesheet" type="text/css">
|
|
||||||
<meta name="apple-mobile-web-app-title" content="Tracker">
|
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
||||||
<link rel="apple-touch-startup-image" href="../launch.png">
|
|
||||||
<link rel="apple-touch-icon" href="../touch-icon-iphone.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="152x152" href="../touch-icon-ipad.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="../touch-icon-iphone-retina.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="167x167" href="../touch-icon-ipad-retina.png">
|
|
||||||
|
|
||||||
<script type="application/javascript" src="../config.js"></script>
|
|
||||||
<style>
|
|
||||||
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
// getUserMedia only works over https in Chrome 47+, so we redirect to https. Also notify user if running from file.
|
|
||||||
if (window.location.protocol == "file:") {
|
|
||||||
alert("You seem to be running this example directly from a file. Note that these examples only work when served from a server or localhost due to canvas cross-domain restrictions.");
|
|
||||||
} else if (window.location.hostname !== "localhost" && window.location.protocol !== "https:"){
|
|
||||||
window.location.protocol = "http";
|
|
||||||
//window.location.protocol = "https";
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<!--
|
|
||||||
<script type="text/javascript">
|
|
||||||
|
|
||||||
var _gaq = _gaq || [];
|
|
||||||
_gaq.push(['_setAccount', 'UA-32642923-1']);
|
|
||||||
_gaq.push(['_trackPageview']);
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
|
||||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
|
||||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
|
||||||
})();
|
|
||||||
|
|
||||||
</script>
|
|
||||||
-->
|
|
||||||
<!-- Web audio buttons defaults -->
|
|
||||||
<script type="application/javascript" src="../webcomponents-lite.js"></script>
|
|
||||||
<script>
|
|
||||||
WebAudioControlsOptions={
|
|
||||||
useMidi:1,
|
|
||||||
knobSrc:"knobs/simplegray.png",
|
|
||||||
knobSprites:100,
|
|
||||||
switchSrc:"knobs/switch_toggle.png",
|
|
||||||
sliderSrc:"knobs/vsliderbody.png",
|
|
||||||
sliderKnobsrc:"knobs/vsliderknob.png",
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<script src="../webaudio-controls.js"></script>
|
|
||||||
<!-- link rel="stylesheet" href="LJgrid.css" / -->
|
|
||||||
<link rel="stylesheet" type="text/css" href="../selector.min.css">
|
|
||||||
<script type="application/javascript" src="../selector.min.js"></script>
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="../css/common.css" />
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body style="background-color:#222;">
|
|
||||||
<script src="./js/libs/utils.js"></script>
|
|
||||||
<script src="../build/clmtrackr.js"></script>
|
|
||||||
<script src="./js/libs/Stats.js"></script>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Top Rack
|
|
||||||
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<a href="index.html"><img height="25" width="21" src="../knobs/indexs.png"></a>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<div class="Rackcontent">
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Navigation Rack
|
|
||||||
-->
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<div class="buttons-7container">
|
|
||||||
|
|
||||||
<a href="../index.html">
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled">
|
|
||||||
Index
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="../align.html">
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled">
|
|
||||||
Align
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="../auralls.html">
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled">
|
|
||||||
Aurora
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="trckrcam1.html">
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled">
|
|
||||||
Lasercam
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="../simu.html">
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<div align="center" class="navled">
|
|
||||||
Simu
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<button type="button" class="navled" style="border : #222222 1px;" onclick="onSubmit(this.id)" id="settings/restart lj" >
|
|
||||||
rstrt LJ
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="webaudiobut">
|
|
||||||
<button type="button" class="navled" style="border : #222222 1px;" onclick="onSubmit(this.id)" id="settings/restart aurora" >
|
|
||||||
rstrt AU
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Lasers & colors Rack
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<div class="TopRackGrid">
|
|
||||||
<div>
|
|
||||||
<h2>
|
|
||||||
/TL RGY 1
|
|
||||||
<span class="shade"> </span>
|
|
||||||
</h2>
|
|
||||||
<webaudio-switch id="on" value="1" tooltip="Switch-B" height="35" width="85" src="../knobs/switch1.png">
|
|
||||||
</webaudio-switch>
|
|
||||||
</div>
|
|
||||||
<div style="border : #242424 1px solid;background: #000;">
|
|
||||||
<div align="center" id="line1" class="busled">
|
|
||||||
LASERcam 1 : Allow to use your webcam + start
|
|
||||||
</div>
|
|
||||||
<div align="center" id="status" class="busled">
|
|
||||||
/team/laser
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div></div>
|
|
||||||
<div>
|
|
||||||
<div style="margin-top : 30px;">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Colors Rack
|
|
||||||
-->
|
|
||||||
<div class="content">
|
|
||||||
<div class="Rackgrid">
|
|
||||||
<div>
|
|
||||||
<h2>
|
|
||||||
Colors
|
|
||||||
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="webaudiobut"><webaudio-switch id="noteon 24" value="1" tooltip="Switch-B" height="64" width="64" src="../knobs/big0.png"></webaudio-switch></div>
|
|
||||||
<div class="webaudiobut"><webaudio-switch id="noteon 25" value="0" tooltip="Switch-B" height="64" width="64" src=" ../knobs/big1.png"></webaudio-switch></div>
|
|
||||||
<div class="webaudiobut"><webaudio-switch id="noteon 26" value="0" tooltip="Switch-B" height="64" width="64" src="../knobs/big2.png"></webaudio-switch></div>
|
|
||||||
<div class="webaudiobut"><webaudio-switch id="noteon 27" value="0" tooltip="Switch-B" height="64" width="64" src="../knobs/big3.png"></webaudio-switch></div>
|
|
||||||
<div></div>
|
|
||||||
<div class="webaudiobut"><webaudio-switch id="trckr/color/0 red" value="1" tooltip="Switch-B" height="64" width="64" src="knobs/red.png"></webaudio-switch></div>
|
|
||||||
<div class="webaudiobut"><webaudio-switch id="trckr/color/0 yellow" value="0" tooltip="Switch-B" height="64" width="64" src="knobs/yellow.png"></webaudio-switch></div>
|
|
||||||
<div class="webaudiobut"><webaudio-switch id="trckr/color/0 green" value="0" tooltip="Switch-B" height="64" width="64" src="knobs/green.png"></webaudio-switch></div>
|
|
||||||
<div></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Webcam Rack
|
|
||||||
-->
|
|
||||||
<div class="content" style="background-image: linear-gradient(174deg, #111,#030303);">
|
|
||||||
<video id="videoel" class="webaudiobut" width="400" height="300" preload="auto" loop playsinline autoplay>
|
|
||||||
</video>
|
|
||||||
<canvas id="overlay" width="400" height="300"></canvas>
|
|
||||||
<input class="btn" type="button" value="wait" style="margin-left: 150px;" disabled="disabled" onclick="startVideo()" id="startbutton"></input>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Big Display Rack
|
|
||||||
-->
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<div id="text" class="busled" style="font-size:1.5em;border : #242424 1px solid;background: #000;-webkit-box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72);-moz-box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72);box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72);">
|
|
||||||
<div id="gum" class="gum">
|
|
||||||
<p>To try it out:
|
|
||||||
<ol>
|
|
||||||
<li>Allow the page to use your webcamera</li>
|
|
||||||
<li>Make sure that your face is clearly visible in the video, and click start</li>
|
|
||||||
<li>See the model fitted to your face</li>
|
|
||||||
<ol>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div id="nogum" class="nogum">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
JS
|
|
||||||
-->
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var vid = document.getElementById('videoel');
|
|
||||||
var vid_width = vid.width;
|
|
||||||
var vid_height = vid.height;
|
|
||||||
var overlay = document.getElementById('overlay');
|
|
||||||
var overlayCC = overlay.getContext('2d');
|
|
||||||
|
|
||||||
/*********** Setup of video/webcam and checking for webGL support *********/
|
|
||||||
|
|
||||||
function enablestart() {
|
|
||||||
var startbutton = document.getElementById('startbutton');
|
|
||||||
startbutton.value = "start";
|
|
||||||
startbutton.disabled = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var insertAltVideo = function(video) {
|
|
||||||
// insert alternate video if getUserMedia not available
|
|
||||||
if (supports_video()) {
|
|
||||||
if (supports_webm_video()) {
|
|
||||||
video.src = "./media/cap12_edit.webm";
|
|
||||||
} else if (supports_h264_baseline_video()) {
|
|
||||||
video.src = "./media/cap12_edit.mp4";
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function adjustVideoProportions() {
|
|
||||||
// resize overlay and video if proportions of video are not 4:3
|
|
||||||
// keep same height, just change width
|
|
||||||
var proportion = vid.videoWidth/vid.videoHeight;
|
|
||||||
vid_width = Math.round(vid_height * proportion);
|
|
||||||
vid.width = vid_width;
|
|
||||||
overlay.width = vid_width;
|
|
||||||
}
|
|
||||||
|
|
||||||
function gumSuccess( stream ) {
|
|
||||||
// add camera stream if getUserMedia succeeded
|
|
||||||
if ("srcObject" in vid) {
|
|
||||||
vid.srcObject = stream;
|
|
||||||
} else {
|
|
||||||
vid.src = (window.URL && window.URL.createObjectURL(stream));
|
|
||||||
}
|
|
||||||
vid.onloadedmetadata = function() {
|
|
||||||
adjustVideoProportions();
|
|
||||||
vid.play();
|
|
||||||
}
|
|
||||||
vid.onresize = function() {
|
|
||||||
adjustVideoProportions();
|
|
||||||
if (trackingStarted) {
|
|
||||||
ctrack.stop();
|
|
||||||
ctrack.reset();
|
|
||||||
ctrack.start(vid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function gumFail() {
|
|
||||||
// fall back to video if getUserMedia failed
|
|
||||||
insertAltVideo(vid);
|
|
||||||
document.getElementById('gum').className = "hide";
|
|
||||||
document.getElementById('nogum').className = "nohide";
|
|
||||||
}
|
|
||||||
|
|
||||||
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
|
|
||||||
window.URL = window.URL || window.webkitURL || window.msURL || window.mozURL;
|
|
||||||
|
|
||||||
// set up video
|
|
||||||
if (navigator.mediaDevices) {
|
|
||||||
navigator.mediaDevices.getUserMedia({video : true}).then(gumSuccess).catch(gumFail);
|
|
||||||
} else if (navigator.getUserMedia) {
|
|
||||||
navigator.getUserMedia({video : true}, gumSuccess, gumFail);
|
|
||||||
} else {
|
|
||||||
insertAltVideo(vid);
|
|
||||||
document.getElementById('gum').className = "hide";
|
|
||||||
document.getElementById('nogum').className = "nohide";
|
|
||||||
alert("Your browser does not seem to support getUserMedia, using a fallback video instead.");
|
|
||||||
}
|
|
||||||
|
|
||||||
vid.addEventListener('canplay', enablestart, false);
|
|
||||||
|
|
||||||
/*********** Code for face tracking *********/
|
|
||||||
|
|
||||||
var ctrack = new clm.tracker();
|
|
||||||
ctrack.init();
|
|
||||||
var trackingStarted = false;
|
|
||||||
var counter = 0;
|
|
||||||
var layer = 0;
|
|
||||||
|
|
||||||
function startVideo() {
|
|
||||||
// start video
|
|
||||||
vid.play();
|
|
||||||
// start tracking
|
|
||||||
ctrack.start(vid);
|
|
||||||
trackingStarted = true;
|
|
||||||
// start loop to draw face
|
|
||||||
drawLoop();
|
|
||||||
}
|
|
||||||
|
|
||||||
function drawLoop() {
|
|
||||||
requestAnimFrame(drawLoop);
|
|
||||||
overlayCC.clearRect(0, 0, vid_width, vid_height);
|
|
||||||
//psrElement.innerHTML = "score :" + ctrack.getScore().toFixed(4);
|
|
||||||
var positions = ctrack.getCurrentPosition();
|
|
||||||
// do something with the positions ...
|
|
||||||
// print the positions
|
|
||||||
var positionString = "";
|
|
||||||
var positionFace = 'trckr/frame '+layer+" "+counter+" ";
|
|
||||||
if (positions) {
|
|
||||||
ctrack.draw(overlay);
|
|
||||||
for (var p = 0;p < 71;p++) {
|
|
||||||
positionString += "featurepoint "+p+" : ["+positions[p][0].toFixed(2)+","+positions[p][1].toFixed(2)+"]<br/>";
|
|
||||||
positionFace += positions[p][0].toFixed(2)+" "+positions[p][1].toFixed(2)+" ";
|
|
||||||
}
|
|
||||||
|
|
||||||
//document.getElementById('positions').innerHTML = positionString;
|
|
||||||
_WS.s.send(positionFace);
|
|
||||||
counter +=1;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********** Code for stats **********/
|
|
||||||
|
|
||||||
stats = new Stats();
|
|
||||||
stats.domElement.style.position = 'absolute';
|
|
||||||
stats.domElement.style.top = '0px';
|
|
||||||
document.getElementById('container').appendChild( stats.domElement );
|
|
||||||
|
|
||||||
// update stats on every iteration
|
|
||||||
document.addEventListener('clmtrackrIteration', function(event) {
|
|
||||||
stats.update();
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- LJ style WS : A nettoyer ! -->
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
|
|
||||||
var LJ = 'ws://192.168.2.43:9001/'
|
|
||||||
|
|
||||||
var _WS = {
|
|
||||||
uri: LJ,
|
|
||||||
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.showstatus("Connected to "+LJ);
|
|
||||||
document.getElementById("on").value = 1;
|
|
||||||
},
|
|
||||||
|
|
||||||
onClose: function () {
|
|
||||||
_WS.showline1('<span style="color: red;">LJ DISCONNECTED</span> ');
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
onMessage: function (e) {
|
|
||||||
var res = e.data.split(" ");
|
|
||||||
//console.log(e.data)
|
|
||||||
//console.log(res[0].substring(0,6))
|
|
||||||
//console.log(res)
|
|
||||||
//console.log(res[0].slice(1))
|
|
||||||
var divtext = document.getElementById('status');
|
|
||||||
var divtextp = document.getElementById('players');
|
|
||||||
|
|
||||||
|
|
||||||
switch (res[0].substring(0,6)) {
|
|
||||||
|
|
||||||
case "/statu":
|
|
||||||
|
|
||||||
if (res[2]==="Disconnected"){
|
|
||||||
_WS.showstatus(res[1]+" "+'<span style="color: red;">'+ res[2]+'</span> ');
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
_WS.showstatus(res[1]+" "+res[2]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/redst":
|
|
||||||
//console.log("red"+res[1]+" "+res[2]);
|
|
||||||
_WS.showstatus('<span style="color: red;">'+res[1]+" "+ res[2]+'</span> ');
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/line1":
|
|
||||||
//divtext.innerHTML="connected to "+LJ;
|
|
||||||
divtext1.innerHTML=res[1]+" "+res[2];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/redline1":
|
|
||||||
//divtext.innerHTML="connected to "+LJ;
|
|
||||||
divtext1.innerHTML='<span style="color: red;">'+ res[1]+" "+res[2]+'</span>';
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/laser":
|
|
||||||
console.log("/laser "+res[1])
|
|
||||||
newlaser(res[1])
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/lack/":
|
|
||||||
console.log("/lack "+res[1])
|
|
||||||
document.getElementById(res[0].slice(1)).value = res[1];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "/lstt/":
|
|
||||||
console.log("/lstt "+res[1])
|
|
||||||
document.getElementById(res[0].slice(1)).value = res[1];
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
//console.log("test "+res[0].slice(1)+" "+res[1]);
|
|
||||||
document.getElementById(res[0].slice(1)).value = res[1];
|
|
||||||
//_WS.showstatus(e.data);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
showline1: function (message) {
|
|
||||||
var divtext = document.getElementById('line1');
|
|
||||||
divtext.innerHTML="";
|
|
||||||
divtext.innerHTML= message.toString();
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
onError: function (e) {
|
|
||||||
_WS.showstatus('<span style="color: red;">ERROR:</span> ' + e.data);
|
|
||||||
},
|
|
||||||
|
|
||||||
showin: function (message) {
|
|
||||||
var divtext = document.getElementById('status');
|
|
||||||
divtext.innerHTML="";
|
|
||||||
divtext.innerHTML= message.toString();
|
|
||||||
},
|
|
||||||
|
|
||||||
showout: function (message) {
|
|
||||||
var divtext = document.getElementById('status');
|
|
||||||
divtext.innerHTML="";
|
|
||||||
divtext.innerHTML= message.toString();
|
|
||||||
},
|
|
||||||
|
|
||||||
showstatus: function (message) {
|
|
||||||
var divtext = document.getElementById('status');
|
|
||||||
divtext.innerHTML="";
|
|
||||||
divtext.innerHTML= message.toString();
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
send: function (message) {
|
|
||||||
if (!message.length) {
|
|
||||||
alert('Empty message not allowed !');
|
|
||||||
} else {
|
|
||||||
_WS.showstatus(message);
|
|
||||||
_WS.s.send(message);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
close: function () {
|
|
||||||
_WS.showstatus('GOODBYE !');
|
|
||||||
_WS.s.close();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
window.addEventListener('load', _WS.init, false);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Forms submits
|
|
||||||
//
|
|
||||||
|
|
||||||
function onSubmit(clicked_id) {
|
|
||||||
var input = document.getElementById(clicked_id);
|
|
||||||
console.log("/" + clicked_id + " " + input.value);
|
|
||||||
_WS.send("/" + clicked_id + " " + input.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
web audio encoders scripts
|
|
||||||
-->
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function newlaser(id) {
|
|
||||||
|
|
||||||
console.log("newlaser " +id)
|
|
||||||
var laserid = 24+ parseInt(id,10);
|
|
||||||
laser = "noteon "+laserid;
|
|
||||||
console.log("laser "+laser);
|
|
||||||
nolaser();
|
|
||||||
nofx();
|
|
||||||
|
|
||||||
var x = document.getElementById(laser);
|
|
||||||
x.value = 1 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function nolaser() {
|
|
||||||
//console.log("nolaser")
|
|
||||||
var x = document.getElementById("noteon 24");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("noteon 25");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("noteon 26");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("noteon 27");
|
|
||||||
x.value = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// RGB Colors
|
|
||||||
function nocolor() {
|
|
||||||
//console.log("nocolor0")
|
|
||||||
var x = document.getElementById("trckr/color/ red");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("trckr/color/ yellow");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("trckr/color/ green");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("trckr/color/ blue");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("trckr/color/ cyan");
|
|
||||||
x.value = 0 ;
|
|
||||||
var x = document.getElementById("trckr/color/ white");
|
|
||||||
x.value = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// RGY Colors
|
|
||||||
//function nocolor() {
|
|
||||||
//var x = document.getElementById("trckr/color/ red");
|
|
||||||
// x.value = 0 ;
|
|
||||||
//var x = document.getElementById("trckr/color/ yellow");
|
|
||||||
// x.value = 0 ;
|
|
||||||
//var x = document.getElementById("trckr/color/ green");
|
|
||||||
// x.value = 0 ;
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
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/>";
|
|
||||||
}
|
|
||||||
|
|
||||||
_WS.send("/" + e.target.id + " " + e.target.value);
|
|
||||||
|
|
||||||
var res = e.target.id.split(" ");
|
|
||||||
|
|
||||||
|
|
||||||
// on off
|
|
||||||
if (e.target.id === "on" && e.type === "change") {
|
|
||||||
window.location.reload();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Go to index
|
|
||||||
if (e.target.id === "index" && e.type === "change") {
|
|
||||||
window.location.assign("../index.html");
|
|
||||||
}
|
|
||||||
// Fx
|
|
||||||
if (res[0].substring(7,9) === "fx" && e.type === "change") {
|
|
||||||
|
|
||||||
var layer = res[0].substring(10,12);
|
|
||||||
nofx0();
|
|
||||||
var x = document.getElementById(e.target.id);
|
|
||||||
x.value = 1 ;
|
|
||||||
_WS.showstatus(e.target.id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Colors
|
|
||||||
if (res[0].substring(7,9) === "co" && e.type === "change") {
|
|
||||||
|
|
||||||
nocolor();
|
|
||||||
_WS.send("/"+res[0]+laser+ " "+ res[1]+ " " + e.target.value);
|
|
||||||
var x = document.getElementById(e.target.id);
|
|
||||||
x.value = 1 ;
|
|
||||||
//_WS.showstatus("Laser "+laser+ " "+ res[1]);
|
|
||||||
console.log("colors sending "+res[0]+laser+ " "+ res[1]+ " " + e.target.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Lasers
|
|
||||||
if (res[0] === "noteon" && e.type === "change") {
|
|
||||||
//console.log(e.target.id);
|
|
||||||
//console.log(res);
|
|
||||||
//console.log(res[1] - 24)
|
|
||||||
newlaser(res[1] - 24);
|
|
||||||
_WS.send("/" + e.target.id + " " + e.target.value);
|
|
||||||
|
|
||||||
//nolaser();
|
|
||||||
//nofx();
|
|
||||||
//_WS.send("/" + e.target.id + " " + e.target.value);
|
|
||||||
//var x = document.getElementById(e.target.id);
|
|
||||||
//x.value = 1 ;
|
|
||||||
//laser = res[1] - 24;
|
|
||||||
//console.log("laser "+laser);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -93,10 +93,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="../align.html">
|
<a href="../settings.html">
|
||||||
<div class="webaudiobut">
|
<div class="webaudiobut">
|
||||||
<div align="center" class="navled">
|
<div align="center" class="navled">
|
||||||
Align
|
Settings
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
@ -127,8 +127,8 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="webaudiobut">
|
<div class="webaudiobut">
|
||||||
<button type="button" class="navled" style="border : #222222 1px;" onclick="onSubmit(this.id)" id="settings/restart lj" >
|
<button type="button" class="navled" style="border : #222222 1px;" onclick="onSubmit(this.id)" id="settings/reset" >
|
||||||
rstrt LJ
|
Reset
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user