Jelajahi Sumber

Add microwave example

Joeri Exelmans 3 tahun lalu
melakukan
1ef21e39c5
100 mengubah file dengan 10853 tambahan dan 0 penghapusan
  1. 4 0
      microwave/README
  2. 2 0
      microwave/YAKINDU_WORKSPACE/.settings/org.eclipse.core.resources.prefs
  3. 23 0
      microwave/YAKINDU_WORKSPACE/00_EmptyModel/.project
  4. 3 0
      microwave/YAKINDU_WORKSPACE/00_EmptyModel/.settings/org.eclipse.core.resources.prefs
  5. 15 0
      microwave/YAKINDU_WORKSPACE/00_EmptyModel/Statechart.sgen
  6. 74 0
      microwave/YAKINDU_WORKSPACE/00_EmptyModel/Statechart.ysc
  7. 5 0
      microwave/YAKINDU_WORKSPACE/00_EmptyModel/src/yakindu/__init__.py
  8. 48 0
      microwave/YAKINDU_WORKSPACE/00_EmptyModel/src/yakindu/rx.py
  9. 326 0
      microwave/YAKINDU_WORKSPACE/00_EmptyModel/srcgen/statechart.py
  10. 23 0
      microwave/YAKINDU_WORKSPACE/10_OnOffModel/.project
  11. 3 0
      microwave/YAKINDU_WORKSPACE/10_OnOffModel/.settings/org.eclipse.core.resources.prefs
  12. 15 0
      microwave/YAKINDU_WORKSPACE/10_OnOffModel/Statechart.sgen
  13. 116 0
      microwave/YAKINDU_WORKSPACE/10_OnOffModel/Statechart.ysc
  14. 5 0
      microwave/YAKINDU_WORKSPACE/10_OnOffModel/src/yakindu/__init__.py
  15. 48 0
      microwave/YAKINDU_WORKSPACE/10_OnOffModel/src/yakindu/rx.py
  16. 276 0
      microwave/YAKINDU_WORKSPACE/10_OnOffModel/srcgen/statechart.py
  17. 23 0
      microwave/YAKINDU_WORKSPACE/11_EnterExitActions/.project
  18. 3 0
      microwave/YAKINDU_WORKSPACE/11_EnterExitActions/.settings/org.eclipse.core.resources.prefs
  19. 15 0
      microwave/YAKINDU_WORKSPACE/11_EnterExitActions/Statechart.sgen
  20. 116 0
      microwave/YAKINDU_WORKSPACE/11_EnterExitActions/Statechart.ysc
  21. 5 0
      microwave/YAKINDU_WORKSPACE/11_EnterExitActions/src/yakindu/__init__.py
  22. 48 0
      microwave/YAKINDU_WORKSPACE/11_EnterExitActions/src/yakindu/rx.py
  23. 286 0
      microwave/YAKINDU_WORKSPACE/11_EnterExitActions/srcgen/statechart.py
  24. 23 0
      microwave/YAKINDU_WORKSPACE/20_TimerFlat/.project
  25. 3 0
      microwave/YAKINDU_WORKSPACE/20_TimerFlat/.settings/org.eclipse.core.resources.prefs
  26. 15 0
      microwave/YAKINDU_WORKSPACE/20_TimerFlat/Statechart.sgen
  27. 139 0
      microwave/YAKINDU_WORKSPACE/20_TimerFlat/Statechart.ysc
  28. 5 0
      microwave/YAKINDU_WORKSPACE/20_TimerFlat/src/yakindu/__init__.py
  29. 48 0
      microwave/YAKINDU_WORKSPACE/20_TimerFlat/src/yakindu/rx.py
  30. 328 0
      microwave/YAKINDU_WORKSPACE/20_TimerFlat/srcgen/statechart.py
  31. 23 0
      microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/.project
  32. 3 0
      microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/.settings/org.eclipse.core.resources.prefs
  33. 15 0
      microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/Statechart.sgen
  34. 167 0
      microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/Statechart.ysc
  35. 5 0
      microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/src/yakindu/__init__.py
  36. 48 0
      microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/src/yakindu/rx.py
  37. 339 0
      microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/srcgen/statechart.py
  38. 23 0
      microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/.project
  39. 3 0
      microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/.settings/org.eclipse.core.resources.prefs
  40. 15 0
      microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/Statechart.sgen
  41. 178 0
      microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/Statechart.ysc
  42. 5 0
      microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/src/yakindu/__init__.py
  43. 48 0
      microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/src/yakindu/rx.py
  44. 345 0
      microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/srcgen/statechart.py
  45. 23 0
      microwave/YAKINDU_WORKSPACE/30_Orthogonality/.project
  46. 3 0
      microwave/YAKINDU_WORKSPACE/30_Orthogonality/.settings/org.eclipse.core.resources.prefs
  47. 15 0
      microwave/YAKINDU_WORKSPACE/30_Orthogonality/Statechart.sgen
  48. 295 0
      microwave/YAKINDU_WORKSPACE/30_Orthogonality/Statechart.ysc
  49. 5 0
      microwave/YAKINDU_WORKSPACE/30_Orthogonality/src/yakindu/__init__.py
  50. 48 0
      microwave/YAKINDU_WORKSPACE/30_Orthogonality/src/yakindu/rx.py
  51. 419 0
      microwave/YAKINDU_WORKSPACE/30_Orthogonality/srcgen/statechart.py
  52. 23 0
      microwave/YAKINDU_WORKSPACE/40_Door/.project
  53. 3 0
      microwave/YAKINDU_WORKSPACE/40_Door/.settings/org.eclipse.core.resources.prefs
  54. 15 0
      microwave/YAKINDU_WORKSPACE/40_Door/Statechart.sgen
  55. 349 0
      microwave/YAKINDU_WORKSPACE/40_Door/Statechart.ysc
  56. 5 0
      microwave/YAKINDU_WORKSPACE/40_Door/src/yakindu/__init__.py
  57. 48 0
      microwave/YAKINDU_WORKSPACE/40_Door/src/yakindu/rx.py
  58. 459 0
      microwave/YAKINDU_WORKSPACE/40_Door/srcgen/statechart.py
  59. 23 0
      microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/.project
  60. 3 0
      microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/.settings/org.eclipse.core.resources.prefs
  61. 15 0
      microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/Statechart.sgen
  62. 396 0
      microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/Statechart.ysc
  63. 5 0
      microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/src/yakindu/__init__.py
  64. 48 0
      microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/src/yakindu/rx.py
  65. 496 0
      microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/srcgen/statechart.py
  66. 23 0
      microwave/YAKINDU_WORKSPACE/42_DoorHistory/.project
  67. 3 0
      microwave/YAKINDU_WORKSPACE/42_DoorHistory/.settings/org.eclipse.core.resources.prefs
  68. 15 0
      microwave/YAKINDU_WORKSPACE/42_DoorHistory/Statechart.sgen
  69. 409 0
      microwave/YAKINDU_WORKSPACE/42_DoorHistory/Statechart.ysc
  70. 5 0
      microwave/YAKINDU_WORKSPACE/42_DoorHistory/src/yakindu/__init__.py
  71. 48 0
      microwave/YAKINDU_WORKSPACE/42_DoorHistory/src/yakindu/rx.py
  72. 521 0
      microwave/YAKINDU_WORKSPACE/42_DoorHistory/srcgen/statechart.py
  73. 23 0
      microwave/YAKINDU_WORKSPACE/50_ChildLock/.project
  74. 3 0
      microwave/YAKINDU_WORKSPACE/50_ChildLock/.settings/org.eclipse.core.resources.prefs
  75. 15 0
      microwave/YAKINDU_WORKSPACE/50_ChildLock/Statechart.sgen
  76. 617 0
      microwave/YAKINDU_WORKSPACE/50_ChildLock/Statechart.ysc
  77. 5 0
      microwave/YAKINDU_WORKSPACE/50_ChildLock/src/yakindu/__init__.py
  78. 48 0
      microwave/YAKINDU_WORKSPACE/50_ChildLock/src/yakindu/rx.py
  79. 718 0
      microwave/YAKINDU_WORKSPACE/50_ChildLock/srcgen/statechart.py
  80. 23 0
      microwave/YAKINDU_WORKSPACE/60_Correction1/.project
  81. 3 0
      microwave/YAKINDU_WORKSPACE/60_Correction1/.settings/org.eclipse.core.resources.prefs
  82. 15 0
      microwave/YAKINDU_WORKSPACE/60_Correction1/Statechart.sgen
  83. 701 0
      microwave/YAKINDU_WORKSPACE/60_Correction1/Statechart.ysc
  84. 5 0
      microwave/YAKINDU_WORKSPACE/60_Correction1/src/yakindu/__init__.py
  85. 48 0
      microwave/YAKINDU_WORKSPACE/60_Correction1/src/yakindu/rx.py
  86. 784 0
      microwave/YAKINDU_WORKSPACE/60_Correction1/srcgen/statechart.py
  87. 23 0
      microwave/YAKINDU_WORKSPACE/90_AfterTransition/.project
  88. 3 0
      microwave/YAKINDU_WORKSPACE/90_AfterTransition/.settings/org.eclipse.core.resources.prefs
  89. 15 0
      microwave/YAKINDU_WORKSPACE/90_AfterTransition/Statechart.sgen
  90. 116 0
      microwave/YAKINDU_WORKSPACE/90_AfterTransition/Statechart.ysc
  91. 5 0
      microwave/YAKINDU_WORKSPACE/90_AfterTransition/src/yakindu/__init__.py
  92. 48 0
      microwave/YAKINDU_WORKSPACE/90_AfterTransition/src/yakindu/rx.py
  93. 326 0
      microwave/YAKINDU_WORKSPACE/90_AfterTransition/srcgen/statechart.py
  94. 0 0
      microwave/lib/__init__.py
  95. 37 0
      microwave/lib/audio.py
  96. TEMPAT SAMPAH
      microwave/lib/bell.wav
  97. 166 0
      microwave/lib/gui.py
  98. TEMPAT SAMPAH
      microwave/lib/running.wav
  99. 126 0
      microwave/lib/simulator.py
  100. 0 0
      microwave/lib/small_closed_off.png

+ 4 - 0
microwave/README

@@ -0,0 +1,4 @@
+Dependencies
+============
+
+To run the 'run.py' Python script, you need Python 3 with the TkInter library.

+ 2 - 0
microwave/YAKINDU_WORKSPACE/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/Statechart.ysc=UTF-8

+ 23 - 0
microwave/YAKINDU_WORKSPACE/00_EmptyModel/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>00_EmptyModel</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/00_EmptyModel/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/00_EmptyModel/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "00_EmptyModel"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 74 - 0
microwave/YAKINDU_WORKSPACE/00_EmptyModel/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/00_EmptyModel/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/00_EmptyModel/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 326 - 0
microwave/YAKINDU_WORKSPACE/00_EmptyModel/srcgen/statechart.py

