Skip to content

Commit f7a52dd

Browse files
authored
Merge pull request kontakt#11 from fornellas/fix_bounce
Various fixes, rework of main functions and additional interface work
2 parents 38e5527 + c18614f commit f7a52dd

File tree

2 files changed

+92
-23
lines changed

2 files changed

+92
-23
lines changed

octoprint_filamentreload/__init__.py

Lines changed: 80 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from octoprint.events import eventManager, Events
66
from flask import jsonify, make_response
77
import RPi.GPIO as GPIO
8+
from time import sleep
89

910
class FilamentReloadedPlugin(octoprint.plugin.StartupPlugin,
1011
octoprint.plugin.EventHandlerPlugin,
@@ -18,45 +19,101 @@ def initialize(self):
1819
GPIO.setmode(GPIO.BOARD) # Use the board numbering scheme
1920
GPIO.setwarnings(False) # Disable GPIO warnings
2021

22+
@property
23+
def pin(self):
24+
return int(self._settings.get(["pin"]))
25+
26+
@property
27+
def bounce(self):
28+
return int(self._settings.get(["bounce"]))
29+
30+
@property
31+
def switch(self):
32+
return int(self._settings.get(["switch"]))
33+
34+
@property
35+
def after_pause_gcode(self):
36+
return str(self._settings.get(["after_pause_gcode"])).splitlines()
37+
38+
@property
39+
def after_resume_gcode(self):
40+
return str(self._settings.get(["after_resume_gcode"])).splitlines()
41+
2142
def on_after_startup(self):
2243
self._logger.info("Filament Sensor Reloaded started")
23-
self.pin = int(self._settings.get(["pin"]))
24-
self.bounce = int(self._settings.get(["bounce"]))
25-
self.switch = int(self._settings.get(["switch"]))
26-
27-
if self._settings.get(["pin"]) != "-1": # If a pin is defined
44+
if self.sensor_enabled():
2845
self._logger.info("Filament Sensor active on GPIO Pin [%s]"%self.pin)
2946
GPIO.setup(self.pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Initialize GPIO as INPUT
47+
else:
48+
self._logger.info("Pin not configured, won't work unless configured!")
3049

3150
def get_settings_defaults(self):
3251
return dict(
3352
pin = -1, # Default is no pin
3453
bounce = 250, # Debounce 250ms
35-
switch = 0 # Normally Open
54+
switch = 0, # Normally Open
55+
after_pause_gcode = '',
56+
after_resume_gcode = '',
3657
)
3758

59+
def sensor_enabled(self):
60+
return self.pin != -1
61+
62+
def no_filament(self):
63+
return GPIO.input(self.pin) != self.switch
64+
3865
def get_template_configs(self):
3966
return [dict(type="settings", custom_bindings=False)]
4067

68+
@property
69+
def _filament_change(self):
70+
return self.__dict__.get('_filament_change', False)
71+
4172
def on_event(self, event, payload):
42-
if event == Events.PRINT_STARTED: # If a new print is beginning
43-
self._logger.info("Printing started: Filament sensor enabled")
44-
if self.pin != -1:
45-
GPIO.add_event_detect(self.pin, GPIO.BOTH, callback=self.check_gpio, bouncetime=self.bounce)
46-
elif event in (Events.PRINT_DONE, Events.PRINT_FAILED, Events.PRINT_CANCELLED):
47-
self._logger.info("Printing stopped: Filament sensor disabled")
48-
try:
73+
# Early abort in case of out ot filament when start printing, as we
74+
# can't change with a cold nozzle
75+
if event is Events.PRINT_STARTED and self.no_filament():
76+
self._logger.info("Printing aborted: no filament detected!")
77+
self._printer.cancel_print()
78+
# Run after resume gcode
79+
if event is Events.PRINT_RESUMED:
80+
if self._filament_change:
81+
self._logger.info("Sending after resume GCODE!")
82+
self._printer.commands(self.after_resume_gcode)
83+
self._filament_change = False
84+
# Enable sensor
85+
if event in (
86+
Events.PRINT_STARTED,
87+
Events.PRINT_RESUMED
88+
):
89+
self._logger.info("%s: Enabling filament sensor." % (event))
90+
if self.sensor_enabled():
4991
GPIO.remove_event_detect(self.pin)
50-
except Exception:
51-
pass
52-
53-
def check_gpio(self, channel):
54-
state = GPIO.input(self.pin)
55-
self._logger.debug("Detected sensor [%s] state [%s]"%(channel, state))
56-
if state != self.switch: # If the sensor is tripped
57-
self._logger.debug("Sensor [%s]"%state)
58-
if self._printer.is_printing():
59-
self._printer.toggle_pause_print()
92+
GPIO.add_event_detect(self.pin, GPIO.BOTH, callback=self.sensor_callback, bouncetime=self.bounce)
93+
# Disable sensor
94+
elif event in (
95+
Events.PRINT_DONE,
96+
Events.PRINT_FAILED,
97+
Events.PRINT_CANCELLED,
98+
Events.ERROR
99+
):
100+
self._logger.info("%s: Disabling filament sensor." % (event))
101+
GPIO.remove_event_detect(self.pin)
102+
103+
def sensor_callback(self, _):
104+
sleep(self.bounce/1000)
105+
if self.no_filament():
106+
if self._filament_change:
107+
self._logger.info("Out of filament, waiting for replacement!")
108+
else:
109+
self._logger.info("Out of filament, pausing!")
110+
self._printer.pause_print()
111+
if self.after_pause_gcode:
112+
self._logger.info("Sending after pause GCODE")
113+
self._printer.commands(self.after_pause_gcode)
114+
self._filament_change = True
115+
else:
116+
self._logger.info("Filament detected, resume to continue!")
60117

61118
def get_update_information(self):
62119
return dict(

octoprint_filamentreload/templates/filamentreload_settings.jinja2

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,16 @@ Define the pin used by your sensor and the debounce timing for false positive pr
2424
</select>
2525
</div>
2626
</div>
27+
<div class="control-group">
28+
<label class="control-label">{{ _('After pause GCODE:') }}</label>
29+
<div class="controls">
30+
<textarea rows="4" class="block" data-bind="value: settings.plugins.filamentreload.after_pause_gcode"></textarea>
31+
</div>
32+
</div>
33+
<div class="control-group">
34+
<label class="control-label">{{ _('After resume GCODE:') }}</label>
35+
<div class="controls">
36+
<textarea rows="4" class="block" data-bind="value: settings.plugins.filamentreload.after_resume_gcode"></textarea>
37+
</div>
38+
</div>
2739
</form>

0 commit comments

Comments
 (0)