'required': ['commands',
'transitions']}},
'additionalProperties': False}}))
- receives = []
- receives.append(MessageTemplate({'target': {'const': self.name},
- 'command': {'const': 'get state'}}))
- receives.append(MessageTemplate({'target': {'const': self.name},
- 'command': {'const': 'get machine'}}))
- receives.append(MessageTemplate({'target': {'const': self.name},
- 'command': {'const': 'set state'},
- 'new state': {'type': 'string'}}))
+ triggers = []
for state in self.conf['states']:
commands = self.conf['states'][state]['commands']
for command in commands:
transitions = self.conf['states'][state]['transitions']
for transition in transitions:
template = MessageTemplate(transition['trigger'])
- if template not in receives:
- receives.append(template)
- self.bus.register(self.name, 'StateMachine',
- sends, receives, self._receive)
+ if template not in triggers:
+ triggers.append(template)
+ self.bus.register(self.name, 'StateMachine', sends,
+ [([MessageTemplate({'target':
+ {'const': self.name},
+ 'command':
+ {'const': 'get state'}})],
+ self._get_state),
+ ([MessageTemplate({'target':
+ {'const': self.name},
+ 'command':
+ {'const': 'get machine'}})],
+ self._get_machine),
+ ([MessageTemplate({'target':
+ {'const': self.name},
+ 'command':
+ {'const': 'set state'},
+ 'new state':
+ {'type': 'string'}})],
+ self._set_state),
+ (triggers, self._trigger)])
- async def _receive(self, message: Message) -> None:
- if ('target' in message and message['target'] == self.name and
- 'command' in message):
- if message['command'] == 'get state':
- await self.bus.send(Message(self.name,
- {'state': self._current_state}))
- if message['command'] == 'get machine':
- await self.bus.send(Message(self.name,
- {'init': self.conf['init'],
- 'states': self.conf['states']}))
- if (message['command'] == 'set state' and
- 'new state' in message and
- message['new state'] != self._current_state and
- message['new state'] in self.conf['states']):
- assert isinstance(message['new state'], str)
- new_state = message['new state']
- self._current_state = new_state
- await self.bus.send(Message(self.name,
- {'event': 'changed',
- 'state': new_state}))
- commands = self.conf['states'][new_state]['commands']
- for command in commands:
- await self.bus.send(Message(self.name, command))
+ async def _get_state(self, message: Message) -> None:
+ await self.bus.send(Message(self.name,
+ {'state': self._current_state}))
+
+ async def _get_machine(self, message: Message) -> None:
+ await self.bus.send(Message(self.name,
+ {'init': self.conf['init'],
+ 'states': self.conf['states']}))
+
+ async def _set_state(self, message: Message) -> None:
+ if (message['new state'] != self._current_state and
+ message['new state'] in self.conf['states']):
+ assert isinstance(message['new state'], str)
+ new_state = message['new state']
+ self._current_state = new_state
+ await self.bus.send(Message(self.name,
+ {'event': 'changed',
+ 'state': new_state}))
+ commands = self.conf['states'][new_state]['commands']
+ for command in commands:
+ await self.bus.send(Message(self.name, command))
+
+ async def _trigger(self, message: Message) -> None:
transitions = self.conf['states'][self._current_state]['transitions']
for transition in transitions:
if (MessageTemplate(transition['trigger']).check(message) and