From 7f97537599993d44f0660a17669111d20b5fdcce Mon Sep 17 00:00:00 2001 From: Patrick Schmidt Date: Sat, 28 Aug 2021 12:46:11 +0200 Subject: [PATCH] * Added more URL input options/parsing --- lib/service/KlippyService.dart | 6 +- lib/service/PrinterService.dart | 67 ++++++++----------- lib/ui/bottomsheet/setup_bottom_sheet_ui.dart | 1 - .../views/printers/add/printers_add_view.dart | 6 +- .../printers/add/printers_add_viewmodel.dart | 18 ++--- .../printers/edit/printers_edit_view.dart | 8 ++- .../edit/printers_edit_viewmodel.dart | 11 +-- lib/util/misc.dart | 24 ++++++- 8 files changed, 71 insertions(+), 70 deletions(-) diff --git a/lib/service/KlippyService.dart b/lib/service/KlippyService.dart index 7c7efa07..ddff30ff 100644 --- a/lib/service/KlippyService.dart +++ b/lib/service/KlippyService.dart @@ -7,9 +7,9 @@ import 'package:mobileraker/dto/machine/Printer.dart'; import 'package:mobileraker/dto/server/Klipper.dart'; import 'package:rxdart/rxdart.dart'; -/** - * Handley Server connections/services - */ +/// +/// Handley Server connections/services +/// class KlippyService { final WebSocketWrapper _webSocket; final _logger = getLogger('KlippyService'); diff --git a/lib/service/PrinterService.dart b/lib/service/PrinterService.dart index f2a2f780..f568b90f 100644 --- a/lib/service/PrinterService.dart +++ b/lib/service/PrinterService.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:math'; import 'package:enum_to_string/enum_to_string.dart'; -import 'package:flutter/foundation.dart'; import 'package:mobileraker/WebSocket.dart'; import 'package:mobileraker/app/AppSetup.locator.dart'; import 'package:mobileraker/app/AppSetup.logger.dart'; @@ -63,7 +62,6 @@ class PrinterService { _fetchPrinter(); } - /// Method Handler for registered in the Websocket wrapper. /// Handles all incoming messages and maps the correct method to it! @@ -132,7 +130,8 @@ class PrinterService { if (subToPrinterObjects.containsKey(mainObjectType)) { var method = subToPrinterObjects[mainObjectType]; if (method != null) { - if (split.length > 1) // Multi word objectsType e.g.'temperature_sensor sensor_name' + if (split.length > + 1) // Multi word objectsType e.g.'temperature_sensor sensor_name' method(key, data[key], printer: printer); else method(data[key], printer: printer); @@ -145,29 +144,27 @@ class PrinterService { _makeSubscribeRequest(printer); } - void _updatePartFan(Map fanJson, {Printer? printer}) { - printer ??= _latestPrinter; + void _updatePartFan(Map fanJson, + {required Printer printer}) { if (fanJson.containsKey('speed')) printer.printFan.speed = fanJson['speed']; } void _updateHeaterFan(String heaterFanName, Map fanJson, - {Printer? printer}) { - printer ??= _latestPrinter; + {required Printer printer}) { List split = heaterFanName.split(" "); String hName = split.length > 1 ? split.skip(1).join(" ") : split[0]; NamedFan namedFan = printer.fans.firstWhere( (element) => element.name == hName && element is HeaterFan, orElse: () { var f = HeaterFan(hName); - printer!.fans.add(f); + printer.fans.add(f); return f; }); if (fanJson.containsKey('speed')) namedFan.speed = fanJson['speed']; } void _updateControllerFan(String fanName, Map fanJson, - {Printer? printer}) { - printer ??= _latestPrinter; + {required Printer printer}) { List split = fanName.split(" "); String hName = split.length > 1 ? split.skip(1).join(" ") : split[0]; @@ -175,15 +172,14 @@ class PrinterService { (element) => element.name == hName && element is ControllerFan, orElse: () { var f = ControllerFan(hName); - printer!.fans.add(f); + printer.fans.add(f); return f; }); if (fanJson.containsKey('speed')) namedFan.speed = fanJson['speed']; } void _updateTemperatureFan(String fanName, Map fanJson, - {Printer? printer}) { - printer ??= _latestPrinter; + {required Printer printer}) { List split = fanName.split(" "); String hName = split.length > 1 ? split.skip(1).join(" ") : split[0]; @@ -191,15 +187,14 @@ class PrinterService { (element) => element.name == hName && element is TemperatureFan, orElse: () { var f = TemperatureFan(hName); - printer!.fans.add(f); + printer.fans.add(f); return f; }); if (fanJson.containsKey('speed')) namedFan.speed = fanJson['speed']; } void _updateGenericFan(String fanName, Map fanJson, - {Printer? printer}) { - printer ??= _latestPrinter; + {required Printer printer}) { List split = fanName.split(" "); String hName = split.length > 1 ? split.skip(1).join(" ") : split[0]; @@ -207,22 +202,21 @@ class PrinterService { .firstWhere((element) => element.name == hName && element is GenericFan, orElse: () { var f = GenericFan(hName); - printer!.fans.add(f); + printer.fans.add(f); return f; }); if (fanJson.containsKey('speed')) namedFan.speed = fanJson['speed']; } void _updateTemperatureSensor(String sensor, Map sensorJson, - {Printer? printer}) { - printer ??= _latestPrinter; + {required Printer printer}) { List split = sensor.split(" "); String sName = split.length > 1 ? split.skip(1).join(" ") : split[0]; TemperatureSensor tempSensor = printer.temperatureSensors .firstWhere((element) => element.name == sName, orElse: () { var t = TemperatureSensor(sName); - printer!.temperatureSensors.add(t); + printer.temperatureSensors.add(t); return t; }); @@ -235,23 +229,21 @@ class PrinterService { } void _updateOutputPin(String pin, Map pinJson, - {Printer? printer}) { - printer ??= _latestPrinter; + {required Printer printer}) { List split = pin.split(" "); String sName = split.length > 1 ? split.skip(1).join(" ") : split[0]; OutputPin output = printer.outputPins .firstWhere((element) => element.name == sName, orElse: () { var t = OutputPin(sName); - printer!.outputPins.add(t); + printer.outputPins.add(t); return t; }); if (pinJson.containsKey('value')) output.value = pinJson['value']; } - _updateGCodeMove(Map gCodeJson, {Printer? printer}) { - printer ??= _latestPrinter; + _updateGCodeMove(Map gCodeJson, {required Printer printer}) { if (gCodeJson.containsKey('speed_factor')) printer.gCodeMove.speedFactor = gCodeJson['speed_factor']; if (gCodeJson.containsKey('speed')) @@ -277,8 +269,8 @@ class PrinterService { } } - _updateVirtualSd(Map virtualSDJson, {Printer? printer}) { - printer ??= _latestPrinter; + _updateVirtualSd(Map virtualSDJson, + {required Printer printer}) { if (virtualSDJson.containsKey('progress')) printer.virtualSdCard.progress = virtualSDJson['progress']; if (virtualSDJson.containsKey('is_active')) @@ -288,8 +280,8 @@ class PrinterService { int.tryParse(virtualSDJson['file_position'].toString()) ?? 0; } - _updatePrintStat(Map printStatJson, {Printer? printer}) { - printer ??= _latestPrinter; + _updatePrintStat(Map printStatJson, + {required Printer printer}) { if (printStatJson.containsKey('state')) printer.print.state = EnumToString.fromString(PrintState.values, printStatJson['state'])!; @@ -307,9 +299,8 @@ class PrinterService { } } - _updateConfigFile(Map printStatJson, {Printer? printer}) { - printer ??= _latestPrinter; - + _updateConfigFile(Map printStatJson, + {required Printer printer}) { if (printStatJson.containsKey('settings')) printer.configFile = ConfigFile.parse(printStatJson['settings']); if (printStatJson.containsKey('save_config_pending')) @@ -317,8 +308,8 @@ class PrinterService { printStatJson['save_config_pending']; } - _updateHeaterBed(Map heatedBedJson, {Printer? printer}) { - printer ??= _latestPrinter; + _updateHeaterBed(Map heatedBedJson, + {required Printer printer}) { if (heatedBedJson.containsKey('temperature')) printer.heaterBed.temperature = heatedBedJson['temperature']; if (heatedBedJson.containsKey('target')) @@ -327,8 +318,8 @@ class PrinterService { printer.heaterBed.power = heatedBedJson['power']; } - _updateExtruder(Map extruderJson, {Printer? printer}) { - printer ??= _latestPrinter; + _updateExtruder(Map extruderJson, + {required Printer printer}) { if (extruderJson.containsKey('temperature')) printer.extruder.temperature = extruderJson['temperature']; if (extruderJson.containsKey('target')) @@ -341,8 +332,8 @@ class PrinterService { printer.extruder.power = extruderJson['power']; } - _updateToolhead(Map toolHeadJson, {Printer? printer}) { - printer ??= _latestPrinter; + _updateToolhead(Map toolHeadJson, + {required Printer printer}) { if (toolHeadJson.containsKey('homed_axes')) { String hAxes = toolHeadJson['homed_axes']; Set homed = {}; diff --git a/lib/ui/bottomsheet/setup_bottom_sheet_ui.dart b/lib/ui/bottomsheet/setup_bottom_sheet_ui.dart index d8188325..ca5de513 100644 --- a/lib/ui/bottomsheet/setup_bottom_sheet_ui.dart +++ b/lib/ui/bottomsheet/setup_bottom_sheet_ui.dart @@ -6,7 +6,6 @@ import 'package:mobileraker/enums/BottomSheetType.dart'; import 'package:mobileraker/service/KlippyService.dart'; import 'package:mobileraker/service/MachineService.dart'; import 'package:stacked/stacked.dart'; -import 'package:stacked/stacked_annotations.dart'; import 'package:stacked_services/stacked_services.dart'; void setupBottomSheetUi() { diff --git a/lib/ui/views/printers/add/printers_add_view.dart b/lib/ui/views/printers/add/printers_add_view.dart index d2961b5d..eb1f1fe4 100644 --- a/lib/ui/views/printers/add/printers_add_view.dart +++ b/lib/ui/views/printers/add/printers_add_view.dart @@ -43,8 +43,10 @@ class PrintersAdd extends StatelessWidget { FormBuilderTextField( decoration: InputDecoration( labelText: 'Printer-Address', + hintText: 'Host, IP, or full URL', + helperMaxLines: 2, helperText: model.wsUrl != null - ? 'WS-URL: ${model.wsUrl}' + ? 'Resulting WebSocket-URL: ${model.wsUrl}' : '' //TODO ), onChanged: model.onUrlEntered, @@ -53,7 +55,7 @@ class PrintersAdd extends StatelessWidget { validator: FormBuilderValidators.compose([ FormBuilderValidators.required(context), FormBuilderValidators.url(context, - protocols: ['ws', 'wss']) + protocols: ['ws', 'wss', 'http','https']) ]), ), FormBuilderTextField( diff --git a/lib/ui/views/printers/add/printers_add_viewmodel.dart b/lib/ui/views/printers/add/printers_add_viewmodel.dart index 12001938..a3bd0625 100644 --- a/lib/ui/views/printers/add/printers_add_viewmodel.dart +++ b/lib/ui/views/printers/add/printers_add_viewmodel.dart @@ -7,6 +7,7 @@ import 'package:mobileraker/app/AppSetup.locator.dart'; import 'package:mobileraker/app/AppSetup.router.dart'; import 'package:mobileraker/dto/machine/PrinterSetting.dart'; import 'package:mobileraker/service/MachineService.dart'; +import 'package:mobileraker/util/misc.dart'; import 'package:stacked/stacked.dart'; import 'package:stacked_services/stacked_services.dart'; @@ -22,7 +23,7 @@ class PrintersAddViewModel extends StreamViewModel { GlobalKey get formKey => _fbKey; - String inputUrl = 'mainsailos.local'; + String inputUrl = ''; WebSocketWrapper? _testWebSocket; @@ -69,11 +70,7 @@ class PrintersAddViewModel extends StreamViewModel { } String? get wsUrl { - var printerUrl = inputUrl; - var parse = Uri.tryParse(printerUrl); - return (parse?.hasScheme ?? false) - ? printerUrl - : 'ws://$printerUrl/websocket'; + return urlToWebsocketUrl(inputUrl); } onUrlEntered(value) { @@ -86,9 +83,7 @@ class PrintersAddViewModel extends StreamViewModel { var printerName = _fbKey.currentState!.value['printerName']; var printerAPIKey = _fbKey.currentState!.value['printerApiKey']; var printerUrl = _fbKey.currentState!.value['printerUrl']; - if (!Uri.parse(printerUrl).hasScheme) { - printerUrl = 'ws://$printerUrl/websocket'; - } + printerUrl = urlToWebsocketUrl(printerUrl); var printerSetting = PrinterSetting( name: printerName, wsUrl: printerUrl, apiKey: printerAPIKey); _printerSettingService.addPrinter(printerSetting).then( @@ -100,10 +95,7 @@ class PrintersAddViewModel extends StreamViewModel { if (_fbKey.currentState!.saveAndValidate()) { var printerUrl = _fbKey.currentState!.value['printerUrl']; var printerAPIKey = _fbKey.currentState!.value['printerApiKey']; - var uri = Uri.parse(printerUrl); - if (!uri.hasScheme) { - printerUrl = 'ws://$printerUrl/websocket'; - } + printerUrl = urlToWebsocketUrl(printerUrl); _testWebSocket?.reset(); _testWebSocket?.stateStream.close(); diff --git a/lib/ui/views/printers/edit/printers_edit_view.dart b/lib/ui/views/printers/edit/printers_edit_view.dart index b2b47ff4..743a6847 100644 --- a/lib/ui/views/printers/edit/printers_edit_view.dart +++ b/lib/ui/views/printers/edit/printers_edit_view.dart @@ -52,16 +52,18 @@ class PrintersEdit extends ViewModelBuilderWidget { FormBuilderTextField( decoration: InputDecoration( labelText: 'Printer-Address', + hintText: 'Host, IP, or full URL', + helperMaxLines: 2, helperText: model.wsUrl != null - ? 'WS-URL: ${model.wsUrl}' + ? 'Resulting WebSocket-URL: ${model.wsUrl}' : '' //TODO - ), + ), onChanged: model.onUrlEntered, name: 'printerUrl', initialValue: model.inputUrl, validator: FormBuilderValidators.compose([ FormBuilderValidators.required(context), - FormBuilderValidators.url(context, protocols: ['ws', 'wss']) + FormBuilderValidators.url(context, protocols: ['ws', 'wss', 'http','https']) ]), ), FormBuilderTextField( diff --git a/lib/ui/views/printers/edit/printers_edit_viewmodel.dart b/lib/ui/views/printers/edit/printers_edit_viewmodel.dart index 0d1e0079..bf094d24 100644 --- a/lib/ui/views/printers/edit/printers_edit_viewmodel.dart +++ b/lib/ui/views/printers/edit/printers_edit_viewmodel.dart @@ -7,6 +7,7 @@ import 'package:mobileraker/dto/machine/PrinterSetting.dart'; import 'package:mobileraker/dto/machine/TemperaturePreset.dart'; import 'package:mobileraker/dto/machine/WebcamSetting.dart'; import 'package:mobileraker/service/MachineService.dart'; +import 'package:mobileraker/util/misc.dart'; import 'package:stacked/stacked.dart'; import 'package:stacked_services/stacked_services.dart'; @@ -29,11 +30,7 @@ class PrintersEditViewModel extends BaseViewModel { String? get printerApiKey => printerSetting.apiKey; String? get wsUrl { - var printerUrl = inputUrl; - var parse = Uri.tryParse(printerUrl); - return (parse?.hasScheme ?? false) - ? printerUrl - : 'ws://$printerUrl/websocket'; + return urlToWebsocketUrl(inputUrl); } int get extruderMinTemperature => @@ -132,9 +129,7 @@ class PrintersEditViewModel extends BaseViewModel { var printerName = _fbKey.currentState!.value['printerName']; var printerAPIKey = _fbKey.currentState!.value['printerApiKey']; var printerUrl = _fbKey.currentState!.value['printerUrl']; - if (!Uri.parse(printerUrl).hasScheme) { - printerUrl = 'ws://$printerUrl/websocket'; - } + printerUrl = urlToWebsocketUrl(printerUrl); _saveAllCams(); _saveAllPresets(); printerSetting diff --git a/lib/util/misc.dart b/lib/util/misc.dart index e04f546c..a177da5c 100644 --- a/lib/util/misc.dart +++ b/lib/util/misc.dart @@ -2,5 +2,25 @@ import 'package:mobileraker/app/AppSetup.locator.dart'; import 'package:stacked_services/stacked_services.dart'; void showWIPSnackbar() { - locator().showSnackbar(title: 'Dev-Message',message: "WIP!... Not implemented yet."); -} \ No newline at end of file + locator().showSnackbar( + title: 'Dev-Message', message: "WIP!... Not implemented yet."); +} + +String urlToWebsocketUrl(String enteredURL) { + + var parse = Uri.tryParse(enteredURL); + if (parse == null) return enteredURL; + if (!parse.hasScheme) + parse = Uri.tryParse('ws://$enteredURL/websocket'); + else if (parse.isScheme('http')) + parse = parse.replace(scheme: 'ws'); + else if (parse.isScheme('https')) parse = parse.replace(scheme: 'wss'); + + return parse.toString(); + + // var parse = Uri.tryParse(enteredURL); + // + // return (parse?.hasScheme ?? false) + // ? enteredURL + // : 'ws://$enteredURL/websocket'; +}