2019-03-01 21:59:49 +02:00
|
|
|
import tornado.websocket
|
2019-03-23 23:42:24 +02:00
|
|
|
import json
|
2019-04-27 14:48:58 -07:00
|
|
|
from ..classes.Exceptions import NoCameraConnectedException
|
2019-04-13 11:57:43 -07:00
|
|
|
from ..classes.SettingsManager import SettingsManager
|
2019-03-01 21:59:49 +02:00
|
|
|
|
2019-03-26 21:05:31 +02:00
|
|
|
|
2019-08-15 09:07:52 -07:00
|
|
|
web_socket_clients = set()
|
2019-08-09 02:21:52 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def send_all_async(message):
|
|
|
|
|
for ws in web_socket_clients:
|
2019-08-11 12:03:31 -07:00
|
|
|
try:
|
|
|
|
|
ws.write_message(json.dumps(message))
|
|
|
|
|
except AssertionError as a:
|
|
|
|
|
pass
|
2019-08-09 02:21:52 -07:00
|
|
|
|
|
|
|
|
|
2019-03-01 21:59:49 +02:00
|
|
|
class ChameleonWebSocket(tornado.websocket.WebSocketHandler):
|
2019-08-14 12:59:30 -07:00
|
|
|
|
2019-03-31 01:27:17 +03:00
|
|
|
actions = {}
|
2019-03-26 21:05:31 +02:00
|
|
|
|
2019-08-09 02:21:52 -07:00
|
|
|
set_this_camera_settings = ["exposure", "brightness"]
|
2019-05-01 10:16:40 -07:00
|
|
|
|
2019-03-31 01:27:17 +03:00
|
|
|
def __init__(self, application, request, **kwargs):
|
|
|
|
|
super().__init__(application, request, **kwargs)
|
2019-04-20 06:53:06 -07:00
|
|
|
self.settings_manager = SettingsManager()
|
2019-03-31 01:27:17 +03:00
|
|
|
self.init_actions()
|
|
|
|
|
|
|
|
|
|
def init_actions(self):
|
2019-04-20 09:02:21 -07:00
|
|
|
self.actions["change_pipeline_values"] = self.change_pipeline_values
|
2019-04-20 06:53:06 -07:00
|
|
|
self.actions["change_general_settings_values"] = self.settings_manager.change_general_settings_values
|
2019-08-09 02:21:52 -07:00
|
|
|
self.actions["curr_camera"] = self.change_curr_camera
|
|
|
|
|
self.actions["curr_pipeline"] = self.change_curr_pipeline
|
|
|
|
|
self.actions['resolution'] = self.set_resolution
|
|
|
|
|
self.actions['FOV'] = self.set_fov
|
2019-03-31 22:24:10 +03:00
|
|
|
|
2019-03-31 01:27:17 +03:00
|
|
|
def open(self):
|
2019-04-20 06:53:06 -07:00
|
|
|
self.send_full_settings()
|
2019-08-09 02:21:52 -07:00
|
|
|
if self not in web_socket_clients:
|
2019-08-15 09:07:52 -07:00
|
|
|
web_socket_clients.add(self)
|
2019-03-29 18:20:40 +03:00
|
|
|
|
2019-03-02 00:12:41 +02:00
|
|
|
print("WebSocket opened")
|
2019-03-01 21:59:49 +02:00
|
|
|
|
|
|
|
|
def on_message(self, message):
|
2019-08-10 10:16:49 -07:00
|
|
|
try:
|
|
|
|
|
message_dic = json.loads(message)
|
2019-03-31 22:24:10 +03:00
|
|
|
|
2019-08-10 10:16:49 -07:00
|
|
|
for key in message_dic:
|
|
|
|
|
self.actions.get(key, self.actions["change_pipeline_values"])(message_dic)
|
|
|
|
|
print(message)
|
2019-08-20 21:48:04 +03:00
|
|
|
except Exception as e:
|
|
|
|
|
print("crash " + e)
|
2019-03-02 00:12:41 +02:00
|
|
|
|
2019-03-01 21:59:49 +02:00
|
|
|
def on_close(self):
|
2019-04-20 06:53:06 -07:00
|
|
|
self.settings_manager.save_settings()
|
2019-08-09 02:21:52 -07:00
|
|
|
if self in web_socket_clients:
|
|
|
|
|
web_socket_clients.remove(self)
|
2019-03-02 00:12:41 +02:00
|
|
|
print("WebSocket closed")
|
2019-03-31 01:27:17 +03:00
|
|
|
|
2019-04-08 21:35:17 +03:00
|
|
|
def check_origin(self, origin):
|
|
|
|
|
return True
|
|
|
|
|
|
2019-08-09 02:21:52 -07:00
|
|
|
def set_resolution(self, message):
|
|
|
|
|
self.settings_manager.get_curr_cam()['resolution'] = message['resolution']
|
|
|
|
|
SettingsManager().set_camera_settings(camera_name=SettingsManager().general_settings['curr_camera'],
|
|
|
|
|
dic=message)
|
|
|
|
|
self.settings_manager.save_settings()
|
|
|
|
|
|
|
|
|
|
def set_fov(self, message):
|
|
|
|
|
self.settings_manager.get_curr_cam()['FOV'] = message['FOV']
|
|
|
|
|
self.settings_manager.save_settings()
|
|
|
|
|
|
2019-05-01 10:16:40 -07:00
|
|
|
def send_curr_pipeline(self):
|
2019-04-28 00:12:02 +03:00
|
|
|
try:
|
|
|
|
|
self.write_message(self.settings_manager.get_curr_pipeline())
|
|
|
|
|
except NoCameraConnectedException:
|
|
|
|
|
# TODO: return something if no camera connected
|
2019-05-01 10:16:40 -07:00
|
|
|
self.write_message("No camera connected")
|
|
|
|
|
|
|
|
|
|
def send_curr_cam(self):
|
|
|
|
|
try:
|
|
|
|
|
self.write_message(self.settings_manager.get_curr_cam())
|
|
|
|
|
except NoCameraConnectedException:
|
|
|
|
|
# TODO: return something if no camera connected
|
|
|
|
|
self.write_message("No camera connected")
|
2019-03-31 22:24:10 +03:00
|
|
|
|
2019-08-09 03:29:03 -07:00
|
|
|
def send_curr_port(self):
|
|
|
|
|
self.write_message({
|
|
|
|
|
'port': self.settings_manager.cams_port[self.settings_manager.general_settings["curr_camera"]]
|
|
|
|
|
})
|
|
|
|
|
|
2019-04-20 06:53:06 -07:00
|
|
|
def send_full_settings(self):
|
|
|
|
|
full_settings = self.settings_manager.general_settings.copy()
|
2019-06-14 08:35:42 -07:00
|
|
|
full_settings["cameraList"] = list(self.settings_manager.cams.copy().keys())
|
2019-04-28 00:12:02 +03:00
|
|
|
try:
|
2019-06-14 08:35:42 -07:00
|
|
|
full_settings.update(self.settings_manager.get_curr_pipeline())
|
2019-06-15 13:23:49 -07:00
|
|
|
full_settings["pipelineList"] = list(self.settings_manager.cams[self.settings_manager.general_settings["curr_camera"]]["pipelines"].keys())
|
2019-06-16 11:39:40 -07:00
|
|
|
full_settings["resolutionList"] = self.settings_manager.get_resolution_list()
|
2019-08-09 02:21:52 -07:00
|
|
|
full_settings['resolution'] = self.settings_manager.get_curr_cam()['resolution']
|
|
|
|
|
full_settings['FOV'] = self.settings_manager.get_curr_cam()['FOV']
|
2019-08-09 03:29:03 -07:00
|
|
|
full_settings['port'] = self.settings_manager.cams_port[self.settings_manager.general_settings["curr_camera"]]
|
2019-04-28 00:12:02 +03:00
|
|
|
except NoCameraConnectedException:
|
|
|
|
|
# TODO: return something if no camera connected
|
|
|
|
|
full_settings["data"] = None
|
2019-03-31 22:24:10 +03:00
|
|
|
|
2019-04-20 06:53:06 -07:00
|
|
|
self.write_message(full_settings)
|
2019-03-31 22:24:10 +03:00
|
|
|
|
|
|
|
|
def change_curr_camera(self, dic):
|
2019-08-09 02:21:52 -07:00
|
|
|
self.settings_manager.set_curr_camera(cam_name=dic["curr_camera"])
|
2019-08-09 03:29:03 -07:00
|
|
|
self.send_curr_port()
|
2019-05-01 10:16:40 -07:00
|
|
|
self.send_curr_cam()
|
2019-03-31 22:24:10 +03:00
|
|
|
|
|
|
|
|
def change_curr_pipeline(self, dic):
|
2019-08-09 02:21:52 -07:00
|
|
|
self.settings_manager.set_curr_pipeline(pipe_name=dic["curr_pipeline"])
|
2019-08-11 12:03:31 -07:00
|
|
|
self.settings_manager.cams_curr_pipeline[self.settings_manager.general_settings['curr_camera']] = dic["curr_pipeline"]
|
2019-05-01 10:16:40 -07:00
|
|
|
self.send_curr_pipeline()
|
2019-04-01 00:26:58 +03:00
|
|
|
|
2019-04-20 09:02:21 -07:00
|
|
|
def change_pipeline_values(self, dic):
|
|
|
|
|
self.settings_manager.change_pipeline_values(dic)
|
2019-05-01 10:16:40 -07:00
|
|
|
for key in self.set_this_camera_settings:
|
|
|
|
|
if key in dic:
|
2019-05-05 00:54:45 +03:00
|
|
|
self.settings_manager.set_camera_settings(self.settings_manager.general_settings["curr_camera"],
|
2019-06-14 08:35:42 -07:00
|
|
|
dic)
|