From bb8457293b38af3d4e68cdf73bea36f08d4f3688 Mon Sep 17 00:00:00 2001 From: ori agranat Date: Fri, 16 Aug 2019 20:17:46 +0300 Subject: [PATCH 01/17] faster hvs calc and sending time stamp correctly --- backend/app/handlers/CameraHander.py | 15 +++++++++------ backend/app/handlers/VisionHandler.py | 9 +++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/backend/app/handlers/CameraHander.py b/backend/app/handlers/CameraHander.py index 8690693f4..7ef6e4a28 100644 --- a/backend/app/handlers/CameraHander.py +++ b/backend/app/handlers/CameraHander.py @@ -102,7 +102,7 @@ class CameraHandler: self.table.putNumber('pitch', self.nt_data['pitch']) self.table.putNumber('yaw', self.nt_data['yaw']) self.table.putNumber('fps', self.nt_data['fps']) - self.table.putNumber('time_stamp', self.time_stamp) + self.table.putNumber('time_stamp', self.nt_data['time_stamp']) # if the selected camera in ui is this cam send the point to the ui except: pass @@ -136,7 +136,7 @@ class CameraHandler: pipeline=pipeline ), zmq.SNDMORE) - socket.send_pyobj(self.image) + socket.send_pyobj((self.time_stamp,self.image)) self.p_image = socket.recv_pyobj() self.nt_data = socket.recv_json() @@ -173,9 +173,8 @@ class CameraHandler: fps = 0 while True: - obj = socket.recv_json() - image = socket.recv_pyobj() - curr_pipeline = obj["pipeline"] + curr_pipeline = socket.recv_json()['pipeline'] + time_stamp, image = socket.recv_pyobj() if curr_pipeline['orientation'] == "Inverted": M = cv2.getRotationMatrix2D((width / 2, height / 2), 180, 1) image = cv2.warpAffine(image, M, (width, height)) @@ -191,7 +190,9 @@ class CameraHandler: target_grouping=curr_pipeline['target_group'], target_intersection= curr_pipeline['target_intersection']) + final_contour = self.vision_handler.output_contour(filtered_contours) + try: center = final_contour[0] center_x = (center[1] - curr_pipeline['B']) / curr_pipeline["M"] @@ -209,6 +210,7 @@ class CameraHandler: draw_image = hsv_image else: draw_image = image + res = self.vision_handler.draw_image(input_image=draw_image, contour=final_contour) socket.send_pyobj(res) socket.send_json(dict( @@ -216,7 +218,8 @@ class CameraHandler: yaw=yaw, valid=valid, raw_point=center, - fps=fps + fps=fps, + time_stamp=time_stamp )) counter += 1 if (time.time() - start_time) > x: diff --git a/backend/app/handlers/VisionHandler.py b/backend/app/handlers/VisionHandler.py index b669c0177..7af59ebb5 100644 --- a/backend/app/handlers/VisionHandler.py +++ b/backend/app/handlers/VisionHandler.py @@ -10,17 +10,14 @@ class VisionHandler(): def _hsv_threshold(self, hue: list, saturation: list, value: list, img: numpy.ndarray, is_erode: bool, is_dilate: bool): - blur = cv2.blur(img, (3, 3)) - hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV) - lower = numpy.array([hue[0], saturation[0], value[0]]) - upper = numpy.array([hue[1], saturation[1], value[1]]) - thresh = cv2.inRange(hsv, lower, upper) + hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) + thresh = cv2.inRange(hsv, (hue[0], saturation[0], value[0]), (hue[1], saturation[1], value[1])) erode_img = cv2.erode(thresh, kernel=self.kernel, iterations=is_erode) dilate_img = cv2.dilate(erode_img, kernel=self.kernel, iterations=is_dilate) return dilate_img def find_contours(self, binary_img: numpy.ndarray): - _, contours, _ = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + _, contours, _ = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) return contours class Filter_Contours: From 5fbfb6b2db4ecc1117408c211b1716ecc13167d0 Mon Sep 17 00:00:00 2001 From: ori agranat Date: Fri, 16 Aug 2019 22:14:54 +0300 Subject: [PATCH 02/17] bug fix for threshold image --- backend/app/classes/SettingsManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index 75ae2182b..93b6d90d4 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -27,7 +27,7 @@ class SettingsManager(metaclass=Singleton): "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], - "is_binary": "Normal", + "is_binary": 0, "sort_mode": "Largest", "target_group": 'Single', "target_intersection": 'Up', From d355aa063c8bb68c1255874d1d188b4b62747873 Mon Sep 17 00:00:00 2001 From: ori Date: Fri, 16 Aug 2019 12:57:36 -0700 Subject: [PATCH 03/17] bug fix of camera res because sagi is an idiot --- backend/app/classes/SettingsManager.py | 9 +++------ backend/settings/cams/USB Camera-B4.09.24.1.json | 1 - backend/settings/cams/USB2.0 PC CAMERA.json | 1 - backend/settings/settings.json | 1 - 4 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 backend/settings/cams/USB Camera-B4.09.24.1.json delete mode 100644 backend/settings/cams/USB2.0 PC CAMERA.json delete mode 100644 backend/settings/settings.json diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index 93b6d90d4..31dfb04cd 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -72,13 +72,10 @@ class SettingsManager(metaclass=Singleton): # Initiate our camera's settings def _init_cameras(self): for cam_name in self.usb_cameras_info: - cam = self.usb_cameras_info[cam_name] - if os.path.exists(os.path.join(self.cams_path, cam.name + '.json')): - - with open(os.path.join(self.cams_path, cam.name + '.json'), 'r') as camera: + if os.path.exists(os.path.join(self.cams_path, cam_name + '.json')): + with open(os.path.join(self.cams_path, cam_name + '.json'), 'r') as camera: self.cams[cam_name] = json.load(camera) - - if len(self.cams[cam.name]["pipelines"]) == 0: + if len(self.cams[cam_name]["pipelines"]) == 0: self.create_new_pipeline(cam_name=cam_name) else: self.create_new_cam(cam_name) diff --git a/backend/settings/cams/USB Camera-B4.09.24.1.json b/backend/settings/cams/USB Camera-B4.09.24.1.json deleted file mode 100644 index 91187d8b0..000000000 --- a/backend/settings/cams/USB Camera-B4.09.24.1.json +++ /dev/null @@ -1 +0,0 @@ -{"pipelines": {"pipeline0": {"exposure": 50, "brightness": 15, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": true, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": 0, "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up", "M": 1, "B": 0}, "pipeline1": {"exposure": 50, "brightness": 50, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": 0, "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up", "M": 1, "B": 0}, "pipeline2": {"exposure": 50, "brightness": 50, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": "Normal", "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up", "M": 1, "B": 0}, "pipeline3": {"exposure": 50, "brightness": 50, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": "Normal", "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up", "M": 1, "B": 0}, "pipeline4": {"exposure": 50, "brightness": 50, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": "Normal", "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up", "M": 1, "B": 0}, "pipeline5": {"exposure": 50, "brightness": 50, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": "Normal", "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up", "M": 1, "B": 0}, "pipeline6": {"exposure": 50, "brightness": 50, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": "Normal", "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up", "M": 1, "B": 0}, "pipeline7": {"exposure": 50, "brightness": 50, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": "Normal", "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up", "M": 1, "B": 0}, "pipeline8": {"exposure": 50, "brightness": 50, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": "Normal", "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up", "M": 1, "B": 0}, "pipeline9": {"exposure": 50, "brightness": 50, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": 0, "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up", "M": 1, "B": 0}}, "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"}, "resolution": 0, "FOV": 60.8} \ No newline at end of file diff --git a/backend/settings/cams/USB2.0 PC CAMERA.json b/backend/settings/cams/USB2.0 PC CAMERA.json deleted file mode 100644 index c26acf48d..000000000 --- a/backend/settings/cams/USB2.0 PC CAMERA.json +++ /dev/null @@ -1 +0,0 @@ -{"pipelines": {"pipeline0": {"exposure": 50, "brightness": 50, "orientation": "Normal", "hue": [0, 100], "saturation": [0, 100], "value": [0, 100], "erode": false, "dilate": false, "area": [0, 100], "ratio": [0, 20], "extent": [0, 100], "is_binary": "Normal", "sort_mode": "Largest", "target_group": "Single", "target_intersection": "Up"}}, "path": "/dev/v4l/by-path/pci-0000:02:03.0-usb-0:2:1.0-video-index0", "video_mode": {"fps": 30, "width": 640, "height": 480, "pixel_format": "kYUYV"}, "resolution": 0, "FOV": 60.8} \ No newline at end of file diff --git a/backend/settings/settings.json b/backend/settings/settings.json deleted file mode 100644 index 4768b240f..000000000 --- a/backend/settings/settings.json +++ /dev/null @@ -1 +0,0 @@ -{"team_number": 1567, "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 From 8e2d0fdbd572d6e13674e5a735cdb0267467315c Mon Sep 17 00:00:00 2001 From: ori Date: Fri, 16 Aug 2019 12:58:50 -0700 Subject: [PATCH 04/17] updated git ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1dc29ec9b..8c2e3d3d4 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ Python/app/handlers/__pycache__/ \.vscode/ backend/settings/ +/.vscode/ From 102c1ab63d3fcac9933b218dc63a40a06ae20c41 Mon Sep 17 00:00:00 2001 From: ori agranat Date: Fri, 16 Aug 2019 23:12:48 +0300 Subject: [PATCH 05/17] removed vs file --- .vscode/launch.json | 70 --------------------------------------------- 1 file changed, 70 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 92a2fa2e9..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Python: Current File (Integrated Terminal)", - "type": "python", - "request": "launch", - "program": "${file}", - "console": "integratedTerminal" - }, - { - "name": "Python: Remote Attach", - "type": "python", - "request": "attach", - "port": 5678, - "host": "localhost", - "pathMappings": [ - { - "localRoot": "${workspaceFolder}", - "remoteRoot": "." - } - ] - }, - { - "name": "Python: Module", - "type": "python", - "request": "launch", - "module": "enter-your-module-name-here", - "console": "integratedTerminal" - }, - { - "name": "Python: Django", - "type": "python", - "request": "launch", - "program": "${workspaceFolder}/manage.py", - "console": "integratedTerminal", - "args": [ - "runserver", - "--noreload", - "--nothreading" - ], - "django": true - }, - { - "name": "Python: Flask", - "type": "python", - "request": "launch", - "module": "flask", - "env": { - "FLASK_APP": "app.py" - }, - "args": [ - "run", - "--no-debugger", - "--no-reload" - ], - "jinja": true - }, - { - "name": "Python: Current File (External Terminal)", - "type": "python", - "request": "launch", - "program": "${file}", - "console": "externalTerminal" - } - ] -} \ No newline at end of file From 8c6e52c4ee5b3fb6b1e6a8e4dc896294a761cb39 Mon Sep 17 00:00:00 2001 From: ori agranat Date: Sat, 17 Aug 2019 17:57:41 +0300 Subject: [PATCH 06/17] fixed bugs with unknown pipelines and added driver mode --- backend/Main.py | 1 - backend/app/classes/SettingsManager.py | 3 + backend/app/handlers/CameraHander.py | 106 +++++++++++++++---------- 3 files changed, 66 insertions(+), 44 deletions(-) diff --git a/backend/Main.py b/backend/Main.py index 02aa2c372..5cabb21fc 100644 --- a/backend/Main.py +++ b/backend/Main.py @@ -24,7 +24,6 @@ def run_server(): def run(): NetworkTables.startClientTeam(team=settings_manager.general_settings.get("team_number", 1577)) - # NetworkTables.initialize("localhost") port = 5550 for cam_name in settings_manager.usb_cameras: CameraHandler(cam_name, port).run() diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index 31dfb04cd..f5af4fa87 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -2,6 +2,7 @@ import os import json import cv2 import cscore +import subprocess from cscore._cscore import VideoMode from .Singleton import Singleton from .Exceptions import PipelineAlreadyExistsException, NoCameraConnectedException @@ -187,6 +188,8 @@ class SettingsManager(metaclass=Singleton): for key in dic['change_general_settings_values']: if self.default_general_settings[key]: self.general_settings[key] = dic['change_general_settings_values'][key] + if key == "hostname": + subprocess.call(['hostnamectl set-hostname', str(self.general_settings['hostname'])]) self.settings_manager.save_settings() #after all values has been set change settings self.change_general_settings() diff --git a/backend/app/handlers/CameraHander.py b/backend/app/handlers/CameraHander.py index 7ef6e4a28..1284f6c43 100644 --- a/backend/app/handlers/CameraHander.py +++ b/backend/app/handlers/CameraHander.py @@ -37,29 +37,37 @@ class CameraHandler: pipeline = self.settings_manager.cams[self.cam_name]["pipelines"][self.settings_manager.cams_curr_pipeline[self.cam_name]] FOV = self.settings_manager.cams[self.cam_name]["FOV"] - def change_camera_values(pipline): + def change_camera_values(pipeline): self.settings_manager.usb_cameras[self.cam_name].setBrightness(pipeline['brightness']) self.settings_manager.usb_cameras[self.cam_name].setExposureManual(pipeline['exposure']) self.settings_manager.usb_cameras[self.cam_name].setWhiteBalanceAuto() def pipeline_listener(table, key, value, is_new): asyncio.set_event_loop(asyncio.new_event_loop()) - self.settings_manager.cams_curr_pipeline[self.cam_name] = value - change_camera_values(pipeline) - if self.cam_name == self.settings_manager.general_settings['curr_camera']: - self.settings_manager.general_settings['curr_pipeline'] = value - update_settings = self.settings_manager.get_curr_pipeline() - update_settings['curr_pipeline'] = self.settings_manager.general_settings["curr_pipeline"] - send_all_async(update_settings) + if value in self.settings_manager.cams[self.cam_name]['pipelines'].keys(): + self.settings_manager.cams_curr_pipeline[self.cam_name] = value + change_camera_values(pipeline) + if self.cam_name == self.settings_manager.general_settings['curr_camera']: + self.settings_manager.general_settings['curr_pipeline'] = value + update_settings = self.settings_manager.get_curr_pipeline() + update_settings['curr_pipeline'] = self.settings_manager.general_settings["curr_pipeline"] + send_all_async(update_settings) + else: + self.table.putString('Pipeline', self.settings_manager.cams_curr_pipeline[self.cam_name]) def mode_listener(table, key, value, is_new): - change_camera_values({ - 'brightness': 25, - 'exposure': 15 - }) + if value: + change_camera_values({ + 'brightness': 25, + 'exposure': 15 + }) + else: + change_camera_values(pipeline) #setting up network table self.table = NetworkTables.getTable("/Chameleon-Vision/" + self.cam_name) + #init values for pipeline and driver mode self.table.putString('Pipeline', self.settings_manager.cams_curr_pipeline[self.cam_name]) + self.table.putBoolean('Driver_Mode', False) self.table.addEntryListenerEx(pipeline_listener, key="Pipeline", flags=networktables.NetworkTablesInstance.NotifyFlags.UPDATE) self.table.addEntryListenerEx(mode_listener, key="Driver_Mode", @@ -101,8 +109,8 @@ class CameraHandler: # send the point using network tables self.table.putNumber('pitch', self.nt_data['pitch']) self.table.putNumber('yaw', self.nt_data['yaw']) - self.table.putNumber('fps', self.nt_data['fps']) - self.table.putNumber('time_stamp', self.nt_data['time_stamp']) + self.table.putNumber('time_stamp', self.nt_data['time_stamp']) + self.table.putNumber('fps', self.nt_data['fps']) # if the selected camera in ui is this cam send the point to the ui except: pass @@ -132,8 +140,10 @@ class CameraHandler: #sending and reciving data from opencv sub process pipeline = self.settings_manager.cams[self.cam_name]["pipelines"][ self.settings_manager.cams_curr_pipeline[self.cam_name]] + socket.send_json(dict( - pipeline=pipeline + pipeline=pipeline, + driver_mode= self.table.getBoolean('Driver_Mode', False) ), zmq.SNDMORE) socket.send_pyobj((self.time_stamp,self.image)) @@ -173,45 +183,55 @@ class CameraHandler: fps = 0 while True: - curr_pipeline = socket.recv_json()['pipeline'] + obj = socket.recv_json() + curr_pipeline = obj['pipeline'] + driver_mode = obj['driver_mode'] time_stamp, image = socket.recv_pyobj() if curr_pipeline['orientation'] == "Inverted": M = cv2.getRotationMatrix2D((width / 2, height / 2), 180, 1) image = cv2.warpAffine(image, M, (width, height)) - hsv_image = self.vision_handler._hsv_threshold(curr_pipeline["hue"], - curr_pipeline["saturation"], curr_pipeline["value"], - image, curr_pipeline["erode"], curr_pipeline["dilate"]) - # if table.getBoolean("Driver_Mode", False): - contours = self.vision_handler.find_contours(hsv_image) - filtered_contours = filter_contours.filter_contours(input_contours=contours, area=curr_pipeline['area'], - ratio=curr_pipeline['ratio'], - extent=curr_pipeline['extent'], - sort_mode=curr_pipeline['sort_mode'], cam_area=cam_area, - target_grouping=curr_pipeline['target_group'], - target_intersection= - curr_pipeline['target_intersection']) + if not driver_mode: + hsv_image = self.vision_handler._hsv_threshold(curr_pipeline["hue"], + curr_pipeline["saturation"], curr_pipeline["value"], + image, curr_pipeline["erode"], curr_pipeline["dilate"]) + # if table.getBoolean("Driver_Mode", False): + contours = self.vision_handler.find_contours(hsv_image) + filtered_contours = filter_contours.filter_contours(input_contours=contours, area=curr_pipeline['area'], + ratio=curr_pipeline['ratio'], + extent=curr_pipeline['extent'], + sort_mode=curr_pipeline['sort_mode'], cam_area=cam_area, + target_grouping=curr_pipeline['target_group'], + target_intersection= + curr_pipeline['target_intersection']) - final_contour = self.vision_handler.output_contour(filtered_contours) + final_contour = self.vision_handler.output_contour(filtered_contours) - try: - center = final_contour[0] - center_x = (center[1] - curr_pipeline['B']) / curr_pipeline["M"] - center_y = (center[0] * curr_pipeline["M"]) + curr_pipeline["B"] - pitch = self.vision_handler.calculate_pitch(pixel_y=center[1], center_y=center_y, v_focal_length=V_FOCAL_LENGTH) - yaw = self.vision_handler.calculate_yaw(pixel_x=center[0], center_x=center_x, h_focal_length=H_FOCAL_LENGTH) - valid = True - except IndexError: + try: + center = final_contour[0] + center_x = (center[1] - curr_pipeline['B']) / curr_pipeline["M"] + center_y = (center[0] * curr_pipeline["M"]) + curr_pipeline["B"] + pitch = self.vision_handler.calculate_pitch(pixel_y=center[1], center_y=center_y, v_focal_length=V_FOCAL_LENGTH) + yaw = self.vision_handler.calculate_yaw(pixel_x=center[0], center_x=center_x, h_focal_length=H_FOCAL_LENGTH) + valid = True + except IndexError: + center = None + pitch = None + yaw = None + valid = False + + if curr_pipeline['is_binary']: + draw_image = hsv_image + else: + draw_image = image + + res = self.vision_handler.draw_image(input_image=draw_image, contour=final_contour) + else: + res = image center = None pitch = None yaw = None valid = False - if curr_pipeline['is_binary']: - draw_image = hsv_image - else: - draw_image = image - - res = self.vision_handler.draw_image(input_image=draw_image, contour=final_contour) socket.send_pyobj(res) socket.send_json(dict( pitch=pitch, From 0cc63b392bb45b7a9bf2f5fedbb68e045a0bd49c Mon Sep 17 00:00:00 2001 From: ori agranat Date: Sat, 17 Aug 2019 20:04:23 +0300 Subject: [PATCH 07/17] removed unnecessary dependencies --- backend/Main.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backend/Main.py b/backend/Main.py index 5cabb21fc..91ca7f4c4 100644 --- a/backend/Main.py +++ b/backend/Main.py @@ -1,4 +1,3 @@ -from datetime import timedelta from networktables import NetworkTables import tornado.ioloop import logging @@ -7,7 +6,6 @@ from app.classes.SettingsManager import SettingsManager from tornado.options import options import threading import asyncio -from app.handlers.SocketHandler import send_all_async from app.handlers.CameraHander import CameraHandler @@ -18,8 +16,6 @@ def run_server(): print(f"Serving on port {options.port}") app.listen(options.port) tornado.ioloop.IOLoop.current().start() - tornado.ioloop.IOLoop.instance().add_timeout(timedelta(seconds=1), - send_all_async) def run(): From 3e3ea538af8b7161f32c221d5977b0f8b84a55ff Mon Sep 17 00:00:00 2001 From: ori Date: Sat, 17 Aug 2019 13:55:58 -0700 Subject: [PATCH 08/17] added ip handler --- backend/app/classes/SettingsManager.py | 3 +- backend/app/handlers/IPHandler.py | 42 +++++++++++++++++++ chameleon-client/src/components/SystemTab.vue | 16 +++++++ chameleon-client/src/store.js | 13 +++--- 4 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 backend/app/handlers/IPHandler.py diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index f5af4fa87..ea025ea46 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -40,6 +40,7 @@ class SettingsManager(metaclass=Singleton): "connection_type": "DHCP", "ip": "", "gateway": "", + "netmask": "", "hostname": "", "curr_camera": "", "curr_pipeline": "" @@ -188,8 +189,6 @@ class SettingsManager(metaclass=Singleton): for key in dic['change_general_settings_values']: if self.default_general_settings[key]: self.general_settings[key] = dic['change_general_settings_values'][key] - if key == "hostname": - subprocess.call(['hostnamectl set-hostname', str(self.general_settings['hostname'])]) self.settings_manager.save_settings() #after all values has been set change settings self.change_general_settings() diff --git a/backend/app/handlers/IPHandler.py b/backend/app/handlers/IPHandler.py new file mode 100644 index 000000000..d25ba0321 --- /dev/null +++ b/backend/app/handlers/IPHandler.py @@ -0,0 +1,42 @@ +import subprocess +import netifaces + + +class ChangeIP: + def __init__(self, ip_type, ip, netmask, gateway, hostname): + + adapter = self.find_adapter() + + if ip_type == "DHCP": + self.change_to_dhcp(adapter=adapter) + elif ip_type == "Static": + self.change_to_static(adapter=adapter, ip=ip, netmask=netmask, gateway=gateway) + + self.change_hostname(hostname=hostname) + self.restart_adapter(adapter=adapter) + + @staticmethod + def change_to_dhcp(adapter): + subprocess.call(['dhclient -r', adapter]) + + @staticmethod + def change_to_static(adapter, ip, netmask, gateway): + subprocess.call(['ifconfig', adapter, ip, 'netmask', netmask]) + subprocess.call(['route add default gw', gateway, adapter]) + + @staticmethod + def restart_adapter(adapter): + subprocess.call(['ifconfig', adapter, 'down']) + subprocess.call(['ifconfig', adapter, 'up']) + + @staticmethod + def find_adapter(): + for i_name in netifaces.interfaces(): + interface = netifaces.ifaddresses(i_name)[netifaces.AF_INET][0] + address = interface['addr'].split('.')[0] + if address == "10": + return str(i_name) + + @staticmethod + def change_hostname(hostname): + subprocess.call(['hostnamectl set-hostname', "Chameleon-Vision-{}".format(hostname)]) \ No newline at end of file diff --git a/chameleon-client/src/components/SystemTab.vue b/chameleon-client/src/components/SystemTab.vue index c08ed1918..47a2334fc 100644 --- a/chameleon-client/src/components/SystemTab.vue +++ b/chameleon-client/src/components/SystemTab.vue @@ -25,6 +25,14 @@ + + +

