LJ/main.py

648 lines
19 KiB
Python
Raw Permalink Normal View History

2020-09-19 12:28:56 +00:00
#!/usr/bin/python3
2019-01-16 00:50:24 +00:00
# -*- coding: utf-8 -*-
# -*- mode: Python -*-
2018-12-13 11:05:32 +00:00
'''
2020-09-19 12:28:56 +00:00
LJ Laser Server v0.8.2
2018-12-13 11:05:32 +00:00
2020-09-20 19:46:53 +00:00
Inspiration for a future WebUI icon menu :
2019-08-06 01:08:54 +00:00
https://codepen.io/AlbertFeynman/pen/mjXeMV
2018-12-13 11:05:32 +00:00
Laser server + webUI servers (ws + OSC)
- get point list to draw : /pl/lasernumber
- for report /lstt/lasernumber /lack/lasernumber /cap/lasernumber
2024-08-19 19:22:38 +00:00
- a nice ws debug tool : websocat
- a "plugin" is a generator that send points to LJ. Plugins if they have an open OSC port can be checked and restart if in the same computer.
2018-12-13 11:05:32 +00:00
2019-03-10 22:06:04 +00:00
2024-08-19 19:22:38 +00:00
All used ports:
2019-03-10 22:06:04 +00:00
8002 OSC incoming
2024-08-19 19:22:38 +00:00
9001 Websocket communication with WebGUI
2019-08-06 01:08:54 +00:00
Plugins OSC Ports (see LJ.conf)
2018-12-13 11:05:32 +00:00
'''
2020-09-19 12:28:56 +00:00
#import pdb
from libs3 import log
2023-06-03 12:43:53 +00:00
2020-09-19 12:28:56 +00:00
print("")
print("")
log.infog("LJ Laser Server")
log.infog("v0.8.2")
print("")
print("-h will display help")
print("")
2018-12-13 11:05:32 +00:00
2019-08-06 01:08:54 +00:00
import redis
2020-09-19 12:28:56 +00:00
import os
ljpath = r'%s' % os.getcwd().replace('\\','/')
import sys
#sys.path.append('libs3/')
from libs3 import gstt, settings
2020-10-10 17:29:07 +00:00
gstt.ljpath = ljpath
2020-09-19 12:28:56 +00:00
log.info("Reading " + gstt.ConfigName + " setup file...")
2018-12-13 11:05:32 +00:00
settings.Read()
2019-08-06 01:08:54 +00:00
# Arguments may alter .conf file so import settings first then cli
2020-09-19 12:28:56 +00:00
from libs3 import cli
settings.Write()
2019-08-06 01:08:54 +00:00
2020-09-19 12:28:56 +00:00
from multiprocessing import Process, set_start_method
2018-12-13 11:05:32 +00:00
import random, ast
2020-09-19 12:28:56 +00:00
from libs3 import plugins
2024-08-19 19:22:38 +00:00
#from libs3 import lasytracer as tracer
from libs3 import tracer3 as tracer
#from libs3 import niptracer3 as tracer
2020-10-10 17:29:07 +00:00
from libs3 import homographyp, commands, font1
#import subprocess
2019-03-10 22:06:04 +00:00
import os
2023-06-03 12:43:53 +00:00
#from libs3 import midi3
2024-08-19 19:22:38 +00:00
from libs3 import OSC3
2018-12-13 11:05:32 +00:00
from websocket_server import WebsocketServer
#import socket
2020-09-19 12:28:56 +00:00
import types, _thread, time
2023-06-03 12:43:53 +00:00
import traceback
2020-09-19 12:28:56 +00:00
2023-06-03 12:43:53 +00:00
serverIP = gstt.RediServerIP
print("Redis server IP :", gstt.RediServerIP)
2019-08-06 01:08:54 +00:00
2023-06-03 12:43:53 +00:00
r = redis.StrictRedis(host=gstt.RediServerIP , port=6379, db=0)
# r = redis.StrictRedis(host=gstt.RediServerIP , port=6379, db=0, password='-+F816Y+-')
2018-12-15 19:03:32 +00:00
args =[0,0]
2018-12-13 11:05:32 +00:00
2024-08-15 15:04:23 +00:00
os_name = sys.platform
print(f"Système d'exploitation: {os_name}")
# Plateformes spécifiques
if os_name == "Windows":
print("Plateform: Windows")
elif os_name == "Darwin": # macOS
print("Plateform: macOS")
elif os_name == "Linux":
print("Plateform: Linux")
2018-12-13 11:05:32 +00:00
def dac_process(number, pl):
2020-09-19 12:28:56 +00:00
import sys
from libs3 import gstt
print("Starting dac process", number)
2024-08-19 19:22:38 +00:00
2018-12-13 11:05:32 +00:00
while True:
try:
2018-12-21 16:23:43 +00:00
d = tracer.DAC(number,pl)
2018-12-13 11:05:32 +00:00
d.play_stream()
2020-09-19 12:28:56 +00:00
2018-12-13 11:05:32 +00:00
except Exception as e:
2020-09-19 12:28:56 +00:00
import sys
import traceback
if gstt.debug > 0:
log.err('\n---------------------')
log.err('Exception: %s' % e)
log.err('- - - - - - - - - - -')
2018-12-13 11:05:32 +00:00
traceback.print_tb(sys.exc_info()[2])
2020-09-19 12:28:56 +00:00
print("\n")
2018-12-13 11:05:32 +00:00
pass
except KeyboardInterrupt:
sys.exit(0)
2024-08-19 19:22:38 +00:00
2018-12-13 11:05:32 +00:00
#
2023-06-03 12:43:53 +00:00
# Init variables
2018-12-13 11:05:32 +00:00
#
2024-08-19 19:22:38 +00:00
debug = gstt.debug
2020-09-19 12:28:56 +00:00
print("Debug :", debug)
2018-12-13 11:05:32 +00:00
2024-08-15 15:04:23 +00:00
print("Start Scene number :",gstt.SceneNumber)
2023-07-09 14:09:18 +00:00
print("Laser feedbacks resetting...")
for laserid in range(0,gstt.LaserNumber):
2024-08-19 19:22:38 +00:00
2023-07-09 14:09:18 +00:00
r.set('/lack/'+str(laserid),64)
r.set('/lstt/'+str(laserid),64)
r.set('/cap/'+str(laserid),0)
r.set('/order/'+str(laserid), 0)
2020-10-11 09:48:53 +00:00
'''
# Nozoid OSC Client : to send OSC message to Nozoid inport 8003
2023-06-03 12:43:53 +00:00
nozoscIP = gstt.nozoscip
print("Nozosc IP :", nozoscIP)
2018-12-13 11:05:32 +00:00
NozoscIPout = nozoscIP
2019-03-10 22:06:04 +00:00
NozoscPORTout = plugins.Port("nozoid")
2020-10-11 09:48:53 +00:00
'''
2018-12-13 11:05:32 +00:00
2020-10-11 09:48:53 +00:00
''''
# Planetarium OSC Client : to send OSC message to planetarium inport 8005
2019-02-26 10:10:57 +00:00
planetIPout = nozoscIP
2019-03-10 22:06:04 +00:00
planetPORTout = plugins.Port("planet")
2020-10-11 09:48:53 +00:00
'''
2020-09-19 12:28:56 +00:00
import socket
2019-02-26 10:10:57 +00:00
2020-09-19 12:28:56 +00:00
#retry = 1
#delay = 1
2020-09-19 12:28:56 +00:00
#
# OSC
#
2023-06-03 12:43:53 +00:00
# oscserver
oscserverIP = gstt.oscIPin
2024-08-19 19:22:38 +00:00
# OSC Server : accept OSC message on port 8002
2023-06-03 12:43:53 +00:00
#oscIPin = "192.168.1.10"s
oscserverIPin = serverIP
oscserverPORTin = 8002
# OSC Client : to send OSC message to an IP port 8001
2024-08-19 19:22:38 +00:00
oscserverIPout = oscserverIP
2023-06-03 12:43:53 +00:00
oscserverPORTout = 8101
2020-09-19 12:28:56 +00:00
oscserver = OSC3.OSCServer( (oscserverIPin, oscserverPORTin) )
2018-12-13 11:05:32 +00:00
oscserver.timeout = 0
OSCRunning = True
def handle_timeout(self):
self.timed_out = True
oscserver.handle_timeout = types.MethodType(handle_timeout, oscserver)
2019-03-10 22:06:04 +00:00
2023-06-03 12:43:53 +00:00
# OSC default path handler : send incoming OSC message to UIs : OSC 8001 & websocket 9001
2018-12-13 11:05:32 +00:00
def handler(path, tags, args, source):
2023-06-03 12:43:53 +00:00
# OSC ui connection
if path == "/connect" :
print("OSCUI asked by", source)
gstt.TouchOSCUI = True
gstt.TouchOSCIP= source[0]
print(gstt.LaserNumber)
for laserid in range(gstt.LaserNumber):
commands.UpdateOSCUI(laserid)
return
2018-12-13 11:05:32 +00:00
oscpath = path.split("/")
2019-08-06 01:08:54 +00:00
if gstt.debug > 0:
2020-09-19 12:28:56 +00:00
print("")
2023-06-03 12:43:53 +00:00
print("OSC handler in main got : path", path," oscpath", oscpath," args", args, " source",source)
2019-08-06 01:08:54 +00:00
if oscpath[1] != "pong":
sendWSall(path + " " + str(args[0]))
2023-06-03 12:43:53 +00:00
commands.sendOSCUI(path,oscargs=args)
2018-12-21 16:23:43 +00:00
commands.handler(oscpath,args)
2018-12-13 11:05:32 +00:00
2024-08-19 19:22:38 +00:00
# RAW OSC Frame available ?
2018-12-13 11:05:32 +00:00
def osc_frame():
2018-12-18 01:45:23 +00:00
#print 'oscframe'
2018-12-13 11:05:32 +00:00
# clear timed_out flag
oscserver.timed_out = False
# handle all pending requests then return
while not oscserver.timed_out:
oscserver.handle_request()
def PingAll():
2020-09-19 12:28:56 +00:00
if gstt.debug > 0:
print("Pinging all plugins...")
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
for plugin in list(gstt.plugins.keys()):
if gstt.debug > 0:
print("pinging", plugin)
2019-08-06 01:08:54 +00:00
#sendWSall("/"+ plugin + "/start 0")
plugins.Ping(plugin)
2018-12-13 11:05:32 +00:00
2023-06-03 12:43:53 +00:00
'''
gstt.lasertype[i
2024-08-19 19:22:38 +00:00
gstt.sizeX[i] =
gstt.sizeY[i] =
2023-06-03 12:43:53 +00:00
'''
'''
# OSC UI feedback
def sendOSCUI(oscaddress,oscargs=''):
2024-08-19 19:22:38 +00:00
2023-06-03 12:43:53 +00:00
if gstt.TouchOSCUI == True:
oscmsg = OSC3.OSCMessage()
oscmsg.setAddress(oscaddress)
oscmsg.append(oscargs)
2024-08-19 19:22:38 +00:00
2023-06-03 12:43:53 +00:00
oscui = OSC3.OSCClient()
2024-08-19 19:22:38 +00:00
oscui.connect((gstt.TouchOSCIP, 8001))
2023-06-03 12:43:53 +00:00
print("main sending OSC UI message :", oscmsg, "to", gstt.TouchOSCIP, ":8001")
if gstt.debug >0:
print("main sending OSC UI message :", oscmsg, "to", gstt.TouchOSCIP, ":8001")
2024-08-19 19:22:38 +00:00
2023-06-03 12:43:53 +00:00
try:
oscui.sendto(oscmsg, (gstt.TouchOSCIP, 8001))
oscmsg.clearData()
2024-08-19 19:22:38 +00:00
2023-06-03 12:43:53 +00:00
except:
print ('Connection to OSC UI refused : died ?')
pass
#time.sleep(0.001
'''
2018-12-13 11:05:32 +00:00
2019-01-16 00:50:24 +00:00
# OSC server Thread : handler, dacs reports and simulator points sender to UI.
2018-12-13 11:05:32 +00:00
def osc_thread():
2023-06-03 12:43:53 +00:00
try:
while True:
2018-12-13 11:05:32 +00:00
2023-06-03 12:43:53 +00:00
time.sleep(0.1)
osc_frame()
2018-12-13 11:05:32 +00:00
2023-06-03 12:43:53 +00:00
for laserid in range(0,gstt.LaserNumber): # Laser not used -> led is not lit
2020-09-19 12:28:56 +00:00
2023-06-03 12:43:53 +00:00
lstate = {'0': 'IDLE', '1': 'PREPARE', '2': "PLAYING", '64': "NOCONNECTION ?" }
lstt = r.get('/lstt/'+ str(laserid)).decode('ascii')
#print ("laserid", laserid,"lstt",lstt, type(lstt))
commands.sendOSCUI("/stt/" + str(laserid), lstate[str(lstt)])
if gstt.debug >1:
print("DAC", laserid, "is in (lstt) :", lstt , lstate[str(lstt)])
if lstt == "0": # Dac IDLE state(0) -> led is blue (3)
sendWSall("/lstt/" + str(laserid) + " 3")
2020-09-19 12:28:56 +00:00
2023-06-03 12:43:53 +00:00
if lstt == "1": # Dac PREPARE state (1) -> led is cyan (2)
sendWSall("/lstt/" + str(laserid) + " 2")
2020-09-19 12:28:56 +00:00
2023-06-03 12:43:53 +00:00
if lstt == "2": # Dac PLAYING (2) -> led is green (1)
sendWSall("/lstt/" + str(laserid) + " 1")
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
2023-06-03 12:43:53 +00:00
ackstate = {'61': 'ACK', '46': 'FULL', '49': "INVALID", '21': 'STOP', '64': "NOCONNECTION ?", '35': "NOCONNECTION ?" , '97': 'ACK', '70': 'FULL', '73': "INVALID", '33': 'STOP', '100': "NOCONNECTION", '48': "NOCONNECTION", 'a': 'ACK', 'F': 'FULL', 'I': "INVALID", '!': 'STOP', 'd': "NOCONNECTION", '0': "NOCONNECTION"}
lack= r.get('/lack/'+str(laserid)).decode('ascii')
commands.sendOSCUI("/ack/" + str(laserid), ackstate[str(lack)])
if gstt.debug >1:
print("DAC", laserid, "answered (lack):", lack, chr(int(lack)), ackstate[str(lack)])
2020-09-19 12:28:56 +00:00
2023-06-03 12:43:53 +00:00
if chr(int(lack)) == 'a': # Dac sent ACK ("a") -> led is green (1)
sendWSall("/lack/" + str(laserid) +" 1")
2020-09-19 12:28:56 +00:00
2023-06-03 12:43:53 +00:00
if chr(int(lack)) == 'F': # Dac sent FULL ("F") -> led is orange (5)
sendWSall("/lack/" + str(laserid) +" 5")
2020-09-19 12:28:56 +00:00
2023-06-03 12:43:53 +00:00
if chr(int(lack)) == 'I': # Dac sent INVALID ("I") -> led is yellow (4)
sendWSall("/lack/" + str(laserid)+" 4")
#print lack
2024-08-19 19:22:38 +00:00
2023-06-03 12:43:53 +00:00
if lack == "64" or lack =="35": # no connection to dac -> leds are red (6)
2024-08-19 19:22:38 +00:00
sendWSall("/lack/" + str(laserid) + " 6")
sendWSall("/lstt/" + str(laserid) + " 6")
#sendWSall("/lstt/" + str(laserid) + " 0")
2023-06-03 12:43:53 +00:00
sendWSall("/points/" + str(laserid) + " 6")
2024-08-19 19:22:38 +00:00
2023-06-03 12:43:53 +00:00
else:
# last number of points sent to etherdream buffer
sendWSall("/points/" + str(laserid) + " " + str(r.get('/cap/'+str(laserid)).decode('ascii')))
#print("Sending simu frame from",'/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')))
#commands.sendOSCUI("/cap/" + str(laserid), str(r.get('/cap/'+str(laserid)).decode('ascii')))
if random.randint(0,100)>95:
plugins.sendbroadcast()
except Exception as e:
import sys, traceback
print('\n--------------------------')
print('OSC Thread Exception: %s' % e)
print('- - - - - - - - - - - - - - ')
traceback.print_tb(sys.exc_info()[2])
print("\n")
2018-12-13 11:05:32 +00:00
#
# Websocket part
2024-08-19 19:22:38 +00:00
#
2023-06-03 12:43:53 +00:00
def get_Host_name_IP():
try:
2024-08-19 19:22:38 +00:00
host_name = "localhost" #socket.gethostname()
2023-06-03 12:43:53 +00:00
host_ip = socket.gethostbyname(host_name)
print("Hostname : ", host_name)
print("IP : ", host_ip)
except:
print("Unable to get Hostname and IP")
return host_ip
2024-08-19 19:22:38 +00:00
2018-12-13 11:05:32 +00:00
# Called for every WS client connecting (after handshake)
2019-03-10 22:06:04 +00:00
def new_client(client, wserver):
2018-12-15 19:03:32 +00:00
2018-12-13 11:05:32 +00:00
print("New WS client connected and was given id %d" % client['id'])
2020-09-19 12:28:56 +00:00
sendWSall("/status Hello " + str(client['id']))
2023-06-03 12:43:53 +00:00
#commands.sendOSCUI("/status", "Hello " + str(client['id']))
2018-12-13 11:05:32 +00:00
2024-08-19 19:22:38 +00:00
for laserid in range(0,gstt.LaserNumber):
2019-08-06 01:08:54 +00:00
sendWSall("/ip/" + str(laserid) + " " + str(gstt.lasersIPS[laserid]))
sendWSall("/kpps/" + str(laserid)+ " " + str(gstt.kpps[laserid]))
2020-09-19 12:28:56 +00:00
#sendWSall("/laser"+str(laserid)+"/start 1")
sendWSall("/laser "+str(laserid))
#print("/laser "+str(laserid))
sendWSall("/lack/" + str(laserid) + " 6")
2024-08-19 19:22:38 +00:00
#print("/lack/" + str(laserid) + " 6")
sendWSall("/lstt/" + str(laserid) + " 6")
2020-09-19 12:28:56 +00:00
#print("/lstt/" + str(laserid) + " 6")
sendWSall("/points/" + str(laserid) + " 0")
#print("/points/" + str(laserid) + " 0")
if gstt.swapX[laserid] == 1:
2018-12-15 19:03:32 +00:00
sendWSall("/swap/X/" + str(laserid)+ " 1")
else:
2018-12-15 19:03:32 +00:00
sendWSall("/swap/X/" + str(laserid)+ " 0")
if gstt.swapY[laserid] == 1:
2018-12-15 19:03:32 +00:00
sendWSall("/swap/Y/" + str(laserid)+ " 1")
else:
2018-12-15 19:03:32 +00:00
sendWSall("/swap/Y/" + str(laserid)+ " 0")
2018-12-13 11:05:32 +00:00
# Called for every WS client disconnecting
2019-03-10 22:06:04 +00:00
def client_left(client, wserver):
2023-06-03 12:43:53 +00:00
try:
print("WS Client(%d) disconnected" % client['id'])
except:
print("Something weird is coming from",client,"on the wire...")
pass
2018-12-13 11:05:32 +00:00
2019-03-10 22:06:04 +00:00
# Called for each WS received message.
def message_received(client, wserver, message):
2020-09-19 12:28:56 +00:00
#if len(message) > 200:
2024-08-19 19:22:38 +00:00
# message = message[:200]+'..'
2018-12-15 19:03:32 +00:00
2019-02-26 10:10:57 +00:00
#if gstt.debug >0:
# print ("")
# print("WS Client(%d) said: %s" % (client['id'], message))
2024-08-19 19:22:38 +00:00
2018-12-13 11:05:32 +00:00
oscpath = message.split(" ")
2020-09-19 12:28:56 +00:00
#print "WS Client", client['id'], "said :", message, "splitted in an oscpath :", oscpath
if gstt.debug > 0:
2020-09-19 12:28:56 +00:00
print("WS Client", client['id'], "said :", message, "splitted in an oscpath :", oscpath)
2024-08-19 19:22:38 +00:00
PingAll()
message4plugin = False
2019-03-17 03:19:57 +00:00
# WS received Message is for a plugin ?
2020-09-19 12:28:56 +00:00
for plugin in list(gstt.plugins.keys()):
2024-08-19 19:22:38 +00:00
if oscpath[0].find(plugin) != -1:
2024-08-19 19:22:38 +00:00
message4plugin = True
2020-09-19 12:28:56 +00:00
#print(oscpath)
if plugins.Send(plugin, oscpath):
print("plugins sent incoming WS correctly to", plugin)
2019-08-06 01:08:54 +00:00
else:
2020-09-19 12:28:56 +00:00
print("plugins detected", plugin, "offline.")
2019-02-26 10:10:57 +00:00
2023-06-03 12:43:53 +00:00
# WS received message is an LJ command
if message4plugin == False:
2019-03-17 03:19:57 +00:00
if len(oscpath) == 1:
args[0] = "noargs"
#print "noargs command"
2024-08-19 19:22:38 +00:00
elif len(oscpath) > 1:
2024-08-19 19:22:38 +00:00
args[0] = str(oscpath[1])
#print "arg",oscpath[1]
2024-08-19 19:22:38 +00:00
commands.handler(oscpath[0].split("/"),args)
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
2018-12-13 11:05:32 +00:00
# if needed a loop back : WS Client -> server -> WS Client
#sendWSall("ws"+message)
def handle_timeout(self):
self.timed_out = True
def sendWSall(message):
2018-12-27 11:40:30 +00:00
#if gstt.debug >0:
#print("WS sending %s" % (message))
2019-03-10 22:06:04 +00:00
wserver.send_message_to_all(message)
2024-08-19 19:22:38 +00:00
2023-06-03 12:43:53 +00:00
if gstt.TouchOSCUI == True:
if message[:7] == '/status':
print("Main WSall", message, message[:6])
commands.sendOSCUI('/status', message[8:])
if message[:5] == '/line1':
print("Main WSall", message, message[:6])
commands.sendOSCUI('/line1', message[6:])
2024-08-19 19:22:38 +00:00
'''
2023-06-03 12:43:53 +00:00
print ("")
log.info("Midi Configuration...")
midi3.check()
2019-08-06 01:08:54 +00:00
'''
2018-12-13 11:05:32 +00:00
2020-10-05 20:22:42 +00:00
def fff(name):
print()
print('HELLO', name ) #indent
print()
#
# Create a startup point list for each laser : 0,1,2,...
#
2018-12-13 11:05:32 +00:00
2020-09-19 12:28:56 +00:00
print("")
log.info("Creating startup point lists...")
if r.set("/clientkey","/pl/"+str(gstt.SceneNumber)+"/")==True:
print("sent clientkey : /pl/"+str(gstt.SceneNumber)+"/")
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
#pdb.set_trace()
for sceneid in range(0,gstt.MaxScenes+1):
print("Scene "+ str(sceneid))
#digit_points = font1.DigitsDots(sceneid,65280)
2018-12-13 11:05:32 +00:00
2020-10-05 20:22:42 +00:00
# Order all lasers to show its number at startup -> tell all 4 laser process to USER PLs
2018-12-19 11:39:54 +00:00
for laserid in range(0,gstt.LaserNumber):
2018-12-13 11:05:32 +00:00
2020-09-19 12:28:56 +00:00
digit_points = font1.DigitsDots(laserid,65280)
if r.set('/pl/'+str(sceneid)+'/'+str(laserid), str(digit_points)) == True:
pass
#print( ast.literal_eval(r.get('/pl/'+str(sceneid)+'/'+str(laserid)).decode('ascii')))
#print("/pl/"+str(sceneid)+"/"+str(laserid)+" "+str(ast.literal_eval(r.get('/pl/'+str(sceneid)+'/'+str(laserid)).decode('ascii'))))
2018-12-13 11:05:32 +00:00
2018-12-19 11:39:54 +00:00
r.set('/order/'+str(laserid), 0)
2020-10-05 20:22:42 +00:00
2024-08-19 19:22:38 +00:00
#
# For tracer as external command
#
import subprocess
import select
def spawn(cmd):
p = subprocess.Popen(cmd,
shell=True,
stdin=subprocess.DEVNULL,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL)
return p
2020-09-19 12:28:56 +00:00
#
# Starts one DAC process per requested Laser
#
2018-12-13 11:05:32 +00:00
2024-08-19 19:22:38 +00:00
import signal
import sys
def signal_handler(sig, frame):
print('You pressed Ctrl+C!')
commands.LJautokill()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
2020-09-19 12:28:56 +00:00
if __name__ == '__main__':
2018-12-13 11:05:32 +00:00
2020-09-19 12:28:56 +00:00
# Bug in 3.8.4 MacOS default multiprocessing start method is spawn. Spawn doesn't work properly
set_start_method('fork')
2018-12-13 11:05:32 +00:00
2024-08-15 15:04:23 +00:00
#print("gstt.LaserNumber", gstt.LaserNumber)
2020-09-19 12:28:56 +00:00
if gstt.LaserNumber == -1:
log.infog("Autodetected DACs mode")
commands.DAChecks()
print("dacs", gstt.dacs)
2018-12-13 11:05:32 +00:00
2024-08-19 19:22:38 +00:00
else:
2020-09-19 12:28:56 +00:00
log.infog("Resquested DACs mode")
2018-12-13 11:05:32 +00:00
2024-08-19 19:22:38 +00:00
#lasernumber = gstt.LaserNumber -1
2020-09-19 12:28:56 +00:00
print("LaserNumber = ", gstt.LaserNumber)
log.info("Starting "+str(gstt.LaserNumber) + " DACs process...")
2024-08-19 19:22:38 +00:00
commands.workers = []
for lasernumber in range(0,gstt.LaserNumber):
# Launch one process (a tracer3 instance) by laser
if gstt.dacfamily[lasernumber] == "extern_cmd":
2024-08-19 20:47:42 +00:00
dac_worker = spawn(gstt.cmd[lasernumber])
dac_worker.name = f'ExternCmd{lasernumber}'
dac_worker.join = dac_worker.wait
2024-08-19 19:22:38 +00:00
else:
2024-08-19 20:47:42 +00:00
dac_worker= Process(target=dac_process, args=(lasernumber,0,))
dac_worker.start()
2024-08-19 19:22:38 +00:00
#commands.worker0 = dac_worker0 # ???
2024-08-19 20:47:42 +00:00
commands.workers.append(dac_worker)
print(f"Tracer {lasernumber} : name", dac_worker.name , "pid", dac_worker.pid )
2024-08-19 19:22:38 +00:00
print("DAC Family:", gstt.dacfamily[lasernumber]);
# if lasernumber >0:
# dac_worker1= Process(target=dac_process, args=(1,0,))
# commands.worker1 = dac_worker1
# print("Tracer 1 : name", dac_worker1.name , "pid", dac_worker1.pid )
# dac_worker1.start()
# if lasernumber >1:
# dac_worker2= Process(target=dac_process, args=(2,0,))
# dac_worker2.start()
# commands.worker2 = dac_worker2
# print("Tracer 2 : name", dac_worker2.name , "pid", dac_worker2.pid )
# if lasernumber >2:
# dac_worker3= Process(target=dac_process, args=(3,0,))
# print("Tracer 3 : name", dac_worker3.name , "pid", dac_worker3.pid )
# commands.worker3 = dac_worker3
# dac_worker3.start()
2020-09-19 12:28:56 +00:00
print("")
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
#
2020-10-05 20:22:42 +00:00
# start WS and OSC servers
2020-09-19 12:28:56 +00:00
#
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
try:
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
log.info("Starting servers...")
2023-06-03 12:43:53 +00:00
hostIP= get_Host_name_IP()
if hostIP != gstt.wwwIP:
2024-08-15 15:04:23 +00:00
print("Host IP is : "+str(hostIP))
print("wwwIP in LJ.conf : "+str(gstt.wwwIP))
log.err("Host and wwwIP different : you must update Update LJ.conf :")
print("python3 configure.py")
log.err('Exiting...')
2023-06-03 12:43:53 +00:00
#gstt.wwwIP = hostIP
2024-08-19 19:22:38 +00:00
#commands.LJautokill()
#sys.exit()
2023-06-03 12:43:53 +00:00
2020-09-19 12:28:56 +00:00
# Launch OSC thread listening to oscserver
2024-08-15 15:04:23 +00:00
print("OSC server to receive messages (UI,...)")
print("binded at", oscserverIPin, "port",str(oscserverPORTin))
2020-09-19 12:28:56 +00:00
oscserver.addMsgHandler( "/noteon", commands.NoteOn)
oscserver.addMsgHandler( "/scim", commands.Scim)
oscserver.addMsgHandler( "/line1", commands.Line1)
oscserver.addMsgHandler( "/forwardui", commands.ForwardUI)
# Default OSC handler for all OSC incoming message
oscserver.addMsgHandler("default", handler)
_thread.start_new_thread(osc_thread, ())
2023-06-03 12:43:53 +00:00
#print()
# Websocket listening port
2024-08-15 15:04:23 +00:00
print("WebUI WS server...")
2024-08-19 19:22:38 +00:00
2024-08-15 15:04:23 +00:00
#hostIP= get_Host_name_IP()
2023-06-03 12:43:53 +00:00
if hostIP != gstt.wwwIP:
log.err("wwwIP in config is not set to "+str(hostIP))
gstt.wwwIP = hostIP
#commands.LJautokill()
2024-08-19 19:22:38 +00:00
2024-08-15 15:04:23 +00:00
print("binded at", gstt.wwwIP, "port",str(gstt.wsPORT))
2023-06-03 12:43:53 +00:00
wserver = WebsocketServer(gstt.wsPORT,host= gstt.wwwIP)
plugins.Init(wserver)
2020-09-19 12:28:56 +00:00
wserver.set_fn_new_client(new_client)
wserver.set_fn_client_left(client_left)
wserver.set_fn_message_received(message_received)
2023-06-03 12:43:53 +00:00
2020-09-19 12:28:56 +00:00
print("")
log.info("Resetting all Homographies...")
2024-08-19 19:22:38 +00:00
for laserid in range(0,gstt.LaserNumber):
2020-09-19 12:28:56 +00:00
homographyp.newEDH(laserid)
2024-08-19 19:22:38 +00:00
2023-06-03 12:43:53 +00:00
#midi3.check()
2020-09-19 12:28:56 +00:00
# plugins autostart
2023-06-03 12:43:53 +00:00
#print("")
2020-09-19 12:28:56 +00:00
log.info("Plugins startup...")
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
if gstt.autostart != "":
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
for pluginname in gstt.autostart.split(","):
print("Autostarting", pluginname, "...")
plugins.Start(pluginname)
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
print("")
log.infog("LJ server running...")
2024-08-19 19:22:38 +00:00
2020-10-05 20:22:42 +00:00
# websocket loop
2020-09-19 12:28:56 +00:00
wserver.run_forever()
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
except Exception:
log.err("Exception")
traceback.print_exc()
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
# Gently stop on CTRL C
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
finally:
2020-09-29 22:15:40 +00:00
commands.LJautokill()
2020-10-05 20:22:42 +00:00
2020-09-19 12:28:56 +00:00
'''
Some code previously used, for reference :
2024-08-19 19:22:38 +00:00
2020-09-19 12:28:56 +00:00
random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)]
'''