First draft to the functional spec

Dependencies:   mbed Grove_LCD_RGB_Backlight DebounceIn

Revision:
2:829038a1352b
Parent:
1:ca7bf48a2f71
Child:
3:07d400d50a96
--- a/main.cpp	Tue Oct 08 16:24:32 2019 +0000
+++ b/main.cpp	Tue Oct 08 21:15:26 2019 +0000
@@ -2,6 +2,7 @@
 #include "mbed.h"
 #include "DebounceIn.h"
  
+#define FOREVER    (1)
  
 #define OUT_OFF    (0)
 #define OUT_ON     (1)
@@ -20,9 +21,9 @@
 //output
 DigitalOut doorInterlock(p6);           //Door interlock
 DigitalOut fanRelay(p7);                //Fan control
-DigitalOut redRelay(p8);                //Red light 
-DigitalOut yellowRelay(p11);            //Yellow light 
-DigitalOut greenRelay(p12);             //Green light 
+DigitalOut redRelay(p8);                //Red light - DOOR OPENED
+DigitalOut yellowRelay(p11);            //Yellow light - WASH IN PROGRESS
+DigitalOut greenRelay(p12);             //Green light - DOOR UNLOCKED, TANK READY
 DigitalOut damperRelay(p13);            //Damper solenoid control
 DigitalOut damperRelayAlt(p16);         //Damper solenoid toggle control                    
 DigitalOut vfd(p17);                    //VFD Start relay
@@ -32,6 +33,8 @@
 bool cancelPending = false;
 bool damperIsOpen;  
 bool simulateMode = false;
+bool doorHasOpened = false;
+bool cycleHasStarted = false;
  
 I2C i2c(p9, p10);
 //Serial pc(USBTX, USBRX);
@@ -87,69 +90,108 @@
     rgbLCD.locate(0,0);
     rgbLCD.print("Starting up...  ");   
     
+    // Setup outputs
     vfd              = OUT_OFF;
-    damperIsOpen = false; // Assert and run the opener once
-    damperRotate(1); //vent opened;
-    if(!simulateMode)
-    {
-        //doorInterlock    = OUT_ON;
-        fanRelay         = OUT_ON;
-    }
+    doorInterlock    = OUT_OFF;
     greenRelay       = OUT_OFF;
     yellowRelay      = OUT_OFF;
     redRelay         = OUT_OFF;
     
-    //start timer for 90sec
-    countDown(90);
+    // Door locked, damper open and fan on - we're assuming it's been sitting for a while
+    // and someone is about to open the door.  Make them close the if open
+    // so we can get venting.
+    // Run the damper open twice to get to a known-good position of full-open
+    damperIsOpen = false;   //Assert and run the opener once
+    damperRotate(1);        //vent may be opened;
+    damperIsOpen = false;   //Assert and run the opener a second time
+    damperRotate(1);        //vent opened;
     
-    /*
-    //check for closed door before running fan
-    while(doorClosed!=IN_ON)
+    // Start the fan whether or not the door is open
+    if(!simulateMode)
+    {
+        fanRelay        = OUT_ON;
+    }
+    else
     {
-       rgbLCD.clear();
-       rgbLCD.locate(0,0);
-       rgbLCD.print("Door is opened  ");
-       wait(.25);
+        fanRelay        = OUT_OFF;
     }
-    */
-  
+    
+    // Wait for the door to close
+    if(doorClosed == IN_OFF)
+    {
+        redRelay    = OUT_ON;
+        rgbLCD.locate(0,0);
+        rgbLCD.print("Close the door  ");
+        
+        while(doorClosed == IN_OFF)
+        {
+            wait(1);
+        }
+    }
+    rgbLCD.locate(0,0);
+    rgbLCD.print("Venting         ");
+    doorInterlock = OUT_ON;    
+    redRelay    = OUT_OFF;
+    yellowRelay = OUT_ON;
+
+    //wait 90sec 
+    countDown(90);    
+
+    // We turn off the fan because we don't know how long until someone is ready to open the door  
     //Tank is ready
     rgbLCD.locate(0,0);
     rgbLCD.print("Tank is ready!  ");
+    yellowRelay      = OUT_OFF;
     greenRelay       = OUT_ON;       //green light on
     doorInterlock    = OUT_OFF;      //interlock unlatched, ready to load material into the tank
-    fanRelay         = OUT_OFF;      //fan off
+    fanRelay         = OUT_OFF;
+    damperRotate(0);                // damper is closed
     
     cancelPending = false;
    
