diff --git a/backend/Main.py b/backend/Main.py index cd5f87129..590309c5a 100644 --- a/backend/Main.py +++ b/backend/Main.py @@ -10,7 +10,8 @@ if __name__ == "__main__": # SettingsManager() CamerasHandler.init_camera() - VisionHandler().run() + #VisionHandler().run() + SettingsManager().save_settings() tornado.options.parse_command_line() app = ChameleonApplication() diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index 0ebcfb652..4d8ffc9a7 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -1,5 +1,8 @@ import os import json + +from cscore._cscore import VideoMode + from .Singleton import Singleton from ..handlers.CamerasHandler import CamerasHandler from .Exceptions import PipelineAlreadyExistsException, NoCameraConnectedException @@ -67,6 +70,14 @@ class SettingsManager(metaclass=Singleton): if "path" not in self.cams[cam.name]: self.cams[cam.name]["path"] = cam.otherPaths[0] if len(cam.otherPaths) == 1 else cam.otherPaths[1] + if "video_mode" not in self.cams[cam.name]: + video_mode: VideoMode = CamerasHandler.get_usb_camera_by_name(cam.name).enumerateVideoModes()[0] + self.cams[cam.name]["video_mode"] = { + "fps": video_mode.fps, + "width": video_mode.width, + "height": video_mode.height, + "pixel_format": str(video_mode.pixelFormat).split('.')[1] + } # Access methods @@ -85,6 +96,7 @@ class SettingsManager(metaclass=Singleton): def set_curr_camera(self, cam_name): if cam_name in self.cams: self.general_settings["curr_camera"] = cam_name + self.general_settings["curr_pipeline"] = self.get_curr_cam()["pipelines"].keys()[0] def set_curr_pipeline(self, pipe_name): if pipe_name in self.get_curr_cam()["pipelines"]: @@ -134,14 +146,21 @@ class SettingsManager(metaclass=Singleton): # Savers def save_settings(self): - self._save_cameras() self._save_general_settings() + self._save_cameras() def _save_cameras(self): + + if not os.path.exists(self.cams_path): + os.mkdir(self.cams_path) + for cam in self.cams: with open(os.path.join(self.cams_path, cam + '.json'), 'w+') as camera: json.dump(self.cams[cam], camera) def _save_general_settings(self): + if not os.path.exists(self.settings_path): + os.mkdir(self.settings_path) + with open(os.path.join(self.settings_path, 'settings.json'), 'w+') as setting_file: json.dump(self.general_settings, setting_file) diff --git a/backend/app/handlers/CamerasHandler.py b/backend/app/handlers/CamerasHandler.py index 2f72d5b74..08ac4704f 100644 --- a/backend/app/handlers/CamerasHandler.py +++ b/backend/app/handlers/CamerasHandler.py @@ -66,6 +66,13 @@ class CamerasHandler: return CamerasHandler.get_or_start_cameras(CamerasHandler.get_cameras_info())[cam_name] @staticmethod - def change_camera_values(usb_camera: cscore.UsbCamera, dic): - usb_camera.setBrightness(dic["brightness"] or 50) - usb_camera.setExposureManual(dic["exposure"] or 50) + def set_camera_settings(usb_camera: cscore.UsbCamera, dic): + + if "brightness" in dic: + usb_camera.setBrightness(dic["brightness"]) + + if "exposure" in dic: + usb_camera.setExposureManual(dic["exposure"]) + + if "video_mode" in dic: + usb_camera.setVideoMode(dic["video_mode"]) diff --git a/backend/app/handlers/SocketHandler.py b/backend/app/handlers/SocketHandler.py index 23299599a..214232b82 100644 --- a/backend/app/handlers/SocketHandler.py +++ b/backend/app/handlers/SocketHandler.py @@ -7,9 +7,10 @@ from ..classes.SettingsManager import SettingsManager class ChameleonWebSocket(tornado.websocket.WebSocketHandler): - actions = {} + set_this_camera_settings = ["exposure", "brightness", "video_mode"] + def __init__(self, application, request, **kwargs): super().__init__(application, request, **kwargs) self.settings_manager = SettingsManager() @@ -44,12 +45,19 @@ class ChameleonWebSocket(tornado.websocket.WebSocketHandler): def check_origin(self, origin): return True - def send_curr_cam(self): + def send_curr_pipeline(self): try: self.write_message(self.settings_manager.get_curr_pipeline()) except NoCameraConnectedException: # TODO: return something if no camera connected - self.write_message(None) + 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") def send_full_settings(self): full_settings = self.settings_manager.general_settings.copy() @@ -64,15 +72,17 @@ class ChameleonWebSocket(tornado.websocket.WebSocketHandler): def change_curr_camera(self, dic): self.settings_manager.set_curr_camera(cam_name=dic["cam"]) + self.send_curr_cam() def change_curr_pipeline(self, dic): self.settings_manager.set_curr_pipeline(pipe_name=dic["pipeline"]) + self.send_curr_pipeline() def change_pipeline_values(self, dic): self.settings_manager.change_pipeline_values(dic) - CamerasHandler.change_camera_values(CamerasHandler.get_usb_camera_by_name(self.settings_manager.general_settings["curr_camera"]), dic) - - - - + for key in self.set_this_camera_settings: + if key in dic: + CamerasHandler.set_camera_settings( + CamerasHandler.get_usb_camera_by_name(self.settings_manager.general_settings["curr_camera"]), + dic[key]) diff --git a/backend/settings/cams/USB Camera-B4.09.24.1.json b/backend/settings/cams/USB Camera-B4.09.24.1.json new file mode 100644 index 000000000..186389c20 --- /dev/null +++ b/backend/settings/cams/USB Camera-B4.09.24.1.json @@ -0,0 +1 @@ +{"pipelines": {"pipeline0": {"exposure": 50, "brightness": 50, "orientation": "Normal", "resolution": [320, 160], "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100]}}, "path": "/dev/v4l/by-path/pci-0000:02:03.0-usb-0:1:1.0-video-index0", "video_mode": {"fps": 187, "width": 320, "height": 240, "pixel_format": "kYUYV"}} \ No newline at end of file diff --git a/backend/settings/settings.json b/backend/settings/settings.json new file mode 100644 index 000000000..c89e02900 --- /dev/null +++ b/backend/settings/settings.json @@ -0,0 +1 @@ +{"team_number": 1577, "connection_type": "DHCP", "ip": "", "gateway": "", "hostname": "Chameleon-Vision", "curr_camera": "USB Camera-B4.09.24.1", "curr_pipeline": "pipeline0"} \ No newline at end of file