Browse Source

Microwave example: various changes

Joeri Exelmans 4 years ago
parent
commit
dacbbec4ee

+ 34 - 15
examples/microwave/GUI.py

@@ -1,7 +1,9 @@
 # Based on "Digital Watch GUI" OCT 2008 by Reehan Shaikh reehan.shaikh@cs.mcgill.ca
 
-from tkinter import Frame, PhotoImage, Canvas
-from tkinter.constants import BOTH
+import tkinter
+from tkinter.constants import BOTH, NO
+
+import audio
 
 CANVAS_W = 520
 CANVAS_H = 348
@@ -37,16 +39,14 @@ DOOR_Y1 = 285
 
 FONT_TIME = ("terminal", 14)
 
-class GUI(Frame):
-
-    def __init__(self, parent, send_event):
-        Frame.__init__(self, parent)
-        self.send_event = send_event
+class GUI(tkinter.Frame):
 
-        self.imgClosedOff = PhotoImage(file="./small_closed_off.png")
-        self.imgClosedOn = PhotoImage(file="./small_closed_on.png")
-        self.imgOpenedOff = PhotoImage(file="./small_opened_off.png")
-        self.imgOpenedOn = PhotoImage(file="./small_opened_on.png")
+    def __init__(self, parent):
+        super().__init__(parent)
+        self.imgClosedOff = tkinter.PhotoImage(file="./small_closed_off.png")
+        self.imgClosedOn = tkinter.PhotoImage(file="./small_closed_on.png")
+        self.imgOpenedOff = tkinter.PhotoImage(file="./small_opened_off.png")
+        self.imgOpenedOn = tkinter.PhotoImage(file="./small_opened_on.png")
 
         # state
         self.doorOpened = False
@@ -55,7 +55,7 @@ class GUI(Frame):
         self.lastPressed = ""
                 
         self.pack()
