51 行
1.5 KiB
Python
51 行
1.5 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
import sys
|
|
sys.path.append('../..')
|
|
import logging
|
|
import os
|
|
|
|
import report
|
|
import state_machine
|
|
|
|
logger = logging.getLogger('root')
|
|
report.stdoutLoggingConfigure(log_name_lvl=[('root', 'DEBUG'), ])
|
|
|
|
|
|
class trafic_lights(state_machine.state_machine):
|
|
LOG_PREFIX = 'TraficLights:'
|
|
|
|
STATE_RED = 'state_red'
|
|
STATE_GREEN = 'state_green'
|
|
|
|
CONDITION_TRUE = 'condition_true'
|
|
CONDITION_PEDASTRIAN_REQUEST = 'condition_pedastrian_request'
|
|
|
|
TRANSITIONS = {
|
|
STATE_RED: (
|
|
(CONDITION_PEDASTRIAN_REQUEST, 1, STATE_GREEN),
|
|
),
|
|
STATE_GREEN: (
|
|
(CONDITION_TRUE, 3, STATE_RED),
|
|
)
|
|
}
|
|
|
|
def condition_true(self):
|
|
return True
|
|
|
|
def set_padestrian_request(self):
|
|
logger.log(self.__log_lvl__, '%s Pedestrian gave state change request.', self.LOG_PREFIX)
|
|
self.pedastrian_request = True
|
|
|
|
def condition_pedastrian_request(self):
|
|
return self.pedastrian_request
|
|
|
|
|
|
sm = trafic_lights(trafic_lights.STATE_RED, logging.INFO, pedastrian_request=False)
|
|
sm.register_state_change_callback(sm.STATE_GREEN, sm.CONDITION_PEDASTRIAN_REQUEST, logger.info, 'Callback information: Traffic light had been changed to green caused by pedastrian request')
|
|
while not sm.previous_state_was(sm.STATE_GREEN):
|
|
if sm.this_state_is(sm.STATE_RED) and sm.this_state_duration() > 0.2 and not sm.condition_pedastrian_request():
|
|
sm.set_padestrian_request()
|
|
sm.work()
|