forked from protonphoton/LJ
Aurora bugfixs
This commit is contained in:
parent
fa91c00711
commit
132ea32d66
46
LJ.conf
46
LJ.conf
@ -2,7 +2,7 @@
|
|||||||
lasernumber = 4
|
lasernumber = 4
|
||||||
debug = 0
|
debug = 0
|
||||||
ljayserverip = 0.0.0.0
|
ljayserverip = 0.0.0.0
|
||||||
wwwip = 192.168.2.45
|
wwwip = 192.168.2.43
|
||||||
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,12 +12,12 @@ wsport = 9001
|
|||||||
[laser0]
|
[laser0]
|
||||||
color = -1
|
color = -1
|
||||||
type = DS1000
|
type = DS1000
|
||||||
ip = 192.168.2.3
|
ip = 192.168.2.43
|
||||||
kpps = 25000
|
kpps = 25000
|
||||||
centerx = -393
|
centerx = -5485
|
||||||
centery = 390
|
centery = -11392
|
||||||
zoomx = 50.0
|
zoomx = 80.0
|
||||||
zoomy = 50.0
|
zoomy = 86.0
|
||||||
sizex = 32000
|
sizex = 32000
|
||||||
sizey = 32000
|
sizey = 32000
|
||||||
finangle = 0.0
|
finangle = 0.0
|
||||||
@ -25,19 +25,19 @@ 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.]]
|
||||||
|
|
||||||
[laser1]
|
[laser1]
|
||||||
color = -1
|
color = -1
|
||||||
type = LOCAL
|
type = LOCAL
|
||||||
ip = 192.168.2.5
|
ip = 192.168.2.5
|
||||||
kpps = 25000
|
kpps = 25000
|
||||||
centerx = 0
|
centerx = -17720
|
||||||
centery = 0
|
centery = 419
|
||||||
zoomx = 50.0
|
zoomx = 35.0
|
||||||
zoomy = 50.0
|
zoomy = 35.0
|
||||||
sizex = 32000
|
sizex = 32000
|
||||||
sizey = 32000
|
sizey = 32000
|
||||||
finangle = 0.0
|
finangle = 0.0
|
||||||
@ -45,15 +45,15 @@ 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
|
||||||
type = LUKE400
|
type = LUKE400
|
||||||
ip = 192.168.2.6
|
ip = 192.168.2.6
|
||||||
kpps = 20361
|
kpps = 25000
|
||||||
centerx = -3798
|
centerx = -3798
|
||||||
centery = -13079
|
centery = -13079
|
||||||
zoomx = 73.0
|
zoomx = 73.0
|
||||||
@ -65,9 +65,9 @@ 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
|
||||||
@ -85,9 +85,9 @@ 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 = {
|
||||||
|
@ -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.4
|
|
||||||
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.43
|
|
||||||
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}
|
|
||||||
}
|
|
||||||
|
|
95
README.md
95
README.md
@ -5,7 +5,7 @@ By Sam Neurohack, Loloster, Cocoa
|
|||||||
LICENCE : CC BY
|
LICENCE : CC BY
|
||||||
|
|
||||||
|
|
||||||
![LJ](https://www.teamlaser.tk/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, ...
|
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, ...
|
||||||
|
|
||||||
@ -20,14 +20,6 @@ LJ has 5 main components :
|
|||||||
|
|
||||||
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,...
|
||||||
|
|
||||||
#
|
|
||||||
# Requirements
|
|
||||||
#
|
|
||||||
|
|
||||||
- Our old thinkpad with i5 (2.6 Ghz, 2 cores, 4 threads) works really fine if you run laser only related tasks.
|
|
||||||
- Etherdream DAC/ILDA laser. But you can develop your generators without actual lasers thanks to simu page.
|
|
||||||
- Wired network. Only the web GUI can be on wifi.
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Features among many others.
|
# Features among many others.
|
||||||
#
|
#
|
||||||
@ -36,7 +28,7 @@ Important : for best performance LJ is meant to run in a dedicated computer espe
|
|||||||
- Some Lasermapping ('alignment') like in videomapping.
|
- Some Lasermapping ('alignment') like in videomapping.
|
||||||
- OSC and websocket commands. Very cool : LJ can script or be scripted.
|
- OSC and websocket commands. Very cool : LJ can script or be scripted.
|
||||||
- Python3
|
- Python3
|
||||||
- Web User Interface in your browser : open www/index.html. Javascript is needed. By default it connect to localhost. If you want to control remotely, you need edit webui choice : python3 configure.py
|
- Web User Interface in your browser : open www/index.html. Javascript is needed. By default it connect to localhost. If you want to control remotely, you need to change the uri line in LJ.js.
|
||||||
- Live WebUI extras : change debug level, restart plugin, rescan DACs,...
|
- Live WebUI extras : change debug level, restart plugin, rescan DACs,...
|
||||||
- Status update every 0.5 seconds : every etherdream DAC state, number of buffer points sent,...
|
- Status update every 0.5 seconds : every etherdream DAC state, number of buffer points sent,...
|
||||||
- "Optimisation" points automatically added, can be changed live for glitch art. Search "resampler" commands.
|
- "Optimisation" points automatically added, can be changed live for glitch art. Search "resampler" commands.
|
||||||
@ -53,7 +45,7 @@ Important : for best performance LJ is meant to run in a dedicated computer espe
|
|||||||
# Scenes and pointlists.
|
# Scenes and pointlists.
|
||||||
#
|
#
|
||||||
|
|
||||||
![Scenes](https://www.teamlaser.tk/lj/images/scenes.png)
|
![Scenes](https://www.teamlaser.fr/lj/images/scenes.png)
|
||||||
|
|
||||||
LJ accept up to 4 groups = virtual "scenes" of 4 "pointlists" each (= one pointlist per laser), so up to 16 pointlists can be sent to redis at anytime from anywhere in the network. The idea behind this is to easily share actual lasers. Imagine in demo party :
|
LJ accept up to 4 groups = virtual "scenes" of 4 "pointlists" each (= one pointlist per laser), so up to 16 pointlists can be sent to redis at anytime from anywhere in the network. The idea behind this is to easily share actual lasers. Imagine in demo party :
|
||||||
|
|
||||||
@ -86,7 +78,6 @@ LJ is in dev : versions in this repository will always be core functionnal : acc
|
|||||||
- Linux Buster : in LJ directory, type in a terminal window :
|
- Linux Buster : in LJ directory, type in a terminal window :
|
||||||
|
|
||||||
cd server
|
cd server
|
||||||
|
|
||||||
./install.sh
|
./install.sh
|
||||||
|
|
||||||
|
|
||||||
@ -214,7 +205,7 @@ Dest1 = lj.DestObject('1', 1, True, 0 , 1, 1)
|
|||||||
|
|
||||||
Dest1 will also send layer 0 points to scene 1, laser 1
|
Dest1 will also send layer 0 points to scene 1, laser 1
|
||||||
|
|
||||||
![Layers](https://www.teamlaser.tk/lj/images/layer.png)
|
![Layers](https://www.teamlaser.fr/lj/images/layer.png)
|
||||||
|
|
||||||
2/ Different layers to different lasers ?
|
2/ Different layers to different lasers ?
|
||||||
|
|
||||||
@ -269,14 +260,10 @@ DrawDests() will take care of all your declared drawn elements/"objects" and Des
|
|||||||
# Nannou etherdeam simulator aka visualiser
|
# Nannou etherdeam simulator aka visualiser
|
||||||
#
|
#
|
||||||
|
|
||||||
Nannou visualiser kind of emulate an etherdream and display in a window what a real laser draws.
|
2 compiled nannou visualisers are included, one for Linux, one for macOS. It's pretty old version but much more compatible with "old" processors/computer.
|
||||||
|
|
||||||
2 compiled nannou visualisers are included, one for Linux, one for macOS. It's pretty old versions but much more compatible with "old" processors/computer, as you may want to repurpose an old computer to run LJ.
|
|
||||||
|
|
||||||
To use this visualiser as one of LJ's lasers, in LJ.conf edit one of line ip = someipaddress with the IP of the computer running the visualiser. Relaunch LJ. One visualiser per computer.
|
To use this visualiser as one of LJ's lasers, in LJ.conf edit one of line ip = someipaddress with the IP of the computer running the visualiser. Relaunch LJ. One visualiser per computer.
|
||||||
|
|
||||||
Nannou visualiser emulation is better and better but one can find a few known non-working situations. See it's github repository (https://github.com/nannou-org/ether-dream/tree/master/dac-emulator) for more recent versions.
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Todo
|
# Todo
|
||||||
#
|
#
|
||||||
@ -304,19 +291,17 @@ Our "always working solution", as we regularly move our gear for different venue
|
|||||||
- Again, even if etherdreams are 100 Mbits, we use *gigabits* gear.
|
- Again, even if etherdreams are 100 Mbits, we use *gigabits* gear.
|
||||||
|
|
||||||
|
|
||||||
By default LJ listen on all network interfaces (0.0.0.0) :
|
By default LJ uses on 127.0.0.1 (localhost) :
|
||||||
|
|
||||||
|
- A websocket on port 9001 for WebUI interaction.
|
||||||
- The redis server on port 6379 ('ljayserverip').
|
- The redis server on port 6379 ('ljayserverip').
|
||||||
- An OSC server on port 8002 for remote control via OSC and plugins.
|
- An OSC server on port 8002 for remote control via OSC and plugins.
|
||||||
- Some OSC clients defined in LJ.conf to forward commands to defined plugins.
|
- Some OSC clients defined in LJ.conf to forward commands to defined plugins.
|
||||||
|
|
||||||
Obviously WebUI pages needs your LJ computer IP to connect to (websocket on port 9001).
|
|
||||||
|
|
||||||
You need to update LJ.conf to your network/etherdreams IPs (using configure script) and be sure to check command arguments : python3 main.py --help
|
|
||||||
|
|
||||||
The need for a dedicated computer to act as "laser server" usually depends on how many lasers you want to control and your main computer load. If you seen flickering with small point lists, try the dedicated computer idea and/or stop non laser activities or cpu intensive task like face tracking. WebUI can be open on another computer/tablet/phone.
|
|
||||||
|
|
||||||
|
You need to update LJ.conf to your network/etherdreams IPs and be sure to check command arguments : python3 main.py --help
|
||||||
|
|
||||||
|
The need for a dedicated computer to act as "laser server" usually depends on how many lasers you want to control and your main computer load. If you seen flickering with small point lists, try the dedicated computer idea and/or stop process interfering like redis monitoring,...
|
||||||
|
|
||||||
#
|
#
|
||||||
# Glitch art
|
# Glitch art
|
||||||
@ -335,7 +320,7 @@ For glitching experience you can change resampling strategy live with "resampler
|
|||||||
# Colors
|
# Colors
|
||||||
#
|
#
|
||||||
|
|
||||||
LJ is compatible with TLL and analog modulation. Each point color is an int value, wich is simply the hex color in decimal. Example : white = #ffffff = 16777215.
|
LJ is compatible with TLL and analog modulation. Each point color is an int value, wich is simply the hex color in decimal. Example : white = #fffff = 65535.
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ether dream DAC
|
# Ether dream DAC
|
||||||
@ -364,11 +349,9 @@ About hardware setup, especially if you have several lasers : ILDA cables are in
|
|||||||
# Ethertools directory
|
# Ethertools directory
|
||||||
#
|
#
|
||||||
|
|
||||||
2 useful and *always working tools* from j4cdac github repository : sitter and talk.
|
2 useful and always working tools from j4cdac github repository : sitter and talk
|
||||||
- Sitter will display all etherdreams available on the network and their state (playing, idle,...). python sitter.py or use the compiled version (for macOS). May need tkinter :
|
- Sitter will display all real etherdreams available on the network and their state (playing, idle,...). python sitter.py or use the compiled version (for macOS).
|
||||||
pip3 install tk
|
- Talk : will draw a 4 colors square. python3 talk3.py
|
||||||
+/- : sudo apt install python-tk
|
|
||||||
- Talk : will draw a 4 colors square. Try : python3 talk3.py -h
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Links
|
# Links
|
||||||
@ -380,38 +363,12 @@ Generic :
|
|||||||
|
|
||||||
![LJ website](https://www.teamlaser.tk/lj)
|
![LJ website](https://www.teamlaser.tk/lj)
|
||||||
|
|
||||||
![Interactive lasers](https://www.teamlaser.tk/lj/images/display.png)
|
![Interactive lasers](https://www.teamlaser.fr/lj/images/display.png)
|
||||||
|
|
||||||
![Laser Faq](https://www.repairfaq.org/sam/lasersam.htm)
|
![Laser Faq](https://www.repairfaq.org/sam/lasersam.htm)
|
||||||
|
|
||||||
![Etherdream protocol](https://ether-dream.com/protocol.html)
|
|
||||||
|
|
||||||
There is a nice websocket debug tool : websocat.
|
There is a nice websocket debug tool : websocat.
|
||||||
|
|
||||||
#
|
|
||||||
# Troubleshooting
|
|
||||||
#
|
|
||||||
|
|
||||||
Try these steps in this order ;
|
|
||||||
|
|
||||||
- Use talk3 in ethertools directory : this ensure your computer can connect to the etherdream. See ethertools chapter in this readme. If talk3 doesn't works, check the hardware, connections,...
|
|
||||||
|
|
||||||
python3 talk3.py -i etherdreamIP
|
|
||||||
|
|
||||||
- You should see "connected to yourLJserverIP" on webUI. If not : LJ is not started / reload webpage / your network configuration is bad / a wrong IP in the configure parameters : python3 configure.py.
|
|
||||||
|
|
||||||
- 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).
|
|
||||||
|
|
||||||
- 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" ?
|
|
||||||
|
|
||||||
- too small movement : some lasers (with small angle like 40°) won't display anything if zoomx/zoomy are too small. Increase zoomx / zoomy in LJ.conf. Try 50-100 values.
|
|
||||||
- off center : check in LJ.conf centerX and centerY. Reset them to 0.
|
|
||||||
- not enough points.
|
|
||||||
|
|
||||||
*Don't kill your scanners : becareful with kpps setting.*
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# LJ commands reference
|
# LJ commands reference
|
||||||
#
|
#
|
||||||
@ -424,26 +381,25 @@ All these commands are available via OSC (port 8002) or websocket (port 9001)
|
|||||||
|
|
||||||
Use the same syntax if you send your pointlist directly in redis : "/pl/0/0" is the key and value is "[(150.0,..."
|
Use the same syntax if you send your pointlist directly in redis : "/pl/0/0" is the key and value is "[(150.0,..."
|
||||||
|
|
||||||
Every point must be : (x,y,color). Color is the hex color like #FFFFFF in decimal. For new laserist : if point A is green and next point B is red, line AB will be red.
|
Every point must be : (x,y,color). Color is the hex color #FFFFFF in decimal.
|
||||||
|
|
||||||
|
|
||||||
/scale/X/lasernumber value (0-200)
|
/scale/X/lasernumber value
|
||||||
|
|
||||||
/scale/Y/lasernumber value (0-200)
|
/scale/Y/lasernumber value
|
||||||
|
|
||||||
/swap/X/lasernumber value (0 or 1)
|
/swap/X/lasernumber value (0 or 1)
|
||||||
|
|
||||||
/swap/Y/lasernumber value (0 or 1)
|
/swap/Y/lasernumber value (0 or 1)
|
||||||
|
|
||||||
/angle/lasernumber value : angle correction for given laser by value (0-360)
|
/angle/lasernumber value : increase/decrease angle correction for given laser by value
|
||||||
|
|
||||||
/loffset/X/lasernumber value : change X offset of given laser to value (-32000/32000)
|
/loffset/X/lasernumber value : change X offset of given laser by value
|
||||||
|
|
||||||
/loffset/Y/lasernumber value : change Y offset of given laser to value (-32000/32000)
|
/loffset/Y/lasernumber value : change Y offset of given laser by value
|
||||||
|
|
||||||
|
|
||||||
/kpps/lasernumber value : live change of kpps
|
/kpps/lasernumber value : live change of kpps
|
||||||
|
|
||||||
/intens/lasernumber value : increase/decrease intensity for given laser by value. Needs analog modulation laser
|
/intens/lasernumber value : increase/decrease intensity for given laser by value. Needs analog modulation laser
|
||||||
|
|
||||||
|
|
||||||
@ -459,7 +415,7 @@ Every point must be : (x,y,color). Color is the hex color like #FFFFFF in decima
|
|||||||
/resampler/lasernumber lsteps : change resampling strategy (see glitch art), for given laser
|
/resampler/lasernumber lsteps : change resampling strategy (see glitch art), for given laser
|
||||||
lsteps is a string like "[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]"
|
lsteps is a string like "[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]"
|
||||||
|
|
||||||
/scene/scenenumber/start 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.
|
/regen : regen webui index html page.
|
||||||
|
|
||||||
@ -477,7 +433,7 @@ and second line (/line1 or /redline1). Examples of "uicommand arg" :
|
|||||||
/redline1 Error
|
/redline1 Error
|
||||||
|
|
||||||
|
|
||||||
![LJ Display](https://www.teamlaser.tk/lj/images/display.png)
|
![LJ Display](https://www.teamlaser.fr/lj/images/display.png)
|
||||||
|
|
||||||
Leds colors for each DACs :
|
Leds colors for each DACs :
|
||||||
|
|
||||||
@ -500,6 +456,11 @@ FULL -> orange
|
|||||||
|
|
||||||
INVALID -> yellow
|
INVALID -> yellow
|
||||||
|
|
||||||
|
#
|
||||||
|
# LJ python3 plugin command reference
|
||||||
|
#
|
||||||
|
|
||||||
|
See beginning of lj23layers.py in libs3
|
||||||
|
|
||||||
|
|
||||||
![LJ](https://www.teamlaser.tk/lj/images/calig.png)
|
![LJ](https://www.teamlaser.fr/lj/images/calig.png)
|
@ -27,8 +27,8 @@ Basic Draw :
|
|||||||
|
|
||||||
High level draw :
|
High level draw :
|
||||||
|
|
||||||
- Text(word, integercolor, layer , xpos, ypos, resize, rotx, roty, rotz) : Display a word
|
- Text(word, zpos, integercolor, layer , xpos, ypos, resize, rotx, roty, rotz) : Display a word
|
||||||
- TextRGB(word, red, green, blue, ...)
|
- TextRGB(word, zpos, red, green, blue, ...)
|
||||||
- Embeded font1
|
- Embeded font1
|
||||||
|
|
||||||
|
|
||||||
@ -582,6 +582,8 @@ def rPolyLineOneColor(xy_list, c, layer , closed, xpos = 0, ypos =0, resize =0.7
|
|||||||
for xy in xy_list:
|
for xy in xy_list:
|
||||||
if xy0 is None:
|
if xy0 is None:
|
||||||
xy0 = xy
|
xy0 = xy
|
||||||
|
#if xy == (338.8, -20, 16777215) or xy == (338.8, -20, 255):
|
||||||
|
# print(xy, xy0, xpos, ypos, resize, rotx, roty, rotz, Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz))
|
||||||
LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz), 0, layer )
|
LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz), 0, layer )
|
||||||
LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz), c, layer )
|
LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz), c, layer )
|
||||||
else:
|
else:
|
||||||
@ -955,7 +957,7 @@ def CharDots(char,color):
|
|||||||
dots.append((dot[0],dot[1],color))
|
dots.append((dot[0],dot[1],color))
|
||||||
return dots
|
return dots
|
||||||
|
|
||||||
def Text(message, c, layer, xpos, ypos, resize, rotx, roty, rotz):
|
def Text(message, zpos, c, layer, xpos, ypos, resize, rotx, roty, rotz):
|
||||||
|
|
||||||
dots =[]
|
dots =[]
|
||||||
|
|
||||||
@ -985,15 +987,14 @@ def Text(message, c, layer, xpos, ypos, resize, rotx, roty, rotz):
|
|||||||
#dots.append((char_layer_list[0][0] + x_offset,char_layer_list[0][1],0))
|
#dots.append((char_layer_list[0][0] + x_offset,char_layer_list[0][1],0))
|
||||||
|
|
||||||
for xy in char_layer_list:
|
for xy in char_layer_list:
|
||||||
char_draw.append((xy[0] + x_offset,xy[1],c))
|
char_draw.append((xy[0] + x_offset,xy[1], zpos))
|
||||||
i +=1
|
i +=1
|
||||||
print(ch, c, xpos, ypos, resize, char_draw)
|
|
||||||
rPolyLineOneColor(char_draw, c, layer , False, xpos, ypos, resize, rotx, roty, rotz)
|
rPolyLineOneColor(char_draw, c, layer , False, xpos, ypos, resize, rotx, roty, rotz)
|
||||||
#dots.append(char_draw)
|
#dots.append(char_draw)
|
||||||
|
|
||||||
def TextRGB(message,c, layer, xpos, ypos, resize, rotx, roty, rotz):
|
def TextRGB(message, zpos, c, layer, xpos, ypos, resize, rotx, roty, rotz):
|
||||||
|
|
||||||
Text(message,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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
49
main.py
49
main.py
@ -57,10 +57,8 @@ from multiprocessing import Process, set_start_method
|
|||||||
import random, ast
|
import random, ast
|
||||||
|
|
||||||
from libs3 import plugins
|
from libs3 import plugins
|
||||||
|
|
||||||
from libs3 import tracer3 as tracer
|
from libs3 import tracer3 as tracer
|
||||||
from libs3 import homographyp, commands, font1
|
from libs3 import homographyp, commands, font1
|
||||||
#from webui import build
|
|
||||||
|
|
||||||
#import subprocess
|
#import subprocess
|
||||||
|
|
||||||
@ -383,7 +381,15 @@ midi.InConfig()
|
|||||||
midi.OutConfig()
|
midi.OutConfig()
|
||||||
'''
|
'''
|
||||||
|
|
||||||
# Creating a startup point list for each laser : 0,1,2,...
|
def fff(name):
|
||||||
|
print()
|
||||||
|
print('HELLO', name ) #indent
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Create a startup point list for each laser : 0,1,2,...
|
||||||
|
#
|
||||||
|
|
||||||
print("")
|
print("")
|
||||||
log.info("Creating startup point lists...")
|
log.info("Creating startup point lists...")
|
||||||
@ -397,7 +403,7 @@ for sceneid in range(0,gstt.MaxScenes+1):
|
|||||||
print("Scene "+ str(sceneid))
|
print("Scene "+ str(sceneid))
|
||||||
#digit_points = font1.DigitsDots(sceneid,65280)
|
#digit_points = font1.DigitsDots(sceneid,65280)
|
||||||
|
|
||||||
# Order all lasers to show the laser client number at startup -> tell all 4 laser process to USER PLs
|
# Order all lasers to show its number at startup -> tell all 4 laser process to USER PLs
|
||||||
for laserid in range(0,gstt.LaserNumber):
|
for laserid in range(0,gstt.LaserNumber):
|
||||||
|
|
||||||
digit_points = font1.DigitsDots(laserid,65280)
|
digit_points = font1.DigitsDots(laserid,65280)
|
||||||
@ -408,15 +414,11 @@ for sceneid in range(0,gstt.MaxScenes+1):
|
|||||||
|
|
||||||
r.set('/order/'+str(laserid), 0)
|
r.set('/order/'+str(laserid), 0)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Starts one DAC process per requested Laser
|
# Starts one DAC process per requested Laser
|
||||||
#
|
#
|
||||||
|
|
||||||
def fff(name):
|
|
||||||
print()
|
|
||||||
print('HELLO', name ) #indent
|
|
||||||
print()
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
# Bug in 3.8.4 MacOS default multiprocessing start method is spawn. Spawn doesn't work properly
|
# Bug in 3.8.4 MacOS default multiprocessing start method is spawn. Spawn doesn't work properly
|
||||||
@ -437,7 +439,7 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
log.info("Starting "+str(gstt.LaserNumber) + " DACs process...")
|
log.info("Starting "+str(gstt.LaserNumber) + " DACs process...")
|
||||||
|
|
||||||
# Launch one process (a newdacp instance) by etherdream
|
# Launch one process (a tracer3 instance) by etherdream
|
||||||
dac_worker0= Process(target=dac_process, args=(0,0,))
|
dac_worker0= Process(target=dac_process, args=(0,0,))
|
||||||
dac_worker0.start()
|
dac_worker0.start()
|
||||||
commands.worker0 = dac_worker0
|
commands.worker0 = dac_worker0
|
||||||
@ -461,14 +463,12 @@ if __name__ == '__main__':
|
|||||||
commands.worker3 = dac_worker3
|
commands.worker3 = dac_worker3
|
||||||
dac_worker3.start()
|
dac_worker3.start()
|
||||||
print("")
|
print("")
|
||||||
#def Run():
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Main loop do nothing. Maybe do the webui server ?
|
# start WS and OSC servers
|
||||||
#
|
#
|
||||||
|
|
||||||
try:
|
try:
|
||||||
#while True:
|
|
||||||
|
|
||||||
# Websocket startup
|
# Websocket startup
|
||||||
wserver = WebsocketServer(wsPORT,host=serverIP)
|
wserver = WebsocketServer(wsPORT,host=serverIP)
|
||||||
@ -509,6 +509,8 @@ if __name__ == '__main__':
|
|||||||
print("")
|
print("")
|
||||||
log.infog("LJ server running...")
|
log.infog("LJ server running...")
|
||||||
|
|
||||||
|
# websocket loop
|
||||||
|
|
||||||
wserver.run_forever()
|
wserver.run_forever()
|
||||||
|
|
||||||
|
|
||||||
@ -521,27 +523,6 @@ if __name__ == '__main__':
|
|||||||
finally:
|
finally:
|
||||||
|
|
||||||
commands.LJautokill()
|
commands.LJautokill()
|
||||||
'''
|
|
||||||
dac_worker0.join()
|
|
||||||
if lasernumber >0:
|
|
||||||
dac_worker1.join()
|
|
||||||
if lasernumber >1:
|
|
||||||
dac_worker2.join()
|
|
||||||
if lasernumber >2:
|
|
||||||
dac_worker3.join()
|
|
||||||
|
|
||||||
|
|
||||||
for laserid in range(0,lasernumber+1):
|
|
||||||
print("Laser",laserid,"feedbacks resetting...")
|
|
||||||
r.set('/lack/'+str(laserid),64)
|
|
||||||
r.set('/lstt/'+str(laserid),64)
|
|
||||||
r.set('/cap/'+str(laserid),0)
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if __name__ == "__main__":
|
|
||||||
# Run()
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Some code previously used, for reference :
|
Some code previously used, for reference :
|
||||||
|
@ -22,6 +22,7 @@ import live
|
|||||||
ljpath = r'%s' % os.getcwd().replace('\\','/')
|
ljpath = r'%s' % os.getcwd().replace('\\','/')
|
||||||
# import from shell
|
# import from shell
|
||||||
sys.path.append(ljpath +'/../../libs3/')
|
sys.path.append(ljpath +'/../../libs3/')
|
||||||
|
sys.path.append(ljpath +'/../../libs3')
|
||||||
sys.path.append(ljpath +'/../libs3/')
|
sys.path.append(ljpath +'/../libs3/')
|
||||||
|
|
||||||
#import from LJ
|
#import from LJ
|
||||||
@ -29,7 +30,6 @@ sys.path.append(ljpath +'/libs3/')
|
|||||||
|
|
||||||
|
|
||||||
sys.path.append('../libs3')
|
sys.path.append('../libs3')
|
||||||
sys.path.append(ljpath +'/../../libs3')
|
|
||||||
|
|
||||||
import lj23layers as lj
|
import lj23layers as lj
|
||||||
import gstt
|
import gstt
|
||||||
@ -321,7 +321,7 @@ def Circle(LAY):
|
|||||||
|
|
||||||
def Word(LAY):
|
def Word(LAY):
|
||||||
|
|
||||||
lj.Text(LAY['word'], c = LAY['color'], layer = LAY['number'], xpos = 300, ypos = 300, resize = LAY['scale']*20, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
|
lj.Text(LAY['word'], zpos=0, c = LAY['color'], layer = LAY['number'], xpos = 300, ypos = 300, resize = LAY['scale']*0.6, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
|
||||||
#lj.Text(LAY['word'], c = LAY['color'], layer = LAY['number'], xpos = LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*10, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
|
#lj.Text(LAY['word'], c = LAY['color'], layer = LAY['number'], xpos = LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*10, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
|
||||||
#lj.rPolyLineOneColor([(x/2,y/2),((x+1)/2,(y+1)/2)], c = LAY['color'], layer = l, xpos = 0, ypos = 0, resize = LAY['scale'], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
|
#lj.rPolyLineOneColor([(x/2,y/2),((x+1)/2,(y+1)/2)], c = LAY['color'], layer = l, xpos = 0, ypos = 0, resize = LAY['scale'], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
|
||||||
#lj.rPolyLineOneColor([(x/2,y/2,0),((x+1)/2,(y+1)/2,0)], c = z2color(Field['stars'][starnumber][2], LAY['color']), layer = LAY['number'], closed = False, xpos = -200, ypos = 0, resize = LAY['scale'], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
|
#lj.rPolyLineOneColor([(x/2,y/2,0),((x+1)/2,(y+1)/2,0)], c = z2color(Field['stars'][starnumber][2], LAY['color']), layer = LAY['number'], closed = False, xpos = -200, ypos = 0, resize = LAY['scale'], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
|
||||||
|
@ -179,9 +179,9 @@ print()
|
|||||||
log.infog("Aurora v0.1b")
|
log.infog("Aurora v0.1b")
|
||||||
|
|
||||||
OSCinPort = 8090
|
OSCinPort = 8090
|
||||||
ljscene = 1
|
ljscene = 0
|
||||||
|
|
||||||
StartFXs = ["anim.Word", "anim.Word","anim.Starfield","anim.Starfield"]
|
StartFXs = ["anim.Trckr","anim.Starfield","anim.Starfield", "anim.Word"]
|
||||||
|
|
||||||
# Useful variables init.
|
# Useful variables init.
|
||||||
white = lj.rgb2int(255,255,255)
|
white = lj.rgb2int(255,255,255)
|
||||||
@ -191,7 +191,7 @@ green = lj.rgb2int(0,255,0)
|
|||||||
cyan = lj.rgb2int(255,0,255)
|
cyan = lj.rgb2int(255,0,255)
|
||||||
yellow = lj.rgb2int(255,255,0)
|
yellow = lj.rgb2int(255,255,0)
|
||||||
|
|
||||||
StartColors = [blue, blue, green, red]
|
StartColors = [white, white,white, white]
|
||||||
|
|
||||||
screen_size = [700,700]
|
screen_size = [700,700]
|
||||||
xy_center = [screen_size[0]/2,screen_size[1]/2]
|
xy_center = [screen_size[0]/2,screen_size[1]/2]
|
||||||
@ -291,7 +291,7 @@ for l in range(lasernumber):
|
|||||||
'scandots': 64, 'scale': 45, 'color': white, "run": False,
|
'scandots': 64, 'scale': 45, 'color': white, "run": False,
|
||||||
'intensity': 255, 'closed': False,
|
'intensity': 255, 'closed': False,
|
||||||
'lineSize': 64, 'radius': 45, 'wavefreq': 3,
|
'lineSize': 64, 'radius': 45, 'wavefreq': 3,
|
||||||
'word': "Sonoptik",
|
'word': "SonoptiK",
|
||||||
'step': 0, 'steps': 60, 'stepmax': 60, 'stepvals': [],
|
'step': 0, 'steps': 60, 'stepmax': 60, 'stepvals': [],
|
||||||
'Xtransamt': 0, 'Ytransamt': 0, 'Ztransamt': 0,
|
'Xtransamt': 0, 'Ytransamt': 0, 'Ztransamt': 0,
|
||||||
'Xtranspeed': 0, 'Ytranspeed': 0, 'Ztranspeed': 0,
|
'Xtranspeed': 0, 'Ytranspeed': 0, 'Ztranspeed': 0,
|
||||||
@ -366,6 +366,7 @@ def OSChandler(path, tags, args, source):
|
|||||||
oscaddress = ''.join(path.split("/"))
|
oscaddress = ''.join(path.split("/"))
|
||||||
#print()
|
#print()
|
||||||
print("Aurora default OSC Handler : " + str(path) + " from Client : " + str(source[0]))
|
print("Aurora default OSC Handler : " + str(path) + " from Client : " + str(source[0]))
|
||||||
|
#print(args)
|
||||||
|
|
||||||
if len(args) > 0:
|
if len(args) > 0:
|
||||||
pass
|
pass
|
||||||
@ -463,10 +464,10 @@ def OSChandler(path, tags, args, source):
|
|||||||
TrckrPts.append([float(args[dot]), float(args[dot+1])])
|
TrckrPts.append([float(args[dot]), float(args[dot+1])])
|
||||||
'''
|
'''
|
||||||
|
|
||||||
TrckrPts[args[0]] = []
|
TrckrPts[int(args[0])] = []
|
||||||
for dot in range(2,len(args)-1,2):
|
for dot in range(2,len(args)-1,2):
|
||||||
|
|
||||||
TrckrPts[args[0]].append([float(args[dot]), float(args[dot+1])])
|
TrckrPts[int(args[0])].append([float(args[dot]), float(args[dot+1])])
|
||||||
|
|
||||||
|
|
||||||
# /aurora/word/layer word
|
# /aurora/word/layer word
|
||||||
|
Loading…
Reference in New Issue
Block a user