-    while(1)
+    while(FOREVER)
     {    
         if(cancelPending)
         {
             cancelPending = false;
             
             //Display status
+            vfd             = OUT_OFF;  //pump off
             greenRelay      = OUT_OFF;  //green light OFF
             yellowRelay     = OUT_OFF;  //yellow light OFF
             redRelay        = OUT_ON;   //turn red light ON
             rgbLCD.clear();
             rgbLCD.locate(0,0);
             rgbLCD.print("CYCLE STOPPED.  "); 
-            vfd             = OUT_OFF;  //pump off
-            if(doorClosed == IN_ON  && !simulateMode)
+
+            if(doorClosed == IN_ON && !simulateMode)
             {
                 doorInterlock = OUT_ON; //door latched
+                fanRelay    = OUT_ON; //fan on
                 damperRotate(1);    //damper opened
-                fanRelay    = OUT_ON; //fan on
+                //wait 60s, including the 30s damper rotation
+                countDown(30);
+                fanRelay        = OUT_OFF;  //fan stops
+                damperRotate(0);            //damper closed
+            }
+            else if(doorClosed == IN_OFF)
+            {
+                for(int i=0; i<3; i++)
+                {
+                    wait(.5);
+                    redRelay = OUT_OFF;
+                    wait(.5);
+                    redRelay = OUT_ON;    
+                }                
             }
             
-            //wait 60sec 
-            countDown(60);              
+            wait(0.5);
+            redRelay = OUT_OFF;
+            greenRelay = OUT_ON;
             doorInterlock=OUT_OFF;      //door unlatched
-            damperRotate(0);            //damper closed
-            fanRelay        = OUT_OFF;  //fan stops
             rgbLCD.locate(0,0);
             rgbLCD.print("Tank is ready!  ");
+            doorHasOpened = false;
         }
     
         if(doorClosed==IN_ON)    //door closed
@@ -157,19 +199,21 @@
             /*
              *  Get set up for the wash, and wait for the start button
              */ 
-            rgbLCD.locate(0,1);
-            rgbLCD.print("Door closed     ");
             greenRelay      = OUT_ON;       //green light stays on
             yellowRelay     = OUT_OFF;      //yellow light off
             redRelay        = OUT_OFF;      //red light off           
             doorInterlock   = OUT_OFF;      //door unlocked
-            fanRelay        = OUT_OFF;                            
+            fanRelay        = OUT_OFF;       
+            damperRotate(0);                //damper closed
+            rgbLCD.locate(0,1);
+            rgbLCD.print("Door closed     ");
+                                
             while(cycleStartBtt != IN_ON && !(doorClosed == IN_OFF || cancelPending))
             {
                 if(stopBtt == IN_ON)
                 {
                     cancelPending = true;
-                    continue;    
+                    break;    
                 }
                 wait(.25);
             }
@@ -182,19 +226,18 @@
             /*
              * Cycle start button pressed - wash for 2 minutes
              */
+            cycleHasStarted = true;
             rgbLCD.clear();
             rgbLCD.locate(0,0);
             rgbLCD.print("CYCLE STARTED!  ");     
             greenRelay      = OUT_OFF;  //green light off
-            yellowRelay     = OUT_ON;   //yellow light on   
-            fanRelay        = OUT_OFF;  //fan stop                        
-            //damperRotate(0);            //vent already close
-            
+            yellowRelay     = OUT_ON;   //yellow light on                  
             if(!simulateMode)
             {
                 doorInterlock   = OUT_ON;   //door locked
                 vfd             = OUT_ON;   //vfd for pump up to speed
             }
+            doorHasOpened = false;
             countDown(120);             //start timer for 2min
             if(doorClosed == IN_OFF || cancelPending)
             {
@@ -217,57 +260,45 @@
             
             
             /*
-             * Drip dry after washing for 5 minutes
+             * Drip dry and vent after washing for 5 minutes
              */
             rgbLCD.clear();
             rgbLCD.locate(0,0);
-            rgbLCD.print("DRIP DRYING!    ");                
-            countDown(300);
+            rgbLCD.print("DRIP DRYING!    ");         
+            if(!simulateMode)
+            {
+                fanRelay = OUT_ON;          //fan on
+            }       
+            damperRotate(1);            //vent opened
+            countDown(270);             // 5 minutes, including the damper opening
             if(doorClosed == IN_OFF || cancelPending)
             {
                 continue;
-            }
-    
-    
-            /*
-             * Change the air out for 2 minutes
-             */
-            rgbLCD.clear();
-            rgbLCD.locate(0,0);
-            rgbLCD.print("AIR CYCLING!    ");                                 
-            damperRotate(1);            //vent opened
-            if(!simulateMode)
-            {
-                fanRelay = OUT_ON;          //fan on
-            }
-            countDown(120);  
-            if(doorClosed == IN_OFF || cancelPending)
-            {
-                continue;
-            }            
+            }         
             
             
             /*
              * Entire cycle is done, close up and go back to waiting
              */             
-            greenRelay      = OUT_ON;       //green light on
-            yellowRelay     = OUT_OFF;      //yellow light off
-            doorInterlock   = OUT_OFF;      //door unlocked
             fanRelay        = OUT_OFF;      //fan off
-            damperRotate(0);               //vent closed
+            damperRotate(0);                //vent closed
             rgbLCD.clear();
             rgbLCD.locate(0,0);
             rgbLCD.print("Tank is ready!  ");
+            doorInterlock   = OUT_OFF;      //door unlocked
+            greenRelay      = OUT_ON;       //green light on
+            yellowRelay     = OUT_OFF;      //yellow light off
         }
         else                    //door open
         {
+            greenRelay  = OUT_OFF;  //green light OFF
+            yellowRelay = OUT_OFF;
+            redRelay    = OUT_ON;   //turn red light ON
+            fanRelay    = OUT_ON;   //fan on   
+            damperRotate(1);        //damper opened       
             rgbLCD.locate(0,1);
             rgbLCD.print("Door open       ");
-            greenRelay  = OUT_OFF;  //green light OFF
-            redRelay    = OUT_ON;   //turn red light ON
-            yellowRelay = OUT_OFF;
-            damperRotate(1);        //damper opened
-            fanRelay    = OUT_ON;  //fan on                  
+            doorHasOpened = true;        
         }
             
         wait(1);
