def cb_validate_init_parameters(self, pin_id, direction_mode, blocking_mode):
     '''
         Check parameters are valid. Raise exception if they are not.
         Base implementation checks pin_id is not already exported.
         Sub-classes should override, add additional checks and call
         this super class implementation. Note that basic parameter
         checks are performed before _validate_init_parameters is called
         by converting parameters to instances of their specific,
         validated, handling types: PinId, DirectionMode and BlockMode.
     '''
     # Raise a PinInUseError if pin is currently exported
     if os.path.exists(sysfs_pin_path(pin_id)):
         raise PinInUseError
 def close(self):
     '''
         Closes the pin. Can be called repeatedly safely on the same
         object. Closes pin's sys filesystem value file and unexports
         the pin from the sys filesystem.
     '''
     if ( not self.closed() ):
         self.__value_file.close()
         self.__value_file = None
         # Unexport if exported (should be unless somone sneaking around
         # behind our backs!)
         if os.path.exists(sysfs_pin_path( self.__pin_id )):
             with open(sysfs_unexport_path(), 'w') as unexport_file:
                 unexport_file.write( str(self.__pin_id) )
         self.__pin_id = None
def force_free_pin( pin_id ):
    '''
        Will 'free' a pin by unexporting it from the sys filesystem if it
        is exported. Intended to be used in cases where some failure has
        left pins exported which should not have been. It is considered
        preferable to have GPIO pin IO classes back off if a pin they are
        asked to use is already exported so as not to trample on other
        users' toes as it were. However this leaves the possibility that
        pins are accidentally left exported due to bad process termination.

        pin_id is the raw GPIO pin id to free.

        Returns None if the pin was not exported or the pin_id value if it
        was and had to be unexported.
        
        Throws a pin.PinIdInvalidError if the pin_id is invalid
    '''
    unexported = None
    if os.path.exists(sysfs_pin_path( pin_id )):
        unexported = pin_id
        with open(sysfs_unexport_path(), 'w') as unexport_file:
            unexport_file.write( str(pin_id) )
    return unexported