예제 #1
0
def generate_state_machine():
    pmodel = ProtoModel("Protocol Model")
    pmachine = Machine(model=pmodel,
                       states=['0'],
                       initial='0',
                       auto_transitions=False)
    pmachine.add_transition(exit_label, source='0', dest='0')
    return pmachine
예제 #2
0
class Process(object):

    states = ['sleeping', 'waiting', 'running', 'terminated']

    def __init__(self, name):
        self.name = name

        # initialize the state machine
        self.machine = GraphMachine(model=self,
                                    states=self.states,
                                    initial='sleeping')

        # add transitions
        self.machine.add_transition(trigger='wake_up',
                                    source='sleeping',
                                    dest='waiting')
        self.machine.add_transition(trigger='start',
                                    source='waiting',
                                    dest='running',
                                    before='display_message')
        self.machine.add_transition(trigger='interrupt',
                                    source='*',
                                    dest='terminated',
                                    after='display_warning')
        self.machine.add_transition(trigger='random_trigger',
                                    source='*',
                                    dest='terminated',
                                    conditions=['is_valid'])

        # create image of the state machine (requires GraphViz and pygraphviz)
        self.graph.draw('my_state_diagram.png', prog='dot')

    def is_valid(self):
        return random.random() < 0.5

    def display_message(self):
        print("I'm starting...")

    def display_warning(self):
        print("I've just got an interrupt!")

    def random_termination(self):
        print('terminated')
예제 #3
0
class IR_Model(object):
    def __init__(self, name):
        self.name = name
        self.states = ['start']
        self.machine = GraphMachine(model=self, initial='start', title=name, show_conditions=True, show_state_attributes=True)

    def get_condition_list(self, self_transitions):
        condition_list = []
        existing_conditions = self_transitions[0].conditions
        for condition in existing_conditions:
            condition_list.append(condition.func)  # get the string of the condition, not the condition obj
        return condition_list

    def update_condition_list(self, self_transitions, new_condition_list):
        condition_list = self.get_condition_list(self_transitions)
        for new_condition in new_condition_list:
            if new_condition not in condition_list:
                condition_list.append(new_condition)
        return condition_list

    def add_new_transition(self, trigger, source, dest):
        existing_transitions = self.machine.get_transitions(trigger=trigger, source=source, dest=dest)
        if len(existing_transitions) == 0:
            self.machine.add_transition(trigger=trigger, source=source, dest=dest)
            self.states.append(source)
            self.states.append(dest)

    def add_self_transition(self, state, new_condition_list):
        trigger_list = self.machine.get_triggers(state)
        for trigger in trigger_list:
            if trigger == 'self':  # self loop exists in the usage model
                self_transitions = self.machine.get_transitions('self', state, state)
                condition_list = self.update_condition_list(self_transitions, new_condition_list)
                self.machine.remove_transition('self', state, state)
                self.machine.add_transition(trigger='self', source=state, dest=state, conditions=condition_list)
                self.states.append(state)
                return
        # when self loop doesn't exist or the state doesn't exist
        self.machine.add_transition(trigger='self', source=state, dest=state, conditions=new_condition_list)
        self.states.append(state)
