You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Dribble/scripts/utils/Server.py

149 lines
8.0 KiB
Python

7 months ago
import os
class Server():
def __init__(self,script) -> None:
if os.path.isdir("/usr/local/share/rcssserver3d/"):
self.source = "/usr/local/share/rcssserver3d/"
elif os.path.isdir("/usr/share/rcssserver3d/"):
self.source = "/usr/share/rcssserver3d/"
else:
raise FileNotFoundError("The server configuration files were not found!")
# To add options: insert into options & explations with same index, read respective value from file or from other values, add edit entry
self.options = ["Official Config", "Penalty Shootout", "Soccer Rules", "Sync Mode", "Real Time", "Cheats", "Full Vision", "Add Noise", "25Hz Monitor"]
self.descriptions = ["Configuration used in official matches", "Server's Penalty Shootout mode", "Play modes, automatic referee, etc.",
"Synchronous communication between agents and server", "Real Time (or maximum server speed)",
"Agent position & orientation, ball position", "See 360 deg instead of 120 deg (vertically & horizontally)",
"Noise added to the position of visible objects", "25Hz Monitor (or 50Hz but RoboViz will show 2x the actual speed)"]
spark_f = os.path.expanduser("~/.simspark/spark.rb")
naoneckhead_f = self.source+"rsg/agent/nao/naoneckhead.rsg"
self.files = {"Penalty Shootout" : self.source + "naosoccersim.rb",
"Soccer Rules" : self.source + "naosoccersim.rb",
"Sync Mode" : spark_f,
"Real Time" : self.source+"rcssserver3d.rb",
"Cheats" : naoneckhead_f,
"Full Vision" : naoneckhead_f,
"Add Noise" : naoneckhead_f,
"25Hz Monitor" : spark_f}
def label(self, setting_name, t_on, t_off):
with open(self.files[setting_name], "r") as sources:
content = sources.read()
if t_on in content:
self.values[setting_name] = "On"
elif t_off in content:
self.values[setting_name] = "Off"
else:
self.values[setting_name] = "Error"
def read_config(self):
v = self.values = dict()
print("Reading server configuration files...")
self.label("Penalty Shootout", "addSoccerVar('PenaltyShootout', true)", "addSoccerVar('PenaltyShootout', false)")
self.label("Soccer Rules", " gameControlServer.initControlAspect('SoccerRuleAspect')", "#gameControlServer.initControlAspect('SoccerRuleAspect')")
self.label("Real Time", "enableRealTimeMode = true", "enableRealTimeMode = false")
self.label("Cheats", "setSenseMyPos true", "setSenseMyPos false")
self.label("Full Vision", "setViewCones 360 360", "setViewCones 120 120")
self.label("Add Noise", "addNoise true", "addNoise false")
self.label("Sync Mode", "agentSyncMode = true", "agentSyncMode = false")
self.label("25Hz Monitor", "monitorStep = 0.04", "monitorStep = 0.02")
is_official_config = (v["Penalty Shootout"] == "Off" and v["Soccer Rules"] == "On" and v["Real Time"] == "On" and v["Cheats"] == "Off" and v["Full Vision"] == "Off" and
v["Add Noise"] == "On" and v["Sync Mode"] == "Off" and v["25Hz Monitor"] == "On")
print(v["Penalty Shootout"], is_official_config)
v["Official Config"] = "On" if is_official_config else "Off"
def change_config(self, setting_name, t_on, t_off, current_value=None, file=None):
if current_value is None:
current_value = self.values[setting_name]
if file is None:
file = self.files[setting_name]
with open(file, "r") as sources:
t = sources.read()
if current_value == "On":
t = t.replace(t_on, t_off, 1)
print(f"Replacing '{t_on}' with '{t_off}' in '{file}'")
elif current_value == "Off":
t = t.replace(t_off, t_on, 1)
print(f"Replacing '{t_off}' with '{t_on}' in '{file}'")
else:
print(setting_name, "was not changed because the value is unknown!")
with open(file, "w") as sources:
sources.write(t)
def execute(self):
while True:
self.read_config()
# Convert convenient values dict to list
values_list = [self.values[o] for o in self.options]
print()
UI.print_table( [self.options, values_list, self.descriptions], ["Setting", "Value", "Description"], numbering=[True, False, False])
choice = UI.read_int('Choose setting (ctrl+c to return): ',0,len(self.options))
opt = self.options[choice]
prefix = ['sudo', 'python3', 'scripts/utils/Server.py', opt]
if opt in self.files:
suffix = [self.values[opt], self.files[opt]]
if opt == "Penalty Shootout":
subprocess.call([*prefix, "addSoccerVar('PenaltyShootout', true)", "addSoccerVar('PenaltyShootout', false)", *suffix])
elif opt == "Soccer Rules":
subprocess.call([*prefix, "gameControlServer.initControlAspect('SoccerRuleAspect')", "#gameControlServer.initControlAspect('SoccerRuleAspect')", *suffix])
elif opt == "Sync Mode":
self.change_config(opt, "agentSyncMode = true", "agentSyncMode = false") # doesn't need sudo privileges
elif opt == "Real Time":
subprocess.call([*prefix, "enableRealTimeMode = true", "enableRealTimeMode = false", *suffix])
elif opt == "Cheats":
subprocess.call([*prefix, "setSenseMyPos true", "setSenseMyPos false", *suffix,
opt, "setSenseMyOrien true", "setSenseMyOrien false", *suffix,
opt, "setSenseBallPos true", "setSenseBallPos false", *suffix])
elif opt == "Full Vision":
subprocess.call([*prefix, "setViewCones 360 360", "setViewCones 120 120", *suffix])
elif opt == "Add Noise":
subprocess.call([*prefix, "addNoise true", "addNoise false", *suffix])
elif opt == "25Hz Monitor":
self.change_config(opt, "monitorStep = 0.04", "monitorStep = 0.02") # doesn't need sudo privileges
elif opt == "Official Config":
if self.values[opt] == "On":
print("The official configuration is already On!")
else: # here, the first option is the official value
subprocess.call([*prefix[:3],
"Penalty Shootout", "addSoccerVar('PenaltyShootout', false)", "addSoccerVar('PenaltyShootout', true)", "Off", self.files["Penalty Shootout"],
"Soccer Rules", "gameControlServer.initControlAspect('SoccerRuleAspect')", "#gameControlServer.initControlAspect('SoccerRuleAspect')", "Off", self.files["Soccer Rules"],
"Sync Mode", "agentSyncMode = false", "agentSyncMode = true", "Off", self.files["Sync Mode"],
"Real Time", "enableRealTimeMode = true", "enableRealTimeMode = false", "Off", self.files["Real Time"],
"Cheats", "setSenseMyPos false", "setSenseMyPos true", "Off", self.files["Cheats"],
"Cheats", "setSenseMyOrien false", "setSenseMyOrien true", "Off", self.files["Cheats"],
"Cheats", "setSenseBallPos false", "setSenseBallPos true", "Off", self.files["Cheats"],
"Full Vision", "setViewCones 120 120", "setViewCones 360 360", "Off", self.files["Full Vision"],
"Add Noise", "addNoise true", "addNoise false", "Off", self.files["Add Noise"],
"25Hz Monitor", "monitorStep = 0.04", "monitorStep = 0.02", "Off", self.files["25Hz Monitor"]])
# process with sudo privileges to change the configuration files
if __name__ == "__main__":
import sys
s = Server(None)
for i in range(1,len(sys.argv),5):
s.change_config( *sys.argv[i:i+5] )
else:
import subprocess
from scripts.commons.UI import UI