5
5
from octoprint .events import eventManager , Events
6
6
from flask import jsonify , make_response
7
7
import RPi .GPIO as GPIO
8
+ from time import sleep
8
9
9
10
class FilamentReloadedPlugin (octoprint .plugin .StartupPlugin ,
10
11
octoprint .plugin .EventHandlerPlugin ,
@@ -18,45 +19,101 @@ def initialize(self):
18
19
GPIO .setmode (GPIO .BOARD ) # Use the board numbering scheme
19
20
GPIO .setwarnings (False ) # Disable GPIO warnings
20
21
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
+
21
42
def on_after_startup (self ):
22
43
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 ():
28
45
self ._logger .info ("Filament Sensor active on GPIO Pin [%s]" % self .pin )
29
46
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!" )
30
49
31
50
def get_settings_defaults (self ):
32
51
return dict (
33
52
pin = - 1 , # Default is no pin
34
53
bounce = 250 , # Debounce 250ms
35
- switch = 0 # Normally Open
54
+ switch = 0 , # Normally Open
55
+ after_pause_gcode = '' ,
56
+ after_resume_gcode = '' ,
36
57
)
37
58
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
+
38
65
def get_template_configs (self ):
39
66
return [dict (type = "settings" , custom_bindings = False )]
40
67
68
+ @property
69
+ def _filament_change (self ):
70
+ return self .__dict__ .get ('_filament_change' , False )
71
+
41
72
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 ():
49
91
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!" )
60
117
61
118
def get_update_information (self ):
62
119
return dict (
0 commit comments