diff --git a/src/py/bbctrl/Config.py b/src/py/bbctrl/Config.py index 3395189..7f20fb6 100644 --- a/src/py/bbctrl/Config.py +++ b/src/py/bbctrl/Config.py @@ -29,6 +29,8 @@ class Config(object): self.log.exception( 'Internal error: Failed to load config template') + self.reload() + def load(self): path = self.ctrl.get_path('config.json') diff --git a/src/py/bbctrl/Ctrl.py b/src/py/bbctrl/Ctrl.py index f9b8247..68c52d9 100644 --- a/src/py/bbctrl/Ctrl.py +++ b/src/py/bbctrl/Ctrl.py @@ -32,7 +32,7 @@ class Ctrl(object): self.mach = bbctrl.Mach(self, self.avr) self.preplanner = bbctrl.Preplanner(self) if not args.demo: - self.jog = bbctrl.Jog(self) + self.gamepadSupport = bbctrl.GamepadSupport(self) self.pwr = bbctrl.Pwr(self) self.mach.connect() diff --git a/src/py/bbctrl/Jog.py b/src/py/bbctrl/GamepadSupport.py similarity index 76% rename from src/py/bbctrl/Jog.py rename to src/py/bbctrl/GamepadSupport.py index 162602e..98642a8 100644 --- a/src/py/bbctrl/Jog.py +++ b/src/py/bbctrl/GamepadSupport.py @@ -4,7 +4,6 @@ from evdev.ecodes import EV, EV_ABS, EV_KEY import errno import evdev import functools -import hashlib import json import os import pyudev @@ -14,16 +13,16 @@ import typing userGamepadConfigs = {} -gamepadConfigs = { +factoryGamepadConfigs = { "default": { "sign-x": 1, "sign-y": -1, "sign-z": -1, "deadband": 0.15, "debug": False, + "type": "XBOX", }, - "9E2B3A63": { - "description": "Logitech 710, X mode", + "XBOX": { "EV_KEY:308": "speed-4", "EV_KEY:305": "speed-3", "EV_KEY:304": "speed-2", @@ -38,8 +37,7 @@ gamepadConfigs = { "EV_ABS:2": "lock-y", "EV_ABS:5": "lock-x", }, - "B98EF4EC": { - "description": "Logitech 710, D mode", + "PLAYSTATION": { "EV_KEY:307": "speed-4", "EV_KEY:306": "speed-3", "EV_KEY:305": "speed-2", @@ -54,24 +52,7 @@ gamepadConfigs = { "EV_KEY:310": "lock-y", "EV_KEY:311": "lock-x", }, - "268256FD": { - "description": "EasySMX ESM-9013, top lights mode", - "EV_KEY:308": "speed-4", - "EV_KEY:305": "speed-3", - "EV_KEY:304": "speed-2", - "EV_KEY:307": "speed-1", - "EV_ABS:0": "axis-x", - "EV_ABS:16": "axis-x", - "EV_ABS:1": "axis-y", - "EV_ABS:17": "axis-y", - "EV_ABS:4": "axis-z", - "EV_KEY:310": "lock-y", - "EV_KEY:311": "lock-x", - "EV_ABS:2": "lock-y", - "EV_ABS:5": "lock-x", - }, - "23CEC0CB": { - "description": "EasySMX ESM-9013, left lights mode", + "SMX-LEFT": { "EV_KEY:304": "speed-4", "EV_KEY:305": "speed-3", "EV_KEY:306": "speed-2", @@ -86,8 +67,7 @@ gamepadConfigs = { "EV_KEY:310": "lock-y", "EV_KEY:311": "lock-x", }, - "370DCB72": { - "description": "EasySMX ESM-9013, bottom lights mode", + "SMX-BOTTOM": { "EV_KEY:308": "speed-4", "EV_KEY:305": "speed-3", "EV_KEY:304": "speed-2", @@ -102,117 +82,77 @@ gamepadConfigs = { "EV_KEY:312": "lock-y", "EV_KEY:313": "lock-x", }, - "0BD0841F": { - "description": "Sony Playstation 4 Dual-Shock Controller", - "EV_KEY:307": "speed-4", - "EV_KEY:306": "speed-3", - "EV_KEY:305": "speed-2", - "EV_KEY:304": "speed-1", - "EV_ABS:0": "axis-x", - "EV_ABS:16": "axis-x", - "EV_ABS:1": "axis-y", - "EV_ABS:17": "axis-y", - "EV_ABS:5": "axis-z", - "EV_KEY:308": "lock-y", - "EV_KEY:309": "lock-x", - "EV_KEY:310": "lock-y", - "EV_KEY:311": "lock-x", - }, - "D09463DD": { - "description": "Sony Playstation 5 Controller", - "EV_KEY:307": "speed-4", - "EV_KEY:306": "speed-3", - "EV_KEY:305": "speed-2", - "EV_KEY:304": "speed-1", - "EV_ABS:0": "axis-x", - "EV_ABS:16": "axis-x", - "EV_ABS:1": "axis-y", - "EV_ABS:17": "axis-y", - "EV_ABS:5": "axis-z", - "EV_KEY:308": "lock-y", - "EV_KEY:309": "lock-x", - "EV_KEY:310": "lock-y", - "EV_KEY:311": "lock-x", - }, - "06656EBD": { - "description": "XBox One Controller", - "EV_KEY:308": "speed-4", - "EV_KEY:305": "speed-3", - "EV_KEY:304": "speed-2", - "EV_KEY:307": "speed-1", - "EV_ABS:0": "axis-x", - "EV_ABS:16": "axis-x", - "EV_ABS:1": "axis-y", - "EV_ABS:17": "axis-y", - "EV_ABS:4": "axis-z", - "EV_KEY:310": "lock-y", - "EV_KEY:311": "lock-x", - "EV_ABS:2": "lock-y", - "EV_ABS:5": "lock-x", - }, - "BFF99E89": { + "045E:02A1": { "description": "XBox 360 Controller", - "EV_KEY:308": "speed-4", - "EV_KEY:305": "speed-3", - "EV_KEY:304": "speed-2", - "EV_KEY:307": "speed-1", - "EV_ABS:0": "axis-x", - "EV_ABS:16": "axis-x", - "EV_ABS:1": "axis-y", - "EV_ABS:17": "axis-y", - "EV_ABS:4": "axis-z", - "EV_KEY:310": "lock-y", - "EV_KEY:311": "lock-x", - "EV_ABS:2": "lock-y", - "EV_ABS:5": "lock-x", + "type": "XBOX" }, - "4E0C75F7": { - "description": "EasySMX ESM-9100 XBox Controller, top lights mode", - "EV_KEY:308": "speed-4", - "EV_KEY:305": "speed-3", - "EV_KEY:304": "speed-2", - "EV_KEY:307": "speed-1", - "EV_ABS:0": "axis-x", - "EV_ABS:16": "axis-x", - "EV_ABS:1": "axis-y", - "EV_ABS:17": "axis-y", - "EV_ABS:4": "axis-z", - "EV_KEY:310": "lock-y", - "EV_KEY:311": "lock-x", - "EV_ABS:17": "axis-y", - "EV_ABS:4": "axis-z" + "045E:028E": { + "description": "Xbox360 Controller", + "type": "XBOX", }, - "E310BCC0": { - "description": "EasySMX ESM-9100, left lights mode", - "EV_KEY:304": "speed-4", - "EV_KEY:305": "speed-3", - "EV_KEY:306": "speed-2", - "EV_KEY:307": "speed-1", - "EV_ABS:0": "axis-x", - "EV_ABS:16": "axis-x", - "EV_ABS:1": "axis-y", - "EV_ABS:17": "axis-y", - "EV_ABS:5": "axis-z", - "EV_KEY:308": "lock-y", - "EV_KEY:309": "lock-x", - "EV_KEY:310": "lock-y", - "EV_KEY:311": "lock-x", + "045E:028F": { + "description": "Xbox360 Wireless Controller", + "type": "XBOX", }, - "96D2AC48": { + "045E:0B12": { + "description": "XBox One Controller", + "type": "XBOX" + }, + "046D:C216": { + "description": "Logitech F310, D mode", + "type": "PLAYSTATION" + }, + "046D:C216": { + "description": "Logitech F510, D mode", + "type": "PLAYSTATION" + }, + "046D:C219": { + "description": "Logitech F710, D mode", + "type": "PLAYSTATION" + }, + "046D:C21D": { + "description": "Logitech F310, X mode", + "type": "XBOX" + }, + "046D:C21E": { + "description": "Logitech F510, X mode", + "type": "XBOX" + }, + "046D:C21F": { + "description": "Logitech 710, X mode", + "type": "XBOX" + }, + "054C:05C4": { + "description": "Sony Playstation 4 DualShock Controller", + "type": "PLAYSTATION" + }, + "054C:09CC": { + "description": "Sony Playstation 4 DualShock Controller", + "type": "PLAYSTATION" + }, + "054C:0BA0": { + "description": "Sony Playstation 4 DualShock Controller", + "type": "PLAYSTATION" + }, + "054C:0CE6": { + "description": "Sony Playstation 5 DualSense Controller", + "type": "PLAYSTATION" + }, + "11C0:5500": { + "description": "EasySMX ESM-9013, bottom lights mode", + "type": "SMX-BOTTOM" + }, + "11C1:9101": { + "description": "EasySMX ESM-9013, left lights mode", + "type": "SMX-LEFT" + }, + "20BC:5500": { "description": "EasySMX ESM-9100, bottom lights mode", - "EV_KEY:308": "speed-4", - "EV_KEY:305": "speed-3", - "EV_KEY:304": "speed-2", - "EV_KEY:307": "speed-1", - "EV_ABS:0": "axis-x", - "EV_ABS:16": "axis-x", - "EV_ABS:1": "axis-y", - "EV_ABS:17": "axis-y", - "EV_ABS:5": "axis-z", - "EV_KEY:310": "lock-y", - "EV_KEY:311": "lock-x", - "EV_KEY:312": "lock-y", - "EV_KEY:313": "lock-x", + "type": "SMX-BOTTOM" + }, + "20BC:9100": { + "description": "EasySMX ESM-9100, left lights mode", + "type": "SMX-LEFT" }, } @@ -254,6 +194,25 @@ def processCapabilities(capabilities): return result +def loadConfig(id): + config = { + **factoryGamepadConfigs.get("default"), + **userGamepadConfigs.get("default", {}), + **factoryGamepadConfigs.get(id, {}), + **userGamepadConfigs.get(id, {}) + } + + while "type" in config: + type = config.pop("type") + config = { + **factoryGamepadConfigs.get(type, {}), + **userGamepadConfigs.get(type, {}), + **config, + } + + return config + + # A forward declaration, so Command can reference it class Gamepad(object): pass @@ -298,15 +257,11 @@ class Gamepad(object): for key in _udev.properties} } - json = sorted_json(self._details["evdev"]) - self.hash = hashlib.sha256(json.encode()).hexdigest()[-8:].upper() + self.id = "{:04X}:{:04X}".format(_evdev.info.vendor, + _evdev.info.product) + self.config = loadConfig(self.id) - self.config = { - **gamepadConfigs.get("default"), - **userGamepadConfigs.get("default", {}), - **gamepadConfigs.get(self.hash, {}), - **userGamepadConfigs.get(self.hash, {}) - } + self.log("Configuration Settings: {}".format(self.config)) def read(self): return self._evdev.read() @@ -374,7 +329,7 @@ class Gamepad(object): return round(value, 3) def log(self, msg): - self._log.info("{}: {}".format(self.hash, msg)) + self._log.info("{}: {}".format(self.id, msg)) def logOnce(self, msg): if self.config.get("debug") or msg not in self._logOnceRecord: @@ -390,11 +345,11 @@ class Gamepad(object): "devicePath": self.devicePath, "bustype": self._evdev.info.bustype, "details": self._details, - "hash": self.hash + "id": self.id }) -class Jog(object): +class GamepadSupport(object): gamepads = {} # type: dict[typing.Union[int, str], Gamepad] lock = {"x": False, "y": False} axes = {"x": 0, "y": 0, "z": 0} @@ -419,8 +374,9 @@ class Jog(object): global userGamepadConfigs userGamepadConfigs = json.load(f) except: + self.log.info("Failed to read 'gamepads.json':") self.log.info(traceback.format_exc()) - self.log.info("Failed to read 'gamepads.json'") + userGamepadConfigs = {} def _startMonitoring(self): self.udev_context = pyudev.Context() @@ -465,6 +421,8 @@ class Jog(object): self._listen("/dev/input/{}".format(match.group())) def _listen(self, devicePath: str): + self._refreshDefaultGamepadType() + gamepad = Gamepad( self.log, evdev.InputDevice(devicePath), pyudev.Devices.from_device_file(self.udev_context, devicePath)) @@ -558,6 +516,18 @@ class Jog(object): def _processDisabled(self, command: Command): pass + def _refreshDefaultGamepadType(self): + defaultGamepadType = self.ctrl.config.get("gamepad-default-type") + + if defaultGamepadType is not None: + default = factoryGamepadConfigs.get("default", {}) + default["type"] = defaultGamepadType + factoryGamepadConfigs["default"] = default + + default = userGamepadConfigs.get("default") + if default is not None: + default.pop("type", None) + def _updateJogging(self): try: if not self.changed: diff --git a/src/py/bbctrl/__init__.py b/src/py/bbctrl/__init__.py index d80df7a..d64bc26 100644 --- a/src/py/bbctrl/__init__.py +++ b/src/py/bbctrl/__init__.py @@ -14,7 +14,7 @@ from bbctrl.FileHandler import FileHandler from bbctrl.Config import Config from bbctrl.Mach import Mach from bbctrl.Web import Web -from bbctrl.Jog import Jog +from bbctrl.GamepadSupport import GamepadSupport from bbctrl.Ctrl import Ctrl from bbctrl.Pwr import Pwr from bbctrl.I2C import I2C diff --git a/src/resources/config-template.json b/src/resources/config-template.json index fad50fb..ede895f 100644 --- a/src/resources/config-template.json +++ b/src/resources/config-template.json @@ -1,540 +1,705 @@ { - "settings": { - "units": { - "type": "enum", - "values": ["METRIC", "IMPERIAL"], - "default": "METRIC" - }, - "max-deviation": { - "help": - "Default allowed deviation from programmed path. Also see G64 & G61.", - "type": "float", - "min": 0.05, - "max": 100, - "unit": "mm", - "default": 0.1 - }, - "junction-accel": { - "help": - "Higher values will increasing cornering speed but may cause stalls.", - "type": "float", - "min": 10000, - "max": 100000000, - "unit": "mm/min²", - "default": 200000 - } - }, - - "motors": { - "type": "list", - "index": "0123", - "default": [ - {"axis": "X"}, - {"axis": "Y"}, - {"axis": "Z"}, - {"axis": "A"} - ], - "template": { - "general": { - "axis": { - "type": "enum", - "values": ["X", "Y", "Z", "A", "B", "C"], - "default": "X", - "code": "an" + "settings": { + "units": { + "type": "enum", + "values": [ + "METRIC", + "IMPERIAL" + ], + "default": "METRIC" + }, + "max-deviation": { + "help": "Default allowed deviation from programmed path. Also see G64 & G61.", + "type": "float", + "min": 0.05, + "max": 100, + "unit": "mm", + "default": 0.1 + }, + "junction-accel": { + "help": "Higher values will increasing cornering speed but may cause stalls.", + "type": "float", + "min": 10000, + "max": 100000000, + "unit": "mm/min²", + "default": 200000 + }, + "gamepad-default-type": { + "help": "When a gamepad is not recognized, treat it as the selected type of gamepad.", + "type": "enum", + "values": [ + { + "title": "XBox", + "value": "XBOX" + }, + { + "title": "Playstation", + "value": "PLAYSTATION" + }, + { + "title": "SMX Left-lights mode", + "value": "SMX-LEFT" + }, + { + "title": "SMX Bottom-lights mode", + "value": "SMX-BOTTOM" + } + ], + "default": "XBOX" } - }, - - "power": { - "enabled": { - "type": "bool", - "default": true, - "code": "me" - }, - "drive-current": { - "type": "float", - "min": 0, - "max": 6, - "unit": "amps", - "default": 1.5, - "code": "dc" - }, - "idle-current": { - "type": "float", - "min": 0, - "max": 2, - "unit": "amps", - "default": 0, - "code": "ic" + }, + "motors": { + "type": "list", + "index": "0123", + "default": [ + { + "axis": "X" + }, + { + "axis": "Y" + }, + { + "axis": "Z" + }, + { + "axis": "A" + } + ], + "template": { + "general": { + "axis": { + "type": "enum", + "values": [ + "X", + "Y", + "Z", + "A", + "B", + "C" + ], + "default": "X", + "code": "an" + } + }, + "power": { + "enabled": { + "type": "bool", + "default": true, + "code": "me" + }, + "drive-current": { + "type": "float", + "min": 0, + "max": 6, + "unit": "amps", + "default": 1.5, + "code": "dc" + }, + "idle-current": { + "type": "float", + "min": 0, + "max": 2, + "unit": "amps", + "default": 0, + "code": "ic" + } + }, + "motion": { + "reverse": { + "type": "bool", + "default": false, + "code": "rv" + }, + "microsteps": { + "type": "int", + "values": [ + 1, + 2, + 4, + 8, + 16, + 32, + 64, + 128, + 256 + ], + "unit": "per full step", + "default": 32, + "code": "mi" + }, + "max-velocity": { + "type": "float", + "min": 0, + "unit": "m/min", + "iunit": "IPM", + "scale": 0.0254, + "default": 5, + "code": "vm" + }, + "max-accel": { + "type": "float", + "min": 0, + "unit": "km/min²", + "iunit": "g-force", + "scale": 35.304, + "default": 10, + "code": "am" + }, + "max-jerk": { + "type": "float", + "min": 0, + "unit": "km/min³", + "iunit": "g/min", + "scale": 35.304, + "default": 50, + "code": "jm" + }, + "step-angle": { + "type": "float", + "min": 0, + "max": 360, + "step": 0.1, + "unit": "degrees", + "default": 1.8, + "code": "sa" + }, + "travel-per-rev": { + "type": "float", + "unit": "mm", + "iunit": "in", + "scale": 25.4, + "default": 5, + "code": "tr" + } + }, + "limits": { + "min-soft-limit": { + "type": "float", + "unit": "mm", + "iunit": "in", + "scale": 25.4, + "default": 0, + "code": "tn" + }, + "max-soft-limit": { + "type": "float", + "unit": "mm", + "iunit": "in", + "scale": 25.4, + "default": 0, + "code": "tm" + }, + "min-switch": { + "type": "enum", + "values": [ + "disabled", + "normally-open", + "normally-closed" + ], + "default": "disabled", + "code": "ls", + "pins": [ + 3, + 5, + 9, + 11 + ] + }, + "max-switch": { + "type": "enum", + "values": [ + "disabled", + "normally-open", + "normally-closed" + ], + "default": "disabled", + "code": "xs", + "pins": [ + 4, + 8, + 10, + 12 + ] + } + }, + "homing": { + "homing-mode": { + "type": "enum", + "values": [ + "manual", + "switch-min", + "switch-max", + "stall-min", + "stall-max" + ], + "default": "manual", + "code": "ho" + }, + "stall-microstep": { + "type": "int", + "values": [ + 2, + 4, + 8, + 16, + 32, + 64, + 128, + 256 + ], + "unit": "per full step", + "default": 8, + "code": "lm", + "hmodes": [ + "stall-min", + "stall-max" + ] + }, + "search-velocity": { + "type": "float", + "min": 0, + "unit": "m/min", + "iunit": "IPM", + "scale": 0.0254, + "default": 0.5, + "code": "sv", + "hmodes": [ + "switch-min", + "switch-max", + "stall-min", + "stall-max" + ] + }, + "latch-velocity": { + "type": "float", + "min": 0, + "unit": "m/min", + "iunit": "IPM", + "scale": 0.0254, + "default": 0.1, + "code": "lv", + "hmodes": [ + "switch-min", + "switch-max" + ] + }, + "latch-backoff": { + "type": "float", + "min": 0, + "unit": "mm", + "iunit": "in", + "scale": 25.4, + "default": 100, + "code": "lb", + "hmodes": [ + "switch-min", + "switch-max" + ] + }, + "stall-volts": { + "type": "float", + "min": 0, + "unit": "v", + "default": 6, + "code": "tv", + "hmodes": [ + "stall-min", + "stall-max" + ] + }, + "stall-sample-time": { + "type": "int", + "values": [ + 50, + 100, + 200, + 300, + 400, + 600, + 800, + 1000 + ], + "default": 50, + "unit": "µsec", + "code": "sp", + "hmodes": [ + "stall-min", + "stall-max" + ] + }, + "stall-current": { + "type": "float", + "min": 0, + "unit": "amps", + "default": 1.5, + "code": "tc", + "hmodes": [ + "stall-min", + "stall-max" + ] + }, + "zero-backoff": { + "type": "float", + "min": 0, + "unit": "mm", + "iunit": "in", + "scale": 25.4, + "default": 5, + "code": "zb", + "hmodes": [ + "switch-min", + "switch-max", + "stall-min", + "stall-max" + ] + } + } } - }, - - "motion": { - "reverse": { - "type": "bool", - "default": false, - "code": "rv" + }, + "tool": { + "selected-tool": { + "type": "string", + "default": "disabled" }, - "microsteps": { - "type": "int", - "values": [1, 2, 4, 8, 16, 32, 64, 128, 256], - "unit": "per full step", - "default": 32, - "code": "mi" + "tool-type": { + "type": "enum", + "values": [ + "Disabled", + "PWM Spindle", + "Huanyang VFD", + "Custom Modbus VFD", + "AC-Tech VFD", + "Nowforever VFD", + "Delta VFD015M21A (Beta)", + "YL600, YL620, YL620-A VFD (Beta)", + "FR-D700 (Beta)", + "Sunfar E300 (Beta)", + "OMRON MX2" + ], + "default": "Disabled", + "code": "st" }, - "max-velocity": { - "type": "float", - "min": 0, - "unit": "m/min", - "iunit": "IPM", - "scale": 0.0254, - "default": 5, - "code": "vm" + "tool-reversed": { + "type": "bool", + "default": false, + "code": "sr" }, - "max-accel": { - "type": "float", - "min": 0, - "unit": "km/min²", - "iunit": "g-force", - "scale": 35.304, - "default": 10, - "code": "am" + "max-spin": { + "type": "float", + "unit": "RPM", + "min": 0, + "default": 10000, + "code": "sx" }, - "max-jerk": { - "type": "float", - "min": 0, - "unit": "km/min³", - "iunit": "g/min", - "scale": 35.304, - "default": 50, - "code": "jm" + "min-spin": { + "type": "float", + "unit": "RPM", + "min": 0, + "default": 0, + "code": "sm" }, - "step-angle": { - "type": "float", - "min": 0, - "max": 360, - "step": 0.1, - "unit": "degrees", - "default": 1.8, - "code": "sa" + "tool-enable-mode": { + "type": "enum", + "values": [ + "disabled", + "lo-hi", + "hi-lo", + "tri-lo", + "tri-hi", + "lo-tri", + "hi-tri" + ], + "default": "lo-hi", + "code": "eom", + "pin": 15 }, - "travel-per-rev": { - "type": "float", - "unit": "mm", - "iunit": "in", - "scale": 25.4, - "default": 5, - "code": "tr" + "tool-direction-mode": { + "type": "enum", + "values": [ + "disabled", + "lo-hi", + "hi-lo", + "tri-lo", + "tri-hi", + "lo-tri", + "hi-tri" + ], + "default": "lo-hi", + "code": "dom", + "pin": 16 } - }, - - "limits": { - "min-soft-limit": { - "type": "float", - "unit": "mm", - "iunit": "in", - "scale": 25.4, - "default": 0, - "code": "tn" + }, + "modbus-spindle": { + "bus-id": { + "type": "int", + "default": "1", + "code": "hi" }, - "max-soft-limit": { - "type": "float", - "unit": "mm", - "iunit": "in", - "scale": 25.4, - "default": 0, - "code": "tm" + "baud": { + "type": "enum", + "values": [ + "9600", + "19200", + "38400", + "57600", + "115200" + ], + "default": "9600", + "code": "mb" }, - "min-switch": { - "type": "enum", - "values": ["disabled", "normally-open", "normally-closed"], - "default": "disabled", - "code": "ls", - "pins": [3, 5, 9, 11] + "parity": { + "type": "enum", + "values": [ + "None", + "Even", + "Odd" + ], + "default": "None", + "code": "ma" }, - "max-switch": { - "type": "enum", - "values": ["disabled", "normally-open", "normally-closed"], - "default": "disabled", - "code": "xs", - "pins": [4, 8, 10, 12] + "multi-write": { + "help": "Use Modbus multi register write. Function 16 vs. 6.", + "type": "bool", + "default": false, + "code": "mw" + }, + "regs": { + "type": "list", + "index": "0123456789abcdefghijklmnopqrstuv", + "default": [], + "template": { + "reg-type": { + "type": "enum", + "values": [ + "disabled", + "connect-write", + "max-freq-read", + "max-freq-fixed", + "freq-set", + "freq-signed-set", + "stop-write", + "forward-write", + "reverse-write", + "freq-read", + "freq-signed-read", + "freq-actech-read", + "status-read", + "disconnect-write" + ], + "default": "disabled", + "code": "vt" + }, + "reg-addr": { + "type": "int", + "min": 0, + "max": 65535, + "default": 0, + "code": "va" + }, + "reg-value": { + "type": "int", + "min": 0, + "max": 65535, + "default": 0, + "code": "vv" + } + } } - }, - - "homing": { - "homing-mode": { - "type": "enum", - "values": ["manual", "switch-min", "switch-max","stall-min","stall-max"], - "default": "manual", - "code": "ho" + }, + "pwm-spindle": { + "pwm-inverted": { + "help": "Invert the PWM signal output.", + "type": "bool", + "default": false, + "code": "pi" }, - "stall-microstep": { - "type": "int", - "values": [2, 4, 8, 16, 32, 64, 128, 256], - "unit": "per full step", - "default": 8, - "code": "lm", - "hmodes": ["stall-min","stall-max"] + "pwm-min-duty": { + "type": "float", + "unit": "%", + "min": 0, + "max": 100, + "default": 1, + "code": "nd" }, - "search-velocity": { - "type": "float", - "min": 0, - "unit": "m/min", - "iunit": "IPM", - "scale": 0.0254, - "default": 0.5, - "code": "sv", - "hmodes": ["switch-min", "switch-max", "stall-min","stall-max"] + "pwm-max-duty": { + "type": "float", + "unit": "%", + "min": 0, + "max": 100, + "default": 99.99, + "code": "md" }, - "latch-velocity": { - "type": "float", - "min": 0, - "unit": "m/min", - "iunit": "IPM", - "scale": 0.0254, - "default": 0.1, - "code": "lv", - "hmodes": ["switch-min", "switch-max"] + "pwm-freq": { + "type": "int", + "unit": "Hz", + "min": 8, + "max": 320000, + "default": 1000, + "code": "sf" }, - "latch-backoff": { - "type": "float", - "min": 0, - "unit": "mm", - "iunit": "in", - "scale": 25.4, - "default": 100, - "code": "lb", - "hmodes": ["switch-min", "switch-max"] + "rapid-auto-off": { + "help": "Turn tool off during rapid moves. Useful for LASERs.", + "type": "bool", + "default": false }, - "stall-volts": { - "type": "float", - "min": 0, - "unit": "v", - "default": 6, - "code": "tv", - "hmodes": ["stall-min","stall-max"] - }, - "stall-sample-time": { - "type": "int", - "values": [50, 100, 200, 300, 400, 600, 800, 1000], - "default": 50, - "unit": "µsec", - "code": "sp", - "hmodes": ["stall-min","stall-max"] - }, - "stall-current": { - "type": "float", - "min": 0, - "unit": "amps", - "default": 1.5, - "code": "tc", - "hmodes": ["stall-min","stall-max"] - }, - "zero-backoff": { - "type": "float", - "min": 0, - "unit": "mm", - "iunit": "in", - "scale": 25.4, - "default": 5, - "code": "zb", - "hmodes": ["switch-min", "switch-max", "stall-min","stall-max"] + "dynamic-power": { + "help": "Adjust tool power based on velocity and feed rate. Useful for LASERs.", + "type": "bool", + "default": false, + "code": "dp" } - } - } - }, - - "tool": { - "selected-tool": { - "type": "string", - "default": "disabled" }, - "tool-type": { - "type": "enum", - "values": [ - "Disabled", - "PWM Spindle", - "Huanyang VFD", - "Custom Modbus VFD", - "AC-Tech VFD", - "Nowforever VFD", - "Delta VFD015M21A (Beta)", - "YL600, YL620, YL620-A VFD (Beta)", - "FR-D700 (Beta)", - "Sunfar E300 (Beta)", - "OMRON MX2" - ], - "default": "Disabled", - "code": "st" - }, - "tool-reversed": { - "type": "bool", - "default": false, - "code": "sr" - }, - "max-spin": { - "type": "float", - "unit": "RPM", - "min": 0, - "default": 10000, - "code": "sx" - }, - "min-spin": { - "type": "float", - "unit": "RPM", - "min": 0, - "default": 0, - "code": "sm" - }, - "tool-enable-mode": { - "type": "enum", - "values": ["disabled", "lo-hi", "hi-lo", "tri-lo", "tri-hi", "lo-tri", - "hi-tri"], - "default": "lo-hi", - "code": "eom", - "pin": 15 - }, - "tool-direction-mode": { - "type": "enum", - "values": ["disabled", "lo-hi", "hi-lo", "tri-lo", "tri-hi", "lo-tri", - "hi-tri"], - "default": "lo-hi", - "code": "dom", - "pin": 16 - } - }, - - "modbus-spindle": { - "bus-id": { - "type": "int", - "default": "1", - "code": "hi" - }, - "baud": { - "type": "enum", - "values": ["9600", "19200", "38400", "57600", "115200"], - "default": "9600", - "code": "mb" - }, - "parity": { - "type": "enum", - "values": ["None", "Even", "Odd"], - "default": "None", - "code": "ma" - }, - "multi-write": { - "help": "Use Modbus multi register write. Function 16 vs. 6.", - "type": "bool", - "default": false, - "code": "mw" - }, - "regs": { - "type": "list", - "index": "0123456789abcdefghijklmnopqrstuv", - "default": [], - "template": { - "reg-type": { - "type": "enum", - "values": [ - "disabled", - "connect-write", - "max-freq-read", "max-freq-fixed", - "freq-set", "freq-signed-set", - "stop-write", "forward-write", "reverse-write", - "freq-read", "freq-signed-read", "freq-actech-read", - "status-read", - "disconnect-write"], - "default": "disabled", - "code": "vt" + "switches": { + "estop": { + "type": "enum", + "values": [ + "disabled", + "normally-open", + "normally-closed" + ], + "default": "disabled", + "code": "et", + "pin": 23 }, - "reg-addr": { - "type": "int", - "min": 0, - "max": 65535, - "default": 0, - "code": "va" + "probe": { + "type": "enum", + "values": [ + "disabled", + "normally-open", + "normally-closed" + ], + "default": "normally-open", + "code": "pt", + "pin": 22 }, - "reg-value": { - "type": "int", - "min": 0, - "max": 65535, - "default": 0, - "code": "vv" + "switch-debounce": { + "type": "int", + "min": 1, + "max": 5000, + "unit": "ms", + "default": 5, + "code": "sd", + "help": "Minimum time in ms before a switch change is acknowledged." + }, + "switch-lockout": { + "type": "int", + "min": 0, + "max": 60000, + "unit": "ms", + "default": 250, + "code": "sc", + "help": "Time in ms to ignore switch changes after an acknowledge change." } - } - } - }, - - "pwm-spindle": { - "pwm-inverted": { - "help": "Invert the PWM signal output.", - "type": "bool", - "default": false, - "code": "pi" }, - "pwm-min-duty": { - "type": "float", - "unit": "%", - "min": 0, - "max": 100, - "default": 1, - "code": "nd" - }, - "pwm-max-duty": { - "type": "float", - "unit": "%", - "min": 0, - "max": 100, - "default": 99.99, - "code": "md" - }, - "pwm-freq": { - "type": "int", - "unit": "Hz", - "min": 8, - "max": 320000, - "default": 1000, - "code": "sf" - }, - "rapid-auto-off": { - "help": "Turn tool off during rapid moves. Useful for LASERs.", - "type": "bool", - "default": false - }, - "dynamic-power": { - "help": - "Adjust tool power based on velocity and feed rate. Useful for LASERs.", - "type": "bool", - "default": false, - "code": "dp" - } - }, - - "switches": { - "estop": { - "type": "enum", - "values": ["disabled", "normally-open", "normally-closed"], - "default": "disabled", - "code": "et", - "pin": 23 + "outputs": { + "load-1": { + "type": "enum", + "values": [ + "disabled", + "lo-hi", + "hi-lo", + "tri-lo", + "tri-hi", + "lo-tri", + "hi-tri" + ], + "default": "lo-hi", + "code": "1om", + "pin": 2 + }, + "load-2": { + "type": "enum", + "values": [ + "disabled", + "lo-hi", + "hi-lo", + "tri-lo", + "tri-hi", + "lo-tri", + "hi-tri" + ], + "default": "lo-hi", + "code": "2om", + "pin": 1 + }, + "fault": { + "type": "enum", + "values": [ + "disabled", + "lo-hi", + "hi-lo", + "tri-lo", + "tri-hi", + "lo-tri", + "hi-tri" + ], + "default": "lo-hi", + "code": "fom", + "pin": 21 + } }, "probe": { - "type": "enum", - "values": ["disabled", "normally-open", "normally-closed"], - "default": "normally-open", - "code": "pt", - "pin": 22 + "probe-diameter": { + "type": "float", + "min": 0, + "max": 25.4, + "unit": "mm", + "default": 6.35 + }, + "probe-xdim": { + "type": "float", + "unit": "mm", + "min": 0, + "max": 1000, + "default": 53.975 + }, + "probe-ydim": { + "type": "float", + "unit": "mm", + "min": 0, + "max": 1000, + "default": 53.975 + }, + "probe-zdim": { + "type": "float", + "unit": "mm", + "min": 0, + "max": 1000, + "default": 15.4 + }, + "probe-fast-seek": { + "type": "float", + "unit": "mm/min", + "min": 0, + "max": 1000, + "default": 200 + }, + "probe-slow-seek": { + "type": "float", + "unit": "mm/min", + "min": 0, + "max": 1000, + "default": 25 + } }, - "switch-debounce": { - "type": "int", - "min": 1, - "max": 5000, - "unit": "ms", - "default": 5, - "code": "sd", - "help": "Minimum time in ms before a switch change is acknowledged." + "gcode": { + "program-start": { + "type": "text", + "default": "(Runs at program start)\nG90 (Absolute distance mode)\nG17 (Select XY plane)\n" + }, + "tool-change": { + "type": "text", + "default": "(Runs on M6, tool change)\nM0 M6 (MSG, Change tool)" + }, + "program-end": { + "type": "text", + "default": "(Runs on M2, program end)\nM2" + } }, - "switch-lockout": { - "type": "int", - "min": 0, - "max": 60000, - "unit": "ms", - "default": 250, - "code": "sc", - "help": "Time in ms to ignore switch changes after an acknowledge change." + "admin": { + "auto-check-upgrade": { + "type": "bool", + "default": true + } } - }, - - "outputs": { - "load-1": { - "type": "enum", - "values": ["disabled", "lo-hi", "hi-lo", "tri-lo", "tri-hi", "lo-tri", - "hi-tri"], - "default": "lo-hi", - "code": "1om", - "pin": 2 - }, - "load-2": { - "type": "enum", - "values": ["disabled", "lo-hi", "hi-lo", "tri-lo", "tri-hi", "lo-tri", - "hi-tri"], - "default": "lo-hi", - "code": "2om", - "pin": 1 - }, - "fault": { - "type": "enum", - "values": ["disabled", "lo-hi", "hi-lo", "tri-lo", "tri-hi", "lo-tri", - "hi-tri"], - "default": "lo-hi", - "code": "fom", - "pin": 21 - } - }, - - "probe": { - "probe-diameter": { - "type": "float", - "min": 0, - "max": 25.4, - "unit": "mm", - "default": 6.35 - }, - "probe-xdim": { - "type": "float", - "unit": "mm", - "min": 0, - "max": 1000, - "default": 53.975 - }, - "probe-ydim": { - "type": "float", - "unit": "mm", - "min": 0, - "max": 1000, - "default": 53.975 - }, - "probe-zdim": { - "type": "float", - "unit": "mm", - "min": 0, - "max": 1000, - "default": 15.4 - }, - "probe-fast-seek": { - "type": "float", - "unit": "mm/min", - "min": 0, - "max": 1000, - "default": 200 - }, - "probe-slow-seek": { - "type": "float", - "unit": "mm/min", - "min": 0, - "max": 1000, - "default": 25 - } - }, - - "gcode": { - "program-start": { - "type": "text", - "default": "(Runs at program start)\nG90 (Absolute distance mode)\nG17 (Select XY plane)\n" - }, - "tool-change": { - "type": "text", - "default": "(Runs on M6, tool change)\nM0 M6 (MSG, Change tool)" - }, - "program-end": { - "type": "text", - "default": "(Runs on M2, program end)\nM2" - } - }, - - "admin": { - "auto-check-upgrade": { - "type": "bool", - "default": true - } - } -} +} \ No newline at end of file diff --git a/src/svelte-components/src/components/ConfigTemplatedInput.svelte b/src/svelte-components/src/components/ConfigTemplatedInput.svelte index ed31d07..5c410ea 100644 --- a/src/svelte-components/src/components/ConfigTemplatedInput.svelte +++ b/src/svelte-components/src/components/ConfigTemplatedInput.svelte @@ -6,7 +6,11 @@ type Template = { type?: string; - values?: (string | number)[]; + values?: ( + | string + | number + | { title: string; value: string | number } + )[]; unit?: "string"; iunit?: "string"; min?: number; @@ -97,8 +101,11 @@ {#if template.values} diff --git a/src/svelte-components/src/components/SettingsView.svelte b/src/svelte-components/src/components/SettingsView.svelte index a1c941d..10cbe55 100644 --- a/src/svelte-components/src/components/SettingsView.svelte +++ b/src/svelte-components/src/components/SettingsView.svelte @@ -44,6 +44,17 @@ +
+ If you have a gamepad that is not officially supported, and doesn't seem + to be working right, try changing gamepad-default-type to one of + the other types. +
+