aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/webhooks.py
diff options
context:
space:
mode:
Diffstat (limited to 'klippy/webhooks.py')
-rw-r--r--klippy/webhooks.py62
1 files changed, 50 insertions, 12 deletions
diff --git a/klippy/webhooks.py b/klippy/webhooks.py
index e923e986..d10f5c2c 100644
--- a/klippy/webhooks.py
+++ b/klippy/webhooks.py
@@ -45,12 +45,16 @@ class Sentinel:
class WebRequest:
error = WebRequestError
- def __init__(self, base_request):
+ def __init__(self, client_conn, base_request):
+ self.client_conn = client_conn
self.id = base_request['id']
self.path = base_request['path']
self.args = base_request['args']
self.response = None
+ def get_client_connection(self):
+ return self.client_conn
+
def get(self, item, default=Sentinel):
if item not in self.args:
if default == Sentinel:
@@ -170,6 +174,9 @@ class ClientConnection:
pass
self.server.pop_client(self.uid)
+ def is_closed(self):
+ return self.fd_handle is None
+
def process_received(self, eventtime):
try:
data = self.sock.recv(4096)
@@ -191,7 +198,7 @@ class ClientConnection:
logging.debug(
"webhooks: Request received: %s" % (req))
try:
- web_request = WebRequest(json_loads_byteified(req))
+ web_request = WebRequest(self, json_loads_byteified(req))
except Exception:
logging.exception(
"webhooks: Error decoding Server Request %s"
@@ -257,21 +264,11 @@ class WebHooks:
# Register Events
printer.register_event_handler(
- "klippy:connect", self._handle_connect)
- printer.register_event_handler(
"klippy:shutdown", self._notify_shutdown)
- def _handle_connect(self):
- gcode = self.printer.lookup_object('gcode')
- gcode.register_output_handler(self._process_gcode_response)
-
def _notify_shutdown(self):
self.call_remote_method("set_klippy_shutdown")
- def _process_gcode_response(self, gc_response):
- self.call_remote_method(
- "process_gcode_response", response=gc_response)
-
def register_endpoint(self, path, callback):
if path in self._endpoints:
raise WebRequestError("Path already registered to an endpoint")
@@ -318,6 +315,46 @@ class WebHooks:
"action_call_remote_method": self._action_call_remote_method
}
+class GCodeHelper:
+ def __init__(self, printer):
+ self.printer = printer
+ self.gcode = printer.lookup_object("gcode")
+ # Output subscription tracking
+ self.is_output_registered = False
+ self.clients = {}
+ # Register webhooks
+ wh = printer.lookup_object('webhooks')
+ wh.register_endpoint("gcode/help", self._handle_help)
+ wh.register_endpoint("gcode/script", self._handle_script)
+ wh.register_endpoint("gcode/restart", self._handle_restart)
+ wh.register_endpoint("gcode/firmware_restart",
+ self._handle_firmware_restart)
+ wh.register_endpoint("gcode/subscribe_output",
+ self._handle_subscribe_output)
+ def _handle_help(self, web_request):
+ web_request.send(self.gcode.get_command_help())
+ def _handle_script(self, web_request):
+ self.gcode.run_script(web_request.get('script'))
+ def _handle_restart(self, web_request):
+ self.gcode.run_script('restart')
+ def _handle_firmware_restart(self, web_request):
+ self.gcode.run_script('firmware_restart')
+ def _output_callback(self, msg):
+ for cconn, template in list(self.clients.items()):
+ if cconn.is_closed():
+ del self.clients[cconn]
+ continue
+ tmp = dict(template)
+ tmp['params'] = {'response': msg}
+ cconn.send(tmp)
+ def _handle_subscribe_output(self, web_request):
+ cconn = web_request.get_client_connection()
+ template = web_request.get('response_template', {})
+ self.clients[cconn] = template
+ if not self.is_output_registered:
+ self.gcode.register_output_handler(self._output_callback)
+ self.is_output_registered = True
+
SUBSCRIPTION_REFRESH_TIME = .25
class StatusHandler:
@@ -443,4 +480,5 @@ class StatusHandler:
def add_early_printer_objects(printer):
printer.add_object('webhooks', WebHooks(printer))
+ GCodeHelper(printer)
StatusHandler(printer)