예제 #4
0
class Request(object):

    # --- validity checks ---
    def is_tel_nr_valid(self):
        print("is_telephone_nr_valid()")
        self._user_telephone = self._payload.text()
        return not re.match(r'[+]380\d{2}\d{7}', self._user_telephone) is None

    def is_user_name_valid(self):
        print("is_user_name_valid()")
        self._user_name = self._payload.text()
        return not re.match(r'\w+', self._user_name) is None

    def is_home_flat_valid(self):
        print("is_home_flat_valid()")
        return True

    def is_car_valid(self):
        print("is_car_valid()")
        return True

    def is_cmd(self, stype):
        print("is_cmd({})".format(stype))
        cmd = self._payload.text()
        return cmd == "{{" + stype + "}}"

    def is_reg_tel_cmd(self):
        return self.is_cmd(CMD_REG_TEL)

    def is_add_home_flat_cmd(self):
        return self.is_cmd(CMD_ADD_HOME_FLAT_NR)

    def is_add_name_cmd(self):
        return self.is_cmd(CMD_ADD_NAME)

    def is_add_car_cmd(self):
        return self.is_cmd(CMD_ADD_CAR_NR)

    def is_unknown_cmd(self):
        return not (self.is_reg_tel_cmd()       or \
                    self.is_add_home_flat_cmd() or \
                    self.is_add_car_cmd()       or \
                    self.is_add_name_cmd())

    def db_failed(self):
        return False

    # --- on enter ---
    def on_enter_IDENTIFY(self):
        print("on_enter state={}".format(self.state))
        # put sql queries into data base
        # check user is present inside data base tables
        # set _user_identified and _user_confirmed to an appropriate state according to db
        self._user_identified = False
        self._user_confirmed = False
        self._need_input = False
        self._need_output = True
        self._message_out = TXT_IDENTIFY__NEW_USER
        self._kb_out = KBD_ALL_KEYS

    # ---
    def generateConfirmationCode(self):
        stime = str(datetime.datetime.timestamp(datetime.datetime.now()))
        return str(stime).replace('.', '')[-5:]

    def on_enter_REG_TEL_NR(self):
        print("on_enter state={}".format(self.state))
        self._need_input = True
        self._message_out = TXT_REG_TEL_NR
        self._kb_out = Keyboard([])

    def on_enter_GOT_TEL_NR(self):
        print("on_enter state={}".format(self.state))
        self._confirmation_code = self.generateConfirmationCode()
        self._need_input = False
        self._need_output = False
        self._message_out = TXT_GOT_TEL_NR
        self._kb_out = KBD_ALL_KEYS

    # ---
    def on_enter_ADD_HOME_FL_NR(self):
        print("on_enter state={}".format(self.state))
        self._need_input = True
        self._message_out = TXT_ADD_HOME_FL_NR
        self._kb_out = Keyboard([])

    def on_enter_GOT_HOME_FL_NR(self):
        self._need_input = False
        self._need_output = False
        self._message_out = TXT_GOT_HOME_FL_NR
        self._kb_out = KBD_ALL_KEYS
        pass

    # ---
    def on_enter_ADD_CAR_NR(self):
        print("on_enter state={}".format(self.state))
        self._need_input = True
        self._message_out = TXT_ADD_CAR_NR
        self._kb_out = Keyboard([])

    def on_enter_GOT_CAR_NR(self):
        self._need_input = False
        self._need_output = False
        self._message_out = TXT_GOT_CAR_NR
        self._kb_out = KBD_ALL_KEYS
        pass

    # ---
    def on_enter_ADD_NAME(self):
        print("on_enter state={}".format(self.state))
        self._need_input = True
        self._message_out = TXT_ADD_NAME
        self._kb_out = Keyboard([])

    def on_enter_GOT_NAME(self):
        self._need_input = False
        self._need_output = False
        self._message_out = TXT_GOT_NAME
        self._kb_out = KBD_ALL_KEYS
        pass

    # ---
    def on_enter_UPDATE_DB(self):
        print("on_enter state={}".format(self.state))
        self._need_output = False
        self._need_input = False

    def on_enter_ERROR(self):
        print("on_enter state={}".format(self.state))
        self._message_out = ERR_GENERAL
        self._kb_out = KBD_ALL_KEYS
        self._need_output = False
        self._need_input = False

    def on_enter_DELETE(self):
        print("on_enter state={}".format(self.state))
        self._need_input = True

    def _init_sm(self):
        states = [
            'NEW', 'IDENTIFY', 'REG_TEL_NR', 'GOT_TEL_NR', 'ADD_HOME_FL_NR',
            'GOT_HOME_FL_NR', 'ADD_CAR_NR', 'GOT_CAR_NR', 'ADD_NAME',
            'GOT_NAME', 'UPDATE_DB', 'DELETE', 'ERROR'
        ]
        #self._machine = Machine(model=self, states=states, initial='NEW')
        self._machine = Machine(model=self,
                                states=states,
                                initial='NEW',
                                show_conditions=True)
        self._machine.add_transition('advance', 'NEW', 'IDENTIFY')
        # --- IDENTIFY to ALL
        self._machine.add_transition('advance',
                                     'IDENTIFY',
                                     'REG_TEL_NR',
                                     unless='db_failed',
                                     conditions='is_reg_tel_cmd')
        self._machine.add_transition('advance',
                                     'IDENTIFY',
                                     'ADD_HOME_FL_NR',
                                     unless='db_failed',
                                     conditions='is_add_home_flat_cmd')
        self._machine.add_transition('advance',
                                     'IDENTIFY',
                                     'ADD_CAR_NR',
                                     unless='db_failed',
                                     conditions='is_add_car_cmd')
        self._machine.add_transition('advance',
                                     'IDENTIFY',
                                     'ADD_NAME',
                                     unless='db_failed',
                                     conditions='is_add_name_cmd')
        self._machine.add_transition('advance',
                                     'IDENTIFY',
                                     'ERROR',
                                     conditions='db_failed')
        self._machine.add_transition('advance',
                                     'IDENTIFY',
                                     'ERROR',
                                     conditions='is_unknown_cmd')
        # --- TEL_NRs
        self._machine.add_transition('advance',
                                     'REG_TEL_NR',
                                     'GOT_TEL_NR',
                                     conditions='is_tel_nr_valid')
        self._machine.add_transition('advance', 'REG_TEL_NR', 'ERROR')
        self._machine.add_transition('advance', 'GOT_TEL_NR', 'UPDATE_DB')
        # --- HOME_FL_NRs
        self._machine.add_transition('advance',
                                     'ADD_HOME_FL_NR',
                                     'GOT_HOME_FL_NR',
                                     conditions='is_home_flat_valid')
        self._machine.add_transition('advance', 'ADD_HOME_FL_NR', 'ERROR')
        self._machine.add_transition('advance', 'GOT_HOME_FL_NR', 'UPDATE_DB')
        # --- CAR_NRs
        self._machine.add_transition('advance',
                                     'ADD_CAR_NR',
                                     'GOT_CAR_NR',
                                     conditions='is_car_valid')
        self._machine.add_transition('advance', 'ADD_CAR_NR', 'ERROR')
        self._machine.add_transition('advance', 'GOT_CAR_NR', 'UPDATE_DB')
        # --- NAME_NRs
        self._machine.add_transition('advance',
                                     'ADD_NAME',
                                     'GOT_NAME',
                                     conditions='is_user_name_valid')
        self._machine.add_transition('advance', 'ADD_NAME', 'ERROR')
        self._machine.add_transition('advance', 'GOT_NAME', 'UPDATE_DB')
        #---
        self._machine.add_transition('advance',
                                     'UPDATE_DB',
                                     'ERROR',
                                     conditions='db_failed')
        self._machine.add_transition('advance', 'UPDATE_DB', 'DELETE')
        self._machine.add_transition('advance', 'ERROR', 'DELETE')

    # ---- Public ----

    def get_kbd(self):
        return self._kb_out

    def get_message_out(self):
        return self._message_out

    def get_user_id(self):
        self._payload.user_id()

    def need_input(self):
        return self._need_input

    def need_output(self):
        return self.need_input() or self._need_output

    def finished(self):
        return self.state == "DELETE"

    def update_payload(self, payload):
        self._payload = payload

    def __init__(self, payload):
        self._payload = payload
        self._message_out = None
        self._kb_out = None

        self._user_identified = None
        self._user_confirmed = None
        self._user_blocked = None
        self._need_input = False
        self._need_output = False

        self._user_telephone = ''
        self._user_name = ''
        self._confirmation_code = ''
        self._user_home_flat = ''

        self._init_sm()
