Skip to content

Commit

Permalink
SW-2806 laser head lifespan switching with model (#1694)
Browse files Browse the repository at this point in the history
- added lifespan to the laser head profile
- added unittest
- get lifespan of laser head from backend
  • Loading branch information
Josef-MrBeam authored Mar 8, 2023
1 parent 254c966 commit 1fa4282
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 5 deletions.
1 change: 1 addition & 0 deletions octoprint_mrbeam/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
34 changes: 34 additions & 0 deletions octoprint_mrbeam/iobeam/laserhead_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
1 change: 1 addition & 0 deletions octoprint_mrbeam/profiles/laserhead/laserhead_id_0.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions octoprint_mrbeam/profiles/laserhead/laserhead_id_1.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions octoprint_mrbeam/profiles/laserhead/laserhead_id_3.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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,
Expand Down Expand Up @@ -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 () {
Expand Down Expand Up @@ -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 () {
Expand Down
32 changes: 32 additions & 0 deletions tests/iobeam/test_laserhead_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 1fa4282

Please sign in to comment.