Netmask:

+ + + + +

Gateway:

@@ -103,6 +111,14 @@ this.$store.commit('ip',value); } }, + netmask:{ + get: function(){ + return this.$store.state.netmask; + }, + set: function(){ + this.$store.commit('netmask',value); + } + }, gateway:{ get: function(){ return this.$store.state.gateway; diff --git a/chameleon-client/src/store.js b/chameleon-client/src/store.js index e42e35de3..ddca1e933 100644 --- a/chameleon-client/src/store.js +++ b/chameleon-client/src/store.js @@ -30,14 +30,15 @@ export const store = new Vuex.Store({ area:[0,100], ratio:[0,20], extent:[0,100], - sort_mode:'Largest', // - target_group:'Single', // - target_intersection:'Up', // + sort_mode:'Largest', + target_group:'Single', + target_intersection:'Up', //Settings team_number:0, connection_type:"DHCP", - ip:0, - gateWay:0, + ip:"", + gateWay:"", + netmask:"", hostname:"", //live info port:1181, @@ -68,6 +69,7 @@ export const store = new Vuex.Store({ team_number: set('team_number'), connection_type: set('connection_type'), ip: set('ip'), + netmask: set('netmask'), gateWay : set('gateway'), hostname : set('hostname'), is_binary: set('is_binary'), @@ -99,6 +101,7 @@ export const store = new Vuex.Store({ team_number: state => state.teamValue, connection_type: state => state.connectionType, ip: state => state.ip, + netmask: state => state.netmask, gateWay: state => state.gateWay, hostname: state => state.hostName, is_binary: state => state.is_binary, From d36def7ec5ec8ca04e8855ae2936bf4345369c8b Mon Sep 17 00:00:00 2001 From: ori Date: Mon, 19 Aug 2019 13:14:49 -0700 Subject: [PATCH 09/17] integrated ip --- backend/app/classes/SettingsManager.py | 12 +++++++----- backend/app/handlers/IPHandler.py | 2 +- chameleon-client/public/favicon.ico | Bin 1150 -> 226046 bytes chameleon-client/src/assets/logo.png | Bin 6849 -> 82656 bytes chameleon-client/src/components/SystemTab.vue | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) mode change 100644 => 100755 chameleon-client/public/favicon.ico mode change 100644 => 100755 chameleon-client/src/assets/logo.png diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index ea025ea46..8660a661b 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -6,6 +6,7 @@ import subprocess from cscore._cscore import VideoMode from .Singleton import Singleton from .Exceptions import PipelineAlreadyExistsException, NoCameraConnectedException +from ..handlers.IPHandler import ChangeIP class SettingsManager(metaclass=Singleton): @@ -189,9 +190,12 @@ class SettingsManager(metaclass=Singleton): for key in dic['change_general_settings_values']: if self.default_general_settings[key]: self.general_settings[key] = dic['change_general_settings_values'][key] - self.settings_manager.save_settings() - #after all values has been set change settings - self.change_general_settings() + self.save_settings() + + # after all values has been set change settings + ChangeIP(hostname=self.general_settings['hostname'], ip=self.general_settings['ip'], + netmask=self.general_settings['netmask'], gateway=self.general_settings['gateway']) + # Creators @@ -254,7 +258,5 @@ class SettingsManager(metaclass=Singleton): with open(os.path.join(self.settings_path, 'settings.json'), 'w+') as setting_file: json.dump(self.general_settings, setting_file) - def change_general_settings(self): - pass diff --git a/backend/app/handlers/IPHandler.py b/backend/app/handlers/IPHandler.py index d25ba0321..be1c26fc1 100644 --- a/backend/app/handlers/IPHandler.py +++ b/backend/app/handlers/IPHandler.py @@ -39,4 +39,4 @@ class ChangeIP: @staticmethod def change_hostname(hostname): - subprocess.call(['hostnamectl set-hostname', "Chameleon-Vision-{}".format(hostname)]) \ No newline at end of file + subprocess.call(['hostnamectl set-hostname', "Chameleon-Vision-{}".format(hostname)]) diff --git a/chameleon-client/public/favicon.ico b/chameleon-client/public/favicon.ico old mode 100644 new mode 100755 index c7b9a43c8cd16d0b434adaf513fcacb340809a11..bc877aaad417c1e857b87e3cedb8f830bbff19c7 GIT binary patch literal 226046 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

!UUsvLyMr-#v@G1aOyh#Y`NLNK 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 diff --git a/chameleon-client/src/assets/logo.png b/chameleon-client/src/assets/logo.png old mode 100644 new mode 100755 index f3d2503fc2a44b5053b0837ebea6e87a2d339a43..5520ffde3a46a691ada93772ab652211ba5e92c2 GIT binary patch literal 82656 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 MA0OJChfdBvi literal 6849 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 - http://Chameleon-Vision + http://Chameleon-Vision- .local From 116938b7fac8132924b3b7b2ea441079a5bd3193 Mon Sep 17 00:00:00 2001 From: ori agranat Date: Mon, 19 Aug 2019 23:44:45 +0300 Subject: [PATCH 10/17] fixed requirements txt --- backend/requirement.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/requirement.txt b/backend/requirement.txt index 47a0882ef..84e5a9010 100644 --- a/backend/requirement.txt +++ b/backend/requirement.txt @@ -1,3 +1,4 @@ tornado pyzmq -robotpy-cscore \ No newline at end of file +robotpy-cscore +netifaces \ No newline at end of file From eed5dfbe40dad227662bad47e6c4528cbe041d94 Mon Sep 17 00:00:00 2001 From: ori agranat Date: Tue, 20 Aug 2019 21:48:04 +0300 Subject: [PATCH 11/17] integrated ip handler --- backend/app/classes/SettingsManager.py | 2 +- backend/app/handlers/IPHandler.py | 10 +++++----- backend/app/handlers/SocketHandler.py | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index 8660a661b..84d9e94ba 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -193,7 +193,7 @@ class SettingsManager(metaclass=Singleton): self.save_settings() # after all values has been set change settings - ChangeIP(hostname=self.general_settings['hostname'], ip=self.general_settings['ip'], + ChangeIP(connection_type=self.general_settings['connection_type'] ,hostname=self.general_settings['hostname'], ip=self.general_settings['ip'], netmask=self.general_settings['netmask'], gateway=self.general_settings['gateway']) diff --git a/backend/app/handlers/IPHandler.py b/backend/app/handlers/IPHandler.py index be1c26fc1..b5cce0044 100644 --- a/backend/app/handlers/IPHandler.py +++ b/backend/app/handlers/IPHandler.py @@ -3,13 +3,13 @@ import netifaces class ChangeIP: - def __init__(self, ip_type, ip, netmask, gateway, hostname): + def __init__(self, connection_type, ip, netmask, gateway, hostname): adapter = self.find_adapter() - if ip_type == "DHCP": + if connection_type == "DHCP": self.change_to_dhcp(adapter=adapter) - elif ip_type == "Static": + elif connection_type == "Static": self.change_to_static(adapter=adapter, ip=ip, netmask=netmask, gateway=gateway) self.change_hostname(hostname=hostname) @@ -17,7 +17,7 @@ class ChangeIP: @staticmethod def change_to_dhcp(adapter): - subprocess.call(['dhclient -r', adapter]) + subprocess.call(['dhclient',"-r", adapter]) @staticmethod def change_to_static(adapter, ip, netmask, gateway): @@ -39,4 +39,4 @@ class ChangeIP: @staticmethod def change_hostname(hostname): - subprocess.call(['hostnamectl set-hostname', "Chameleon-Vision-{}".format(hostname)]) + subprocess.call(['hostnamectl', 'set-hostname', "Chameleon-Vision-" + hostname]) diff --git a/backend/app/handlers/SocketHandler.py b/backend/app/handlers/SocketHandler.py index b6f54d136..df6d48a69 100644 --- a/backend/app/handlers/SocketHandler.py +++ b/backend/app/handlers/SocketHandler.py @@ -48,8 +48,8 @@ class ChameleonWebSocket(tornado.websocket.WebSocketHandler): for key in message_dic: self.actions.get(key, self.actions["change_pipeline_values"])(message_dic) print(message) - except: - print("crash " + message) + except Exception as e: + print("crash " + e) def on_close(self): self.settings_manager.save_settings() From 79511877ddccc8221302fa0e637c8c914899239a Mon Sep 17 00:00:00 2001 From: ori Date: Tue, 20 Aug 2019 12:03:22 -0700 Subject: [PATCH 12/17] fixed bug in settings manager --- backend/app/classes/SettingsManager.py | 4 ++-- backend/app/handlers/IPHandler.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index 84d9e94ba..5ec1363b4 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -42,7 +42,7 @@ class SettingsManager(metaclass=Singleton): "ip": "", "gateway": "", "netmask": "", - "hostname": "", + "hostname": "Chameleon-Vision", "curr_camera": "", "curr_pipeline": "" } @@ -188,7 +188,7 @@ class SettingsManager(metaclass=Singleton): def change_general_settings_values(self, dic): for key in dic['change_general_settings_values']: - if self.default_general_settings[key]: + if key in self.default_general_settings.keys(): self.general_settings[key] = dic['change_general_settings_values'][key] self.save_settings() diff --git a/backend/app/handlers/IPHandler.py b/backend/app/handlers/IPHandler.py index b5cce0044..dee105418 100644 --- a/backend/app/handlers/IPHandler.py +++ b/backend/app/handlers/IPHandler.py @@ -39,4 +39,4 @@ class ChangeIP: @staticmethod def change_hostname(hostname): - subprocess.call(['hostnamectl', 'set-hostname', "Chameleon-Vision-" + hostname]) + subprocess.call(['hostnamectl set-hostname', hostname]) From d23150dff9fec8131bacb048bc987472a782b58f Mon Sep 17 00:00:00 2001 From: ori Date: Tue, 20 Aug 2019 12:20:11 -0700 Subject: [PATCH 13/17] updated website --- backend/app/site/favicon.ico | Bin 1150 -> 226046 bytes backend/app/site/index.html | 2 +- backend/app/site/js/app.5bd5cd15.js | 2 ++ backend/app/site/js/app.5bd5cd15.js.map | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 backend/app/site/js/app.5bd5cd15.js create mode 100644 backend/app/site/js/app.5bd5cd15.js.map diff --git a/backend/app/site/favicon.ico b/backend/app/site/favicon.ico index c7b9a43c8cd16d0b434adaf513fcacb340809a11..bc877aaad417c1e857b87e3cedb8f830bbff19c7 100644 GIT binary patch literal 226046 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

!UUsvLyMr-#v@G1aOyh#Y`NLNK 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 diff --git a/backend/app/site/index.html b/backend/app/site/index.html index 331ceb380..3d9c8f2e3 100644 --- a/backend/app/site/index.html +++ b/backend/app/site/index.html @@ -1 +1 @@ -Chameleon Vision

\ No newline at end of file +Chameleon Vision
\ No newline at end of file diff --git a/backend/app/site/js/app.5bd5cd15.js b/backend/app/site/js/app.5bd5cd15.js new file mode 100644 index 000000000..7f7ab3c39 --- /dev/null +++ b/backend/app/site/js/app.5bd5cd15.js @@ -0,0 +1,2 @@ +(function(t){function e(e){for(var s,r,o=e[0],l=e[1],u=e[2],p=0,m=[];p\n \n \n

{{title.charAt(0).toUpperCase() + title.slice(1)}} :

\n \n \n \n {{item}}\n \n \n
\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-select.vue?vue&type=template&id=c9ee7642&\"\nimport script from \"./ch-select.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-select.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-select.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports"," \n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=69465486&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Layout',{attrs:{\"id\":\"main-layout\"}},[_c('Header',{attrs:{\"id\":\"main-header\"}},[_c('Row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('Col',{attrs:{\"span\":\"12\"}},[_c('chselect',{attrs:{\"title\":\"camera\",\"list\":_vm.cameraList,\"Xkey\":\"curr_camera\"}})],1),_c('Col',{attrs:{\"span\":\"12\"}},[_c('chselect',{attrs:{\"title\":\"pipline\",\"list\":_vm.pipelineList,\"Xkey\":\"curr_pipeline\"}})],1)],1)],1),_c('Content',{attrs:{\"id\":\"main-content\"}},[_c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"top\",\"gutter\":5}},[_c('Col',{attrs:{\"span\":\"12\"}},[_c('router-view')],1),_c('Col',{attrs:{\"span\":\"12\"}},[_c('Tabs',{attrs:{\"animated\":false},on:{\"on-click\":_vm.handleImage},model:{value:(_vm.isBinary),callback:function ($$v) {_vm.isBinary=$$v},expression:\"isBinary\"}},[_c('TabPane',{attrs:{\"label\":\"Normal\"}}),_c('TabPane',{attrs:{\"label\":\"Threshold\"}})],1),_c('img',{staticClass:\"imageSize\",attrs:{\"src\":_vm.steamAdress}}),_c('h4',{staticClass:\"pointText\"},[_vm._v(_vm._s(_vm.point))])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Vision.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Vision.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Vision.vue?vue&type=template&id=2db2bf31&\"\nimport script from \"./Vision.vue?vue&type=script&lang=js&\"\nexport * from \"./Vision.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Vision.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Layout',{attrs:{\"id\":\"main-layout\"}},[_c('Content',{attrs:{\"id\":\"main-content\"}},[_c('router-view')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Settings.vue?vue&type=template&id=033196b2&scoped=true&\"\nimport script from \"./Settings.vue?vue&type=script&lang=js&\"\nexport * from \"./Settings.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"033196b2\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"InputTab\"}},[_c('chslider',{staticClass:\"spacing\",attrs:{\"title\":\"exposure\",\"Xkey\":\"exposure\"}}),_c('chslider',{staticClass:\"spacing\",attrs:{\"title\":\"Brightness\",\"Xkey\":\"brightness\"}}),_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Orientation\",\"Xkey\":\"orientation\",\"list\":['Normal','Inverted']}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{staticStyle:{\"text-align\":\"left\"},attrs:{\"span\":\"4\"}},[_c('InputNumber',{staticStyle:{\"align-self\":\"flex-start\"},attrs:{\"size\":\"small\"},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1),_c('Col',{attrs:{\"span\":\"14\"}},[_c('Slider',{on:{\"on-input\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-slider.vue?vue&type=template&id=7e5a6bfa&\"\nimport script from \"./ch-slider.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-slider.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-slider.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{attrs:{\"span\":\"4\"}},[_c('i-select',{attrs:{\"size\":\"small\"},on:{\"on-change\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}},_vm._l((_vm.list),function(item,index){return _c('i-option',{key:index,attrs:{\"value\":index}},[_vm._v(_vm._s(item))])}),1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-IndexSelect.vue?vue&type=template&id=2c264cc6&\"\nimport script from \"./ch-IndexSelect.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-IndexSelect.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-IndexSelect.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n \n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./InputTab.vue?vue&type=template&id=285b7205&scoped=true&\"\nimport script from \"./InputTab.vue?vue&type=script&lang=js&\"\nexport * from \"./InputTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./InputTab.vue?vue&type=style&index=0&id=285b7205&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"285b7205\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"Threshold\"}},[_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Hue\",\"Xkey\":\"hue\",\"maximum\":180}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Saturation\",\"Xkey\":\"saturation\",\"maximum\":255}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Value\",\"Xkey\":\"value\",\"maximum\":255}}),_c('chswitch',{staticClass:\"spacing\",attrs:{\"title\":\"Erode\",\"Xkey\":\"erode\"}}),_c('chswitch',{staticClass:\"spacing\",attrs:{\"title\":\"Dilate\",\"Xkey\":\"dilate\"}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{staticStyle:{\"text-align\":\"left\"},attrs:{\"span\":\"4\"}},[_c('InputNumber',{staticStyle:{\"align-self\":\"flex-start\"},attrs:{\"size\":\"small\",\"step\":_vm.steps},model:{value:(_vm.value[0]),callback:function ($$v) {_vm.$set(_vm.value, 0, $$v)},expression:\"value[0]\"}})],1),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Slider',{attrs:{\"range\":\"\",\"step\":_vm.steps,\"max\":_vm.maximum},on:{\"on-input\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1),_c('Col',{staticStyle:{\"text-align\":\"right\"},attrs:{\"span\":\"4\"}},[_c('InputNumber',{staticStyle:{\"align-self\":\"flex-end\"},attrs:{\"size\":\"small\",\"step\":_vm.steps,\"max\":_vm.maximum},model:{value:(_vm.value[1]),callback:function ($$v) {_vm.$set(_vm.value, 1, $$v)},expression:\"value[1]\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-range.vue?vue&type=template&id=a3c890c4&\"\nimport script from \"./ch-range.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-range.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-range.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{staticStyle:{\"text-align\":\"left\"},attrs:{\"span\":\"4\"}},[_c('i-switch',{staticStyle:{\"align-self\":\"flex-start\"},on:{\"on-change\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-switch.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-switch.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-switch.vue?vue&type=template&id=182635d8&scoped=true&\"\nimport script from \"./ch-switch.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-switch.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"182635d8\",\n null\n \n)\n\nexport default component.exports","\n \n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ThresholdTab.vue?vue&type=template&id=267dfb50&scoped=true&\"\nimport script from \"./ThresholdTab.vue?vue&type=script&lang=js&\"\nexport * from \"./ThresholdTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThresholdTab.vue?vue&type=style&index=0&id=267dfb50&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"267dfb50\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"SystemTab\"}},[_c('div',[_c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('Col',{attrs:{\"span\":\"6\"}},[_c('h4',[_vm._v(\"Team Number:\")])]),_c('col',{attrs:{\"span\":\"4\"}}),_c('InputNumber',{attrs:{\"min\":0,\"size\":\"small\"},model:{value:(_vm.team_number),callback:function ($$v) {_vm.team_number=$$v},expression:\"team_number\"}})],1)],1),_c('Divider',{staticClass:\"divdiv\",attrs:{\"orientation\":\"left\"}},[_vm._v(\"Networking\")]),_c('div',[_c('RadioGroup',{staticStyle:{\"display\":\"flex\"},model:{value:(_vm.connection_type),callback:function ($$v) {_vm.connection_type=$$v},expression:\"connection_type\"}},[_c('Radio',{attrs:{\"label\":\"DHCP\"}}),_c('Radio',{attrs:{\"label\":\"Static\"}})],1),_c('div',{staticClass:\"ipSettings\"},[_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"IP:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\",\"disabled\":_vm.isConnection},model:{value:(_vm.ip),callback:function ($$v) {_vm.ip=$$v},expression:\"ip\"}})],1)],1),_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Netmask:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\",\"disabled\":_vm.isConnection},model:{value:(_vm.netmask),callback:function ($$v) {_vm.netmask=$$v},expression:\"netmask\"}})],1)],1),_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Gateway:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\",\"disabled\":_vm.isConnection},model:{value:(_vm.gateway),callback:function ($$v) {_vm.gateway=$$v},expression:\"gateway\"}})],1)],1),_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Hostname:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\"},model:{value:(_vm.hostname),callback:function ($$v) {_vm.hostname=$$v},expression:\"hostname\"}},[_c('span',{attrs:{\"slot\":\"prepend\"},slot:\"prepend\"},[_vm._v(\"http://Chameleon-Vision-\")]),_c('span',{attrs:{\"slot\":\"append\"},slot:\"append\"},[_vm._v(\".local\")])])],1)],1)],1),_c('Divider',{staticClass:\"divdiv\",attrs:{\"orientation\":\"left\"}}),_c('row',{staticStyle:{\"margin-top\":\"20px\"},attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.socketSendAll}},[_vm._v(\"Save Changes and Restart\")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"InputNumber\"}},[_c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('Col',{attrs:{\"span\":\"6\"}},[_c('h4',[_vm._v(_vm._s(_vm.title))])]),_c('col',{attrs:{\"span\":\"4\"}}),_c('InputNumber',{attrs:{\"min\":0,\"size\":\"small\"},on:{\"on-change\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-inputNumber.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-inputNumber.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-inputNumber.vue?vue&type=template&id=672703df&scoped=true&\"\nimport script from \"./ch-inputNumber.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-inputNumber.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"672703df\",\n null\n \n)\n\nexport default component.exports","\n\n \n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SystemTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SystemTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SystemTab.vue?vue&type=template&id=25a6e22e&\"\nimport script from \"./SystemTab.vue?vue&type=script&lang=js&\"\nexport * from \"./SystemTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SystemTab.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"spacing\",attrs:{\"id\":\"cameraTab\"}},[_c('chselect',{attrs:{\"title\":\"select camera\",\"list\":_vm.cameraList,\"Xkey\":\"curr_camera\"}}),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Resolution:\")])]),_c('Col',{attrs:{\"span\":\"4\"}},[_c('i-select',{attrs:{\"size\":\"small\"},model:{value:(_vm.resolution),callback:function ($$v) {_vm.resolution=$$v},expression:\"resolution\"}},_vm._l((_vm.resolutionList),function(item,index){return _c('i-option',{key:index,attrs:{\"value\":index}},[_vm._v(_vm._s(item))])}),1)],1)],1),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Diagonal FOV:\")])]),_c('Col',{attrs:{\"span\":\"4\"}},[_c('InputNumber',{attrs:{\"min\":0,\"size\":\"small\"},model:{value:(_vm.FOV),callback:function ($$v) {_vm.FOV=$$v},expression:\"FOV\"}})],1)],1),_c('Button',{staticClass:\"buttonClass spacing\",attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.socketSendAll}},[_vm._v(\"Save settings to current camera\")]),_c('h4',{staticClass:\"spacing\"},[_vm._v(\"Please Restart the computer Manually after saving all cameras\")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CameraTab.vue?vue&type=template&id=4d25b2ea&scoped=true&\"\nimport script from \"./CameraTab.vue?vue&type=script&lang=js&\"\nexport * from \"./CameraTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CameraTab.vue?vue&type=style&index=0&id=4d25b2ea&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4d25b2ea\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"ContourTab\"}},[_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Area\",\"Xkey\":\"area\"}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Ratio (W/H)\",\"Xkey\":\"ratio\",\"steps\":0.1}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Extent\",\"Xkey\":\"extent\"}}),_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Target Group\",\"Xkey\":\"target_group\",\"list\":['Single','Dual','Triple','Quadruple','Quintuple']}}),_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Target Intersaction\",\"Xkey\":\"target_intersection\",\"list\":['Up','Down','Left','Right','Parallel'],\"isDisabled\":_vm.isSingle}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./contourTab.vue?vue&type=template&id=90fe5fa0&scoped=true&\"\nimport script from \"./contourTab.vue?vue&type=script&lang=js&\"\nexport * from \"./contourTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./contourTab.vue?vue&type=style&index=0&id=90fe5fa0&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"90fe5fa0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"OutputTab\"}},[_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Sort Mode\",\"Xkey\":\"sort_mode\",\"list\":['Largest','Smallest','Highest','Lowest','Rightmost','Leftmost','Closest']}}),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('col'),_c('Button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.takePointA}},[_vm._v(\"Take Point A\")]),_c('col',{staticStyle:{\"margin-left\":\"10px\"}}),_c('Button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.takePointB}},[_vm._v(\"Take Point B\")])],1),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"align\":\"middle\",\"gutter\":10}},[_c('col'),_c('Button',{attrs:{\"type\":\"warning\",\"size\":\"small\"},on:{\"click\":_vm.clearPoints}},[_vm._v(\"Clear All Points\")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./outputTab.vue?vue&type=template&id=1abc7610&scoped=true&\"\nimport script from \"./outputTab.vue?vue&type=script&lang=js&\"\nexport * from \"./outputTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./outputTab.vue?vue&type=style&index=0&id=1abc7610&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1abc7610\",\n null\n \n)\n\nexport default component.exports","import VueRouter from \"vue-router\";\nimport Vision from \"./components/Vision.vue\"\nimport Setting from \"./components/Settings.vue\"\nimport Input from \"./components/InputTab.vue\";\nimport Threshold from \"./components/ThresholdTab.vue\";\nimport System from \"./components/SystemTab.vue\";\nimport Camera from \"./components/CameraTab.vue\";\nimport Contours from \"./components/contourTab.vue\";\nimport Output from './components/outputTab.vue'\n\nconst routes = [\n { path: '/', redirect: '/vision/input'},\n { path: '/vision', component: Vision, children: [\n { path: 'input', component: Input },\n { path: 'threshold', component: Threshold },\n { path: 'contours', component: Contours },\n { path: 'output', component: Output },\n ]},\n { path: '/settings', component: Setting, children: [\n { path: 'system', component: System },\n { path: 'camera', component: Camera }\n ]}\n]\n\nconst router = new VueRouter({\n routes\n})\n\nexport default router;","import Vue from 'vue'\nimport Vuex from 'vuex'\n\nVue.use(Vuex);\nconst set = key => (state,val) =>{\n state[key] = val\n};\nexport const store = new Vuex.Store({\n\n state:{\n //header\n curr_camera:\"\",\n curr_pipeline:\"\",\n cameraList:[],\n pipelineList:[],\n //input\n exposure:54,\n brightness:0,\n orientation:0,\n resolution:0,\n resolutionList:[],\n FOV:0,\n //threshold\n hue:[0,10],\n saturation:[0,10],\n value:[0,10],\n erode: false,\n dilate: false,\n //contours\n area:[0,100],\n ratio:[0,20],\n extent:[0,100],\n sort_mode:'Largest', \n target_group:'Single', \n target_intersection:'Up',\n //Settings\n team_number:0,\n connection_type:\"DHCP\",\n ip:\"\",\n gateWay:\"\",\n netmask:\"\",\n hostname:\"\",\n //live info\n port:1181,\n is_binary:0,\n //points\n raw_point:[],\n point:{}\n\n },\n mutations:{\n curr_camera (state,value){\n state['curr_camera'] = value;\n state['pipeline'] = \"0\";\n },\n curr_pipeline: set('curr_pipeline'),\n brightness: set('brightness'),\n exposure: set('exposure'),\n orientation:set('orientation'),\n resolution: set('resolution'),\n hue: set('hue'),\n saturation: set('saturation'),\n value: set('value'),\n erode: set('erode'),\n dilate: set('dilate'),\n area: set('area'),\n ratio: set('ratio'),\n extent: set('extent'),\n team_number: set('team_number'),\n connection_type: set('connection_type'),\n ip: set('ip'),\n netmask: set('netmask'),\n gateWay : set('gateway'),\n hostname : set('hostname'),\n is_binary: set('is_binary'),\n cameraList : set('cameraList'),\n pipelineList: set('piplineList'),\n sort_mode: set('sort_mode'),\n target_group:set('target_group'),\n target_intersection:set('target_intersection'),\n FOV:set('FOV'),\n port:set('port'),\n raw_point:set('raw_point'),\n point:set('point')\n },\n getters:{\n curr_camera: state => state.curr_camera,\n curr_pipeline: state => state.curr_pipeline,\n brightness: state => state.brightness,\n exposure: state => state.exposure,\n orientation: state => state.orientation,\n resolution: state => state.resolution,\n hue: state => state.hue,\n saturation: state => state.saturation,\n value: state => state.value,\n erode: state => state.dilate,\n dilate: state => state.dilate,\n area: state =>state.area,\n ratio: state =>state.ratio,\n extent: state =>state.extent,\n team_number: state => state.teamValue,\n connection_type: state => state.connectionType,\n ip: state => state.ip,\n netmask: state => state.netmask,\n gateWay: state => state.gateWay,\n hostname: state => state.hostName,\n is_binary: state => state.is_binary,\n cameraList: state => state.cameraList,\n pipelineList: state => state.pipelineList,\n sort_mode: state => state.sort_mode,\n target_group: state => state.target_group,\n target_intersection: state => state.target_intersection,\n FOV: state => state.FOV,\n port: state => state.port,\n raw_point:state => state.raw_point,\n point: state => state.point\n\n },\n});","import Vue from 'vue'\nimport App from './App.vue'\nimport VueRouter from 'vue-router'\nimport iView from 'iview';\nimport router from \"./routes\";\nimport '../theme/index.less';\nimport VueNativeSock from 'vue-native-websocket';\nimport locale from 'iview/dist/locale/en-US';\nimport {store} from './store'\n\nVue.use(VueRouter);\nVue.use(iView , { locale });\nVue.use(VueNativeSock,'ws://'+location.hostname+':8888/websocket',{format:'JSON'});\nVue.config.productionTip = false\n\nnew Vue({\n router,\n store,\n render: h => h(App)\n}).$mount('#app')\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=style&index=0&id=4d25b2ea&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=style&index=0&id=4d25b2ea&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=style&index=0&id=1abc7610&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=style&index=0&id=1abc7610&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=style&index=0&id=90fe5fa0&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=style&index=0&id=90fe5fa0&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=style&index=0&id=267dfb50&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=style&index=0&id=267dfb50&scoped=true&lang=css&\""],"sourceRoot":""} \ No newline at end of file From fa49aabf7466f138d7cc50000a111c47ca90554b Mon Sep 17 00:00:00 2001 From: ori agranat Date: Tue, 20 Aug 2019 23:10:43 +0300 Subject: [PATCH 14/17] some bug fixes --- backend/app/classes/SettingsManager.py | 3 +++ backend/app/handlers/IPHandler.py | 11 +++++++---- chameleon-client/src/store.js | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index 5ec1363b4..d14e7c096 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -51,6 +51,9 @@ class SettingsManager(metaclass=Singleton): self.settings_path = os.path.join(os.getcwd(), "settings") self.cams_path = os.path.join(self.settings_path, "cams") self._init_general_settings() + ChangeIP(connection_type=self.general_settings['connection_type'], hostname=self.general_settings['hostname'], + ip=self.general_settings['ip'], + netmask=self.general_settings['netmask'], gateway=self.general_settings['gateway']) self._init_cameras_info() self._init_usb_cameras() self._init_cameras() diff --git a/backend/app/handlers/IPHandler.py b/backend/app/handlers/IPHandler.py index dee105418..8d41f111b 100644 --- a/backend/app/handlers/IPHandler.py +++ b/backend/app/handlers/IPHandler.py @@ -6,6 +6,7 @@ class ChangeIP: def __init__(self, connection_type, ip, netmask, gateway, hostname): adapter = self.find_adapter() + self.shutdown_adapter(adapter) if connection_type == "DHCP": self.change_to_dhcp(adapter=adapter) @@ -13,7 +14,7 @@ class ChangeIP: self.change_to_static(adapter=adapter, ip=ip, netmask=netmask, gateway=gateway) self.change_hostname(hostname=hostname) - self.restart_adapter(adapter=adapter) + self.start_adapter(adapter) @staticmethod def change_to_dhcp(adapter): @@ -22,11 +23,13 @@ class ChangeIP: @staticmethod def change_to_static(adapter, ip, netmask, gateway): subprocess.call(['ifconfig', adapter, ip, 'netmask', netmask]) - subprocess.call(['route add default gw', gateway, adapter]) + subprocess.call(['route', 'add', 'default', 'gw', gateway, adapter]) @staticmethod - def restart_adapter(adapter): + def shutdown_adapter(adapter): subprocess.call(['ifconfig', adapter, 'down']) + @staticmethod + def start_adapter(adapter): subprocess.call(['ifconfig', adapter, 'up']) @staticmethod @@ -39,4 +42,4 @@ class ChangeIP: @staticmethod def change_hostname(hostname): - subprocess.call(['hostnamectl set-hostname', hostname]) + subprocess.call(['hostnamectl', 'set-hostname', hostname]) diff --git a/chameleon-client/src/store.js b/chameleon-client/src/store.js index ddca1e933..7f43cb0a8 100644 --- a/chameleon-client/src/store.js +++ b/chameleon-client/src/store.js @@ -37,7 +37,7 @@ export const store = new Vuex.Store({ team_number:0, connection_type:"DHCP", ip:"", - gateWay:"", + gateway:"", netmask:"", hostname:"", //live info From 7734a89c880857ced31ac7b980ea12f13baf9f03 Mon Sep 17 00:00:00 2001 From: ori Date: Tue, 20 Aug 2019 13:26:48 -0700 Subject: [PATCH 15/17] fixed var names in website --- backend/app/classes/SettingsManager.py | 5 +++-- backend/app/site/index.html | 2 +- backend/app/site/js/app.10bc1021.js | 2 ++ backend/app/site/js/app.10bc1021.js.map | 1 + chameleon-client/src/components/SystemTab.vue | 5 +++-- chameleon-client/src/store.js | 4 ++-- 6 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 backend/app/site/js/app.10bc1021.js create mode 100644 backend/app/site/js/app.10bc1021.js.map diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index d14e7c096..06f3678ce 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -196,8 +196,9 @@ class SettingsManager(metaclass=Singleton): self.save_settings() # after all values has been set change settings - ChangeIP(connection_type=self.general_settings['connection_type'] ,hostname=self.general_settings['hostname'], ip=self.general_settings['ip'], - netmask=self.general_settings['netmask'], gateway=self.general_settings['gateway']) + ChangeIP(connection_type=self.general_settings['connection_type'] ,hostname=self.general_settings['hostname'], + ip=self.general_settings['ip'], netmask=self.general_settings['netmask'], + gateway=self.general_settings['gateway']) diff --git a/backend/app/site/index.html b/backend/app/site/index.html index 3d9c8f2e3..8f0a9d475 100644 --- a/backend/app/site/index.html +++ b/backend/app/site/index.html @@ -1 +1 @@ -Chameleon Vision
\ No newline at end of file +Chameleon Vision
\ No newline at end of file diff --git a/backend/app/site/js/app.10bc1021.js b/backend/app/site/js/app.10bc1021.js new file mode 100644 index 000000000..21f371c2f --- /dev/null +++ b/backend/app/site/js/app.10bc1021.js @@ -0,0 +1,2 @@ +(function(t){function e(e){for(var s,r,o=e[0],l=e[1],u=e[2],p=0,m=[];p\n \n \n

{{title.charAt(0).toUpperCase() + title.slice(1)}} :

\n \n \n \n {{item}}\n \n \n
\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-select.vue?vue&type=template&id=c9ee7642&\"\nimport script from \"./ch-select.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-select.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-select.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports"," \n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=69465486&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Layout',{attrs:{\"id\":\"main-layout\"}},[_c('Header',{attrs:{\"id\":\"main-header\"}},[_c('Row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('Col',{attrs:{\"span\":\"12\"}},[_c('chselect',{attrs:{\"title\":\"camera\",\"list\":_vm.cameraList,\"Xkey\":\"curr_camera\"}})],1),_c('Col',{attrs:{\"span\":\"12\"}},[_c('chselect',{attrs:{\"title\":\"pipline\",\"list\":_vm.pipelineList,\"Xkey\":\"curr_pipeline\"}})],1)],1)],1),_c('Content',{attrs:{\"id\":\"main-content\"}},[_c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"top\",\"gutter\":5}},[_c('Col',{attrs:{\"span\":\"12\"}},[_c('router-view')],1),_c('Col',{attrs:{\"span\":\"12\"}},[_c('Tabs',{attrs:{\"animated\":false},on:{\"on-click\":_vm.handleImage},model:{value:(_vm.isBinary),callback:function ($$v) {_vm.isBinary=$$v},expression:\"isBinary\"}},[_c('TabPane',{attrs:{\"label\":\"Normal\"}}),_c('TabPane',{attrs:{\"label\":\"Threshold\"}})],1),_c('img',{staticClass:\"imageSize\",attrs:{\"src\":_vm.steamAdress}}),_c('h4',{staticClass:\"pointText\"},[_vm._v(_vm._s(_vm.point))])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Vision.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Vision.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Vision.vue?vue&type=template&id=2db2bf31&\"\nimport script from \"./Vision.vue?vue&type=script&lang=js&\"\nexport * from \"./Vision.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Vision.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Layout',{attrs:{\"id\":\"main-layout\"}},[_c('Content',{attrs:{\"id\":\"main-content\"}},[_c('router-view')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Settings.vue?vue&type=template&id=033196b2&scoped=true&\"\nimport script from \"./Settings.vue?vue&type=script&lang=js&\"\nexport * from \"./Settings.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"033196b2\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"InputTab\"}},[_c('chslider',{staticClass:\"spacing\",attrs:{\"title\":\"exposure\",\"Xkey\":\"exposure\"}}),_c('chslider',{staticClass:\"spacing\",attrs:{\"title\":\"Brightness\",\"Xkey\":\"brightness\"}}),_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Orientation\",\"Xkey\":\"orientation\",\"list\":['Normal','Inverted']}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{staticStyle:{\"text-align\":\"left\"},attrs:{\"span\":\"4\"}},[_c('InputNumber',{staticStyle:{\"align-self\":\"flex-start\"},attrs:{\"size\":\"small\"},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1),_c('Col',{attrs:{\"span\":\"14\"}},[_c('Slider',{on:{\"on-input\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-slider.vue?vue&type=template&id=7e5a6bfa&\"\nimport script from \"./ch-slider.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-slider.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-slider.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{attrs:{\"span\":\"4\"}},[_c('i-select',{attrs:{\"size\":\"small\"},on:{\"on-change\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}},_vm._l((_vm.list),function(item,index){return _c('i-option',{key:index,attrs:{\"value\":index}},[_vm._v(_vm._s(item))])}),1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-IndexSelect.vue?vue&type=template&id=2c264cc6&\"\nimport script from \"./ch-IndexSelect.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-IndexSelect.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-IndexSelect.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n \n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./InputTab.vue?vue&type=template&id=285b7205&scoped=true&\"\nimport script from \"./InputTab.vue?vue&type=script&lang=js&\"\nexport * from \"./InputTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./InputTab.vue?vue&type=style&index=0&id=285b7205&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"285b7205\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"Threshold\"}},[_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Hue\",\"Xkey\":\"hue\",\"maximum\":180}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Saturation\",\"Xkey\":\"saturation\",\"maximum\":255}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Value\",\"Xkey\":\"value\",\"maximum\":255}}),_c('chswitch',{staticClass:\"spacing\",attrs:{\"title\":\"Erode\",\"Xkey\":\"erode\"}}),_c('chswitch',{staticClass:\"spacing\",attrs:{\"title\":\"Dilate\",\"Xkey\":\"dilate\"}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{staticStyle:{\"text-align\":\"left\"},attrs:{\"span\":\"4\"}},[_c('InputNumber',{staticStyle:{\"align-self\":\"flex-start\"},attrs:{\"size\":\"small\",\"step\":_vm.steps},model:{value:(_vm.value[0]),callback:function ($$v) {_vm.$set(_vm.value, 0, $$v)},expression:\"value[0]\"}})],1),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Slider',{attrs:{\"range\":\"\",\"step\":_vm.steps,\"max\":_vm.maximum},on:{\"on-input\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1),_c('Col',{staticStyle:{\"text-align\":\"right\"},attrs:{\"span\":\"4\"}},[_c('InputNumber',{staticStyle:{\"align-self\":\"flex-end\"},attrs:{\"size\":\"small\",\"step\":_vm.steps,\"max\":_vm.maximum},model:{value:(_vm.value[1]),callback:function ($$v) {_vm.$set(_vm.value, 1, $$v)},expression:\"value[1]\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-range.vue?vue&type=template&id=a3c890c4&\"\nimport script from \"./ch-range.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-range.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-range.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{staticStyle:{\"text-align\":\"left\"},attrs:{\"span\":\"4\"}},[_c('i-switch',{staticStyle:{\"align-self\":\"flex-start\"},on:{\"on-change\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-switch.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-switch.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-switch.vue?vue&type=template&id=182635d8&scoped=true&\"\nimport script from \"./ch-switch.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-switch.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"182635d8\",\n null\n \n)\n\nexport default component.exports","\n \n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ThresholdTab.vue?vue&type=template&id=267dfb50&scoped=true&\"\nimport script from \"./ThresholdTab.vue?vue&type=script&lang=js&\"\nexport * from \"./ThresholdTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThresholdTab.vue?vue&type=style&index=0&id=267dfb50&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"267dfb50\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"SystemTab\"}},[_c('div',[_c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('Col',{attrs:{\"span\":\"6\"}},[_c('h4',[_vm._v(\"Team Number:\")])]),_c('col',{attrs:{\"span\":\"4\"}}),_c('InputNumber',{attrs:{\"min\":0,\"size\":\"small\"},model:{value:(_vm.team_number),callback:function ($$v) {_vm.team_number=$$v},expression:\"team_number\"}})],1)],1),_c('Divider',{staticClass:\"divdiv\",attrs:{\"orientation\":\"left\"}},[_vm._v(\"Networking\")]),_c('div',[_c('RadioGroup',{staticStyle:{\"display\":\"flex\"},model:{value:(_vm.connection_type),callback:function ($$v) {_vm.connection_type=$$v},expression:\"connection_type\"}},[_c('Radio',{attrs:{\"label\":\"DHCP\"}}),_c('Radio',{attrs:{\"label\":\"Static\"}})],1),_c('div',{staticClass:\"ipSettings\"},[_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"IP:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\",\"disabled\":_vm.isConnection},model:{value:(_vm.ip),callback:function ($$v) {_vm.ip=$$v},expression:\"ip\"}})],1)],1),_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Netmask:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\",\"disabled\":_vm.isConnection},model:{value:(_vm.netmask),callback:function ($$v) {_vm.netmask=$$v},expression:\"netmask\"}})],1)],1),_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Gateway:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\",\"disabled\":_vm.isConnection},model:{value:(_vm.gateway),callback:function ($$v) {_vm.gateway=$$v},expression:\"gateway\"}})],1)],1),_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Hostname:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\"},model:{value:(_vm.hostname),callback:function ($$v) {_vm.hostname=$$v},expression:\"hostname\"}},[_c('span',{attrs:{\"slot\":\"prepend\"},slot:\"prepend\"},[_vm._v(\"http://Chameleon-Vision-\")]),_c('span',{attrs:{\"slot\":\"append\"},slot:\"append\"},[_vm._v(\".local\")])])],1)],1)],1),_c('Divider',{staticClass:\"divdiv\",attrs:{\"orientation\":\"left\"}}),_c('row',{staticStyle:{\"margin-top\":\"20px\"},attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.socketSendAll}},[_vm._v(\"Save Changes and Restart\")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"InputNumber\"}},[_c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('Col',{attrs:{\"span\":\"6\"}},[_c('h4',[_vm._v(_vm._s(_vm.title))])]),_c('col',{attrs:{\"span\":\"4\"}}),_c('InputNumber',{attrs:{\"min\":0,\"size\":\"small\"},on:{\"on-change\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-inputNumber.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-inputNumber.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-inputNumber.vue?vue&type=template&id=672703df&scoped=true&\"\nimport script from \"./ch-inputNumber.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-inputNumber.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"672703df\",\n null\n \n)\n\nexport default component.exports","\n\n \n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SystemTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SystemTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SystemTab.vue?vue&type=template&id=175c3e50&\"\nimport script from \"./SystemTab.vue?vue&type=script&lang=js&\"\nexport * from \"./SystemTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SystemTab.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"spacing\",attrs:{\"id\":\"cameraTab\"}},[_c('chselect',{attrs:{\"title\":\"select camera\",\"list\":_vm.cameraList,\"Xkey\":\"curr_camera\"}}),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Resolution:\")])]),_c('Col',{attrs:{\"span\":\"4\"}},[_c('i-select',{attrs:{\"size\":\"small\"},model:{value:(_vm.resolution),callback:function ($$v) {_vm.resolution=$$v},expression:\"resolution\"}},_vm._l((_vm.resolutionList),function(item,index){return _c('i-option',{key:index,attrs:{\"value\":index}},[_vm._v(_vm._s(item))])}),1)],1)],1),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Diagonal FOV:\")])]),_c('Col',{attrs:{\"span\":\"4\"}},[_c('InputNumber',{attrs:{\"min\":0,\"size\":\"small\"},model:{value:(_vm.FOV),callback:function ($$v) {_vm.FOV=$$v},expression:\"FOV\"}})],1)],1),_c('Button',{staticClass:\"buttonClass spacing\",attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.socketSendAll}},[_vm._v(\"Save settings to current camera\")]),_c('h4',{staticClass:\"spacing\"},[_vm._v(\"Please Restart the computer Manually after saving all cameras\")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CameraTab.vue?vue&type=template&id=4d25b2ea&scoped=true&\"\nimport script from \"./CameraTab.vue?vue&type=script&lang=js&\"\nexport * from \"./CameraTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CameraTab.vue?vue&type=style&index=0&id=4d25b2ea&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4d25b2ea\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"ContourTab\"}},[_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Area\",\"Xkey\":\"area\"}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Ratio (W/H)\",\"Xkey\":\"ratio\",\"steps\":0.1}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Extent\",\"Xkey\":\"extent\"}}),_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Target Group\",\"Xkey\":\"target_group\",\"list\":['Single','Dual','Triple','Quadruple','Quintuple']}}),_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Target Intersaction\",\"Xkey\":\"target_intersection\",\"list\":['Up','Down','Left','Right','Parallel'],\"isDisabled\":_vm.isSingle}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./contourTab.vue?vue&type=template&id=90fe5fa0&scoped=true&\"\nimport script from \"./contourTab.vue?vue&type=script&lang=js&\"\nexport * from \"./contourTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./contourTab.vue?vue&type=style&index=0&id=90fe5fa0&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"90fe5fa0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"OutputTab\"}},[_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Sort Mode\",\"Xkey\":\"sort_mode\",\"list\":['Largest','Smallest','Highest','Lowest','Rightmost','Leftmost','Closest']}}),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('col'),_c('Button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.takePointA}},[_vm._v(\"Take Point A\")]),_c('col',{staticStyle:{\"margin-left\":\"10px\"}}),_c('Button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.takePointB}},[_vm._v(\"Take Point B\")])],1),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"align\":\"middle\",\"gutter\":10}},[_c('col'),_c('Button',{attrs:{\"type\":\"warning\",\"size\":\"small\"},on:{\"click\":_vm.clearPoints}},[_vm._v(\"Clear All Points\")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./outputTab.vue?vue&type=template&id=1abc7610&scoped=true&\"\nimport script from \"./outputTab.vue?vue&type=script&lang=js&\"\nexport * from \"./outputTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./outputTab.vue?vue&type=style&index=0&id=1abc7610&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1abc7610\",\n null\n \n)\n\nexport default component.exports","import VueRouter from \"vue-router\";\nimport Vision from \"./components/Vision.vue\"\nimport Setting from \"./components/Settings.vue\"\nimport Input from \"./components/InputTab.vue\";\nimport Threshold from \"./components/ThresholdTab.vue\";\nimport System from \"./components/SystemTab.vue\";\nimport Camera from \"./components/CameraTab.vue\";\nimport Contours from \"./components/contourTab.vue\";\nimport Output from './components/outputTab.vue'\n\nconst routes = [\n { path: '/', redirect: '/vision/input'},\n { path: '/vision', component: Vision, children: [\n { path: 'input', component: Input },\n { path: 'threshold', component: Threshold },\n { path: 'contours', component: Contours },\n { path: 'output', component: Output },\n ]},\n { path: '/settings', component: Setting, children: [\n { path: 'system', component: System },\n { path: 'camera', component: Camera }\n ]}\n]\n\nconst router = new VueRouter({\n routes\n})\n\nexport default router;","import Vue from 'vue'\nimport Vuex from 'vuex'\n\nVue.use(Vuex);\nconst set = key => (state,val) =>{\n state[key] = val\n};\nexport const store = new Vuex.Store({\n\n state:{\n //header\n curr_camera:\"\",\n curr_pipeline:\"\",\n cameraList:[],\n pipelineList:[],\n //input\n exposure:54,\n brightness:0,\n orientation:0,\n resolution:0,\n resolutionList:[],\n FOV:0,\n //threshold\n hue:[0,10],\n saturation:[0,10],\n value:[0,10],\n erode: false,\n dilate: false,\n //contours\n area:[0,100],\n ratio:[0,20],\n extent:[0,100],\n sort_mode:'Largest', \n target_group:'Single', \n target_intersection:'Up',\n //Settings\n team_number:0,\n connection_type:\"DHCP\",\n ip:\"\",\n gateway:\"\",\n netmask:\"\",\n hostname:\"\",\n //live info\n port:1181,\n is_binary:0,\n //points\n raw_point:[],\n point:{}\n\n },\n mutations:{\n curr_camera (state,value){\n state['curr_camera'] = value;\n state['pipeline'] = \"0\";\n },\n curr_pipeline: set('curr_pipeline'),\n brightness: set('brightness'),\n exposure: set('exposure'),\n orientation:set('orientation'),\n resolution: set('resolution'),\n hue: set('hue'),\n saturation: set('saturation'),\n value: set('value'),\n erode: set('erode'),\n dilate: set('dilate'),\n area: set('area'),\n ratio: set('ratio'),\n extent: set('extent'),\n team_number: set('team_number'),\n connection_type: set('connection_type'),\n ip: set('ip'),\n netmask: set('netmask'),\n gateway : set('gateway'),\n hostname : set('hostname'),\n is_binary: set('is_binary'),\n cameraList : set('cameraList'),\n pipelineList: set('piplineList'),\n sort_mode: set('sort_mode'),\n target_group:set('target_group'),\n target_intersection:set('target_intersection'),\n FOV:set('FOV'),\n port:set('port'),\n raw_point:set('raw_point'),\n point:set('point')\n },\n getters:{\n curr_camera: state => state.curr_camera,\n curr_pipeline: state => state.curr_pipeline,\n brightness: state => state.brightness,\n exposure: state => state.exposure,\n orientation: state => state.orientation,\n resolution: state => state.resolution,\n hue: state => state.hue,\n saturation: state => state.saturation,\n value: state => state.value,\n erode: state => state.dilate,\n dilate: state => state.dilate,\n area: state =>state.area,\n ratio: state =>state.ratio,\n extent: state =>state.extent,\n team_number: state => state.teamValue,\n connection_type: state => state.connectionType,\n ip: state => state.ip,\n netmask: state => state.netmask,\n gateway: state => state.gateway,\n hostname: state => state.hostName,\n is_binary: state => state.is_binary,\n cameraList: state => state.cameraList,\n pipelineList: state => state.pipelineList,\n sort_mode: state => state.sort_mode,\n target_group: state => state.target_group,\n target_intersection: state => state.target_intersection,\n FOV: state => state.FOV,\n port: state => state.port,\n raw_point:state => state.raw_point,\n point: state => state.point\n\n },\n});","import Vue from 'vue'\nimport App from './App.vue'\nimport VueRouter from 'vue-router'\nimport iView from 'iview';\nimport router from \"./routes\";\nimport '../theme/index.less';\nimport VueNativeSock from 'vue-native-websocket';\nimport locale from 'iview/dist/locale/en-US';\nimport {store} from './store'\n\nVue.use(VueRouter);\nVue.use(iView , { locale });\nVue.use(VueNativeSock,'ws://'+location.hostname+':8888/websocket',{format:'JSON'});\nVue.config.productionTip = false\n\nnew Vue({\n router,\n store,\n render: h => h(App)\n}).$mount('#app')\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=style&index=0&id=4d25b2ea&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=style&index=0&id=4d25b2ea&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=style&index=0&id=1abc7610&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=style&index=0&id=1abc7610&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=style&index=0&id=90fe5fa0&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=style&index=0&id=90fe5fa0&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=style&index=0&id=267dfb50&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=style&index=0&id=267dfb50&scoped=true&lang=css&\""],"sourceRoot":""} \ No newline at end of file diff --git a/chameleon-client/src/components/SystemTab.vue b/chameleon-client/src/components/SystemTab.vue index 7a3cf033d..e28f7ffa1 100644 --- a/chameleon-client/src/components/SystemTab.vue +++ b/chameleon-client/src/components/SystemTab.vue @@ -82,6 +82,7 @@ 'team_number':this.team_number, 'connection_type':this.connection_type, 'ip':this.ip, + 'netmask':this.netmask, 'gateway':this.gateway, 'hostname':this.hostname}}); } @@ -115,7 +116,7 @@ get: function(){ return this.$store.state.netmask; }, - set: function(){ + set: function(value){ this.$store.commit('netmask',value); } }, @@ -136,7 +137,7 @@ } }, isConnection: function(){ - if(this.connectionType == "DHCP"){ + if(this.connection_type == "DHCP"){ return true } else{ return false diff --git a/chameleon-client/src/store.js b/chameleon-client/src/store.js index 7f43cb0a8..d6682463e 100644 --- a/chameleon-client/src/store.js +++ b/chameleon-client/src/store.js @@ -70,7 +70,7 @@ export const store = new Vuex.Store({ connection_type: set('connection_type'), ip: set('ip'), netmask: set('netmask'), - gateWay : set('gateway'), + gateway : set('gateway'), hostname : set('hostname'), is_binary: set('is_binary'), cameraList : set('cameraList'), @@ -102,7 +102,7 @@ export const store = new Vuex.Store({ connection_type: state => state.connectionType, ip: state => state.ip, netmask: state => state.netmask, - gateWay: state => state.gateWay, + gateway: state => state.gateway, hostname: state => state.hostName, is_binary: state => state.is_binary, cameraList: state => state.cameraList, From 514403bd64e72abc40edf41969b8f8e1a355012f Mon Sep 17 00:00:00 2001 From: ori Date: Tue, 20 Aug 2019 13:33:32 -0700 Subject: [PATCH 16/17] removed prepaend from hostname --- backend/app/site/index.html | 2 +- backend/app/site/js/app.894d02a9.js | 2 ++ backend/app/site/js/app.894d02a9.js.map | 1 + chameleon-client/src/components/SystemTab.vue | 1 - 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 backend/app/site/js/app.894d02a9.js create mode 100644 backend/app/site/js/app.894d02a9.js.map diff --git a/backend/app/site/index.html b/backend/app/site/index.html index 8f0a9d475..2a000f9bf 100644 --- a/backend/app/site/index.html +++ b/backend/app/site/index.html @@ -1 +1 @@ -Chameleon Vision
\ No newline at end of file +Chameleon Vision
\ No newline at end of file diff --git a/backend/app/site/js/app.894d02a9.js b/backend/app/site/js/app.894d02a9.js new file mode 100644 index 000000000..bb58211ac --- /dev/null +++ b/backend/app/site/js/app.894d02a9.js @@ -0,0 +1,2 @@ +(function(t){function e(e){for(var s,r,o=e[0],l=e[1],u=e[2],p=0,m=[];p\n \n \n

{{title.charAt(0).toUpperCase() + title.slice(1)}} :

\n \n \n \n {{item}}\n \n \n
\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-select.vue?vue&type=template&id=c9ee7642&\"\nimport script from \"./ch-select.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-select.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-select.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports"," \n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=69465486&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Layout',{attrs:{\"id\":\"main-layout\"}},[_c('Header',{attrs:{\"id\":\"main-header\"}},[_c('Row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('Col',{attrs:{\"span\":\"12\"}},[_c('chselect',{attrs:{\"title\":\"camera\",\"list\":_vm.cameraList,\"Xkey\":\"curr_camera\"}})],1),_c('Col',{attrs:{\"span\":\"12\"}},[_c('chselect',{attrs:{\"title\":\"pipline\",\"list\":_vm.pipelineList,\"Xkey\":\"curr_pipeline\"}})],1)],1)],1),_c('Content',{attrs:{\"id\":\"main-content\"}},[_c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"top\",\"gutter\":5}},[_c('Col',{attrs:{\"span\":\"12\"}},[_c('router-view')],1),_c('Col',{attrs:{\"span\":\"12\"}},[_c('Tabs',{attrs:{\"animated\":false},on:{\"on-click\":_vm.handleImage},model:{value:(_vm.isBinary),callback:function ($$v) {_vm.isBinary=$$v},expression:\"isBinary\"}},[_c('TabPane',{attrs:{\"label\":\"Normal\"}}),_c('TabPane',{attrs:{\"label\":\"Threshold\"}})],1),_c('img',{staticClass:\"imageSize\",attrs:{\"src\":_vm.steamAdress}}),_c('h4',{staticClass:\"pointText\"},[_vm._v(_vm._s(_vm.point))])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Vision.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Vision.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Vision.vue?vue&type=template&id=2db2bf31&\"\nimport script from \"./Vision.vue?vue&type=script&lang=js&\"\nexport * from \"./Vision.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Vision.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Layout',{attrs:{\"id\":\"main-layout\"}},[_c('Content',{attrs:{\"id\":\"main-content\"}},[_c('router-view')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Settings.vue?vue&type=template&id=033196b2&scoped=true&\"\nimport script from \"./Settings.vue?vue&type=script&lang=js&\"\nexport * from \"./Settings.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"033196b2\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"InputTab\"}},[_c('chslider',{staticClass:\"spacing\",attrs:{\"title\":\"exposure\",\"Xkey\":\"exposure\"}}),_c('chslider',{staticClass:\"spacing\",attrs:{\"title\":\"Brightness\",\"Xkey\":\"brightness\"}}),_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Orientation\",\"Xkey\":\"orientation\",\"list\":['Normal','Inverted']}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{staticStyle:{\"text-align\":\"left\"},attrs:{\"span\":\"4\"}},[_c('InputNumber',{staticStyle:{\"align-self\":\"flex-start\"},attrs:{\"size\":\"small\"},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1),_c('Col',{attrs:{\"span\":\"14\"}},[_c('Slider',{on:{\"on-input\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-slider.vue?vue&type=template&id=7e5a6bfa&\"\nimport script from \"./ch-slider.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-slider.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-slider.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{attrs:{\"span\":\"4\"}},[_c('i-select',{attrs:{\"size\":\"small\"},on:{\"on-change\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}},_vm._l((_vm.list),function(item,index){return _c('i-option',{key:index,attrs:{\"value\":index}},[_vm._v(_vm._s(item))])}),1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-IndexSelect.vue?vue&type=template&id=2c264cc6&\"\nimport script from \"./ch-IndexSelect.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-IndexSelect.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-IndexSelect.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n \n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./InputTab.vue?vue&type=template&id=285b7205&scoped=true&\"\nimport script from \"./InputTab.vue?vue&type=script&lang=js&\"\nexport * from \"./InputTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./InputTab.vue?vue&type=style&index=0&id=285b7205&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"285b7205\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"Threshold\"}},[_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Hue\",\"Xkey\":\"hue\",\"maximum\":180}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Saturation\",\"Xkey\":\"saturation\",\"maximum\":255}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Value\",\"Xkey\":\"value\",\"maximum\":255}}),_c('chswitch',{staticClass:\"spacing\",attrs:{\"title\":\"Erode\",\"Xkey\":\"erode\"}}),_c('chswitch',{staticClass:\"spacing\",attrs:{\"title\":\"Dilate\",\"Xkey\":\"dilate\"}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{staticStyle:{\"text-align\":\"left\"},attrs:{\"span\":\"4\"}},[_c('InputNumber',{staticStyle:{\"align-self\":\"flex-start\"},attrs:{\"size\":\"small\",\"step\":_vm.steps},model:{value:(_vm.value[0]),callback:function ($$v) {_vm.$set(_vm.value, 0, $$v)},expression:\"value[0]\"}})],1),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Slider',{attrs:{\"range\":\"\",\"step\":_vm.steps,\"max\":_vm.maximum},on:{\"on-input\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1),_c('Col',{staticStyle:{\"text-align\":\"right\"},attrs:{\"span\":\"4\"}},[_c('InputNumber',{staticStyle:{\"align-self\":\"flex-end\"},attrs:{\"size\":\"small\",\"step\":_vm.steps,\"max\":_vm.maximum},model:{value:(_vm.value[1]),callback:function ($$v) {_vm.$set(_vm.value, 1, $$v)},expression:\"value[1]\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-range.vue?vue&type=template&id=a3c890c4&\"\nimport script from \"./ch-range.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-range.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ch-range.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(_vm._s(_vm.title.charAt(0).toUpperCase() + _vm.title.slice(1))+\" :\")])]),_c('Col',{staticStyle:{\"text-align\":\"left\"},attrs:{\"span\":\"4\"}},[_c('i-switch',{staticStyle:{\"align-self\":\"flex-start\"},on:{\"on-change\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-switch.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-switch.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-switch.vue?vue&type=template&id=182635d8&scoped=true&\"\nimport script from \"./ch-switch.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-switch.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"182635d8\",\n null\n \n)\n\nexport default component.exports","\n \n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ThresholdTab.vue?vue&type=template&id=267dfb50&scoped=true&\"\nimport script from \"./ThresholdTab.vue?vue&type=script&lang=js&\"\nexport * from \"./ThresholdTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThresholdTab.vue?vue&type=style&index=0&id=267dfb50&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"267dfb50\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"SystemTab\"}},[_c('div',[_c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('Col',{attrs:{\"span\":\"6\"}},[_c('h4',[_vm._v(\"Team Number:\")])]),_c('col',{attrs:{\"span\":\"4\"}}),_c('InputNumber',{attrs:{\"min\":0,\"size\":\"small\"},model:{value:(_vm.team_number),callback:function ($$v) {_vm.team_number=$$v},expression:\"team_number\"}})],1)],1),_c('Divider',{staticClass:\"divdiv\",attrs:{\"orientation\":\"left\"}},[_vm._v(\"Networking\")]),_c('div',[_c('RadioGroup',{staticStyle:{\"display\":\"flex\"},model:{value:(_vm.connection_type),callback:function ($$v) {_vm.connection_type=$$v},expression:\"connection_type\"}},[_c('Radio',{attrs:{\"label\":\"DHCP\"}}),_c('Radio',{attrs:{\"label\":\"Static\"}})],1),_c('div',{staticClass:\"ipSettings\"},[_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"IP:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\",\"disabled\":_vm.isConnection},model:{value:(_vm.ip),callback:function ($$v) {_vm.ip=$$v},expression:\"ip\"}})],1)],1),_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Netmask:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\",\"disabled\":_vm.isConnection},model:{value:(_vm.netmask),callback:function ($$v) {_vm.netmask=$$v},expression:\"netmask\"}})],1)],1),_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Gateway:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\",\"disabled\":_vm.isConnection},model:{value:(_vm.gateway),callback:function ($$v) {_vm.gateway=$$v},expression:\"gateway\"}})],1)],1),_c('row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Hostname:\")])]),_c('Col',{attrs:{\"span\":\"10\"}},[_c('Input',{attrs:{\"size\":\"small\"},model:{value:(_vm.hostname),callback:function ($$v) {_vm.hostname=$$v},expression:\"hostname\"}},[_c('span',{attrs:{\"slot\":\"append\"},slot:\"append\"},[_vm._v(\".local\")])])],1)],1)],1),_c('Divider',{staticClass:\"divdiv\",attrs:{\"orientation\":\"left\"}}),_c('row',{staticStyle:{\"margin-top\":\"20px\"},attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\"}},[_c('Button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.socketSendAll}},[_vm._v(\"Save Changes and Restart\")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"InputNumber\"}},[_c('row',{attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('Col',{attrs:{\"span\":\"6\"}},[_c('h4',[_vm._v(_vm._s(_vm.title))])]),_c('col',{attrs:{\"span\":\"4\"}}),_c('InputNumber',{attrs:{\"min\":0,\"size\":\"small\"},on:{\"on-change\":_vm.handleInput},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-inputNumber.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-inputNumber.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ch-inputNumber.vue?vue&type=template&id=672703df&scoped=true&\"\nimport script from \"./ch-inputNumber.vue?vue&type=script&lang=js&\"\nexport * from \"./ch-inputNumber.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"672703df\",\n null\n \n)\n\nexport default component.exports","\n\n \n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SystemTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SystemTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SystemTab.vue?vue&type=template&id=bf05131c&\"\nimport script from \"./SystemTab.vue?vue&type=script&lang=js&\"\nexport * from \"./SystemTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SystemTab.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"spacing\",attrs:{\"id\":\"cameraTab\"}},[_c('chselect',{attrs:{\"title\":\"select camera\",\"list\":_vm.cameraList,\"Xkey\":\"curr_camera\"}}),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Resolution:\")])]),_c('Col',{attrs:{\"span\":\"4\"}},[_c('i-select',{attrs:{\"size\":\"small\"},model:{value:(_vm.resolution),callback:function ($$v) {_vm.resolution=$$v},expression:\"resolution\"}},_vm._l((_vm.resolutionList),function(item,index){return _c('i-option',{key:index,attrs:{\"value\":index}},[_vm._v(_vm._s(item))])}),1)],1)],1),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":1}},[_c('Col',{attrs:{\"span\":\"4\"}},[_c('h4',[_vm._v(\"Diagonal FOV:\")])]),_c('Col',{attrs:{\"span\":\"4\"}},[_c('InputNumber',{attrs:{\"min\":0,\"size\":\"small\"},model:{value:(_vm.FOV),callback:function ($$v) {_vm.FOV=$$v},expression:\"FOV\"}})],1)],1),_c('Button',{staticClass:\"buttonClass spacing\",attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.socketSendAll}},[_vm._v(\"Save settings to current camera\")]),_c('h4',{staticClass:\"spacing\"},[_vm._v(\"Please Restart the computer Manually after saving all cameras\")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CameraTab.vue?vue&type=template&id=4d25b2ea&scoped=true&\"\nimport script from \"./CameraTab.vue?vue&type=script&lang=js&\"\nexport * from \"./CameraTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CameraTab.vue?vue&type=style&index=0&id=4d25b2ea&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4d25b2ea\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"ContourTab\"}},[_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Area\",\"Xkey\":\"area\"}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Ratio (W/H)\",\"Xkey\":\"ratio\",\"steps\":0.1}}),_c('chrange',{staticClass:\"spacing\",attrs:{\"title\":\"Extent\",\"Xkey\":\"extent\"}}),_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Target Group\",\"Xkey\":\"target_group\",\"list\":['Single','Dual','Triple','Quadruple','Quintuple']}}),_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Target Intersaction\",\"Xkey\":\"target_intersection\",\"list\":['Up','Down','Left','Right','Parallel'],\"isDisabled\":_vm.isSingle}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./contourTab.vue?vue&type=template&id=90fe5fa0&scoped=true&\"\nimport script from \"./contourTab.vue?vue&type=script&lang=js&\"\nexport * from \"./contourTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./contourTab.vue?vue&type=style&index=0&id=90fe5fa0&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"90fe5fa0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"OutputTab\"}},[_c('chselect',{staticClass:\"spacing\",attrs:{\"title\":\"Sort Mode\",\"Xkey\":\"sort_mode\",\"list\":['Largest','Smallest','Highest','Lowest','Rightmost','Leftmost','Closest']}}),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"justify\":\"start\",\"align\":\"middle\",\"gutter\":10}},[_c('col'),_c('Button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.takePointA}},[_vm._v(\"Take Point A\")]),_c('col',{staticStyle:{\"margin-left\":\"10px\"}}),_c('Button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.takePointB}},[_vm._v(\"Take Point B\")])],1),_c('Row',{staticClass:\"spacing\",attrs:{\"type\":\"flex\",\"align\":\"middle\",\"gutter\":10}},[_c('col'),_c('Button',{attrs:{\"type\":\"warning\",\"size\":\"small\"},on:{\"click\":_vm.clearPoints}},[_vm._v(\"Clear All Points\")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./outputTab.vue?vue&type=template&id=1abc7610&scoped=true&\"\nimport script from \"./outputTab.vue?vue&type=script&lang=js&\"\nexport * from \"./outputTab.vue?vue&type=script&lang=js&\"\nimport style0 from \"./outputTab.vue?vue&type=style&index=0&id=1abc7610&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1abc7610\",\n null\n \n)\n\nexport default component.exports","import VueRouter from \"vue-router\";\nimport Vision from \"./components/Vision.vue\"\nimport Setting from \"./components/Settings.vue\"\nimport Input from \"./components/InputTab.vue\";\nimport Threshold from \"./components/ThresholdTab.vue\";\nimport System from \"./components/SystemTab.vue\";\nimport Camera from \"./components/CameraTab.vue\";\nimport Contours from \"./components/contourTab.vue\";\nimport Output from './components/outputTab.vue'\n\nconst routes = [\n { path: '/', redirect: '/vision/input'},\n { path: '/vision', component: Vision, children: [\n { path: 'input', component: Input },\n { path: 'threshold', component: Threshold },\n { path: 'contours', component: Contours },\n { path: 'output', component: Output },\n ]},\n { path: '/settings', component: Setting, children: [\n { path: 'system', component: System },\n { path: 'camera', component: Camera }\n ]}\n]\n\nconst router = new VueRouter({\n routes\n})\n\nexport default router;","import Vue from 'vue'\nimport Vuex from 'vuex'\n\nVue.use(Vuex);\nconst set = key => (state,val) =>{\n state[key] = val\n};\nexport const store = new Vuex.Store({\n\n state:{\n //header\n curr_camera:\"\",\n curr_pipeline:\"\",\n cameraList:[],\n pipelineList:[],\n //input\n exposure:54,\n brightness:0,\n orientation:0,\n resolution:0,\n resolutionList:[],\n FOV:0,\n //threshold\n hue:[0,10],\n saturation:[0,10],\n value:[0,10],\n erode: false,\n dilate: false,\n //contours\n area:[0,100],\n ratio:[0,20],\n extent:[0,100],\n sort_mode:'Largest', \n target_group:'Single', \n target_intersection:'Up',\n //Settings\n team_number:0,\n connection_type:\"DHCP\",\n ip:\"\",\n gateway:\"\",\n netmask:\"\",\n hostname:\"\",\n //live info\n port:1181,\n is_binary:0,\n //points\n raw_point:[],\n point:{}\n\n },\n mutations:{\n curr_camera (state,value){\n state['curr_camera'] = value;\n state['pipeline'] = \"0\";\n },\n curr_pipeline: set('curr_pipeline'),\n brightness: set('brightness'),\n exposure: set('exposure'),\n orientation:set('orientation'),\n resolution: set('resolution'),\n hue: set('hue'),\n saturation: set('saturation'),\n value: set('value'),\n erode: set('erode'),\n dilate: set('dilate'),\n area: set('area'),\n ratio: set('ratio'),\n extent: set('extent'),\n team_number: set('team_number'),\n connection_type: set('connection_type'),\n ip: set('ip'),\n netmask: set('netmask'),\n gateway : set('gateway'),\n hostname : set('hostname'),\n is_binary: set('is_binary'),\n cameraList : set('cameraList'),\n pipelineList: set('piplineList'),\n sort_mode: set('sort_mode'),\n target_group:set('target_group'),\n target_intersection:set('target_intersection'),\n FOV:set('FOV'),\n port:set('port'),\n raw_point:set('raw_point'),\n point:set('point')\n },\n getters:{\n curr_camera: state => state.curr_camera,\n curr_pipeline: state => state.curr_pipeline,\n brightness: state => state.brightness,\n exposure: state => state.exposure,\n orientation: state => state.orientation,\n resolution: state => state.resolution,\n hue: state => state.hue,\n saturation: state => state.saturation,\n value: state => state.value,\n erode: state => state.dilate,\n dilate: state => state.dilate,\n area: state =>state.area,\n ratio: state =>state.ratio,\n extent: state =>state.extent,\n team_number: state => state.teamValue,\n connection_type: state => state.connectionType,\n ip: state => state.ip,\n netmask: state => state.netmask,\n gateway: state => state.gateway,\n hostname: state => state.hostName,\n is_binary: state => state.is_binary,\n cameraList: state => state.cameraList,\n pipelineList: state => state.pipelineList,\n sort_mode: state => state.sort_mode,\n target_group: state => state.target_group,\n target_intersection: state => state.target_intersection,\n FOV: state => state.FOV,\n port: state => state.port,\n raw_point:state => state.raw_point,\n point: state => state.point\n\n },\n});","import Vue from 'vue'\nimport App from './App.vue'\nimport VueRouter from 'vue-router'\nimport iView from 'iview';\nimport router from \"./routes\";\nimport '../theme/index.less';\nimport VueNativeSock from 'vue-native-websocket';\nimport locale from 'iview/dist/locale/en-US';\nimport {store} from './store'\n\nVue.use(VueRouter);\nVue.use(iView , { locale });\nVue.use(VueNativeSock,'ws://'+location.hostname+':8888/websocket',{format:'JSON'});\nVue.config.productionTip = false\n\nnew Vue({\n router,\n store,\n render: h => h(App)\n}).$mount('#app')\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=style&index=0&id=4d25b2ea&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CameraTab.vue?vue&type=style&index=0&id=4d25b2ea&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=style&index=0&id=1abc7610&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./outputTab.vue?vue&type=style&index=0&id=1abc7610&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=style&index=0&id=90fe5fa0&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./contourTab.vue?vue&type=style&index=0&id=90fe5fa0&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-IndexSelect.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-select.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-slider.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ch-range.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=style&index=0&id=267dfb50&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThresholdTab.vue?vue&type=style&index=0&id=267dfb50&scoped=true&lang=css&\""],"sourceRoot":""} \ No newline at end of file diff --git a/chameleon-client/src/components/SystemTab.vue b/chameleon-client/src/components/SystemTab.vue index e28f7ffa1..d5cfda58f 100644 --- a/chameleon-client/src/components/SystemTab.vue +++ b/chameleon-client/src/components/SystemTab.vue @@ -47,7 +47,6 @@ - http://Chameleon-Vision- .local From b3d3264dff26bddadb54d48b2a9f02470fb92dd1 Mon Sep 17 00:00:00 2001 From: ori agranat Date: Tue, 20 Aug 2019 23:39:03 +0300 Subject: [PATCH 17/17] fully integrated ip handler --- backend/app/classes/SettingsManager.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index 06f3678ce..8a64acef2 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -194,11 +194,8 @@ class SettingsManager(metaclass=Singleton): if key in self.default_general_settings.keys(): self.general_settings[key] = dic['change_general_settings_values'][key] self.save_settings() - + subprocess.call(['reboot']) # after all values has been set change settings - ChangeIP(connection_type=self.general_settings['connection_type'] ,hostname=self.general_settings['hostname'], - ip=self.general_settings['ip'], netmask=self.general_settings['netmask'], - gateway=self.general_settings['gateway'])