feat: separate laser API endpoint (POST /api/laser)
This commit is contained in:
@@ -89,40 +89,77 @@ class _ImageHandler(BaseHTTPRequestHandler):
|
||||
def do_POST(self):
|
||||
path = self.path.split('?')[0]
|
||||
if path == '/api/mode/switch':
|
||||
content_length = int(self.headers.get('Content-Length', 0))
|
||||
body = self.rfile.read(content_length) if content_length > 0 else b'{}'
|
||||
try:
|
||||
data = json.loads(body)
|
||||
mode = data.get('mode', '')
|
||||
except json.JSONDecodeError:
|
||||
self.send_response(400)
|
||||
self.end_headers()
|
||||
self.wfile.write(b'{"error":"invalid json"}')
|
||||
return
|
||||
|
||||
valid_modes = ('auto', 'manual', 'debug', 'laser_on', 'laser_off')
|
||||
if mode not in valid_modes:
|
||||
self.send_response(400)
|
||||
self.end_headers()
|
||||
self.wfile.write(
|
||||
f'{{"error":"invalid mode, must be one of {valid_modes}"}}'
|
||||
.encode()
|
||||
)
|
||||
return
|
||||
|
||||
if _mode_publisher is not None:
|
||||
msg = String()
|
||||
msg.data = mode
|
||||
_mode_publisher.publish(msg)
|
||||
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type', 'application/json')
|
||||
self.end_headers()
|
||||
self.wfile.write(f'{{"status":"ok","mode":"{mode}"}}'.encode())
|
||||
self._handle_mode_switch()
|
||||
elif path == '/api/laser':
|
||||
self._handle_laser()
|
||||
else:
|
||||
self.send_response(404)
|
||||
self.end_headers()
|
||||
|
||||
def _handle_mode_switch(self):
|
||||
content_length = int(self.headers.get('Content-Length', 0))
|
||||
body = self.rfile.read(content_length) if content_length > 0 else b'{}'
|
||||
try:
|
||||
data = json.loads(body)
|
||||
mode = data.get('mode', '')
|
||||
except json.JSONDecodeError:
|
||||
self.send_response(400)
|
||||
self.end_headers()
|
||||
self.wfile.write(b'{"error":"invalid json"}')
|
||||
return
|
||||
|
||||
valid_modes = ('auto', 'manual', 'debug')
|
||||
if mode not in valid_modes:
|
||||
self.send_response(400)
|
||||
self.end_headers()
|
||||
self.wfile.write(
|
||||
f'{{"error":"invalid mode, must be one of {valid_modes}"}}'
|
||||
.encode()
|
||||
)
|
||||
return
|
||||
|
||||
if _mode_publisher is not None:
|
||||
msg = String()
|
||||
msg.data = mode
|
||||
_mode_publisher.publish(msg)
|
||||
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type', 'application/json')
|
||||
self.end_headers()
|
||||
self.wfile.write(f'{{"status":"ok","mode":"{mode}"}}'.encode())
|
||||
|
||||
def _handle_laser(self):
|
||||
content_length = int(self.headers.get('Content-Length', 0))
|
||||
body = self.rfile.read(content_length) if content_length > 0 else b'{}'
|
||||
try:
|
||||
data = json.loads(body)
|
||||
action = data.get('action', '')
|
||||
except json.JSONDecodeError:
|
||||
self.send_response(400)
|
||||
self.end_headers()
|
||||
self.wfile.write(b'{"error":"invalid json"}')
|
||||
return
|
||||
|
||||
if action == 'on':
|
||||
mode = 'laser_on'
|
||||
elif action == 'off':
|
||||
mode = 'laser_off'
|
||||
else:
|
||||
self.send_response(400)
|
||||
self.end_headers()
|
||||
self.wfile.write(b'{"error":"action must be on or off"}')
|
||||
return
|
||||
|
||||
if _mode_publisher is not None:
|
||||
msg = String()
|
||||
msg.data = mode
|
||||
_mode_publisher.publish(msg)
|
||||
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type', 'application/json')
|
||||
self.end_headers()
|
||||
self.wfile.write(f'{{"status":"ok","laser":"{action}"}}'.encode())
|
||||
|
||||
def _serve_image(self, key):
|
||||
global _latest_jpeg
|
||||
jpeg = _latest_jpeg.get(key) if _latest_jpeg else None
|
||||
|
||||
Reference in New Issue
Block a user