@@ -351,10 +382,13 @@
     char displayLine1[17];
     char displayLine2[17];
     unsigned int count = 0;
+    bool stopReleased = false;
  
+    damperRelay     = OUT_OFF;      //Damper solenoid control
+    damperRelayAlt  = OUT_OFF;      //Damper solenoid toggle control                    
+    vfd             = OUT_OFF;      //VFD Start relay
     rgbLCD.clear();
     rgbLCD.locate(0,0);
-    //damperRotate(1);
     
     do
     {
@@ -372,15 +406,15 @@
         if(cycleStartBtt == 1)
         {
             strcat(displayLine1, "1 ");
-            if(stopBtt == 0)
-            {
-                fanRelay    = OUT_OFF;
-            }
+            fanRelay    = OUT_OFF;
         }
-        else
+        else // start pressed
         {
             strcat(displayLine1, "0 ");
-            fanRelay    = OUT_ON;
+            if(stopBtt == IN_OFF && doorClosed == IN_OFF)
+            {
+                fanRelay    = OUT_ON;
+            }
         }
     
         
@@ -392,60 +426,54 @@
         else
         {
             strcat(displayLine2, "0 ");
+            stopReleased = true;
             
         }
                
         // Every 2s, change the outputs
-        if((count&7) == 0)
+        if((count&7) == 0) // only do it 1 time out of 8
         {
             doorInterlock   = OUT_OFF;      //Door interlock
-            //fanRelay        = OUT_ON;      //Fan control
             redRelay        = OUT_OFF;      //Red light 
             yellowRelay     = OUT_OFF;      //Yellow light 
             greenRelay      = OUT_OFF;      //Green light 
-            damperRelay     = OUT_OFF;      //Damper solenoid control
-            damperRelayAlt  = OUT_OFF;      //Damper solenoid toggle control                    
-            vfd             = OUT_OFF;      //VFD Start relay
             
-            switch((count>>3)%8)
+            switch((count>>3)%4) // ignore the bottom 3 bits, and then roll over when you've counted to 4
             {
             case 0:
                 doorInterlock   = OUT_ON;      //Door interlock
                 strcat(displayLine2, " Lock   ");
                 break;
             case 1:
-                //fanRelay        = OUT_ON;      //Fan control
-                //strcat(displayLine2, " Fan    ");
-                break;
-            case 2:
                 redRelay        = OUT_ON;      //Red light 
                 strcat(displayLine2, " Red    ");
                 break;
-            case 3:
+            case 2:
                 yellowRelay     = OUT_ON;      //Yellow light 
                 strcat(displayLine2, " Yellow ");
                 break;
-            case 4:
+            case 3:
                 greenRelay      = OUT_ON;      //Green light 
                 strcat(displayLine2, " Green  ");
                 break;
-            case 5:
-                //damperRelayAlt  = OUT_ON;      //Damper solenoid toggle control - closed                 
-                //strcat(displayLine2, " Damper1");
-                //wait(30);
-                break;
-            case 6:
-                //damperRelay     = OUT_ON;      //Damper solenoid control - open                    
-                //strcat(displayLine2, " Damper2");
-                //wait(30);
-                break;
-            case 7:
-                //vfd             = OUT_ON;      //VFD Start relay
-                //strcat(displayLine2, " VFD    ");
-                break;
             }
         }
         
+        // Adjust the damper with start/stop if the door is closed
+        if(cycleStartBtt == IN_ON && stopBtt == IN_OFF && stopReleased == true && doorClosed == IN_ON)
+        {
+            damperRelay = OUT_ON;
+        }
+        else if(stopBtt == IN_ON && cycleStartBtt == IN_OFF && stopReleased == true && doorClosed == IN_ON)
+        {
+            damperRelayAlt = OUT_ON;
+        }
+        else
+        {
+            damperRelay     = OUT_OFF;
+            damperRelayAlt  = OUT_OFF;
+        }
+        
         rgbLCD.locate(0,0);
         rgbLCD.print(displayLine1);
         rgbLCD.locate(0,1);