Browse Source

Digital watch is working!

Joeri Exelmans 5 years ago
parent
commit
cede8ccf90

+ 1 - 1
examples/digitalwatch/DigitalWatchGUI.py

@@ -151,7 +151,7 @@ class DigitalWatchGUI_Controller:
     # Check if time = alarm set time
     def checkTime(self):
         if self.GUI.getTime()[0] == self.GUI.getAlarm()[0] and self.GUI.getTime()[1] == self.GUI.getAlarm()[1] and self.GUI.getTime()[2] == self.GUI.getAlarm()[2]:
-            #self.alarm()
+            self.alarm()
             return True
         else:
             return False

+ 12 - 8
examples/digitalwatch/run.py

@@ -21,11 +21,10 @@ def main():
     scheduled = None
 
     def gui_event(event: str):
-        print(event)
-        controller.add_input(InputEvent(name=event, port="in", params=[], time_offset=duration(0)))
+        # print("in:", event)
         if scheduled:
             tk.after_cancel(scheduled)
-        wakeup()
+        wakeup(event)
 
     tk = tkinter.Tk()
     tk.withdraw()
@@ -38,29 +37,34 @@ def main():
     q = queue.Queue()
     start_time = now()
 
-    def wakeup():
+    def wakeup(event: Optional[str] = None):
         nonlocal scheduled
+
         # run controller - output will accumulate in 'q'
         controller.run_until(now() - start_time, q)
 
+        # controller's "simulated time" is now "now", so "now" is the time to add input:
+        if event is not None:
+            controller.add_input(InputEvent(name=event, port="in", params=[], time_offset=duration(0)))
+            controller.run_until(now() - start_time, q)
+
         # process output
         try:
             while True:
                 big_step_output = q.get_nowait()
                 for e in big_step_output:
-                    print("out:", e.name)
-                    # print("got output:", e.name)
+                    # print("out:", e.name)
                     # the output event names happen to be functions on our GUI controller:
                     method = getattr(gui.controller, e.name)
-                    # print(method)
                     method()
         except queue.Empty:
             pass
 
-        # done enough for now, go to sleep
+        # go to sleep
         # convert our statechart's timestamp to tkinter's (100 us -> 1 ms)
         sleep_duration = (controller.next_wakeup() - controller.simulated_time) // 10
         scheduled = tk.after(sleep_duration, wakeup)
+        # print("sleeping %d ms" % sleep_duration)
 
     tk.after(0, wakeup)
     tk.mainloop()

+ 27 - 15
examples/digitalwatch/statechart_digitalwatch.xml

@@ -1,11 +1,5 @@
 <statechart>
   <semantics big_step_maximality="take_many"/>
-  
-  <datamodel>
-    checkTime = func {
-      log("checkTime");
-    };
-  </datamodel>
 
   <inport name="in">
     <event name="bottomLeftPressed"/>
@@ -16,20 +10,25 @@
     <event name="topLeftReleased"/>
     <event name="topRightPressed"/>
     <event name="topRightReleased"/>
+    <event name="alarmStart"/>
   </inport>
 
   <outport name="out">
-    <event name="setAlarm"/>
-    <event name="setIndiglo"/>
-    <event name="unsetIndiglo"/>
-    <event name="increaseTimeByOne"/>
+    <event name="checkTime"/>
     <event name="refreshTimeDisplay"/>
+    <event name="refreshChronoDisplay"/>
+    <event name="refreshDateDisplay"/>
+    <event name="refreshAlarmDisplay"/>
+    <event name="resetChrono"/>
     <event name="startSelection"/>
-    <event name="stopSelection"/>
     <event name="increaseSelection"/>
-    <event name="resetChrono"/>
+    <event name="selectNext"/>
+    <event name="stopSelection"/>
+    <event name="increaseTimeByOne"/>
     <event name="increaseChronoByOne"/>
-    <event name="refreshChronoDisplay"/>
+    <event name="setIndiglo"/>
+    <event name="unsetIndiglo"/>
+    <event name="setAlarm"/>
   </outport>
 
   <outport name="out">
@@ -106,7 +105,9 @@
           </state>
 
           <state id="GoingToNext">
-            <transition event="bottomRightReleased" target="../Waiting"/>
+            <transition event="bottomRightReleased" target="../Waiting">
+              <raise event="selectNext"/>
+            </transition>
             <transition after="2 s" target="../../TimeUpdate">
               <raise event="edit_done"/>
             </transition>
@@ -129,9 +130,13 @@
         </state>
 
         <state id="WaitingForAlarm">
+          <onentry>
+            <raise event="refreshAlarmDisplay"/>
+          </onentry>
           <transition after="1500 ms" target="../EditingTime">
             <raise event="alarm_edit"/>
           </transition>
+          <transition event="bottomLeftReleased" target="../TimeUpdate"/>
         </state>
       </state>
 
@@ -143,7 +148,14 @@
         </state>
 
         <state id="On">
-          <transition cond="checkTime()" target="../Blinking"/>
+          <onentry>
+            <raise event="checkTime"/>
+          </onentry>
+          <transition event="bottomLeftPressed" cond='INSTATE(["/P/Display/TimeUpdate"]) or INSTATE(["/P/Display/WaitingForAlarm"])' target="../Off">
+            <raise event="setAlarm"/>
+          </transition>
+          <transition after="1 s" target="."/>
+          <transition event="alarmStart" target="../Blinking"/>
         </state>
 
         <state id="Blinking" initial="On">