@@ -0,0 +1,326 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_magnetron_off,
+			main_region_magnetron_on,
+			null_state
+		) = range(3)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 1
+		for __state_index in range(1):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 2
+		
+		# initializations:
+		self.__is_executing = False
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_off
+		if s == self.__State.main_region_magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_on
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(2):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_magnetron_off(self):
+		"""Entry action for state 'MagnetronOff'..
+		"""
+		self.timer_service.set_timer(self, 0, 250, False)
+		
+	def __entry_action_main_region_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.timer_service.set_timer(self, 1, 250, False)
+		self.turn_magnetron_on_observable.next()
+		
+	def __exit_action_main_region_magnetron_off(self):
+		"""Exit action for state 'MagnetronOff'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		
+	def __exit_action_main_region_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.timer_service.unset_timer(self, 1)
+		self.turn_magnetron_off_observable.next()
+		
+	def __enter_sequence_main_region_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__entry_action_main_region_magnetron_off()
+		self.__state_vector[0] = self.State.main_region_magnetron_off
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_magnetron_on
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __exit_sequence_main_region_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__exit_action_main_region_magnetron_off()
+		
+	def __exit_sequence_main_region_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__exit_action_main_region_magnetron_on()
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__exit_sequence_main_region_magnetron_off()
+		elif state == self.State.main_region_magnetron_on:
+			self.__exit_sequence_main_region_magnetron_on()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_magnetron_off_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_off_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.__time_events[0]:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.__time_events[0] = False
+				self.__enter_sequence_main_region_magnetron_on_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_on_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.__time_events[1]:
+				self.__exit_sequence_main_region_magnetron_on()
+				self.__time_events[1] = False
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+		self.__time_events[1] = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__main_region_magnetron_off_react(-1)
+		elif state == self.State.main_region_magnetron_on:
+			self.__main_region_magnetron_on_react(-1)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/10_OnOffModel/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>10_OnOffModel</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/10_OnOffModel/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/10_OnOffModel/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "10_OnOffModel"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 116 - 0
microwave/YAKINDU_WORKSPACE/10_OnOffModel/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/10_OnOffModel/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/10_OnOffModel/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 276 - 0
microwave/YAKINDU_WORKSPACE/10_OnOffModel/srcgen/statechart.py

@@ -0,0 +1,276 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_magnetron_off,
+			main_region_magnetron_on,
+			null_state
+		) = range(3)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 1
+		for __state_index in range(1):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# initializations:
+		self.__is_executing = False
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_off
+		if s == self.__State.main_region_magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_on
+		return False
+		
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __enter_sequence_main_region_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_magnetron_off
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.main_region_magnetron_on
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __exit_sequence_main_region_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		
+	def __exit_sequence_main_region_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__exit_sequence_main_region_magnetron_off()
+		elif state == self.State.main_region_magnetron_on:
+			self.__exit_sequence_main_region_magnetron_on()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_magnetron_off_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_off_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.turn_magnetron_on_observable.next()
+				self.__enter_sequence_main_region_magnetron_on_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_on_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_magnetron_on()
+				self.turn_magnetron_off_observable.next()
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__main_region_magnetron_off_react(-1)
+		elif state == self.State.main_region_magnetron_on:
+			self.__main_region_magnetron_on_react(-1)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/11_EnterExitActions/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>11_EnterExitActions</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/11_EnterExitActions/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/11_EnterExitActions/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "11_EnterExitActions"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 116 - 0
microwave/YAKINDU_WORKSPACE/11_EnterExitActions/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/11_EnterExitActions/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/11_EnterExitActions/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 286 - 0
microwave/YAKINDU_WORKSPACE/11_EnterExitActions/srcgen/statechart.py

@@ -0,0 +1,286 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_magnetron_off,
+			main_region_magnetron_on,
+			null_state
+		) = range(3)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 1
+		for __state_index in range(1):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# initializations:
+		self.__is_executing = False
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_off
+		if s == self.__State.main_region_magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_on
+		return False
+		
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.turn_magnetron_on_observable.next()
+		
+	def __exit_action_main_region_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.turn_magnetron_off_observable.next()
+		
+	def __enter_sequence_main_region_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_magnetron_off
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_magnetron_on
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __exit_sequence_main_region_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		
+	def __exit_sequence_main_region_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__exit_action_main_region_magnetron_on()
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__exit_sequence_main_region_magnetron_off()
+		elif state == self.State.main_region_magnetron_on:
+			self.__exit_sequence_main_region_magnetron_on()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_magnetron_off_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_off_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.__enter_sequence_main_region_magnetron_on_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_on_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_magnetron_on()
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__main_region_magnetron_off_react(-1)
+		elif state == self.State.main_region_magnetron_on:
+			self.__main_region_magnetron_on_react(-1)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/20_TimerFlat/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>20_TimerFlat</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/20_TimerFlat/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/20_TimerFlat/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "20_TimerFlat"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 139 - 0
microwave/YAKINDU_WORKSPACE/20_TimerFlat/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/20_TimerFlat/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/20_TimerFlat/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 328 - 0
microwave/YAKINDU_WORKSPACE/20_TimerFlat/srcgen/statechart.py

@@ -0,0 +1,328 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_magnetron_off,
+			main_region_magnetron_on,
+			null_state
+		) = range(3)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		self.__remaining_time = None
+		
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 1
+		for __state_index in range(1):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 1
+		
+		# initializations:
+		self.__remaining_time = 0
+		self.__is_executing = False
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_off
+		if s == self.__State.main_region_magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_on
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(1):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.timer_service.set_timer(self, 0, (1 * 1000), False)
+		self.turn_magnetron_on_observable.next()
+		
+	def __exit_action_main_region_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		self.turn_magnetron_off_observable.next()
+		
+	def __enter_sequence_main_region_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_magnetron_off
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_magnetron_on
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __exit_sequence_main_region_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		
+	def __exit_sequence_main_region_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__exit_action_main_region_magnetron_on()
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__exit_sequence_main_region_magnetron_off()
+		elif state == self.State.main_region_magnetron_on:
+			self.__exit_sequence_main_region_magnetron_on()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_magnetron_off_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_off_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.__enter_sequence_main_region_magnetron_on_default()
+				transitioned_after = 0
+			elif self.increase_time_pressed:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.__remaining_time = self.__remaining_time + 10
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_on_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_magnetron_on()
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+			elif self.__time_events[0]:
+				self.__exit_sequence_main_region_magnetron_on()
+				self.__remaining_time = self.__remaining_time - 1
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__time_events[0] = False
+				self.__enter_sequence_main_region_magnetron_on_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__main_region_magnetron_off_react(-1)
+		elif state == self.State.main_region_magnetron_on:
+			self.__main_region_magnetron_on_react(-1)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>21_TimerFlatStopCondition</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "21_TimerFlatStopCondition"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 167 - 0
microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 339 - 0
microwave/YAKINDU_WORKSPACE/21_TimerFlatStopCondition/srcgen/statechart.py

@@ -0,0 +1,339 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_magnetron_off,
+			main_region_magnetron_on,
+			null_state
+		) = range(3)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		self.__remaining_time = None
+		
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 1
+		for __state_index in range(1):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 1
+		
+		# initializations:
+		self.__remaining_time = 0
+		self.__is_executing = False
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_off
+		if s == self.__State.main_region_magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_on
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(1):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.timer_service.set_timer(self, 0, (1 * 1000), False)
+		self.turn_magnetron_on_observable.next()
+		
+	def __exit_action_main_region_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		self.turn_magnetron_off_observable.next()
+		
+	def __enter_sequence_main_region_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_magnetron_off
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_magnetron_on
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __exit_sequence_main_region_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		
+	def __exit_sequence_main_region_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__exit_action_main_region_magnetron_on()
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__exit_sequence_main_region_magnetron_off()
+		elif state == self.State.main_region_magnetron_on:
+			self.__exit_sequence_main_region_magnetron_on()
+		
+	def __react_main_region__choice_0(self):
+		"""The reactions of state null..
+		"""
+		if self.__remaining_time == 0:
+			self.ring_bell_observable.next()
+			self.__enter_sequence_main_region_magnetron_off_default()
+		else:
+			self.__enter_sequence_main_region_magnetron_on_default()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_magnetron_off_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_off_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.__remaining_time = 10 if self.__remaining_time == 0 else self.__remaining_time
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_magnetron_on_default()
+				transitioned_after = 0
+			elif self.increase_time_pressed:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.__remaining_time = self.__remaining_time + 10
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_on_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_magnetron_on()
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+			elif self.__time_events[0]:
+				self.__exit_sequence_main_region_magnetron_on()
+				self.__remaining_time = self.__remaining_time - 1
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__time_events[0] = False
+				self.__react_main_region__choice_0()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__main_region_magnetron_off_react(-1)
+		elif state == self.State.main_region_magnetron_on:
+			self.__main_region_magnetron_on_react(-1)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>22_TimerFlatClearTime</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "22_TimerFlatClearTime"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 178 - 0
microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 345 - 0
microwave/YAKINDU_WORKSPACE/22_TimerFlatClearTime/srcgen/statechart.py

@@ -0,0 +1,345 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_magnetron_off,
+			main_region_magnetron_on,
+			null_state
+		) = range(3)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		self.__remaining_time = None
+		
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 1
+		for __state_index in range(1):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 1
+		
+		# initializations:
+		self.__remaining_time = 0
+		self.__is_executing = False
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_off
+		if s == self.__State.main_region_magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_on
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(1):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.timer_service.set_timer(self, 0, (1 * 1000), False)
+		self.turn_magnetron_on_observable.next()
+		
+	def __exit_action_main_region_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		self.turn_magnetron_off_observable.next()
+		
+	def __enter_sequence_main_region_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_magnetron_off
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_magnetron_on
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __exit_sequence_main_region_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		
+	def __exit_sequence_main_region_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__exit_action_main_region_magnetron_on()
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__exit_sequence_main_region_magnetron_off()
+		elif state == self.State.main_region_magnetron_on:
+			self.__exit_sequence_main_region_magnetron_on()
+		
+	def __react_main_region__choice_0(self):
+		"""The reactions of state null..
+		"""
+		if self.__remaining_time == 0:
+			self.ring_bell_observable.next()
+			self.__enter_sequence_main_region_magnetron_off_default()
+		else:
+			self.__enter_sequence_main_region_magnetron_on_default()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_magnetron_off_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_off_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.__remaining_time = 10 if self.__remaining_time == 0 else self.__remaining_time
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_magnetron_on_default()
+				transitioned_after = 0
+			elif self.increase_time_pressed:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.__remaining_time = self.__remaining_time + 10
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+			elif self.stop_pressed:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.__remaining_time = 0
+				self.set_displayed_time_observable.next(0)
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_on_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_magnetron_on()
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+			elif self.__time_events[0]:
+				self.__exit_sequence_main_region_magnetron_on()
+				self.__remaining_time = self.__remaining_time - 1
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__time_events[0] = False
+				self.__react_main_region__choice_0()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__main_region_magnetron_off_react(-1)
+		elif state == self.State.main_region_magnetron_on:
+			self.__main_region_magnetron_on_react(-1)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/30_Orthogonality/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>30_Orthogonality</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/30_Orthogonality/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/30_Orthogonality/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "30_Orthogonality"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 295 - 0
microwave/YAKINDU_WORKSPACE/30_Orthogonality/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/30_Orthogonality/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/30_Orthogonality/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 419 - 0
microwave/YAKINDU_WORKSPACE/30_Orthogonality/srcgen/statechart.py

@@ -0,0 +1,419 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_orthogonal_state,
+			main_region_orthogonal_state_r1magnetron_on,
+			main_region_orthogonal_state_r1magnetron_off,
+			main_region_orthogonal_state_r2time_control,
+			null_state
+		) = range(5)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		self.__remaining_time = None
+		
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 2
+		for __state_index in range(2):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 1
+		
+		# initializations:
+		self.__remaining_time = 0
+		self.__is_executing = False
+		self.__state_conf_vector_position = None
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state or self.__state_vector[1] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_orthogonal_state:
+			return (self.__state_vector[0] >= self.__State.main_region_orthogonal_state)\
+				and (self.__state_vector[0] <= self.__State.main_region_orthogonal_state_r2time_control)
+		if s == self.__State.main_region_orthogonal_state_r1magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1magnetron_on
+		if s == self.__State.main_region_orthogonal_state_r1magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1magnetron_off
+		if s == self.__State.main_region_orthogonal_state_r2time_control:
+			return self.__state_vector[1] == self.__State.main_region_orthogonal_state_r2time_control
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(1):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_orthogonal_state_r1_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.timer_service.set_timer(self, 0, (1 * 1000), False)
+		self.turn_magnetron_on_observable.next()
+		
+	def __exit_action_main_region_orthogonal_state_r1_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		self.turn_magnetron_off_observable.next()
+		
+	def __enter_sequence_main_region_orthogonal_state_default(self):
+		"""'default' enter sequence for state OrthogonalState.
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_default()
+		self.__enter_sequence_main_region_orthogonal_state_r2_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_orthogonal_state_r1_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1magnetron_on
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1magnetron_off
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_orthogonal_state_r2_time_control_default(self):
+		"""'default' enter sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.main_region_orthogonal_state_r2time_control
+		self.__state_conf_vector_position = 1
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_orthogonal_state_r1__entry_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r2_default(self):
+		"""'default' enter sequence for region r2.
+		"""
+		self.__react_main_region_orthogonal_state_r2__entry_default()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		self.__exit_action_main_region_orthogonal_state_r1_magnetron_on()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_orthogonal_state_r2_time_control(self):
+		"""Default exit sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.null_state
+		self.__state_conf_vector_position = 1
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1magnetron_on:
+			self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_on()
+		elif state == self.State.main_region_orthogonal_state_r1magnetron_off:
+			self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_off()
+		state = self.__state_vector[1]
+		if state == self.State.main_region_orthogonal_state_r2time_control:
+			self.__exit_sequence_main_region_orthogonal_state_r2_time_control()
+		
+	def __react_main_region_orthogonal_state_r1__choice_0(self):
+		"""The reactions of state null..
+		"""
+		if self.__remaining_time == 0:
+			self.ring_bell_observable.next()
+			self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default()
+		else:
+			self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_on_default()
+		
+	def __react_main_region_orthogonal_state_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default()
+		
+	def __react_main_region_orthogonal_state_r2__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r2_time_control_default()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_orthogonal_state_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_react function.
+		"""
+		return self.__react(transitioned_before)
+	
+	
+	def __main_region_orthogonal_state_r1_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_magnetron_on_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_on()
+				self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default()
+				transitioned_after = 0
+			elif self.__time_events[0]:
+				self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_on()
+				self.__remaining_time = self.__remaining_time - 1
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__time_events[0] = False
+				self.__react_main_region_orthogonal_state_r1__choice_0()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r1_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_magnetron_off_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_off()
+				self.__remaining_time = 10 if self.__remaining_time == 0 else self.__remaining_time
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_on_default()
+				transitioned_after = 0
+			elif self.stop_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_off()
+				self.__remaining_time = 0
+				self.set_displayed_time_observable.next(0)
+				self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r2_time_control_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r2_time_control_react function.
+		"""
+		transitioned_after = transitioned_before
+		if transitioned_after < 1:
+			if self.increase_time_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r2_time_control()
+				self.__remaining_time = self.__remaining_time + 10
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_orthogonal_state_r2_time_control_default()
+				transitioned_after = 1
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		transitioned = -1
+		self.__state_conf_vector_position = 0
+		state = self.__state_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1magnetron_on:
+			transitioned = self.__main_region_orthogonal_state_r1_magnetron_on_react(transitioned)
+		elif state == self.State.main_region_orthogonal_state_r1magnetron_off:
+			transitioned = self.__main_region_orthogonal_state_r1_magnetron_off_react(transitioned)
+		if self.__state_conf_vector_position < 1:
+			state = self.__state_vector[1]
+			if state == self.State.main_region_orthogonal_state_r2time_control:
+				self.__main_region_orthogonal_state_r2_time_control_react(transitioned)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/40_Door/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>40_Door</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/40_Door/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/40_Door/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "40_Door"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 349 - 0
microwave/YAKINDU_WORKSPACE/40_Door/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/40_Door/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/40_Door/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 459 - 0
microwave/YAKINDU_WORKSPACE/40_Door/srcgen/statechart.py

