예제 #1
0
class FidoTail(FSMClient):
    def __init__(self, inputs, outputs):
        self.inputs = inputs
        self.outputs = outputs
        self.fsm = Fysom({'initial': 'Idle',
                          'events': [
                              {'name': 'start_wagging', 'src': ['Idle', 'Stopping'], 'dst': 'StartingWagging'},
                              {'name': 'started', 'src': 'StartingWagging', 'dst': 'WaggingRight'},
                              {'name': 'timeout', 'src': 'WaggingLeft', 'dst': 'WaggingRight'},
                              {'name': 'timeout', 'src': 'WaggingRight', 'dst': 'WaggingLeft'},
                              {'name': 'stop_wagging', 'src': ['WaggingLeft', 'WaggingRight'], 'dst': 'Stopping'},
                              {'name': 'stop_wagging', 'src': 'Idle', 'dst': 'Idle'},
                              {'name': 'stopped', 'src': 'Stopping', 'dst': 'Idle'}],
                          'callbacks': {
                              'onenterStartingWagging': self._enterStartingWagging,
                              'onenterWaggingRight': self._enterWaggingRight,
                              'doWaggingRight': self._doWaggingRight,
                              'onenterWaggingLeft': self._enterWaggingLeft,
                              'doWaggingLeft': self._doWaggingLeft,
                              'onenterStopping': self._enterStopping}})

    #
    # fsm action methods (private)
    #
    def _enterStartingWagging(self, event):
        self.delay = event.delay
        self.count = event.count
        self.fsm.started()
        
    def _enterWaggingRight(self, event):
        #servo_if.set_servo_reliably(servo_if.TAIL, servo_if.TAIL_RIGHT)
        self.outputs['tail'] = servo_if.TAIL_RIGHT
        self.timeout_time = time.time() + self.delay

    def _doWaggingRight(self):
        if time.time() >= self.timeout_time:
            self.fsm.timeout()

    def _enterWaggingLeft(self, event):
        #servo_if.set_servo_reliably(servo_if.TAIL, servo_if.TAIL_LEFT)
        self.outputs['tail'] = servo_if.TAIL_LEFT
        self.timeout_time = time.time() + self.delay

    def _doWaggingLeft(self):
        if time.time() >= self.timeout_time:
            self.count -= 1
            if self.count > 0:
                self.fsm.timeout()
            else:
                self.fsm.stop_wagging()
            
    def _enterStopping(self, event):
        #servo_if.set_servo(servo_if.TAIL, servo_if.TAIL_CENTER)
        self.outputs['tail'] = servo_if.TAIL_CENTER
        self.fsm.stopped()

    #
    # public interface methods
    #
    def start_wagging(self, delay=0.25, count=5):
        self.fsm.start_wagging(delay=delay, count=count)

    def stop_wagging(self):
        self.fsm.stop_wagging()

    def is_wagging(self):
        return self.fsm.current != 'Idle'