예제 #5
0
class topomap(object):
    states = [
        '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13',
        '14', '15', '16', '17', '18', '19', '20', '21'
    ]
    actions = ['N', 'E', 'S', 'W']

    def __init__(self, init, initial_heading):
        self.machine = Machine(model=self, states=topomap.states, initial=init)
        self.last_state = init
        self.current_heading = initial_heading
        self.machine.add_transition(trigger=self.actions[0],
                                    source='1',
                                    dest='4')

        self.machine.add_transition(trigger=self.actions[1],
                                    source='1',
                                    dest='5')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='1',
                                    dest='2')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='2',
                                    dest='3')

        self.machine.add_transition(trigger=self.actions[1],
                                    source='2',
                                    dest='1')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='2',
                                    dest='10')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='3',
                                    dest='8')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='3',
                                    dest='2')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='3',
                                    dest='4')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='3',
                                    dest='9')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='4',
                                    dest='7')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='4',
                                    dest='1')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='4',
                                    dest='5')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='4',
                                    dest='3')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='5',
                                    dest='6')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='5',
                                    dest='1')

        self.machine.add_transition(trigger=self.actions[2],
                                    source='5',
                                    dest='4')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='6',
                                    dest='11')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='6',
                                    dest='5')

        self.machine.add_transition(trigger=self.actions[2],
                                    source='6',
                                    dest='7')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='7',
                                    dest='12')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='7',
                                    dest='4')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='7',
                                    dest='6')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='7',
                                    dest='8')

        self.machine.add_transition(trigger=self.actions[3],
                                    source='8',
                                    dest='3')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='8',
                                    dest='7')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='8',
                                    dest='9')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='9',
                                    dest='10')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='9',
                                    dest='3')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='9',
                                    dest='8')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='10',
                                    dest='13')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='10',
                                    dest='2')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='10',
                                    dest='9')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='11',
                                    dest='16')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='11',
                                    dest='6')

        self.machine.add_transition(trigger=self.actions[2],
                                    source='11',
                                    dest='12')

        self.machine.add_transition(trigger=self.actions[3],
                                    source='12',
                                    dest='7')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='12',
                                    dest='11')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='12',
                                    dest='14')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='13',
                                    dest='18')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='13',
                                    dest='10')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='13',
                                    dest='14')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='14',
                                    dest='18')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='14',
                                    dest='12')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='14',
                                    dest='17')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='14',
                                    dest='13')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='15',
                                    dest='19')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='15',
                                    dest='15')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='15',
                                    dest='15')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='16',
                                    dest='19')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='16',
                                    dest='11')

        self.machine.add_transition(trigger=self.actions[2],
                                    source='16',
                                    dest='17')

        self.machine.add_transition(trigger=self.actions[3],
                                    source='17',
                                    dest='14')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='17',
                                    dest='16')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='17',
                                    dest='18')

        self.machine.add_transition(trigger=self.actions[3],
                                    source='18',
                                    dest='14')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='18',
                                    dest='17')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='18',
                                    dest='13')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='19',
                                    dest='20')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='19',
                                    dest='16')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='19',
                                    dest='15')
        self.machine.add_transition(trigger=self.actions[2],
                                    source='19',
                                    dest='21')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='20',
                                    dest='21')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='20',
                                    dest='19')

        self.machine.add_transition(trigger=self.actions[2],
                                    source='20',
                                    dest='21')

        self.machine.add_transition(trigger=self.actions[0],
                                    source='21',
                                    dest='20')
        self.machine.add_transition(trigger=self.actions[3],
                                    source='21',
                                    dest='19')
        self.machine.add_transition(trigger=self.actions[1],
                                    source='21',
                                    dest='20')

    def service_callback(self, req):
        action_str = "INIT"
        action_str = req.action
        head = actions.index(self.current_heading)
        turn_arr = ['L', 'F', 'R']
        turn = turn_arr.index(action_str) - 1
        absolute_dir = (head + turn) % 4
        try:
            if absolute_dir == 0:
                self.N()
            elif absolute_dir == 1:
                self.E()
            elif absolute_dir == 2:
                self.S()
            elif absolute_dir == 3:
                self.W()
            print "current state: ", self.machine.get_state(self.state).name
            print "last_state: ", self.last_state
            self.last_state = self.machine.get_state(self.state).name
            #m.get_graph().draw('my_state_diagram.png', prog='dot')
            return self.machine.get_state(self.state).name
        except transitions.core.MachineError as e:
            print e