@@ -0,0 +1,459 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_orthogonal_state,
+			main_region_orthogonal_state_r1magnetron_on,
+			main_region_orthogonal_state_r1magnetron_off,
+			main_region_orthogonal_state_r1door_open,
+			main_region_orthogonal_state_r2time_control,
+			null_state
+		) = range(6)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		self.__remaining_time = None
+		
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 2
+		for __state_index in range(2):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 1
+		
+		# initializations:
+		self.__remaining_time = 0
+		self.__is_executing = False
+		self.__state_conf_vector_position = None
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state or self.__state_vector[1] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_orthogonal_state:
+			return (self.__state_vector[0] >= self.__State.main_region_orthogonal_state)\
+				and (self.__state_vector[0] <= self.__State.main_region_orthogonal_state_r2time_control)
+		if s == self.__State.main_region_orthogonal_state_r1magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1magnetron_on
+		if s == self.__State.main_region_orthogonal_state_r1magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1magnetron_off
+		if s == self.__State.main_region_orthogonal_state_r1door_open:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1door_open
+		if s == self.__State.main_region_orthogonal_state_r2time_control:
+			return self.__state_vector[1] == self.__State.main_region_orthogonal_state_r2time_control
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(1):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_orthogonal_state_r1_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.timer_service.set_timer(self, 0, (1 * 1000), False)
+		self.turn_magnetron_on_observable.next()
+		
+	def __exit_action_main_region_orthogonal_state_r1_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		self.turn_magnetron_off_observable.next()
+		
+	def __enter_sequence_main_region_orthogonal_state_default(self):
+		"""'default' enter sequence for state OrthogonalState.
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_default()
+		self.__enter_sequence_main_region_orthogonal_state_r2_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_orthogonal_state_r1_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1magnetron_on
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1magnetron_off
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_open_default(self):
+		"""'default' enter sequence for state DoorOpen.
+		"""
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1door_open
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_orthogonal_state_r2_time_control_default(self):
+		"""'default' enter sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.main_region_orthogonal_state_r2time_control
+		self.__state_conf_vector_position = 1
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_orthogonal_state_r1__entry_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r2_default(self):
+		"""'default' enter sequence for region r2.
+		"""
+		self.__react_main_region_orthogonal_state_r2__entry_default()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		self.__exit_action_main_region_orthogonal_state_r1_magnetron_on()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_open(self):
+		"""Default exit sequence for state DoorOpen.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_orthogonal_state_r2_time_control(self):
+		"""Default exit sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.null_state
+		self.__state_conf_vector_position = 1
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1magnetron_on:
+			self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_on()
+		elif state == self.State.main_region_orthogonal_state_r1magnetron_off:
+			self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_off()
+		elif state == self.State.main_region_orthogonal_state_r1door_open:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_open()
+		state = self.__state_vector[1]
+		if state == self.State.main_region_orthogonal_state_r2time_control:
+			self.__exit_sequence_main_region_orthogonal_state_r2_time_control()
+		
+	def __react_main_region_orthogonal_state_r1__choice_0(self):
+		"""The reactions of state null..
+		"""
+		if self.__remaining_time == 0:
+			self.ring_bell_observable.next()
+			self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default()
+		else:
+			self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_on_default()
+		
+	def __react_main_region_orthogonal_state_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default()
+		
+	def __react_main_region_orthogonal_state_r2__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r2_time_control_default()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_orthogonal_state_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_react function.
+		"""
+		return self.__react(transitioned_before)
+	
+	
+	def __main_region_orthogonal_state_r1_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_magnetron_on_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_on()
+				self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default()
+				transitioned_after = 0
+			elif self.__time_events[0]:
+				self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_on()
+				self.__remaining_time = self.__remaining_time - 1
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__time_events[0] = False
+				self.__react_main_region_orthogonal_state_r1__choice_0()
+				transitioned_after = 0
+			elif self.door_opened:
+				self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_on()
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_open_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r1_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_magnetron_off_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_off()
+				self.__remaining_time = 10 if self.__remaining_time == 0 else self.__remaining_time
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_on_default()
+				transitioned_after = 0
+			elif self.stop_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_off()
+				self.__remaining_time = 0
+				self.set_displayed_time_observable.next(0)
+				self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default()
+				transitioned_after = 0
+			elif self.door_opened:
+				self.__exit_sequence_main_region_orthogonal_state_r1_magnetron_off()
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_open_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r1_door_open_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_door_open_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.door_closed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_open()
+				self.__enter_sequence_main_region_orthogonal_state_r1_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r2_time_control_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r2_time_control_react function.
+		"""
+		transitioned_after = transitioned_before
+		if transitioned_after < 1:
+			if self.increase_time_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r2_time_control()
+				self.__remaining_time = self.__remaining_time + 10
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_orthogonal_state_r2_time_control_default()
+				transitioned_after = 1
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		transitioned = -1
+		self.__state_conf_vector_position = 0
+		state = self.__state_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1magnetron_on:
+			transitioned = self.__main_region_orthogonal_state_r1_magnetron_on_react(transitioned)
+		elif state == self.State.main_region_orthogonal_state_r1magnetron_off:
+			transitioned = self.__main_region_orthogonal_state_r1_magnetron_off_react(transitioned)
+		elif state == self.State.main_region_orthogonal_state_r1door_open:
+			transitioned = self.__main_region_orthogonal_state_r1_door_open_react(transitioned)
+		if self.__state_conf_vector_position < 1:
+			state = self.__state_vector[1]
+			if state == self.State.main_region_orthogonal_state_r2time_control:
+				self.__main_region_orthogonal_state_r2_time_control_react(transitioned)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>41_DoorHierarchy</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "41_DoorHierarchy"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 396 - 0
microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 496 - 0
microwave/YAKINDU_WORKSPACE/41_DoorHierarchy/srcgen/statechart.py

