@@ -117,7 +117,9 @@ def gpio_remove_event_detect(self, pin:int):
117117class BaseRPiGPIOWrapper (BaseGPIOWrapper ):
118118 """RPI.GPIO base wrapper"""
119119
120- _gpios_pwm = [None ] * 200
120+ def __init__ (self ):
121+ """constructor"""
122+ self ._gpios_pwm = [None ] * 200
121123
122124 def init (self , gpio_mode = None ):
123125 """initialize GPIO library"""
@@ -185,6 +187,7 @@ class MockGPIOWrapper(BaseRPiGPIOWrapper):
185187
186188 def __init__ (self ):
187189 """constructor, imports Mock.GPIO"""
190+ super ().__init__ ()
188191 self .GPIO = import_module ('Mock.GPIO' )
189192 dependencies_logger .log ("using Mock.GPIO for GPIO mocking" , Loglevel .INFO )
190193
@@ -193,6 +196,7 @@ class RPiGPIOWrapper(BaseRPiGPIOWrapper):
193196
194197 def __init__ (self ):
195198 """constructor, imports RPi.GPIO"""
199+ super ().__init__ ()
196200 self .GPIO = import_module ('RPi.GPIO' )
197201 dependencies_logger .log ("using RPi.GPIO for GPIO control" , Loglevel .INFO )
198202
@@ -201,6 +205,7 @@ class JetsonGPIOWrapper(BaseRPiGPIOWrapper):
201205
202206 def __init__ (self ):
203207 """constructor, imports Jetson.GPIO"""
208+ super ().__init__ ()
204209 self .GPIO = import_module ('Jetson.GPIO' )
205210 dependencies_logger .log ("using Jetson.GPIO for GPIO control" , Loglevel .INFO )
206211
@@ -209,17 +214,17 @@ class OPiGPIOWrapper(BaseRPiGPIOWrapper):
209214
210215 def __init__ (self ):
211216 """constructor, imports OPi.GPIO"""
217+ super ().__init__ ()
212218 self .GPIO = import_module ('OPi.GPIO' )
213219 dependencies_logger .log ("using OPi.GPIO for GPIO control" , Loglevel .INFO )
214220
215221class GpiozeroWrapper (BaseGPIOWrapper ):
216222 """gpiozero GPIO wrapper"""
217223
218- _gpios = [None ] * 200
219- _gpios_pwm = [None ] * 200
220-
221224 def __init__ (self ):
222225 """constructor, imports gpiozero"""
226+ self ._gpios = [None ] * 200
227+ self ._gpios_pwm = [None ] * 200
223228 self .gpiozero = import_module ('gpiozero' )
224229 dependencies_logger .log ("using gpiozero for GPIO control" , Loglevel .INFO )
225230
@@ -234,16 +239,20 @@ def deinit(self):
234239 def gpio_setup (self , pin :int , mode :GpioMode , initial :Gpio = Gpio .LOW , pull_up_down :GpioPUD = GpioPUD .PUD_OFF ):
235240 """setup GPIO pin"""
236241 if mode == GpioMode .OUT :
237- self ._gpios [pin ] = self .gpiozero .DigitalOutputDevice (pin , initial_value = bool (initial ))
242+ if self ._gpios [pin ] is None or self ._gpios [pin ].closed :
243+ self ._gpios [pin ] = self .gpiozero .DigitalOutputDevice (pin , initial_value = bool (initial ))
238244 else :
239- self ._gpios [pin ] = self .gpiozero .DigitalInputDevice (pin )
245+ if self ._gpios [pin ] is None or self ._gpios [pin ].closed :
246+ self ._gpios [pin ] = self .gpiozero .DigitalInputDevice (pin )
240247
241248 def gpio_cleanup (self , pin :int ):
242249 """cleanup GPIO pin"""
243250 if self ._gpios [pin ] is not None :
244251 self ._gpios [pin ].close ()
252+ self ._gpios [pin ] = None
245253 if self ._gpios_pwm [pin ] is not None :
246254 self ._gpios_pwm [pin ].close ()
255+ self ._gpios_pwm [pin ] = None
247256
248257 def gpio_input (self , pin :int ) -> int :
249258 """read GPIO pin"""
@@ -314,7 +323,9 @@ def gpio_setup(self, pin:int, mode:GpioMode, initial:Gpio=Gpio.LOW, pull_up_down
314323
315324 def gpio_cleanup (self , pin :int ):
316325 """cleanup GPIO pin"""
317- self ._gpios [pin ].close ()
326+ if self ._gpios [pin ] is not None :
327+ self ._gpios [pin ].close ()
328+ self ._gpios [pin ] = None
318329
319330 def gpio_input (self , pin :int ) -> int :
320331 """read GPIO pin"""
@@ -327,7 +338,7 @@ def gpio_output(self, pin:int, value):
327338
328339board_mapping = {
329340 "raspberry pi 5" : (GpiozeroWrapper , Board .RASPBERRY_PI5 , "gpiozero" , "https://gpiozero.readthedocs.io/en/stable/installing.html" ),
330- "raspberry" : (GpiozeroWrapper , Board .RASPBERRY_PI , "RPi.GPIO" , "https://sourceforge.net/p/raspberry-gpio-python/wiki/install" ),
341+ "raspberry" : (RPiGPIOWrapper , Board .RASPBERRY_PI , "RPi.GPIO" , "https://sourceforge.net/p/raspberry-gpio-python/wiki/install" ),
331342 "jetson" : (JetsonGPIOWrapper , Board .NVIDIA_JETSON , "jetson-gpio" , "https://github.com/NVIDIA/jetson-gpio" ),
332343 "luckfox" : (peripheryWrapper , Board .LUCKFOX_PICO , "periphery" , "https://github.com/vsergeev/python-periphery" ),
333344 "orange" : (OPiGPIOWrapper , Board .ORANGE_PI , "OPi.GPIO" , "https://github.com/rm-hull/OPi.GPIO" )
@@ -365,16 +376,15 @@ def handle_import_error(err, board_name, module_name, install_link):
365376 Loglevel .ERROR )
366377 raise err
367378
368- def initialize_gpio () :
379+ def initialize_gpio (force_lib : Board = None ) -> tuple [ BaseGPIOWrapper , Board ] :
369380 """initialize GPIO"""
370381 model = get_board_model_name ()
371382 dependencies_logger .log (f"Board model: { model } " , Loglevel .INFO )
372383 if model == "mock" :
373384 return MockGPIOWrapper (), Board .UNKNOWN
374385
375-
376386 for key , (wrapper_class , board_enum , module_name , install_link ) in board_mapping .items ():
377- if key in model :
387+ if ( key in model and force_lib is None ) or ( force_lib == module_name ) :
378388 try :
379389 return wrapper_class (), board_enum
380390 except ModuleNotFoundError as err :
0 commit comments