diff --git a/configure.py b/configure.py index 106b2aa..59a3d0b 100644 --- a/configure.py +++ b/configure.py @@ -15,18 +15,20 @@ import configparser from libs3 import gstt import ast import numpy as np +import updateUI config = configparser.ConfigParser() config.read(gstt.ConfigName) qList = [ - {"q":"The server IP address","c":"General","k":"ljayserverip"}, - {"q":"How many lasers to use","c":"General","k":"lasernumber"}, - {"q":"Laser 0 IP address","c":"laser0","k":"ip"}, - {"q":"Laser 1 IP address","c":"laser1","k":"ip"}, - {"q":"Laser 2 IP address","c":"laser2","k":"ip"}, - {"q":"Laser 3 IP address","c":"laser3","k":"ip"} + {"q":"The server IP address ","c":"General","k":"ljayserverip"}, + {"q":"The IP address or domain for webui","c":"General","k":"wwwip"}, + {"q":"How many lasers to use ","c":"General","k":"lasernumber"}, + {"q":"Laser 0 IP address ","c":"laser0","k":"ip"}, + {"q":"Laser 1 IP address ","c":"laser1","k":"ip"}, + {"q":"Laser 2 IP address ","c":"laser2","k":"ip"}, + {"q":"Laser 3 IP address ","c":"laser3","k":"ip"} ] stop = False while stop == False : @@ -52,4 +54,7 @@ while stop == False : new_value = input("Please enter the new value:") config.set(choice["c"],choice["k"],new_value) config.write(open(gstt.ConfigName,'w')) + print(choice["c"],choice["k"]) + if choice["k"] == "wwwip": + updateUI.www(new_value) diff --git a/libs3/settings.py b/libs3/settings.py index 5f122b3..714d6b7 100644 --- a/libs3/settings.py +++ b/libs3/settings.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # -*- mode: Python -*- ''' -LJay/LJ +LJ v0.7.0 Settings Handler diff --git a/plugins/custom1.py b/plugins/custom1.py new file mode 100644 index 0000000..75506c3 --- /dev/null +++ b/plugins/custom1.py @@ -0,0 +1,277 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# -*- mode: Python -*- + + +''' + +custom1 +v0.1.0 + +A copy of square.py you can modify to code your plugin. +custom1 has necessary hooks in LJ.conf, webui and so on. + + +LICENCE : CC + +by Sam Neurohack + + +''' +import sys +import os +print() +ljpath = r'%s' % os.getcwd().replace('\\','/') + +# import from shell + +sys.path.append(ljpath +'/../libs/') + +#import from LJ +sys.path.append(ljpath +'/libs/') +print(ljpath+'/../libs/') + +import lj23layers as lj + +sys.path.append('../libs') +from OSC3 import OSCServer, OSCClient, OSCMessage +import redis +import math +import time +import argparse + +OSCinPort = 8014 + +print ("") +print ("Arguments parsing if needed...") +argsparser = argparse.ArgumentParser(description="Custom1 example for LJ") +argsparser.add_argument("-r","--redisIP",help="IP of the Redis server used by LJ (127.0.0.1 by default) ",type=str) +argsparser.add_argument("-s","--scene",help="LJ scene number (0 by default)",type=int) +#argsparser.add_argument("-l","--laser",help="Laser number to be displayed (0 by default)",type=int) +argsparser.add_argument("-v","--verbose",help="Verbosity level (0 by default)",type=int) +argsparser.add_argument("-m","--myIP",help="Local IP (127.0.0.1 by default) ",type=str) + +args = argsparser.parse_args() + +if args.scene: + ljscene = args.scene +else: + ljscene = 0 +''' +if args.laser: + plnumber = args.laser +else: + plnumber = 0 +''' + +# Redis Computer IP +if args.redisIP != None: + redisIP = args.redisIP +else: + redisIP = '127.0.0.1' + +print("redisIP",redisIP) + +# myIP +if args.myIP != None: + myIP = args.myIP +else: + myIP = '127.0.0.1' + +print("myIP",myIP) +if args.verbose: + debug = args.verbose +else: + debug = 0 + +# Useful variables init. +white = lj.rgb2int(255,255,255) +red = lj.rgb2int(255,0,0) +blue = lj.rgb2int(0,0,255) +green = lj.rgb2int(0,255,0) + +width = 800 +height = 600 +centerX = width / 2 +centerY = height / 2 + +# 3D to 2D projection parameters +fov = 256 +viewer_distance = 2.2 + +# Anaglyph computation parameters for right and left eyes. +# algorythm come from anaglyph geo maps +eye_spacing = 100 +nadir = 0.5 +observer_altitude = 30000 +map_layerane_altitude = 0.0 + +# square coordinates : vertices that compose each of the square. +vertices = [ + (- 1.0, 1.0,- 1.0), + ( 1.0, 1.0,- 1.0), + ( 1.0,- 1.0,- 1.0), + (- 1.0,- 1.0,- 1.0) + ] + +face = [0,1,2,3] + +# +# LJ inits +# + +layer = 0 + +# Setup LJ library mandatory properties for this plugin +lj.Config(redisIP, ljscene, "custom1") + +# Define properties for each drawn "element" : name, intensity, active, xy, color, red, green, blue, layer , closed +Leftsquare = lj.FixedObject('Leftsquare', True, 255, [], red, 255, 0, 0, layer , True) +Rightsquare = lj.FixedObject('Rightsquare', True, 255, [], green, 0, 255, 0, layer , True) + +# 'Destination' for given layer : name, number, active, layer , scene, laser +Dest0 = lj.DestObject('0', 0, True, 0 , 0, 0) # Dest0 will send layer 0 points to scene 0, laser 0 + + +# +# Anaglyph computation : different X coordinate for each eye +# + +def LeftShift(elevation): + + diff = elevation - map_layerane_altitude + return nadir * eye_spacing * diff / (observer_altitude - elevation) + +def RightShift(elevation): + + diff = map_layerane_altitude - elevation + return (1 - nadir) * eye_spacing * diff / (observer_altitude - elevation) + +# +# OSC +# + +oscserver = OSCServer( (myIP, OSCinPort) ) +oscserver.timeout = 0 + + +# 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) + + +# OSC callbacks + +# /custom1/ljscene +def OSCljscene(path, tags, args, source): + + print("Got /custom1/ljscene with value", args[0]) + lj.WebStatus("custom1 to virtual "+ str(args[0])) + ljscene = args[0] + lj.Ljscene(ljscene) + + +def Proj(x,y,z,angleX,angleY,angleZ): + + rad = angleX * math.pi / 180 + cosa = math.cos(rad) + sina = math.sin(rad) + y2 = y + y = y2 * cosa - z * sina + z = y2 * sina + z * cosa + + rad = angleY * math.pi / 180 + cosa = math.cos(rad) + sina = math.sin(rad) + z2 = z + z = z2 * cosa - x * sina + x = z2 * sina + x * cosa + + rad = angleZ * math.pi / 180 + cosa = math.cos(rad) + sina = math.sin(rad) + x2 = x + x = x2 * cosa - y * sina + y = x2 * sina + y * cosa + + + """ Transforms this 3D point to 2D using a perspective projection. """ + factor = fov / (viewer_distance + z) + x = x * factor + centerX + y = - y * factor + centerY + return (x,y) + + +# +# Main +# + +def Run(): + + + Left = [] + Right = [] + counter =0 + #lj.SendLJ("/custom1/start 1") + + # OSC Server callbacks + print("Starting OSC server at",myIP," port",OSCinPort,"...") + oscserver.addMsgHandler( "/custom1/ljscene", OSCljscene ) + + # Add OSC generic plugins commands : 'default", /ping, /quit, /pluginame/obj, /pluginame/var, /pluginame/adddest, /pluginame/deldest + lj.addOSCdefaults(oscserver) + + try: + + while lj.oscrun: + + lj.OSCframe() + Left = [] + Right = [] + + x = vertices[0][0] + y = vertices[0][1] + z = vertices[0][2] + + # LJ tracers will "move" the laser to this first point in black, then move to the next with second point color. + # For more accuracy in dac emulator, repeat this first point. + + # Generate all points in square. + for point in face: + x = vertices[point][0] + y = vertices[point][1] + z = vertices[point][2] + + Left.append(Proj(x+LeftShift(z*25),y,z,0,counter,0)) + Right.append(Proj(x+RightShift(z*25),y,z,0,counter,0)) + + + lj.PolyLineOneColor(Left, c = Leftsquare.color , layer = Leftsquare.layer, closed = Leftsquare.closed) + lj.PolyLineOneColor(Right, c = Rightsquare.color , layer = Rightsquare.layer, closed = Rightsquare.closed) + + lj.DrawDests() + + + time.sleep(0.1) + + counter += 1 + if counter > 360: + counter = 0 + + except KeyboardInterrupt: + pass + + # Gently stop on CTRL C + + finally: + + lj.ClosePlugin() + + +Run() diff --git a/plugins/square.py b/plugins/square.py new file mode 100644 index 0000000..a9f6c34 --- /dev/null +++ b/plugins/square.py @@ -0,0 +1,279 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# -*- mode: Python -*- + + +''' + +Square +v0.1.0 + +Anaglyphed rotating square (for red and green glasses) + +This scene uses the drawing functions provided by LJ in lj23.py + +LICENCE : CC + +by Sam Neurohack + + +''' +import sys +import os +print() +ljpath = r'%s' % os.getcwd().replace('\\','/') + +# import from shell + +sys.path.append(ljpath +'/../libs/') + +#import from LJ +sys.path.append(ljpath +'/libs/') +print(ljpath+'/../libs/') + +import lj23layers as lj + +sys.path.append('../libs') +from OSC3 import OSCServer, OSCClient, OSCMessage +import redis +import math +import time +import argparse + +OSCinPort = 8013 + +print ("") +print ("Arguments parsing if needed...") +argsparser = argparse.ArgumentParser(description="Square example for LJ") +argsparser.add_argument("-r","--redisIP",help="IP of the Redis server used by LJ (127.0.0.1 by default) ",type=str) +argsparser.add_argument("-s","--scene",help="LJ scene number (0 by default)",type=int) +#argsparser.add_argument("-l","--laser",help="Laser number to be displayed (0 by default)",type=int) +argsparser.add_argument("-v","--verbose",help="Verbosity level (0 by default)",type=int) +argsparser.add_argument("-m","--myIP",help="Local IP (127.0.0.1 by default) ",type=str) + +args = argsparser.parse_args() + +if args.scene: + ljscene = args.scene +else: + ljscene = 0 +''' +if args.laser: + plnumber = args.laser +else: + plnumber = 0 +''' + +# Redis Computer IP +if args.redisIP != None: + redisIP = args.redisIP +else: + redisIP = '127.0.0.1' + +print("redisIP",redisIP) + +# myIP +if args.myIP != None: + myIP = args.myIP +else: + myIP = '127.0.0.1' + +print("myIP",myIP) + +if args.verbose: + debug = args.verbose +else: + debug = 0 + +# Useful variables init. +white = lj.rgb2int(255,255,255) +red = lj.rgb2int(255,0,0) +blue = lj.rgb2int(0,0,255) +green = lj.rgb2int(0,255,0) + +width = 800 +height = 600 +centerX = width / 2 +centerY = height / 2 + +# 3D to 2D projection parameters +fov = 256 +viewer_distance = 2.2 + +# Anaglyph computation parameters for right and left eyes. +# algorythm come from anaglyph geo maps +eye_spacing = 100 +nadir = 0.5 +observer_altitude = 30000 +map_layerane_altitude = 0.0 + +# square coordinates : vertices that compose each of the square. +vertices = [ + (- 1.0, 1.0,- 1.0), + ( 1.0, 1.0,- 1.0), + ( 1.0,- 1.0,- 1.0), + (- 1.0,- 1.0,- 1.0) + ] + +face = [0,1,2,3] + +# +# LJ inits +# + +layer = 0 + +# Setup LJ library mandatory properties. +lj.Config(redisIP, ljscene, "square") + +# You can define properties for each drawn "element" : name, intensity, active, xy, color, red, green, blue, layer , closed +Leftsquare = lj.FixedObject('Leftsquare', True, 255, [], red, 255, 0, 0, layer , True) +Rightsquare = lj.FixedObject('Rightsquare', True, 255, [], blue, 0, 255, 0, layer , True) + +# 'Destination' for given layer : name, number, active, layer , scene, laser +Dest0 = lj.DestObject('0', 0, True, 0 , 0, 0) # Dest0 will send layer 0 points to scene 0, laser 0 + + +# +# Anaglyph computation : different X coordinate for each eye +# + +def LeftShift(elevation): + + diff = elevation - map_layerane_altitude + return nadir * eye_spacing * diff / (observer_altitude - elevation) + +def RightShift(elevation): + + diff = map_layerane_altitude - elevation + return (1 - nadir) * eye_spacing * diff / (observer_altitude - elevation) + +# +# OSC +# + +oscserver = OSCServer( (myIP, OSCinPort) ) +oscserver.timeout = 0 + + +# 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) + + +# OSC callbacks + +# /square/ljscene +def OSCljscene(path, tags, args, source): + + print("Got /square/ljscene with value", args[0]) + lj.WebStatus("square to virtual "+ str(args[0])) + ljscene = args[0] + lj.Ljscene(ljscene) + + +def Proj(x,y,z,angleX,angleY,angleZ): + + rad = angleX * math.pi / 180 + cosa = math.cos(rad) + sina = math.sin(rad) + y2 = y + y = y2 * cosa - z * sina + z = y2 * sina + z * cosa + + rad = angleY * math.pi / 180 + cosa = math.cos(rad) + sina = math.sin(rad) + z2 = z + z = z2 * cosa - x * sina + x = z2 * sina + x * cosa + + rad = angleZ * math.pi / 180 + cosa = math.cos(rad) + sina = math.sin(rad) + x2 = x + x = x2 * cosa - y * sina + y = x2 * sina + y * cosa + + + """ Transforms this 3D point to 2D using a perspective projection. """ + factor = fov / (viewer_distance + z) + x = x * factor + centerX + y = - y * factor + centerY + return (x,y) + + +# +# Main +# + +def Run(): + + + Left = [] + Right = [] + counter =0 + lj.WebStatus("Square") + lj.SendLJ("/square/start 1") + + # OSC Server callbacks + print("Starting OSC server at",myIP," port",OSCinPort,"...") + oscserver.addMsgHandler( "/square/ljscene", OSCljscene ) + + # Add OSC generic plugins commands : 'default", /ping, /quit, /pluginame/obj, /pluginame/var, /pluginame/adddest, /pluginame/deldest + lj.addOSCdefaults(oscserver) + + try: + + while lj.oscrun: + + lj.OSCframe() + Left = [] + Right = [] + + x = vertices[0][0] + y = vertices[0][1] + z = vertices[0][2] + + # LJ tracers will "move" the laser to this first point in black, then move to the next with second point color. + # For more accuracy in dac emulator, repeat this first point. + + # Generate all points in square. + for point in face: + x = vertices[point][0] + y = vertices[point][1] + z = vertices[point][2] + + Left.append(Proj(x+LeftShift(z*25),y,z,0,counter,0)) + Right.append(Proj(x+RightShift(z*25),y,z,0,counter,0)) + + + lj.PolyLineOneColor(Left, c = Leftsquare.color , layer = Leftsquare.layer, closed = Leftsquare.closed) + lj.PolyLineOneColor(Right, c = Rightsquare.color , layer = Rightsquare.layer, closed = Rightsquare.closed) + + lj.DrawDests() + + + time.sleep(0.1) + + counter += 1 + if counter > 360: + counter = 0 + + except KeyboardInterrupt: + pass + + # Gently stop on CTRL C + + finally: + + lj.ClosePlugin() + + +Run() diff --git a/updateUI.py b/updateUI.py index 969378e..e2f2a90 100644 --- a/updateUI.py +++ b/updateUI.py @@ -14,7 +14,7 @@ ljpath = r'%s' % os.getcwd().replace('\\','/') python2 = (2, 6) <= sys.version_info < (3, 0) -def Updatewww(file_name): +def Updatepage(file_name): print("updating", file_name) f=open(file_name,"r+") @@ -53,10 +53,14 @@ def Updatewww(file_name): o.close() #now the modification is done in the file -print("Updating www files...") -Updatewww(ljpath+"/www/LJ.js") -Updatewww(ljpath+"/www/trckr/trckrcam1.html") -Updatewww(ljpath+"/www/simu.html") -Updatewww(ljpath+"/www/align.html") -Updatewww(ljpath+"/www/auralls.html") -Updatewww(ljpath+"/www/index.html") +def www(wwwip): + global wwwIP + + wwwIP = wwwip + print("Updating www files to use", wwwIP) + Updatepage(ljpath+"/www/LJ.js") + Updatepage(ljpath+"/www/trckr/trckrcam1.html") + Updatepage(ljpath+"/www/simu.html") + Updatepage(ljpath+"/www/align.html") + Updatepage(ljpath+"/www/auralls.html") + Updatepage(ljpath+"/www/index.html") diff --git a/www/LJ.js b/www/LJ.js index 3f00fc1..6d6dee4 100644 --- a/www/LJ.js +++ b/www/LJ.js @@ -4,7 +4,7 @@ // LJ websocket address. IP will be updated at LJ startup according to LJ.conf wwwIP - var LJ = 'ws://192.168.1.48:9001/' + var LJ = 'ws://192.168.2.43:9001/' // diff --git a/www/align.html b/www/align.html index 1d5ee3d..416380b 100644 --- a/www/align.html +++ b/www/align.html @@ -604,7 +604,7 @@