@@ -0,0 +1,496 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_orthogonal_state,
+			main_region_orthogonal_state_r1door_open,
+			main_region_orthogonal_state_r1door_closed,
+			main_region_orthogonal_state_r1door_closed_r1magnetron_on,
+			main_region_orthogonal_state_r1door_closed_r1magnetron_off,
+			main_region_orthogonal_state_r2time_control,
+			null_state
+		) = range(7)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		self.__remaining_time = None
+		
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 2
+		for __state_index in range(2):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 1
+		
+		# initializations:
+		self.__remaining_time = 0
+		self.__is_executing = False
+		self.__state_conf_vector_position = None
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state or self.__state_vector[1] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_orthogonal_state:
+			return (self.__state_vector[0] >= self.__State.main_region_orthogonal_state)\
+				and (self.__state_vector[0] <= self.__State.main_region_orthogonal_state_r2time_control)
+		if s == self.__State.main_region_orthogonal_state_r1door_open:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1door_open
+		if s == self.__State.main_region_orthogonal_state_r1door_closed:
+			return (self.__state_vector[0] >= self.__State.main_region_orthogonal_state_r1door_closed)\
+				and (self.__state_vector[0] <= self.__State.main_region_orthogonal_state_r1door_closed_r1magnetron_off)
+		if s == self.__State.main_region_orthogonal_state_r1door_closed_r1magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1door_closed_r1magnetron_on
+		if s == self.__State.main_region_orthogonal_state_r1door_closed_r1magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1door_closed_r1magnetron_off
+		if s == self.__State.main_region_orthogonal_state_r2time_control:
+			return self.__state_vector[1] == self.__State.main_region_orthogonal_state_r2time_control
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(1):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.timer_service.set_timer(self, 0, (1 * 1000), False)
+		self.turn_magnetron_on_observable.next()
+		
+	def __exit_action_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		self.turn_magnetron_off_observable.next()
+		
+	def __enter_sequence_main_region_orthogonal_state_default(self):
+		"""'default' enter sequence for state OrthogonalState.
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_default()
+		self.__enter_sequence_main_region_orthogonal_state_r2_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_open_default(self):
+		"""'default' enter sequence for state DoorOpen.
+		"""
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1door_open
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_closed_default(self):
+		"""'default' enter sequence for state DoorClosed.
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_on
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_off
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_orthogonal_state_r2_time_control_default(self):
+		"""'default' enter sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.main_region_orthogonal_state_r2time_control
+		self.__state_conf_vector_position = 1
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_orthogonal_state_r1__entry_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_orthogonal_state_r1_door_closed_r1__entry_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r2_default(self):
+		"""'default' enter sequence for region r2.
+		"""
+		self.__react_main_region_orthogonal_state_r2__entry_default()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_open(self):
+		"""Default exit sequence for state DoorOpen.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_closed(self):
+		"""Default exit sequence for state DoorClosed.
+		"""
+		self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		self.__exit_action_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_orthogonal_state_r2_time_control(self):
+		"""Default exit sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.null_state
+		self.__state_conf_vector_position = 1
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1door_open:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_open()
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_on:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off()
+		state = self.__state_vector[1]
+		if state == self.State.main_region_orthogonal_state_r2time_control:
+			self.__exit_sequence_main_region_orthogonal_state_r2_time_control()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_closed_r1(self):
+		"""Default exit sequence for region r1.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_on:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off()
+		
+	def __react_main_region_orthogonal_state_r1_door_closed_r1__choice_0(self):
+		"""The reactions of state null..
+		"""
+		if self.__remaining_time == 0:
+			self.ring_bell_observable.next()
+			self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		else:
+			self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_default()
+		
+	def __react_main_region_orthogonal_state_r1_door_closed_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __react_main_region_orthogonal_state_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_default()
+		
+	def __react_main_region_orthogonal_state_r2__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r2_time_control_default()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_orthogonal_state_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_react function.
+		"""
+		return self.__react(transitioned_before)
+	
+	
+	def __main_region_orthogonal_state_r1_door_open_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_door_open_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.door_closed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_open()
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r1_door_closed_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_door_closed_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.door_opened:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_closed()
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_open_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_r1_door_closed_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+				transitioned_after = 0
+			elif self.__time_events[0]:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+				self.__remaining_time = self.__remaining_time - 1
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__time_events[0] = False
+				self.__react_main_region_orthogonal_state_r1_door_closed_r1__choice_0()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_r1_door_closed_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off()
+				self.__remaining_time = 10 if self.__remaining_time == 0 else self.__remaining_time
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_default()
+				transitioned_after = 0
+			elif self.stop_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off()
+				self.__remaining_time = 0
+				self.set_displayed_time_observable.next(0)
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r2_time_control_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r2_time_control_react function.
+		"""
+		transitioned_after = transitioned_before
+		if transitioned_after < 1:
+			if self.increase_time_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r2_time_control()
+				self.__remaining_time = self.__remaining_time + 10
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_orthogonal_state_r2_time_control_default()
+				transitioned_after = 1
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		transitioned = -1
+		self.__state_conf_vector_position = 0
+		state = self.__state_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1door_open:
+			transitioned = self.__main_region_orthogonal_state_r1_door_open_react(transitioned)
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_on:
+			transitioned = self.__main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_react(transitioned)
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_off:
+			transitioned = self.__main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_react(transitioned)
+		if self.__state_conf_vector_position < 1:
+			state = self.__state_vector[1]
+			if state == self.State.main_region_orthogonal_state_r2time_control:
+				self.__main_region_orthogonal_state_r2_time_control_react(transitioned)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/42_DoorHistory/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>42_DoorHistory</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/42_DoorHistory/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/42_DoorHistory/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "42_DoorHistory"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 409 - 0
microwave/YAKINDU_WORKSPACE/42_DoorHistory/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/42_DoorHistory/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/42_DoorHistory/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 521 - 0
microwave/YAKINDU_WORKSPACE/42_DoorHistory/srcgen/statechart.py

@@ -0,0 +1,521 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_orthogonal_state,
+			main_region_orthogonal_state_r1door_open,
+			main_region_orthogonal_state_r1door_closed,
+			main_region_orthogonal_state_r1door_closed_r1magnetron_on,
+			main_region_orthogonal_state_r1door_closed_r1magnetron_off,
+			main_region_orthogonal_state_r2time_control,
+			null_state
+		) = range(7)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		self.__remaining_time = None
+		
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 2
+		for __state_index in range(2):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 1
+		
+		# history vector:
+		self.__history_vector = [None] * 1
+		for __history_index in range(1):
+			self.__history_vector[__history_index] = self.State.null_state
+		
+		# initializations:
+		self.__remaining_time = 0
+		self.__is_executing = False
+		self.__state_conf_vector_position = None
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state or self.__state_vector[1] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_orthogonal_state:
+			return (self.__state_vector[0] >= self.__State.main_region_orthogonal_state)\
+				and (self.__state_vector[0] <= self.__State.main_region_orthogonal_state_r2time_control)
+		if s == self.__State.main_region_orthogonal_state_r1door_open:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1door_open
+		if s == self.__State.main_region_orthogonal_state_r1door_closed:
+			return (self.__state_vector[0] >= self.__State.main_region_orthogonal_state_r1door_closed)\
+				and (self.__state_vector[0] <= self.__State.main_region_orthogonal_state_r1door_closed_r1magnetron_off)
+		if s == self.__State.main_region_orthogonal_state_r1door_closed_r1magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1door_closed_r1magnetron_on
+		if s == self.__State.main_region_orthogonal_state_r1door_closed_r1magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_orthogonal_state_r1door_closed_r1magnetron_off
+		if s == self.__State.main_region_orthogonal_state_r2time_control:
+			return self.__state_vector[1] == self.__State.main_region_orthogonal_state_r2time_control
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(1):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.timer_service.set_timer(self, 0, (1 * 1000), False)
+		self.turn_magnetron_on_observable.next()
+		
+	def __exit_action_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		self.turn_magnetron_off_observable.next()
+		
+	def __enter_sequence_main_region_orthogonal_state_default(self):
+		"""'default' enter sequence for state OrthogonalState.
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_default()
+		self.__enter_sequence_main_region_orthogonal_state_r2_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_open_default(self):
+		"""'default' enter sequence for state DoorOpen.
+		"""
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1door_open
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_closed_default(self):
+		"""'default' enter sequence for state DoorClosed.
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_on
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		self.__history_vector[0] = self.__state_vector[0]
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_off
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		self.__history_vector[0] = self.__state_vector[0]
+		
+	def __enter_sequence_main_region_orthogonal_state_r2_time_control_default(self):
+		"""'default' enter sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.main_region_orthogonal_state_r2time_control
+		self.__state_conf_vector_position = 1
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_orthogonal_state_r1__entry_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_orthogonal_state_r1_door_closed_r1__entry_default()
+		
+	def __shallow_enter_sequence_main_region_orthogonal_state_r1_door_closed_r1(self):
+		"""shallow enterSequence with history in child r1.
+		"""
+		state = self.__history_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_on:
+			self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_default()
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __enter_sequence_main_region_orthogonal_state_r2_default(self):
+		"""'default' enter sequence for region r2.
+		"""
+		self.__react_main_region_orthogonal_state_r2__entry_default()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_open(self):
+		"""Default exit sequence for state DoorOpen.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_closed(self):
+		"""Default exit sequence for state DoorClosed.
+		"""
+		self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		self.__exit_action_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_orthogonal_state_r2_time_control(self):
+		"""Default exit sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.null_state
+		self.__state_conf_vector_position = 1
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1door_open:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_open()
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_on:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off()
+		state = self.__state_vector[1]
+		if state == self.State.main_region_orthogonal_state_r2time_control:
+			self.__exit_sequence_main_region_orthogonal_state_r2_time_control()
+		
+	def __exit_sequence_main_region_orthogonal_state_r1_door_closed_r1(self):
+		"""Default exit sequence for region r1.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_on:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off()
+		
+	def __react_main_region_orthogonal_state_r1_door_closed_r1__choice_0(self):
+		"""The reactions of state null..
+		"""
+		if self.__remaining_time == 0:
+			self.ring_bell_observable.next()
+			self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		else:
+			self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_default()
+		
+	def __react_main_region_orthogonal_state_r1_door_closed_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __react_main_region_orthogonal_state_r1_door_closed_r1_h(self):
+		"""Default react sequence for shallow history entry h.
+		"""
+		#Enter the region with shallow history
+		if self.__history_vector[0] is not self.State.null_state:
+			self.__shallow_enter_sequence_main_region_orthogonal_state_r1_door_closed_r1()
+		else:
+			self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __react_main_region_orthogonal_state_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_default()
+		
+	def __react_main_region_orthogonal_state_r2__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_r2_time_control_default()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_orthogonal_state_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_orthogonal_state_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_react function.
+		"""
+		return self.__react(transitioned_before)
+	
+	
+	def __main_region_orthogonal_state_r1_door_open_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_door_open_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.door_closed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_open()
+				self.__react_main_region_orthogonal_state_r1_door_closed_r1_h()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r1_door_closed_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_door_closed_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.door_opened:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_closed()
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_open_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_r1_door_closed_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+				transitioned_after = 0
+			elif self.__time_events[0]:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on()
+				self.__remaining_time = self.__remaining_time - 1
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__time_events[0] = False
+				self.__react_main_region_orthogonal_state_r1_door_closed_r1__choice_0()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_react function.
+		"""
+		transitioned_after = self.__main_region_orthogonal_state_r1_door_closed_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off()
+				self.__remaining_time = 10 if self.__remaining_time == 0 else self.__remaining_time
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_default()
+				transitioned_after = 0
+			elif self.stop_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off()
+				self.__remaining_time = 0
+				self.set_displayed_time_observable.next(0)
+				self.__enter_sequence_main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_orthogonal_state_r2_time_control_react(self, transitioned_before):
+		"""Implementation of __main_region_orthogonal_state_r2_time_control_react function.
+		"""
+		transitioned_after = transitioned_before
+		if transitioned_after < 1:
+			if self.increase_time_pressed:
+				self.__exit_sequence_main_region_orthogonal_state_r2_time_control()
+				self.__remaining_time = self.__remaining_time + 10
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_orthogonal_state_r2_time_control_default()
+				transitioned_after = 1
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		transitioned = -1
+		self.__state_conf_vector_position = 0
+		state = self.__state_vector[0]
+		if state == self.State.main_region_orthogonal_state_r1door_open:
+			transitioned = self.__main_region_orthogonal_state_r1_door_open_react(transitioned)
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_on:
+			transitioned = self.__main_region_orthogonal_state_r1_door_closed_r1_magnetron_on_react(transitioned)
+		elif state == self.State.main_region_orthogonal_state_r1door_closed_r1magnetron_off:
+			transitioned = self.__main_region_orthogonal_state_r1_door_closed_r1_magnetron_off_react(transitioned)
+		if self.__state_conf_vector_position < 1:
+			state = self.__state_vector[1]
+			if state == self.State.main_region_orthogonal_state_r2time_control:
+				self.__main_region_orthogonal_state_r2_time_control_react(transitioned)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/50_ChildLock/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>50_ChildLock</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/50_ChildLock/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/50_ChildLock/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "50_ChildLock"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 617 - 0
microwave/YAKINDU_WORKSPACE/50_ChildLock/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/50_ChildLock/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/50_ChildLock/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 718 - 0
microwave/YAKINDU_WORKSPACE/50_ChildLock/srcgen/statechart.py