-        self.canvas = Canvas(master=self,
+        self.canvas = tkinter.Canvas(master=self,
                              takefocus=1,
                              width=CANVAS_W, height=CANVAS_H,
                              background="black")
@@ -79,7 +79,6 @@ class GUI(Frame):
         self.canvas.bind("<ButtonPress-1>", self.mouse1Click)
         self.canvas.bind("<ButtonRelease-1>", self.mouse1Release)
         
-        # self.b_playpause.focus_force()
         parent.protocol("WM_DELETE_WINDOW", self.window_close)
 
     def mouse1Click(self, event):
@@ -96,11 +95,11 @@ class GUI(Frame):
                 self.lastPressed = "increase_time"
             elif what == "DOOR":
                 self.doorOpened = not self.doorOpened
-                self.refresh_background()
                 if self.doorOpened:
                     self.send_event("door_opened")
                 else:
                     self.send_event("door_closed")
+                self.refresh_background()
                 self.lastPressed = ""
             else:
                 self.lastPressed = ""
@@ -136,7 +135,12 @@ class GUI(Frame):
                 self.canvas.itemconfig(self.background, image=self.imgClosedOn)
             else:
                 self.canvas.itemconfig(self.background, image=self.imgClosedOff)
-        print("refreshed")
+
+        # play or stop sound
+        if self.running:
+            audio.play_running()
+        else:
+            audio.stop_running()
 
     def handle_event(self, event):
         if event.name == "micro_on":
@@ -147,6 +151,8 @@ class GUI(Frame):
             self.refresh_background()
         elif event.name == "set_time":
             self.setTime(event.params[0])
+        elif event.name == "bell":
+            audio.play_bell()
                              
     def setTime(self, time: int):
         self.canvas.itemconfig(self.timeTag, text=str(time))
@@ -155,3 +161,16 @@ class GUI(Frame):
         import sys
         sys.exit(0)
         self.send_event('GUIQuit')
+
+tk = tkinter.Tk()
+tk.withdraw()
+topLevel = tkinter.Toplevel(tk)
+topLevel.resizable(width=NO, height=NO)
+topLevel.title("Microwave oven simulator")
+gui = GUI(topLevel)
+
+from sccd.action_lang.static.types import *
+
+SCCD_EXPORTS = {
+    "display_time": (gui.setTime, SCCDFunction([SCCDInt])),
+}

+ 18 - 26
examples/microwave/models/model_01_flat_nodoor.xml

@@ -9,9 +9,13 @@
       same_source_priority="explicit"
       />
     <datamodel>
+      import GUI;
       time = 0;
       checkStartTime = func {
-        if (time == 0) time = 30;
+        if (time == 0) {
+          time = 30;
+          display_time(time);
+        }
       };
     </datamodel>
     <inport name="in">
@@ -24,46 +28,34 @@
     <outport name="out">
       <event name="micro_on"/>
       <event name="micro_off"/>
-      <event name="set_time"/>
-      <event name="ping"/>
+      <event name="bell"/>
     </outport>
     <root initial="NotRunning">
       <state id="Running">
         <onentry> <raise port="out" event="micro_on"/> </onentry>
         <onexit> <raise port="out" event="micro_off"/> </onexit>
         <transition port="in" event="stop" target="../NotRunning"/>
-        <transition after="1 s" target=".">
-          <code> time -= 1; </code>
-          <raise port="out" event="set_time">
-            <param expr="time"/>
-          </raise>
+        <state id="Inner">
+          <transition after="1 s" target=".">
+            <code> time -= 1; display_time(time); </code>
+          </transition>
+          <transition port="in" event="increase_time" target=".">
+            <code> time += 10; display_time(time); </code>
+          </transition>
+        </state>
+        <transition cond="time == 0" target="../NotRunning">
+          <raise port="out" event="bell"/>
         </transition>
-        <transition port="in" event="increase_time" target=".">
-          <code> time += 10; </code>
-            <raise port="out" event="set_time">
-              <param expr="time"/>
-            </raise>
-        </transition>
-        <transition cond="time == 0" target="../NotRunning"/>
       </state>
       <state id="NotRunning">
         <transition port="in" event="start" target="../Running">
           <code> checkStartTime(); </code>
-          <raise port="out" event="set_time">
-            <param expr="time"/>
-          </raise>
         </transition>
         <transition port="in" event="stop" target=".">
-          <code> time = 0; </code>
-          <raise port="out" event="set_time">
-            <param expr="time"/>
-          </raise>
+          <code> time = 0; display_time(time); </code>
         </transition>
         <transition port="in" event="increase_time" target=".">
-          <code> time += 10; </code>
-            <raise port="out" event="set_time">
-              <param expr="time"/>
-            </raise>
+          <code> time += 10; display_time(time); </code>
         </transition>
       </state>
     </root>

+ 20 - 32
examples/microwave/models/model_01b_flat_nodoor.xml

@@ -9,9 +9,13 @@
       same_source_priority="explicit"
       />
     <datamodel>
+      import GUI;
       time = 0;
       checkStartTime = func {
-        if (time == 0) time = 30;
+        if (time == 0) {
+          time = 30;
+          display_time(time);
+        }
       };
     </datamodel>
     <inport name="in">
@@ -24,51 +28,35 @@
     <outport name="out">
       <event name="micro_on"/>
       <event name="micro_off"/>
-      <event name="set_time"/>
-      <event name="ping"/>
+      <event name="bell"/>
     </outport>
     <root initial="NotRunning">
       <state id="Running">
         <onentry> <raise port="out" event="micro_on"/> </onentry>
         <onexit> <raise port="out" event="micro_off"/> </onexit>
         <transition port="in" event="stop" target="../NotRunning"/>
-        <transition after="1 s" cond="time > 1" target=".">
-          <code> time -= 1; </code>
-          <raise port="out" event="set_time">
-            <param expr="time"/>
-          </raise>
-        </transition>
-        <transition port="in" event="increase_time" target=".">
-          <code> time += 10; </code>
-            <raise port="out" event="set_time">
-              <param expr="time"/>
-            </raise>
-        </transition>
-        <transition after="1 s" cond="time == 1" target="../NotRunning">
-          <code> time -= 1; </code>
-          <raise port="out" event="set_time">
-            <param expr="time"/>
-          </raise>
-        </transition>
+        <state id="Inner">
+          <transition after="1 s" cond="time > 1" target=".">
+            <code> time -= 1; display_time(time); </code>
+          </transition>
+          <transition port="in" event="increase_time" target=".">
+            <code> time += 10; display_time(time); </code>
+          </transition>
+          <transition after="1 s" cond="time == 1" target="/NotRunning">
+            <code> time = 0; display_time(time); </code>
+            <raise port="out" event="bell"/>
+          </transition>
+        </state>
       </state>
       <state id="NotRunning">
         <transition port="in" event="start" target="../Running">
           <code> checkStartTime(); </code>
-          <raise port="out" event="set_time">
-            <param expr="time"/>
-          </raise>
         </transition>
         <transition port="in" event="stop" target=".">
-          <code> time = 0; </code>
-          <raise port="out" event="set_time">
-            <param expr="time"/>
-          </raise>
+          <code> time = 0; display_time(time); </code>
         </transition>
         <transition port="in" event="increase_time" target=".">
-          <code> time += 10; </code>
-            <raise port="out" event="set_time">
-              <param expr="time"/>
-            </raise>
+          <code> time += 10; display_time(time); </code>
         </transition>
       </state>
     </root>