예제 #6
0
class FsmGsm(object):
    """ FSM states
    """
    states = ['init', 'GSM_IDLE', 'GSM_CHECK', 'GSM_READ']

    request_list = [
        "GSM_ACTIVE_REQUEST", "GSM_DEACTIVE_REQUEST", "GSM_POSITION_REQUEST"
    ]

    def __init__(self, name, mi_sim868, url_post_token, url_post_notification,
                 refresh_token, url_get, device_id):

        self.name = name
        self.T_CHECK = 30
        self.flag_data_available = 0
        self.flag_active = 0
        self.__new_active = 0
        self.flag_find_car = 0
        self.gsm_data = None
        ''' SIM868
        '''
        self.sim868 = mi_sim868
        self.url_post_token = url_post_token
        self.url_post_notification = url_post_notification
        self.refresh_token = refresh_token
        self.url_get = url_get
        self.token = 0
        self.device_id = device_id
        ''' Send data
        '''
        self.last_data = {}
        """ Timeout GSM
        """
        self.timeout_gsm = int(dt.now().timestamp()) + self.T_CHECK
        """ Initialize the state machine
        """
        self.machine = Machine(model=self,
                               states=FsmGsm.states,
                               initial='init')
        """ Add transitions
        """
        self.machine.add_transition(trigger='start',
                                    source='init',
                                    dest='GSM_IDLE')
        self.machine.add_transition('fire',
                                    'GSM_IDLE',
                                    'GSM_CHECK',
                                    conditions=['check_timeout'],
                                    after='gsm_get_and_update_timeout')
        self.machine.add_transition('fire',
                                    'GSM_CHECK',
                                    'GSM_READ',
                                    conditions=['gsm_new_data_available'],
                                    after='reset_flag_new_data_available')
        self.machine.add_transition(
            'fire',
            'GSM_CHECK',
            'GSM_IDLE',
            conditions=['gsm_not_new_data_available_and_active'],
            after='read_data_and_gsm_send')
        self.machine.add_transition(
            'fire',
            'GSM_CHECK',
            'GSM_IDLE',
            conditions=['gsm_not_new_data_available_and_not_active'])
        self.machine.add_transition('fire',
                                    'GSM_READ',
                                    'GSM_IDLE',
                                    conditions=['active_request'],
                                    after='set_alarm')
        self.machine.add_transition('fire',
                                    'GSM_READ',
                                    'GSM_IDLE',
                                    conditions=['deactive_request'],
                                    after='reset_alarm')
        self.machine.add_transition('fire',
                                    'GSM_READ',
                                    'GSM_IDLE',
                                    conditions=['invalid_request'])

        self.__n = 0

    # Funciones de guarda
    def check_timeout(self):
        return int(dt.now().timestamp()) > self.timeout_gsm

    def gsm_new_data_available(self):
        return self.flag_data_available

    def gsm_not_new_data_available_and_active(self):
        return (not self.flag_data_available and self.flag_active)

    def gsm_not_new_data_available_and_not_active(self):
        return (not self.flag_data_available and not self.flag_active)

    def active_request(self):
        return (self.__new_active == 1)

    def deactive_request(self):
        return (self.__new_active == 0)

    def invalid_request(self):
        print("Dato no valido")
        return (self.__new_active != 1 and self.__new_active != 0)

    # Funciones salida

    def gsm_get_and_update_timeout(self):
        self.get_token()
        headers = f"Authorization: Bearer {self.token}"
        rcv = (self.sim868.gsm_get(self.url_get, headers))
        try:
            json_text = re.search("({.*})", rcv)[0]
            rcv_dict = json.loads(json_text)
            self.__new_active = int(rcv_dict["parameters"]["active"])
        except:
            pass

        print(f"new_active = {self.__new_active}; active: {self.flag_active}")

        if self.flag_active != self.__new_active:
            self.flag_data_available = 1
            print("flag_data_available = 1")
        self.timeout_gsm = self.timeout_gsm + self.T_CHECK

        self.__n += 1

    def read_data_and_gsm_send(self):
        print("------ GSM SEND ------")
        self.get_token()
        '''Send notification'''
        body_dict = {
            "notification": self.device_id,
            "parameters": self.last_data
        }
        body = json.dumps(body_dict)
        headers = f"Authorization: Bearer {self.token}"
        self.sim868.gsm_post(url=self.url_post_notification,
                             headers=headers,
                             body=body)

    def get_token(self):
        '''Get token'''
        body = {"refreshToken": self.refresh_token}
        response = self.sim868.gsm_post(url=self.url_post_token,
                                        body=json.dumps(body))
        json_text = re.search("({.*})", response)[0]
        token_dict = json.loads(json_text)
        self.token = token_dict["accessToken"]

    def reset_flag_new_data_available(self):
        print("Reset flag new data available")
        self.flag_data_available = 0

    def set_alarm(self):
        self.flag_active = 1
        print("------Set alarm!------")

    def reset_alarm(self):
        self.flag_active = 0
        print("------Reset alarm!------")