@@ -0,0 +1,718 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_child_lockable,
+			main_region_child_lockable_r1locked,
+			main_region_child_lockable_r1orthogonal_state,
+			main_region_child_lockable_r1orthogonal_state_r1door_open,
+			main_region_child_lockable_r1orthogonal_state_r1door_closed,
+			main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on,
+			main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off,
+			main_region_child_lockable_r1orthogonal_state_r2time_control,
+			main_region_child_lockable_r2detect_clicks,
+			null_state
+		) = range(10)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.__internal_event_queue = queue.Queue()
+		self.in_event_queue = queue.Queue()
+		self.__remaining_time = None
+		self.__clicks = None
+		self.lock_unlock = None
+		
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 3
+		for __state_index in range(3):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 2
+		
+		# history vector:
+		self.__history_vector = [None] * 1
+		for __history_index in range(1):
+			self.__history_vector[__history_index] = self.State.null_state
+		
+		# initializations:
+		self.__remaining_time = 0
+		self.__clicks = 0
+		self.__is_executing = False
+		self.__state_conf_vector_position = None
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state or self.__state_vector[1] is not self.__State.null_state or self.__state_vector[2] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_child_lockable:
+			return (self.__state_vector[0] >= self.__State.main_region_child_lockable)\
+				and (self.__state_vector[0] <= self.__State.main_region_child_lockable_r2detect_clicks)
+		if s == self.__State.main_region_child_lockable_r1locked:
+			return self.__state_vector[0] == self.__State.main_region_child_lockable_r1locked
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state:
+			return (self.__state_vector[0] >= self.__State.main_region_child_lockable_r1orthogonal_state)\
+				and (self.__state_vector[0] <= self.__State.main_region_child_lockable_r1orthogonal_state_r2time_control)
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_open:
+			return self.__state_vector[0] == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_open
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed:
+			return (self.__state_vector[0] >= self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed)\
+				and (self.__state_vector[0] <= self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off)
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r2time_control:
+			return self.__state_vector[1] == self.__State.main_region_child_lockable_r1orthogonal_state_r2time_control
+		if s == self.__State.main_region_child_lockable_r2detect_clicks:
+			return self.__state_vector[2] == self.__State.main_region_child_lockable_r2detect_clicks
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(2):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.__internal_event_queue.empty():
+			return self.__internal_event_queue.get()
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	
+	def raise_lock_unlock(self):
+		"""Raise method for event lock_unlock.
+		"""
+		self.__internal_event_queue.put(self.__raise_lock_unlock_call)
+	
+	def __raise_lock_unlock_call(self):
+		"""Raise callback for event lock_unlock.
+		"""
+		self.lock_unlock = True
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_child_lockable_r1_locked(self):
+		"""Entry action for state 'Locked'..
+		"""
+		self.set_displayed_time_observable.next(9999)
+		
+	def __entry_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.timer_service.set_timer(self, 0, (1 * 1000), False)
+		self.turn_magnetron_on_observable.next()
+		
+	def __entry_action_main_region_child_lockable_r2_detect_clicks(self):
+		"""Entry action for state 'DetectClicks'..
+		"""
+		self.timer_service.set_timer(self, 1, 500, False)
+		
+	def __exit_action_main_region_child_lockable_r1_locked(self):
+		"""Exit action for state 'Locked'..
+		"""
+		self.set_displayed_time_observable.next(self.__remaining_time)
+		
+	def __exit_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		self.turn_magnetron_off_observable.next()
+		
+	def __exit_action_main_region_child_lockable_r2_detect_clicks(self):
+		"""Exit action for state 'DetectClicks'..
+		"""
+		self.timer_service.unset_timer(self, 1)
+		
+	def __enter_sequence_main_region_child_lockable_default(self):
+		"""'default' enter sequence for state ChildLockable.
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_default()
+		self.__enter_sequence_main_region_child_lockable_r2_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_locked_default(self):
+		"""'default' enter sequence for state Locked.
+		"""
+		self.__entry_action_main_region_child_lockable_r1_locked()
+		self.__state_vector[0] = self.State.main_region_child_lockable_r1locked
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_default(self):
+		"""'default' enter sequence for state OrthogonalState.
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_default()
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r2_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open_default(self):
+		"""'default' enter sequence for state DoorOpen.
+		"""
+		self.__state_vector[0] = self.State.main_region_child_lockable_r1orthogonal_state_r1door_open
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_default(self):
+		"""'default' enter sequence for state DoorClosed.
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		self.__history_vector[0] = self.__state_vector[0]
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		self.__history_vector[0] = self.__state_vector[0]
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control_default(self):
+		"""'default' enter sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.main_region_child_lockable_r1orthogonal_state_r2time_control
+		self.__state_conf_vector_position = 1
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_child_lockable_r2_detect_clicks_default(self):
+		"""'default' enter sequence for state DetectClicks.
+		"""
+		self.__entry_action_main_region_child_lockable_r2_detect_clicks()
+		self.__state_vector[2] = self.State.main_region_child_lockable_r2detect_clicks
+		self.__state_conf_vector_position = 2
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_child_lockable_r1__entry_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_child_lockable_r1_orthogonal_state_r1__entry_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1__entry_default()
+		
+	def __shallow_enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1(self):
+		"""shallow enterSequence with history in child r1.
+		"""
+		state = self.__history_vector[0]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on:
+			self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_default()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r2_default(self):
+		"""'default' enter sequence for region r2.
+		"""
+		self.__react_main_region_child_lockable_r1_orthogonal_state_r2__entry_default()
+		
+	def __enter_sequence_main_region_child_lockable_r2_default(self):
+		"""'default' enter sequence for region r2.
+		"""
+		self.__react_main_region_child_lockable_r2__entry_default()
+		
+	def __exit_sequence_main_region_child_lockable_r1_locked(self):
+		"""Default exit sequence for state Locked.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		self.__exit_action_main_region_child_lockable_r1_locked()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state(self):
+		"""Default exit sequence for state OrthogonalState.
+		"""
+		self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1()
+		self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open(self):
+		"""Default exit sequence for state DoorOpen.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed(self):
+		"""Default exit sequence for state DoorClosed.
+		"""
+		self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		self.__exit_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control(self):
+		"""Default exit sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.null_state
+		self.__state_conf_vector_position = 1
+		
+	def __exit_sequence_main_region_child_lockable_r2_detect_clicks(self):
+		"""Default exit sequence for state DetectClicks.
+		"""
+		self.__state_vector[2] = self.State.null_state
+		self.__state_conf_vector_position = 2
+		self.__exit_action_main_region_child_lockable_r2_detect_clicks()
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_child_lockable_r1locked:
+			self.__exit_sequence_main_region_child_lockable_r1_locked()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_open:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off()
+		state = self.__state_vector[1]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r2time_control:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control()
+		state = self.__state_vector[2]
+		if state == self.State.main_region_child_lockable_r2detect_clicks:
+			self.__exit_sequence_main_region_child_lockable_r2_detect_clicks()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1(self):
+		"""Default exit sequence for region r1.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_open:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1(self):
+		"""Default exit sequence for region r1.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2(self):
+		"""Default exit sequence for region r2.
+		"""
+		state = self.__state_vector[1]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r2time_control:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1__choice_0(self):
+		"""The reactions of state null..
+		"""
+		if self.__remaining_time == 0:
+			self.ring_bell_observable.next()
+			self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		else:
+			self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_default()
+		
+	def __react_main_region_child_lockable_r2__choice_0(self):
+		"""The reactions of state null..
+		"""
+		if self.__clicks == 3:
+			self.raise_lock_unlock()
+			self.__enter_sequence_main_region_child_lockable_r2_detect_clicks_default()
+		else:
+			self.__enter_sequence_main_region_child_lockable_r2_detect_clicks_default()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_h(self):
+		"""Default react sequence for shallow history entry h.
+		"""
+		#Enter the region with shallow history
+		if self.__history_vector[0] is not self.State.null_state:
+			self.__shallow_enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1()
+		else:
+			self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_default()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r2__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control_default()
+		
+	def __react_main_region_child_lockable_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_default()
+		
+	def __react_main_region_child_lockable_r2__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r2_detect_clicks_default()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_child_lockable_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_react function.
+		"""
+		return self.__react(transitioned_before)
+	
+	
+	def __main_region_child_lockable_r1_locked_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_locked_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.lock_unlock:
+				self.__exit_sequence_main_region_child_lockable_r1_locked()
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.lock_unlock:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state()
+				self.__enter_sequence_main_region_child_lockable_r1_locked_default()
+				transitioned_after = 1
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r1_door_open_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r1_door_open_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_r1_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.door_closed:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open()
+				self.__react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_h()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_r1_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.door_opened:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed()
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_closed_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+				transitioned_after = 0
+			elif self.__time_events[0]:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+				self.__remaining_time = self.__remaining_time - 1
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__time_events[0] = False
+				self.__react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1__choice_0()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_closed_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off()
+				self.__remaining_time = 10 if self.__remaining_time == 0 else self.__remaining_time
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_default()
+				transitioned_after = 0
+			elif self.stop_pressed:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off()
+				self.__remaining_time = 0
+				self.set_displayed_time_observable.next(0)
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r2_time_control_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r2_time_control_react function.
+		"""
+		transitioned_after = transitioned_before
+		if transitioned_after < 1:
+			if self.increase_time_pressed:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control()
+				self.__remaining_time = self.__remaining_time + 10
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control_default()
+				transitioned_after = 1
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r2_detect_clicks_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r2_detect_clicks_react function.
+		"""
+		transitioned_after = transitioned_before
+		if transitioned_after < 2:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_child_lockable_r2_detect_clicks()
+				self.__clicks = self.__clicks + 1
+				self.__react_main_region_child_lockable_r2__choice_0()
+				transitioned_after = 2
+			elif self.__time_events[1]:
+				self.__exit_sequence_main_region_child_lockable_r2_detect_clicks()
+				self.__clicks = 0
+				self.__time_events[1] = False
+				self.__enter_sequence_main_region_child_lockable_r2_detect_clicks_default()
+				transitioned_after = 2
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+		self.__time_events[1] = False
+	
+	
+	def __clear_internal_events(self):
+		"""Implementation of __clear_internal_events function.
+		"""
+		self.lock_unlock = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		transitioned = -1
+		self.__state_conf_vector_position = 0
+		state = self.__state_vector[0]
+		if state == self.State.main_region_child_lockable_r1locked:
+			transitioned = self.__main_region_child_lockable_r1_locked_react(transitioned)
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_open:
+			transitioned = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_open_react(transitioned)
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on:
+			transitioned = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_react(transitioned)
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			transitioned = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_react(transitioned)
+		if self.__state_conf_vector_position < 1:
+			state = self.__state_vector[1]
+			if state == self.State.main_region_child_lockable_r1orthogonal_state_r2time_control:
+				transitioned = self.__main_region_child_lockable_r1_orthogonal_state_r2_time_control_react(transitioned)
+		if self.__state_conf_vector_position < 2:
+			state = self.__state_vector[2]
+			if state == self.State.main_region_child_lockable_r2detect_clicks:
+				self.__main_region_child_lockable_r2_detect_clicks_react(transitioned)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			self.__clear_internal_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/60_Correction1/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>60_Correction1</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/60_Correction1/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/60_Correction1/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "60_Correction1"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 701 - 0
microwave/YAKINDU_WORKSPACE/60_Correction1/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/60_Correction1/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/60_Correction1/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 784 - 0
microwave/YAKINDU_WORKSPACE/60_Correction1/srcgen/statechart.py

