From 1fa4282d70b6f2eff40b46b39b8d6423a3b4478c Mon Sep 17 00:00:00 2001 From: Josef-MrBeam <81746291+Josef-MrBeam@users.noreply.github.com> Date: Wed, 8 Mar 2023 09:19:45 +0100 Subject: [PATCH] SW-2806 laser head lifespan switching with model (#1694) - added lifespan to the laser head profile - added unittest - get lifespan of laser head from backend --- octoprint_mrbeam/__init__.py | 1 + octoprint_mrbeam/iobeam/laserhead_handler.py | 34 +++++++++++++++++++ .../profiles/laserhead/laserhead_id_0.yaml | 1 + .../profiles/laserhead/laserhead_id_1.yaml | 1 + .../profiles/laserhead/laserhead_id_3.yaml | 1 + .../app/view-models/settings/maintenance.js | 13 ++++--- tests/iobeam/test_laserhead_handler.py | 32 +++++++++++++++++ 7 files changed, 78 insertions(+), 5 deletions(-) diff --git a/octoprint_mrbeam/__init__.py b/octoprint_mrbeam/__init__.py index 09eff81c2..7322015a1 100644 --- a/octoprint_mrbeam/__init__.py +++ b/octoprint_mrbeam/__init__.py @@ -569,6 +569,7 @@ def on_settings_load(self): carbonFilterUsage=self.usage_handler.get_carbon_filter_usage(), laserHeadUsage=self.usage_handler.get_laser_head_usage(), gantryUsage=self.usage_handler.get_gantry_usage(), + laserHeadLifespan=self.laserhead_handler.current_laserhead_lifespan, ), tour_auto_launch=self._settings.get(["tour_auto_launch"]), hw_features=dict( diff --git a/octoprint_mrbeam/iobeam/laserhead_handler.py b/octoprint_mrbeam/iobeam/laserhead_handler.py index 6b2552464..b74faa215 100644 --- a/octoprint_mrbeam/iobeam/laserhead_handler.py +++ b/octoprint_mrbeam/iobeam/laserhead_handler.py @@ -11,6 +11,7 @@ LASERHEAD_MAX_DUST_FACTOR_FALLBACK = 3.0 # selected the highest factor LASERHEAD_MAX_CORRECTION_FACTOR_FALLBACK = 1 LASERHEAD_MAX_INSTENSITY_INCLUDING_CORRECTION_FALLBACK = 1500 +LASERHEAD_LIFESPAN_FALLBACK = 40 LASERHEAD_STOCK_ID = 0 LASERHEAD_S_ID = 1 @@ -652,3 +653,36 @@ def default_laserhead_max_intensity_including_correction(self): """ return LASERHEAD_MAX_INSTENSITY_INCLUDING_CORRECTION_FALLBACK + + @property + def current_laserhead_lifespan(self): + """Return the current laser head lifespan. + + Returns: + int: Laser head lifespan + """ + + current_laserhead_properties = self._get_laserhead_properties() + + # Handle the exceptions + if ((isinstance(current_laserhead_properties, dict) is False) or + ("lifespan" not in current_laserhead_properties) or + (isinstance(current_laserhead_properties["lifespan"], int) is False)): + # Apply fallback + self._logger.exception( + "Current Laserhead lifespan couldn't be retrieved, fallback to the factor value of: {}".format( + self.default_laserhead_lifespan)) + return self.default_laserhead_lifespan + # Reaching here means, everything looks good + self._logger.debug( + "Current Laserhead lifespan:{}".format(current_laserhead_properties["lifespan"])) + return current_laserhead_properties["lifespan"] + + @property + def default_laserhead_lifespan(self): + """Default lifespan for laser head. To be used by other modules at init time. + + Returns: + int: Laser head default lifespan + """ + return LASERHEAD_LIFESPAN_FALLBACK diff --git a/octoprint_mrbeam/profiles/laserhead/laserhead_id_0.yaml b/octoprint_mrbeam/profiles/laserhead/laserhead_id_0.yaml index 98b331f26..8ee657612 100644 --- a/octoprint_mrbeam/profiles/laserhead/laserhead_id_0.yaml +++ b/octoprint_mrbeam/profiles/laserhead/laserhead_id_0.yaml @@ -2,3 +2,4 @@ max_temperature: 55.0 max_dust_factor: 2.0 max_correction_factor: 1.15 max_intensity_including_correction: 1500 +lifespan: 40 diff --git a/octoprint_mrbeam/profiles/laserhead/laserhead_id_1.yaml b/octoprint_mrbeam/profiles/laserhead/laserhead_id_1.yaml index c969eb278..c5ff0fafe 100644 --- a/octoprint_mrbeam/profiles/laserhead/laserhead_id_1.yaml +++ b/octoprint_mrbeam/profiles/laserhead/laserhead_id_1.yaml @@ -2,3 +2,4 @@ max_temperature: 59.0 max_dust_factor: 3.0 max_correction_factor: 1.15 max_intensity_including_correction: 1500 +lifespan: 40 diff --git a/octoprint_mrbeam/profiles/laserhead/laserhead_id_3.yaml b/octoprint_mrbeam/profiles/laserhead/laserhead_id_3.yaml index b08d161f4..4de24942d 100644 --- a/octoprint_mrbeam/profiles/laserhead/laserhead_id_3.yaml +++ b/octoprint_mrbeam/profiles/laserhead/laserhead_id_3.yaml @@ -2,3 +2,4 @@ max_temperature: 60.0 max_dust_factor: 3.0 max_correction_factor: 1.23 max_intensity_including_correction: 1600 +lifespan: 80 diff --git a/octoprint_mrbeam/static/js/app/view-models/settings/maintenance.js b/octoprint_mrbeam/static/js/app/view-models/settings/maintenance.js index b54248ab0..38c659896 100644 --- a/octoprint_mrbeam/static/js/app/view-models/settings/maintenance.js +++ b/octoprint_mrbeam/static/js/app/view-models/settings/maintenance.js @@ -24,12 +24,12 @@ $(function () { ); self.LASER_HEAD = gettext("laser head"); self.GANTRY = gettext("mechanics"); + self.WARN_IF_CRITICAL_PERCENT = 70; + self.WARN_IF_USED_PERCENT = 100; self.PREFILTER_LIFESPAN = 40; self.CARBON_FILTER_LIFESPAN = 280; - self.LASER_HEAD_LIFESPAN = 40; self.GANTRY_LIFESPAN = 100; - self.WARN_IF_CRITICAL_PERCENT = 70; - self.WARN_IF_USED_PERCENT = 100; + self.laserHeadLifespan = ko.observable(0); self.totalUsage = ko.observable(0); self.prefilterUsage = ko.observable(0); @@ -49,7 +49,7 @@ $(function () { { lifespan: self.CARBON_FILTER_LIFESPAN } ); self.laserHeadLifespanHours = _.sprintf(gettext("/%(lifespan)s hrs"), { - lifespan: self.LASER_HEAD_LIFESPAN, + lifespan: self.laserHeadLifespan(), }); self.gantryLifespanHours = _.sprintf(gettext("/%(lifespan)s hrs"), { lifespan: self.GANTRY_LIFESPAN, @@ -87,7 +87,7 @@ $(function () { }); self.laserHeadPercent = ko.computed(function () { return self.optimizeParameterPercentageValues( - (self.laserHeadUsageHours() / self.LASER_HEAD_LIFESPAN) * 100 + (self.laserHeadUsageHours() / self.laserHeadLifespan()) * 100 ); }); self.gantryPercent = ko.computed(function () { @@ -356,6 +356,9 @@ $(function () { self.laserHeadSerial( self.settings.settings.plugins.mrbeam.laserhead.serial() ); + self.laserHeadLifespan( + self.settings.settings.plugins.mrbeam.usage.laserHeadLifespan() + ); }; self.notifyMaintenanceRequired = function () { diff --git a/tests/iobeam/test_laserhead_handler.py b/tests/iobeam/test_laserhead_handler.py index 8715a5dfb..13849bb70 100644 --- a/tests/iobeam/test_laserhead_handler.py +++ b/tests/iobeam/test_laserhead_handler.py @@ -362,3 +362,35 @@ def test_current_laserhead_max_dust_factor(mrbeam_plugin, laserhead, expected_va # Assert assert max_dust_factor == expected_value + + +@pytest.mark.parametrize( + "laserhead,expected_value", + [ + (LASERHEAD_STOCK_ID, 40), + (LASERHEAD_S_ID, 40), + (LASERHEAD_X_ID, 80), + (None, 40), + (1000, 40), + ], + ids=[ + "Laserhead Stock", + "Laserhead S", + "Laserhead X", + "None Laserhead", + "unknown Laserhead", + ], +) +def test_current_laserhead_lifespan(laserhead, expected_value, mrbeam_plugin): + # Arrange + with patch( + "octoprint_mrbeam.iobeam.laserhead_handler.LaserheadHandler.get_current_used_lh_model_id", + return_value=laserhead, + ): + laserhead_handler = LaserheadHandler(mrbeam_plugin) + + # Act + lifespan = laserhead_handler.current_laserhead_lifespan + + # Assert + assert lifespan == expected_value