예제 #7
0
class DailyRoutineMachine(object):
    states = ['awake', 'asleep', 'begging']

    def __init__(self, name):
        self.name = name
        self.begging_from = None
        self.machine = Machine(model=self,
                               states=DailyRoutineMachine.states,
                               initial='awake')

        # Go To Bed Trigger / Intent
        # TODO: Determine order of operations for transition as I'm using conditionals first
        # then allowing a non-conditional catch-all.
        self.machine.add_transition(trigger='go_to_bed',
                                    source='awake',
                                    dest='begging',
                                    conditions='should_beg',
                                    before='set_begging_from')
        self.machine.add_transition('go_to_bed', 'awake', 'asleep')
        # Get Up Trigger / Intent
        self.machine.add_transition('get_up',
                                    'asleep',
                                    'begging',
                                    conditions='should_beg',
                                    before='set_begging_from')
        self.machine.add_transition('get_up', 'asleep', 'awake')
        # Yes Trigger / Intent
        self.machine.add_transition('yes',
                                    'begging',
                                    'asleep',
                                    conditions='is_begging_to_stay_awake',
                                    after='reset_begging_from')
        self.machine.add_transition('yes',
                                    'begging',
                                    'awake',
                                    conditions='is_begging_to_stay_asleep',
                                    after='reset_begging_from')
        # No Trigger / Intent
        self.machine.add_transition('no',
                                    'begging',
                                    'awake',
                                    conditions='is_begging_to_stay_awake',
                                    after='reset_begging_from')
        self.machine.add_transition('no',
                                    'begging',
                                    'asleep',
                                    conditions='is_begging_to_stay_asleep',
                                    after='reset_begging_from')
        # TODO: Determine if there is a better way of handling "after='reset_begging_from'". Very Repetitive.

    # State Retry Replies
    def current_retry(self):
        # Returning a retry this way is convenient because
        # The retries I have do not need to pass variables
        # into the template.
        current_retry_name = self.state + '_retry'
        return render_question(current_retry_name)

    # State Replies
    def current_reply(self):
        # Handy if you need to send variables into the template.
        current_reply_name = self.state + '_reply'
        current_reply_method = getattr(self, current_reply_name)
        return current_reply_method()

    def asleep_reply(self):
        return render_question('asleep_reply', state=self.state)

    def awake_reply(self):
        return render_question('awake_reply', state=self.state)

    def begging_reply(self):
        return render_question('begging_reply',
                               state=self.state,
                               begging_from=self.begging_from)

    # Transition Extras
    def set_begging_from(self):
        self.begging_from = self.state

    def reset_begging_from(self):
        self.begging_from = None

    def execute_transition(self, name):
        transition = getattr(self, name)
        try:
            # If a transition has conditionals
            # but they are not met, the transition will
            # return False.
            assert True == transition()
            return self.current_reply()
        except (MachineError, AssertionError):
            # We weren't able to make the transition.
            # Send back the states retry msg.
            return self.current_retry()

    # Transition Conditions
    def is_begging_to_stay_awake(self):
        return self.begging_from == 'awake'

    def is_begging_to_stay_asleep(self):
        return self.begging_from == 'asleep'

    @staticmethod
    def should_beg():
        return random() < 0.50  # 50/50 chance there is gonna be begging

    # Machine Helpers
    def show_graph(self):
        # graph object is created by the machine
        self.graph.draw('state.png', prog='dot')
        display(Image('state.png'))
    def return_false_v2(self):
        return False
    def onA(self):
        print("entered A")
    def onB(self):
        print("entered B")
    def atob(self):
        print("before : a to b")
    def btoa(self):
        print("after : b to a")