@@ -0,0 +1,784 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_child_lockable,
+			main_region_child_lockable_r1locked,
+			main_region_child_lockable_r1orthogonal_state,
+			main_region_child_lockable_r1orthogonal_state_r1door_open,
+			main_region_child_lockable_r1orthogonal_state_r1door_closed,
+			main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on,
+			main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a,
+			main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off,
+			main_region_child_lockable_r1orthogonal_state_r2time_control,
+			main_region_child_lockable_r2detect_clicks,
+			null_state
+		) = range(11)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.__internal_event_queue = queue.Queue()
+		self.in_event_queue = queue.Queue()
+		self.__remaining_time = None
+		self.__clicks = None
+		self.lock_unlock = None
+		
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 3
+		for __state_index in range(3):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 2
+		
+		# history vector:
+		self.__history_vector = [None] * 1
+		for __history_index in range(1):
+			self.__history_vector[__history_index] = self.State.null_state
+		
+		# initializations:
+		self.__remaining_time = 0
+		self.__clicks = 0
+		self.__is_executing = False
+		self.__state_conf_vector_position = None
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state or self.__state_vector[1] is not self.__State.null_state or self.__state_vector[2] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_child_lockable:
+			return (self.__state_vector[0] >= self.__State.main_region_child_lockable)\
+				and (self.__state_vector[0] <= self.__State.main_region_child_lockable_r2detect_clicks)
+		if s == self.__State.main_region_child_lockable_r1locked:
+			return self.__state_vector[0] == self.__State.main_region_child_lockable_r1locked
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state:
+			return (self.__state_vector[0] >= self.__State.main_region_child_lockable_r1orthogonal_state)\
+				and (self.__state_vector[0] <= self.__State.main_region_child_lockable_r1orthogonal_state_r2time_control)
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_open:
+			return self.__state_vector[0] == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_open
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed:
+			return (self.__state_vector[0] >= self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed)\
+				and (self.__state_vector[0] <= self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off)
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on:
+			return (self.__state_vector[0] >= self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on)\
+				and (self.__state_vector[0] <= self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a)
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a:
+			return self.__state_vector[0] == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off
+		if s == self.__State.main_region_child_lockable_r1orthogonal_state_r2time_control:
+			return self.__state_vector[1] == self.__State.main_region_child_lockable_r1orthogonal_state_r2time_control
+		if s == self.__State.main_region_child_lockable_r2detect_clicks:
+			return self.__state_vector[2] == self.__State.main_region_child_lockable_r2detect_clicks
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(2):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.__internal_event_queue.empty():
+			return self.__internal_event_queue.get()
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	
+	def raise_lock_unlock(self):
+		"""Raise method for event lock_unlock.
+		"""
+		self.__internal_event_queue.put(self.__raise_lock_unlock_call)
+	
+	def __raise_lock_unlock_call(self):
+		"""Raise callback for event lock_unlock.
+		"""
+		self.lock_unlock = True
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __effect_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_tr1(self):
+		""".
+		"""
+		self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __entry_action_main_region_child_lockable_r1_locked(self):
+		"""Entry action for state 'Locked'..
+		"""
+		self.set_displayed_time_observable.next(9999)
+		
+	def __entry_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.turn_magnetron_on_observable.next()
+		
+	def __entry_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a(self):
+		"""Entry action for state 'A'..
+		"""
+		self.timer_service.set_timer(self, 0, (1 * 1000), False)
+		
+	def __entry_action_main_region_child_lockable_r2_detect_clicks(self):
+		"""Entry action for state 'DetectClicks'..
+		"""
+		self.timer_service.set_timer(self, 1, 500, False)
+		
+	def __exit_action_main_region_child_lockable_r1_locked(self):
+		"""Exit action for state 'Locked'..
+		"""
+		self.set_displayed_time_observable.next(self.__remaining_time)
+		
+	def __exit_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.turn_magnetron_off_observable.next()
+		
+	def __exit_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a(self):
+		"""Exit action for state 'A'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		
+	def __exit_action_main_region_child_lockable_r2_detect_clicks(self):
+		"""Exit action for state 'DetectClicks'..
+		"""
+		self.timer_service.unset_timer(self, 1)
+		
+	def __enter_sequence_main_region_child_lockable_default(self):
+		"""'default' enter sequence for state ChildLockable.
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_default()
+		self.__enter_sequence_main_region_child_lockable_r2_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_locked_default(self):
+		"""'default' enter sequence for state Locked.
+		"""
+		self.__entry_action_main_region_child_lockable_r1_locked()
+		self.__state_vector[0] = self.State.main_region_child_lockable_r1locked
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_default(self):
+		"""'default' enter sequence for state OrthogonalState.
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_default()
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r2_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open_default(self):
+		"""'default' enter sequence for state DoorOpen.
+		"""
+		self.__state_vector[0] = self.State.main_region_child_lockable_r1orthogonal_state_r1door_open
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_default(self):
+		"""'default' enter sequence for state DoorClosed.
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_default()
+		self.__history_vector[0] = self.__state_vector[0]
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a_default(self):
+		"""'default' enter sequence for state A.
+		"""
+		self.__entry_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a()
+		self.__state_vector[0] = self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off
+		self.__state_conf_vector_position = 0
+		self.__state_conf_vector_changed = True
+		self.__history_vector[0] = self.__state_vector[0]
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control_default(self):
+		"""'default' enter sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.main_region_child_lockable_r1orthogonal_state_r2time_control
+		self.__state_conf_vector_position = 1
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_child_lockable_r2_detect_clicks_default(self):
+		"""'default' enter sequence for state DetectClicks.
+		"""
+		self.__entry_action_main_region_child_lockable_r2_detect_clicks()
+		self.__state_vector[2] = self.State.main_region_child_lockable_r2detect_clicks
+		self.__state_conf_vector_position = 2
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_child_lockable_r1__entry_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_child_lockable_r1_orthogonal_state_r1__entry_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1__entry_default()
+		
+	def __shallow_enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1(self):
+		"""shallow enterSequence with history in child r1.
+		"""
+		state = self.__history_vector[0]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a:
+			self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_default()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_default(self):
+		"""'default' enter sequence for region r1.
+		"""
+		self.__react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1__entry_default()
+		
+	def __enter_sequence_main_region_child_lockable_r1_orthogonal_state_r2_default(self):
+		"""'default' enter sequence for region r2.
+		"""
+		self.__react_main_region_child_lockable_r1_orthogonal_state_r2__entry_default()
+		
+	def __enter_sequence_main_region_child_lockable_r2_default(self):
+		"""'default' enter sequence for region r2.
+		"""
+		self.__react_main_region_child_lockable_r2__entry_default()
+		
+	def __exit_sequence_main_region_child_lockable_r1_locked(self):
+		"""Default exit sequence for state Locked.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		self.__exit_action_main_region_child_lockable_r1_locked()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state(self):
+		"""Default exit sequence for state OrthogonalState.
+		"""
+		self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1()
+		self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open(self):
+		"""Default exit sequence for state DoorOpen.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed(self):
+		"""Default exit sequence for state DoorClosed.
+		"""
+		self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1()
+		self.__exit_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a(self):
+		"""Default exit sequence for state A.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		self.__exit_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__state_conf_vector_position = 0
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control(self):
+		"""Default exit sequence for state TimeControl.
+		"""
+		self.__state_vector[1] = self.State.null_state
+		self.__state_conf_vector_position = 1
+		
+	def __exit_sequence_main_region_child_lockable_r2_detect_clicks(self):
+		"""Default exit sequence for state DetectClicks.
+		"""
+		self.__state_vector[2] = self.State.null_state
+		self.__state_conf_vector_position = 2
+		self.__exit_action_main_region_child_lockable_r2_detect_clicks()
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_child_lockable_r1locked:
+			self.__exit_sequence_main_region_child_lockable_r1_locked()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_open:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a()
+			self.__exit_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off()
+		state = self.__state_vector[1]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r2time_control:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control()
+		state = self.__state_vector[2]
+		if state == self.State.main_region_child_lockable_r2detect_clicks:
+			self.__exit_sequence_main_region_child_lockable_r2_detect_clicks()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1(self):
+		"""Default exit sequence for region r1.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_open:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a()
+			self.__exit_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1(self):
+		"""Default exit sequence for region r1.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a()
+			self.__exit_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1(self):
+		"""Default exit sequence for region r1.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a()
+		
+	def __exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2(self):
+		"""Default exit sequence for region r2.
+		"""
+		state = self.__state_vector[1]
+		if state == self.State.main_region_child_lockable_r1orthogonal_state_r2time_control:
+			self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1__choice_0(self):
+		"""The reactions of state null..
+		"""
+		if self.__remaining_time == 0:
+			self.__entry_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+			self.__react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_done()
+			self.__history_vector[0] = self.__state_vector[0]
+		else:
+			self.__entry_action_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+			self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a_default()
+			self.__history_vector[0] = self.__state_vector[0]
+		
+	def __react_main_region_child_lockable_r2__choice_0(self):
+		"""The reactions of state null..
+		"""
+		if self.__clicks == 3:
+			self.raise_lock_unlock()
+			self.__enter_sequence_main_region_child_lockable_r2_detect_clicks_default()
+		else:
+			self.__enter_sequence_main_region_child_lockable_r2_detect_clicks_default()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a_default()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_h(self):
+		"""Default react sequence for shallow history entry h.
+		"""
+		#Enter the region with shallow history
+		if self.__history_vector[0] is not self.State.null_state:
+			self.__shallow_enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1()
+		else:
+			self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_default()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r2__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control_default()
+		
+	def __react_main_region_child_lockable_r1__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_default()
+		
+	def __react_main_region_child_lockable_r2__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_r2_detect_clicks_default()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_child_lockable_default()
+		
+	def __react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_done(self):
+		"""The reactions of exit done..
+		"""
+		self.__effect_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_tr1()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_child_lockable_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_react function.
+		"""
+		return self.__react(transitioned_before)
+	
+	
+	def __main_region_child_lockable_r1_locked_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_locked_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.lock_unlock:
+				self.__exit_sequence_main_region_child_lockable_r1_locked()
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.lock_unlock:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state()
+				self.__enter_sequence_main_region_child_lockable_r1_locked_default()
+				transitioned_after = 1
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r1_door_open_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r1_door_open_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_r1_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.door_closed:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open()
+				self.__react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_h()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_r1_orthogonal_state_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.door_opened:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed()
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_open_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_closed_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.__time_events[0]:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on()
+				self.__remaining_time = self.__remaining_time - 1
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__time_events[0] = False
+				self.__react_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1__choice_0()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_react function.
+		"""
+		transitioned_after = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_closed_react(transitioned_before)
+		if transitioned_after < 0:
+			if self.start_pressed:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off()
+				self.__remaining_time = 10 if self.__remaining_time == 0 else self.__remaining_time
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_default()
+				transitioned_after = 0
+			elif self.stop_pressed:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off()
+				self.__remaining_time = 0
+				self.set_displayed_time_observable.next(0)
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r1_orthogonal_state_r2_time_control_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r1_orthogonal_state_r2_time_control_react function.
+		"""
+		transitioned_after = transitioned_before
+		if transitioned_after < 1:
+			if self.increase_time_pressed:
+				self.__exit_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control()
+				self.__remaining_time = self.__remaining_time + 10
+				self.set_displayed_time_observable.next(self.__remaining_time)
+				self.__enter_sequence_main_region_child_lockable_r1_orthogonal_state_r2_time_control_default()
+				transitioned_after = 1
+		return transitioned_after
+	
+	
+	def __main_region_child_lockable_r2_detect_clicks_react(self, transitioned_before):
+		"""Implementation of __main_region_child_lockable_r2_detect_clicks_react function.
+		"""
+		transitioned_after = transitioned_before
+		if transitioned_after < 2:
+			if self.stop_pressed:
+				self.__exit_sequence_main_region_child_lockable_r2_detect_clicks()
+				self.__clicks = self.__clicks + 1
+				self.__react_main_region_child_lockable_r2__choice_0()
+				transitioned_after = 2
+			elif self.__time_events[1]:
+				self.__exit_sequence_main_region_child_lockable_r2_detect_clicks()
+				self.__clicks = 0
+				self.__time_events[1] = False
+				self.__enter_sequence_main_region_child_lockable_r2_detect_clicks_default()
+				transitioned_after = 2
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+		self.__time_events[1] = False
+	
+	
+	def __clear_internal_events(self):
+		"""Implementation of __clear_internal_events function.
+		"""
+		self.lock_unlock = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		transitioned = -1
+		self.__state_conf_vector_position = 0
+		state = self.__state_vector[0]
+		if state == self.State.main_region_child_lockable_r1locked:
+			transitioned = self.__main_region_child_lockable_r1_locked_react(transitioned)
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_open:
+			transitioned = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_open_react(transitioned)
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_on_r1a:
+			transitioned = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_on_r1_a_react(transitioned)
+		elif state == self.State.main_region_child_lockable_r1orthogonal_state_r1door_closed_r1magnetron_off:
+			transitioned = self.__main_region_child_lockable_r1_orthogonal_state_r1_door_closed_r1_magnetron_off_react(transitioned)
+		if self.__state_conf_vector_position < 1:
+			state = self.__state_vector[1]
+			if state == self.State.main_region_child_lockable_r1orthogonal_state_r2time_control:
+				transitioned = self.__main_region_child_lockable_r1_orthogonal_state_r2_time_control_react(transitioned)
+		if self.__state_conf_vector_position < 2:
+			state = self.__state_vector[2]
+			if state == self.State.main_region_child_lockable_r2detect_clicks:
+				self.__main_region_child_lockable_r2_detect_clicks_react(transitioned)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			self.__clear_internal_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 23 - 0
microwave/YAKINDU_WORKSPACE/90_AfterTransition/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>90_AfterTransition</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.yakindu.sct.builder.SCTBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>com.yakindu.sct.builder.SCTNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
microwave/YAKINDU_WORKSPACE/90_AfterTransition/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
+encoding/Statechart.ysc=UTF-8

