Source code for wpilib.digitalsource

#----------------------------------------------------------------------------
# Copyright (c) FIRST 2008-2012. All Rights Reserved.
# Open Source Software - may be modified and shared by FRC teams. The code
# must be accompanied by the FIRST BSD license file in the root directory of
# the project.
#----------------------------------------------------------------------------

import hal
import weakref

from .resource import Resource
from .sensorbase import SensorBase
from .interruptablesensorbase import InterruptableSensorBase

__all__ = ["DigitalSource"]

[docs]class DigitalSource(InterruptableSensorBase): """DigitalSource Interface. The DigitalSource represents all the possible inputs for a counter or a quadrature encoder. The source may be either a digital input or an analog input. If the caller just provides a channel, then a digital input will be constructed and freed when finished for the source. The source can either be a digital input or analog trigger but not both. """ channels = Resource(SensorBase.kDigitalChannels) def __init__(self, channel, input): """ :param channel: Port for the digital input :type channel: int :param input: True if input, False otherwise :type input: int """ super().__init__() self.channel = channel # XXX: Replace with hal.checkDigitalChannel when implemented SensorBase.checkDigitalChannel(channel) try: DigitalSource.channels.allocate(self, channel) except IndexError as e: raise IndexError("Digital input %d is already allocated" % self.channel) from e self._port = hal.initializeDigitalPort(hal.getPort(channel)) hal.allocateDIO(self._port, True if input else False) self._port_finalizer = weakref.finalize(self, hal.freeDIO, self._port) @property
[docs] def port(self): if not self._port_finalizer.alive: return None return self._port
[docs] def free(self): if self.channel is None: return DigitalSource.channels.free(self.channel) self._port_finalizer() self.channel = None
[docs] def getChannelForRouting(self): """Get the channel routing number :returns: channel routing number """ return self.channel
[docs] def getModuleForRouting(self): """Get the module routing number :returns: 0 """ return 0
[docs] def getAnalogTriggerForRouting(self): """Is this an analog trigger :returns: True if this is an analog trigger """ return False