woman_bot = Game()
machine = Machine(model=woman_bot, states=states, initial="woman_A", ignore_invalid_triggers=True, title="figure record")

machine.add_transition("a_to_b", "woman_A", "woman_B",
                       conditions="return_true", before="atob")
machine.add_transition("b_to_a", "woman_B", "woman_A",
                       conditions=["return_false_v1"])
machine.add_transition("b_to_a_unless", "woman_B", "woman_A",
                       unless=["return_false_v1", "return_false_v2"], after="btoa")

machine.on_enter_woman_B("onB")
machine.on_enter_woman_A("onA")

woman_bot.a_to_b()
print(woman_bot.state)
# woman_bot.b_to_a()
# print(woman_bot.state)
woman_bot.b_to_a_unless()
print(woman_bot.state)
예제 #9
0
class ungetauftes_wesen(object):
  
    states = ['idle', 'move', 'check', 'move_straight', 'move_to_side','move_forward', 'move_back', 'orientate', 'open_gripper', 'rotate_gripper_fixed','vision','rotate_gripper_free','close_gripper','check_grip']

    def __init__(self, name):

        self.name = name
        
        self.havecommand = False
        self.command = " "
        
        self.angle_of_deviation = 0.0
        
        self.forward = True
        
        self.gripA = True
        self.gripB = True

        self.orientation = [0,0,0,0,0]
        self.moves_left=5
               

        # Initialize the state machine
        self.machine = Machine(model=self, states=ungetauftes_wesen.states, initial='idle')
        
       

        self.machine.add_transition(trigger='wake_up', source='idle', dest='move')
      
        self.machine.add_transition('move_straight', 'move', 'move_forward',conditions=['is_direction_forward'])
        self.machine.add_transition('move_straight', 'move', 'move_back',unless=['is_direction_forward'])
        
        self.machine.add_transition('orientate', 'move_forward', 'orientate')
        self.machine.add_transition('orientate', 'move_back', 'orientate')
        
        self.machine.add_transition('open_gripper', 'orientate', 'open_gripper')
        self.machine.add_transition('close_gripper', 'vision', 'close_gripper')
         
        self.machine.add_transition('rotate_gripper_fixed', 'open_gripper', 'rotate_gripper_fixed')
        
        self.machine.add_transition('vision', 'rotate_gripper_fixed', 'vision')
                
           
        self.machine.add_transition('check', 'idle', 'check')

        # Sweat is a disorder that can be remedied with water.
        # Unless you've had a particularly long day, in which case... bed time!
        self.machine.add_transition('move_finished', 'close_gripper', 'idle', conditions=['is_exhausted'])
        self.machine.add_transition('move_finished', 'close_gripper', 'move',)
        
      
        #self.machine.add_ordered_transitions(['move_forward', 'orientate'])
  