+ 15 - 0
microwave/YAKINDU_WORKSPACE/90_AfterTransition/Statechart.sgen

@@ -0,0 +1,15 @@
+GeneratorModel for create::python {
+
+	const PROJECT : string = "90_AfterTransition"
+
+	const FOLDER : string = "srcgen"
+
+	statechart Statechart {
+
+		feature Outlet {
+			targetProject = PROJECT
+			targetFolder = FOLDER
+			libraryTargetFolder = "src"
+		}
+	}
+}

File diff ditekan karena terlalu besar
+ 116 - 0
microwave/YAKINDU_WORKSPACE/90_AfterTransition/Statechart.ysc


+ 5 - 0
microwave/YAKINDU_WORKSPACE/90_AfterTransition/src/yakindu/__init__.py

@@ -0,0 +1,5 @@
+"""
+
+Empty file that initializes the package it is contained in.
+
+"""

+ 48 - 0
microwave/YAKINDU_WORKSPACE/90_AfterTransition/src/yakindu/rx.py

@@ -0,0 +1,48 @@
+"""Implementation for Observer and Observables used for out events.
+Generated by itemis CREATE code generator.
+"""
+
+
+class Observer():
+	"""Observer implementation.
+	"""
+
+	def next(self, value=None):
+		"""Abstract next method, which must be implemented."""
+		raise NotImplementedError('user must define next() to use this base class')
+
+
+class Observable():
+	"""Observable implementation.
+	"""
+
+	def __init__(self):
+		self.observers = []
+
+	def next(self, value=None):
+		"""Calls next function from every observer.
+		"""
+		for observer in self.observers:
+			if observer is not None:
+				if value is None:
+					observer.next()
+				else:
+					observer.next(value)
+
+	def subscribe(self, observer):
+		"""Subscribe on specified observer.
+		"""
+		if observer is not None:
+			self.observers.append(observer)
+			return True
+		return False
+
+	def unsubscribe(self, observer):
+		"""Unsubscribe from specified observer.
+		"""
+		if observer is None:
+			return False
+		if observer in self.observers:
+			self.observers.remove(observer)
+			return True
+		return False

+ 326 - 0
microwave/YAKINDU_WORKSPACE/90_AfterTransition/srcgen/statechart.py

