121 lines
2.7 KiB
Python
Executable File
121 lines
2.7 KiB
Python
Executable File
#! /usr/bin/env python3
|
|
from serial import Serial
|
|
from argparse import ArgumentParser
|
|
from time import sleep
|
|
|
|
|
|
# w == escape
|
|
# | == carriage return
|
|
POWER_SAVE_ON = "w1PSAV|"
|
|
POWER_SAVE_OFF = "w0PSAV|"
|
|
POWER_SAVE = "wpsav|"
|
|
INPUT = lambda x: f"{x}!"
|
|
|
|
EDIDS = {
|
|
"automatic": 0,
|
|
"1280x800": 14,
|
|
"720p60": 34,
|
|
"1080p60": 45,
|
|
}
|
|
|
|
ERRORS = {
|
|
"E01": "Invalid input number",
|
|
"E06": "Invalid switch attempt in this mode",
|
|
"E10": "Invalid command",
|
|
"E11": "Invalid preset number",
|
|
"E12": "Invalid port number",
|
|
"E13": "Invalid parameter",
|
|
"E14": "Not valid for this configuration",
|
|
"E17": "Invalid command for signal type",
|
|
"E22": "Busy",
|
|
}
|
|
|
|
verbose = False
|
|
|
|
|
|
def send_command(command: str) -> str:
|
|
with Serial("/dev/serial/by-id/usb-Extron_Product-if00", 9600, timeout=1) as ser:
|
|
if verbose:
|
|
print("Send:", command)
|
|
|
|
ser.write(command.encode())
|
|
# response = ser.readline().decode().strip()
|
|
response = None
|
|
|
|
while not (response := ser.readline()):
|
|
pass
|
|
response = response.decode().strip()
|
|
|
|
if verbose:
|
|
print("Resp:", response)
|
|
if not response:
|
|
print("no reponse")
|
|
exit(1)
|
|
if response[0] == "E":
|
|
print(response, ERRORS.get(response, "Unknown"))
|
|
exit(1)
|
|
|
|
return response
|
|
|
|
|
|
def send_command_projector(command: str) -> str:
|
|
with Serial("/dev/serial0", 9600, timeout=1) as ser:
|
|
ser.write(command.encode())
|
|
response = ser.readline()
|
|
|
|
if response:
|
|
print(response.decode())
|
|
|
|
|
|
def check_power_save():
|
|
resp = send_command(POWER_SAVE)
|
|
|
|
return int(resp)
|
|
|
|
|
|
def sleep_extron():
|
|
send_command(POWER_SAVE_ON)
|
|
|
|
|
|
def wake():
|
|
send_command(POWER_SAVE_OFF)
|
|
|
|
|
|
def change_input(input: int):
|
|
send_command(INPUT(input))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
parser = ArgumentParser()
|
|
|
|
parser.add_argument(
|
|
"-v", "--verbose", action="store_true", help="increase output verbosity"
|
|
)
|
|
|
|
sleep_or_wake = parser.add_mutually_exclusive_group()
|
|
sleep_or_wake.add_argument(
|
|
"input",
|
|
nargs="?",
|
|
type=int,
|
|
choices=[1, 2, 3, 4],
|
|
help="wake and select input",
|
|
)
|
|
sleep_or_wake.add_argument("--sleep", action="store_true", help="put in sleep mode")
|
|
args = parser.parse_args()
|
|
|
|
verbose = args.verbose
|
|
|
|
if args.input:
|
|
send_command_projector("\x02ADZZ;PON\x03")
|
|
wake()
|
|
change_input(args.input)
|
|
|
|
if verbose:
|
|
print("Waking projector")
|
|
#send_command_projector("\x02ADZZ;PON\x03")
|
|
|
|
elif args.sleep:
|
|
send_command_projector("\x02ADZZ;POF\x03")
|
|
|
|
sleep_extron()
|