## CONDITIONS  

    def is_exhausted(self):
        """ Basically a coin toss. """
        return self.moves_left < 0.5
        
    def is_direction_forward(self): return self.forward
    
## CONDITIONS 
           
        
    def on_enter_move(self):
        print("entered state move")
        self.moves_left-=1
        print str(self.moves_left)+(" moves left")
        self.move_straight()
               
    def on_enter_move_forward(self):
        print("entered state move forward flag set")
        self.forward = False
        self.orientate()
    def on_enter_move_back(self):
        print("entered state move back flag set")
        self.forward = True
        self.orientate()
        
        
    def on_enter_idle(self):
        print("entered state idle")
        
    def on_enter_orientate(self):
        print("entered state orientate")   
        self.open_gripper()
        
    def on_enter_open_gripper(self):
        print("entered state open_gripper")
        senddata("testdata")
        print str(checkdata('fever'))
        self.rotate_gripper_fixed()
        
    def on_enter_rotate_gripper_fixed(self):
        print("entered state rotate_gripper_fixed")
        print("Wait for Signal:")
        self.havecommand = True
        self.command = "rotate"
        
    def on_enter_vision(self):
        print("entered state vision")
        
        self.angle_of_deviation = get_course()
        
        print "Our course is: " + str(self.angle_of_deviation)
        
        self.close_gripper()
        
        
                    
                
    def on_enter_close_gripper(self):
        print("entered state close_gripper")
        print("Wait for Signal:")
        sleep(.5)
        print(".")
        sleep(.5)
        print(".")
        sleep(.5)
        print(".")
        
        self.move_finished()
예제 #10
0
class FsmGps(object):
    """ FSM states
    """
    states = ['init', 'OFF', 'ON', 'ASSAULT']
    """ Default timeout for GPS frame sending
    """
    def __init__(self, name, mi_sim868):
        self.TIMEOUT_DEFAULT = 30
        self.name = name
        """ Input shared variables 
        """
        self.flag_active = 0
        """ Timeout GPS
        """
        self.timeout_gps = 0
        ''' GPS dictionary
        '''
        self.gps_param = {
            'GNSS_status': 0,
            'UTC': '',  # yyyyMMddhhmmss.sss
            'Latitude': 0.0,  # ±dd.dddddd            [-90.000000,90.000000]
            'Longitude': 0.0,  # ±ddd.dddddd           [-180.000000,180.000000]
            'Altitude': 0.0,  # in meters
            'Speed': 0.0,  # km/h [0,999.99]
        }
        """ Initialize the state machine
        """
        self.machine = Machine(model=self,
                               states=FsmGps.states,
                               initial='init')
        self.sim868 = mi_sim868
        """ Add transitions
        """
        self.machine.add_transition(trigger='start', source='init', dest='OFF')
        self.machine.add_transition('fire',
                                    'OFF',
                                    'ON',
                                    conditions=['is_active'])
        self.machine.add_transition('fire',
                                    'ON',
                                    'OFF',
                                    conditions=['is_not_active'])
        self.machine.add_transition('fire',
                                    'ON',
                                    'ON',
                                    conditions=['timeout_and_active'],
                                    after='send_gps_frame_and_init_timer')

    """ Guard functions
    """

    def is_active(self):
        return self.flag_active

    def is_not_active(self):
        return not self.flag_active

    def timeout_and_active(self):
        return ((int(dt.now().timestamp()) > self.timeout_gps)
                and self.flag_active)

    """ Output functions
    TODO: Modify GPS frame sending with GPS drivers
    """

    def send_gps_frame_and_init_timer(self):
        gps_data = self.sim868.get_gps_data()
        self.gps_param['UTC'] = gps_data["UTC"]
        self.gps_param['Latitude'] = gps_data["Latitude"]
        self.gps_param['Longitude'] = gps_data["Longitude"]
        self.gps_param['Altitude'] = gps_data["Altitude"]
        self.gps_param['Speed'] = gps_data["Speed"]

        print(
            "'UTC': {}, 'Latitude': {}, 'Longitude': {}, 'Altitude': {}, 'Speed': {}"
            .format(self.gps_param["UTC"], self.gps_param["Latitude"],
                    self.gps_param["Longitude"], self.gps_param["Altitude"],
                    self.gps_param["Speed"]))
        self.timeout_gps = int(dt.now().timestamp()) + self.TIMEOUT_DEFAULT
예제 #11
0
                  states=states,
                  transitions=transitions,
                  initial="first")

# method to do transition
print(life_bot.state)

life_bot.go_to_second()
life_bot.go_to_third()

print(life_bot.state)

life_bot.to_first()
print(life_bot.state)

life_bot.trigger("go_to_second")
print(life_bot.state)
life_bot.trigger("go_to_third")
print(life_bot.state)

machine.set_state("first")
print(life_bot.state)

# add state and transitions
machine.add_state("red")
machine.add_states(["green", "blue"])

# alternate machine.add_transition(trigger= ?, source=?, dest=?)
# machine.add_transition("r_to_b", "red", "blue")
machine.add_transition("other_to_r", ["blue", "green"], "red")
예제 #12
0
class Gandalf(object):
    face_in_front = False
    wants_to_enter = None
    testing_mode = False
    allowed_people_dict = {}
    current_person = None
    delete_faces = True
    force_make_queue = False

    STATES = [
        "start", "started", "initialized", "face_detected",
        "intention_recognized", "validate_card", "on_side"
    ]

    def __init__(self, robot, testing_mode=False):
        self.robot = robot
        self.testing_mode = testing_mode

        # Initialize the state machine
        self.state_machine = Machine(model=self,
                                     states=self.STATES,
                                     queued=True,
                                     initial="start")

        self.state_machine.add_transition(
            trigger="starting_up",
            source="start",
            dest="started",
            after=lambda *args, **kwargs: starting_up(self, *args, **kwargs))
        self.state_machine.add_transition(
            trigger="initializing",
            source="started",
            dest="initialized",
            after=lambda *args, **kwargs: initializing(self, *args, **kwargs))
        self.state_machine.add_transition(
            trigger="detecting_face",
            source="*",
            dest="face_detected",
            after=lambda *args, **kwargs: recognizing_face(
                self, *args, **kwargs))
        self.state_machine.add_transition(
            trigger="question_intention",
            source="face_detected",
            dest="intention_recognized",
            after=lambda *args, **kwargs: intention_recognizing(
                self, *args, **kwargs))

        self.state_machine.add_transition(
            trigger="validate_entry",
            source=["intention_recognized", "validate_card"],
            dest="validate_card",
            after=lambda *args, **kwargs: validation_card_reading(
                self, *args, **kwargs))

        self.state_machine.add_transition(
            trigger="move_to_side",
            source="validate_card",
            dest="on_side",
            after=lambda *args, **kwargs: move_to_side(self, *args, **kwargs))
        self.state_machine.add_transition(
            trigger="move_back",
            source="on_side",
            dest="initialized",
            after=lambda *args, **kwargs: move_back(self, *args, **kwargs))

        self.state_machine.add_transition(
            trigger="re_initialize",
            source="*",
            dest="initialized",
            after=lambda *args, **kwargs: initializing(self, *args, **kwargs))