@@ -0,0 +1,326 @@
+"""Implementation of statechart statechart.
+Generated by itemis CREATE code generator.
+"""
+
+import queue
+import sys, os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+from yakindu.rx import Observable
+
+class Statechart:
+	"""Implementation of the state machine Statechart.
+	"""
+
+	class State:
+		""" State Enum
+		"""
+		(
+			main_region_magnetron_off,
+			main_region_magnetron_on,
+			null_state
+		) = range(3)
+	
+	
+	def __init__(self):
+		""" Declares all necessary variables including list of states, histories etc. 
+		"""
+		
+		self.start_pressed = None
+		self.stop_pressed = None
+		self.increase_time_pressed = None
+		self.door_opened = None
+		self.door_closed = None
+		self.turn_magnetron_on = None
+		self.turn_magnetron_on_observable = Observable()
+		self.turn_magnetron_off = None
+		self.turn_magnetron_off_observable = Observable()
+		self.set_displayed_time = None
+		self.set_displayed_time_value = None
+		self.set_displayed_time_observable = Observable()
+		self.ring_bell = None
+		self.ring_bell_observable = Observable()
+		
+		self.in_event_queue = queue.Queue()
+		# enumeration of all states:
+		self.__State = Statechart.State
+		self.__state_conf_vector_changed = None
+		self.__state_vector = [None] * 1
+		for __state_index in range(1):
+			self.__state_vector[__state_index] = self.State.null_state
+		
+		# for timed statechart:
+		self.timer_service = None
+		self.__time_events = [None] * 2
+		
+		# initializations:
+		self.__is_executing = False
+	
+	def is_active(self):
+		"""Checks if the state machine is active.
+		"""
+		return self.__state_vector[0] is not self.__State.null_state
+	
+	def is_final(self):
+		"""Checks if the statemachine is final.
+		Always returns 'false' since this state machine can never become final.
+		"""
+		return False
+			
+	def is_state_active(self, state):
+		"""Checks if the state is currently active.
+		"""
+		s = state
+		if s == self.__State.main_region_magnetron_off:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_off
+		if s == self.__State.main_region_magnetron_on:
+			return self.__state_vector[0] == self.__State.main_region_magnetron_on
+		return False
+		
+	def time_elapsed(self, event_id):
+		"""Add time events to in event queue
+		"""
+		if event_id in range(2):
+			self.in_event_queue.put(lambda: self.raise_time_event(event_id))
+			self.run_cycle()
+	
+	def raise_time_event(self, event_id):
+		"""Raise timed events using the event_id.
+		"""
+		self.__time_events[event_id] = True
+	
+	def __execute_queued_event(self, func):
+		func()
+	
+	def __get_next_event(self):
+		if not self.in_event_queue.empty():
+			return self.in_event_queue.get()
+		return None
+	
+	def raise_start_pressed(self):
+		"""Raise method for event start_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_start_pressed_call)
+		self.run_cycle()
+	
+	def __raise_start_pressed_call(self):
+		"""Raise callback for event start_pressed.
+		"""
+		self.start_pressed = True
+	
+	def raise_stop_pressed(self):
+		"""Raise method for event stop_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_stop_pressed_call)
+		self.run_cycle()
+	
+	def __raise_stop_pressed_call(self):
+		"""Raise callback for event stop_pressed.
+		"""
+		self.stop_pressed = True
+	
+	def raise_increase_time_pressed(self):
+		"""Raise method for event increase_time_pressed.
+		"""
+		self.in_event_queue.put(self.__raise_increase_time_pressed_call)
+		self.run_cycle()
+	
+	def __raise_increase_time_pressed_call(self):
+		"""Raise callback for event increase_time_pressed.
+		"""
+		self.increase_time_pressed = True
+	
+	def raise_door_opened(self):
+		"""Raise method for event door_opened.
+		"""
+		self.in_event_queue.put(self.__raise_door_opened_call)
+		self.run_cycle()
+	
+	def __raise_door_opened_call(self):
+		"""Raise callback for event door_opened.
+		"""
+		self.door_opened = True
+	
+	def raise_door_closed(self):
+		"""Raise method for event door_closed.
+		"""
+		self.in_event_queue.put(self.__raise_door_closed_call)
+		self.run_cycle()
+	
+	def __raise_door_closed_call(self):
+		"""Raise callback for event door_closed.
+		"""
+		self.door_closed = True
+	
+	def __entry_action_main_region_magnetron_off(self):
+		"""Entry action for state 'MagnetronOff'..
+		"""
+		self.timer_service.set_timer(self, 0, 500, False)
+		
+	def __entry_action_main_region_magnetron_on(self):
+		"""Entry action for state 'MagnetronOn'..
+		"""
+		self.timer_service.set_timer(self, 1, 500, False)
+		self.turn_magnetron_on_observable.next()
+		
+	def __exit_action_main_region_magnetron_off(self):
+		"""Exit action for state 'MagnetronOff'..
+		"""
+		self.timer_service.unset_timer(self, 0)
+		
+	def __exit_action_main_region_magnetron_on(self):
+		"""Exit action for state 'MagnetronOn'..
+		"""
+		self.timer_service.unset_timer(self, 1)
+		self.turn_magnetron_off_observable.next()
+		
+	def __enter_sequence_main_region_magnetron_off_default(self):
+		"""'default' enter sequence for state MagnetronOff.
+		"""
+		self.__entry_action_main_region_magnetron_off()
+		self.__state_vector[0] = self.State.main_region_magnetron_off
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_magnetron_on_default(self):
+		"""'default' enter sequence for state MagnetronOn.
+		"""
+		self.__entry_action_main_region_magnetron_on()
+		self.__state_vector[0] = self.State.main_region_magnetron_on
+		self.__state_conf_vector_changed = True
+		
+	def __enter_sequence_main_region_default(self):
+		"""'default' enter sequence for region main region.
+		"""
+		self.__react_main_region__entry_default()
+		
+	def __exit_sequence_main_region_magnetron_off(self):
+		"""Default exit sequence for state MagnetronOff.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__exit_action_main_region_magnetron_off()
+		
+	def __exit_sequence_main_region_magnetron_on(self):
+		"""Default exit sequence for state MagnetronOn.
+		"""
+		self.__state_vector[0] = self.State.null_state
+		self.__exit_action_main_region_magnetron_on()
+		
+	def __exit_sequence_main_region(self):
+		"""Default exit sequence for region main region.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__exit_sequence_main_region_magnetron_off()
+		elif state == self.State.main_region_magnetron_on:
+			self.__exit_sequence_main_region_magnetron_on()
+		
+	def __react_main_region__entry_default(self):
+		"""Default react sequence for initial entry .
+		"""
+		self.__enter_sequence_main_region_magnetron_off_default()
+		
+	def __react(self, transitioned_before):
+		"""Implementation of __react function.
+		"""
+		return transitioned_before
+	
+	
+	def __main_region_magnetron_off_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_off_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.__time_events[0]:
+				self.__exit_sequence_main_region_magnetron_off()
+				self.__time_events[0] = False
+				self.__enter_sequence_main_region_magnetron_on_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __main_region_magnetron_on_react(self, transitioned_before):
+		"""Implementation of __main_region_magnetron_on_react function.
+		"""
+		transitioned_after = self.__react(transitioned_before)
+		if transitioned_after < 0:
+			if self.__time_events[1]:
+				self.__exit_sequence_main_region_magnetron_on()
+				self.__time_events[1] = False
+				self.__enter_sequence_main_region_magnetron_off_default()
+				transitioned_after = 0
+		return transitioned_after
+	
+	
+	def __clear_in_events(self):
+		"""Implementation of __clear_in_events function.
+		"""
+		self.start_pressed = False
+		self.stop_pressed = False
+		self.increase_time_pressed = False
+		self.door_opened = False
+		self.door_closed = False
+		self.__time_events[0] = False
+		self.__time_events[1] = False
+	
+	
+	def __micro_step(self):
+		"""Implementation of __micro_step function.
+		"""
+		state = self.__state_vector[0]
+		if state == self.State.main_region_magnetron_off:
+			self.__main_region_magnetron_off_react(-1)
+		elif state == self.State.main_region_magnetron_on:
+			self.__main_region_magnetron_on_react(-1)
+	
+	
+	def run_cycle(self):
+		"""Implementation of run_cycle function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		next_event = self.__get_next_event()
+		if next_event is not None:
+			self.__execute_queued_event(next_event)
+		condition_0 = True
+		while condition_0:
+			self.__micro_step()
+			self.__clear_in_events()
+			condition_0 = False
+			next_event = self.__get_next_event()
+			if next_event is not None:
+				self.__execute_queued_event(next_event)
+				condition_0 = True
+		self.__is_executing = False
+	
+	
+	def enter(self):
+		"""Implementation of enter function.
+		"""
+		if self.timer_service is None:
+			raise ValueError('Timer service must be set.')
+		
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__enter_sequence_main_region_default()
+		self.__is_executing = False
+	
+	
+	def exit(self):
+		"""Implementation of exit function.
+		"""
+		if self.__is_executing:
+			return
+		self.__is_executing = True
+		self.__exit_sequence_main_region()
+		self.__is_executing = False
+	
+	
+	def trigger_without_event(self):
+		"""Implementation of triggerWithoutEvent function.
+		"""
+		self.run_cycle()
+	

+ 0 - 0
microwave/lib/__init__.py


+ 37 - 0
microwave/lib/audio.py

@@ -0,0 +1,37 @@
+import os
+MODULE_PATH = os.path.dirname(__file__)
+
+try:
+    import simpleaudio
+    bell = simpleaudio.WaveObject.from_wave_file(MODULE_PATH+"/bell.wav")
+
+    def play_bell():
+        bell.play()
+
+    running = simpleaudio.WaveObject.from_wave_file(MODULE_PATH+"/running.wav")
+    running.audio_data *= 200 # repeat sample
+
+    playing = None
+    
+    def play_running():
+        global playing
+        if playing is None:
+            # playing = running.play()
+            pass
+
+    def stop_running():
+        global playing
+        if playing is not None:
+            # playing.stop()
+            pass
+            playing = None
+
+except ImportError:
+    print("Audio disabled. Install python package 'simpleaudio' for a fully immersive experience :)")
+
+    def play_bell():
+        pass
+    def play_running():
+        pass
+    def stop_running():
+        pass

TEMPAT SAMPAH
microwave/lib/bell.wav


+ 166 - 0
microwave/lib/gui.py

@@ -0,0 +1,166 @@
+# Based on "Digital Watch GUI" OCT 2008 by Reehan Shaikh reehan.shaikh@cs.mcgill.ca
+
+import tkinter
+from tkinter.constants import BOTH, NO
+import os
+MODULE_PATH = os.path.dirname(__file__)
+
+from . import audio
+
+
+CANVAS_W = 520
+CANVAS_H = 348
+
+TIME_X0 = 412
+TIME_Y0 = 90
+TIME_X1 = 472
+TIME_Y1 = 106
+
+BUTTON_HEIGHT = 18
+BUTTON_X0 = 412
+BUTTON_X1 = 472
+
+START_X0 = BUTTON_X0
+START_Y0 = 234
+START_X1 = BUTTON_X1
+START_Y1 = START_Y0 + BUTTON_HEIGHT
+
+STOP_X0 = BUTTON_X0
+STOP_Y0 = 211
+STOP_X1 = BUTTON_X1
+STOP_Y1 = STOP_Y0 + BUTTON_HEIGHT
+
+INCTIME_X0 = BUTTON_X0
+INCTIME_Y0 = 188
+INCTIME_X1 = BUTTON_X1
+INCTIME_Y1 = INCTIME_Y0 + BUTTON_HEIGHT
+
+DOOR_X0 = 26
+DOOR_Y0 = 68
+DOOR_X1 = 379
+DOOR_Y1 = 285
+
+FONT_TIME = ("terminal", 14)
+
+class GUI(tkinter.Frame):
+
+    def __init__(self, parent):
+        super().__init__(parent)
+        self.imgClosedOff = tkinter.PhotoImage(file=MODULE_PATH+"/small_closed_off.png")
+        self.imgClosedOn = tkinter.PhotoImage(file=MODULE_PATH+"/small_closed_on.png")
+        self.imgOpenedOff = tkinter.PhotoImage(file=MODULE_PATH+"/small_opened_off.png")
+        self.imgOpenedOn = tkinter.PhotoImage(file=MODULE_PATH+"/small_opened_on.png")
+
+        # state
+        self.doorOpened = False
+        self.running = False
+        
+        self.lastPressed = ""
+                
+        self.pack()
+        self.canvas = tkinter.Canvas(master=self,
+                             takefocus=1,
+                             width=CANVAS_W, height=CANVAS_H,
+                             background="black")
+    
+        self.canvas.pack(fill=BOTH, expand=1)
+        self.canvas.focus_set()
+
+        self.background = self.canvas.create_image(0, 0, image=self.imgClosedOff, anchor="nw")
+
+        self.rects = [
+            (START_X0, START_X1, START_Y0, START_Y1, "START"),
+            (STOP_X0, STOP_X1, STOP_Y0, STOP_Y1, "STOP"),
+            (INCTIME_X0, INCTIME_X1, INCTIME_Y0, INCTIME_Y1, "INCTIME"),
+            (DOOR_X0, DOOR_X1, DOOR_Y0, DOOR_Y1, "DOOR"),
+        ]
+
+        self.timeTag = self.canvas.create_text(
+            TIME_X1-16, TIME_Y0+7,
+            font=FONT_TIME, justify="center", fill="#0f0", text="0")
+
+        self.canvas.bind("<ButtonPress-1>", self.mouse1Click)
+        self.canvas.bind("<ButtonRelease-1>", self.mouse1Release)
+        
+        parent.protocol("WM_DELETE_WINDOW", self.window_close)
+
+    def mouse1Click(self, event):
+
+        def handle(what):
+            if what == "START":
+                self.send_event("start_pressed")
+                self.lastPressed = "start_pressed"
+            elif what == "STOP":
+                self.send_event("stop_pressed")
+                self.lastPressed = "stop_pressed"
+            elif what == "INCTIME":
+                self.send_event("increase_time_pressed")
+                self.lastPressed = "increase_time_pressed"
+            elif what == "DOOR":
+                self.doorOpened = not self.doorOpened
+                if self.doorOpened:
+                    self.send_event("door_opened")
+                else:
+                    self.send_event("door_closed")
+                self.refresh_background()
+                self.lastPressed = ""
+            else:
+                self.lastPressed = ""
+
+        X = self.canvas.canvasx(event.x)
+        Y = self.canvas.canvasy(event.y)
+
+        for X0, X1, Y0, Y1, what in self.rects:
+            if X >= X0 and X <= X1 and Y >= Y0 and Y <= Y1:
+                handle(what)
+                break
+    
+    def mouse1Release(self, event):
+        if self.lastPressed == "start":
+            # self.send_event("releasedStart")
+            pass
+        elif self.lastPressed == "stop":
+            # self.send_event("releasedStop")
+            pass
+        elif self.lastPressed == "increase_time":
+            # self.send_event("releasedIncTime")
+            pass
+        self.lastPressed = ""
+
+    def refresh_background(self):
+        if self.doorOpened:
+            if self.running:
+                self.canvas.itemconfig(self.background, image=self.imgOpenedOn)
+            else:
+                self.canvas.itemconfig(self.background, image=self.imgOpenedOff)
+        else:
+            if self.running:
+                self.canvas.itemconfig(self.background, image=self.imgClosedOn)
+            else:
+                self.canvas.itemconfig(self.background, image=self.imgClosedOff)
+
+        # play or stop sound
+        if self.running:
+            audio.play_running()
+        else:
+            audio.stop_running()
+
+    def handle_event(self, event, param):
+        if event == "turnMagnetronOn":
+            self.running = True
+            self.refresh_background()
+        elif event == "turnMagnetronOff":
+            self.running = False
+            self.refresh_background()
+        elif event == "setDisplayedTime":
+            self.setTime(param)
+        elif event == "ringBell":
+            audio.play_bell()
+                             
+    def setTime(self, time: int):
+        self.canvas.itemconfig(self.timeTag, text=str(time))
+
+    def window_close(self):
+        import sys
+        sys.exit(0)
+        self.send_event('GUIQuit')

TEMPAT SAMPAH
microwave/lib/running.wav


+ 126 - 0
microwave/lib/simulator.py

@@ -0,0 +1,126 @@
+# Author: Joeri Exelmans
+
+import time
+
+class QueueEntry:
+    # Make the common case fast:
+    __slots__ = ('timestamp', 'callback', 'canceled', 'debug')
+
+    def __init__(self, timestamp, callback, debug):
+        self.timestamp = timestamp
+        self.callback = callback
+        self.canceled = False
+        self.debug = debug
+
+# Simulation primitive.
+# Uses virtualized (simulated) time, instead of looking at the wall clock.
+class Controller:
+    def __init__(self):
+        self.event_queue = []
+        self.simulated_time = 0
+
+    def start(self):
+        now = time.perf_counter_ns()
+        self.simulated_time = now
+        self.start_time = now
+
+    def add_input(self, timestamp, sc, event, value=None):
+        raise_method = getattr(sc, 'raise_' + event)
+        if value is not None:
+            callback = lambda: raise_method(value)
+        else:
+            callback = raise_method
+        self.add_input_lowlevel(timestamp, callback, event)
+
+    def add_input_lowlevel(self, timestamp, callback, debug):
+        e = QueueEntry(timestamp, callback, debug)
+        self.event_queue.append(e)
+        self.event_queue.sort(key = lambda entry: entry.timestamp, reverse=True)
+        return e
+
+    def run_until(self, until):
+        while self.have_event() and self.get_earliest() <= until:
+            e = self.event_queue.pop();
+            if not e.canceled:
+                self.simulated_time = e.timestamp
+                print("Time = %03dms - Input event: %s" % (self.get_simtime_seconds()*1000, e.debug))
+                e.callback()
+
+    def have_event(self):
+        return len(self.event_queue) > 0
+
+    def get_earliest(self):
+        return self.event_queue[-1].timestamp
+
+    def get_simtime_seconds(self):
+        return (self.simulated_time - self.start_time) / 1000000000
+
+# Our own timer service, used by the statechart.
+# Much better than YAKINDU's pathetic timer service.
+class TimerService:
+    def __init__(self, controller, scale=1.0):
+        self.controller = controller;
+        self.timers = {}
+        self.scale = scale
+
+    # Duration: milliseconds
+    def set_timer(self, sc, event_id, duration, periodic):
+        def callback():
+            sc.time_elapsed(event_id)
+
+        self.unset_timer(callback, event_id)
+
+        controller_duration = duration * 1000000 / self.scale # ms to ns
+
+        e = self.controller.add_input_lowlevel(
+            self.controller.simulated_time + controller_duration, # timestamp relative to simulated time
+            callback,
+            "timer"+str(event_id))
+
+        self.timers[event_id] = e
+
+    def unset_timer(self, callback, event_id):
+        try:
+            e = self.timers[event_id]
+            e.canceled = True
+        except KeyError:
+            pass
+
+# Runs the Controller as close as possible to the wall-clock.
+# Depending on how fast your computer is, simulated time will always run a tiny bit behind wall-clock time, but this error will NOT grow over time.
+class RealTimeSimulation:
+    def __init__(self, controller, tk, update_callback):
+        self.controller = controller
+        self.tk = tk
+        self.update_callback = update_callback
+
+        self.scheduled_id = None
+        self.purposefully_behind = 0
+
+    def add_input(self, sc, event, value=None):
+        now = time.perf_counter_ns() + self.purposefully_behind
+        self.controller.add_input(now, sc, event, value)
+        self.interrupt()
+
+    def interrupt(self):
+        if self.scheduled_id is not None:
+            self.tk.after_cancel(self.scheduled_id)
+
+        if self.controller.have_event():
+            now = time.perf_counter_ns()
+            earliest = self.controller.get_earliest()
+            sleep_time = earliest - now
+
+            if sleep_time < 0:
+                self.purposefully_behind = sleep_time
+            else:
+                self.purposefully_behind = 0
+
+            def callback():
+                self.controller.run_until(now + self.purposefully_behind)
+                self.update_callback()
+                self.interrupt()
+
+            self.scheduled_id = self.tk.after(int(sleep_time / 1000000), callback)
+        # else:
+            # print("sleeping until next input")

+ 0 - 0
microwave/lib/small_closed_off.png


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini