A simple reminder program that can store up to 5 reminders, and has the ability to navigate between different pages through different functions.

Dependencies:   Hexi_KW40Z Hexi_OLED_SSD1351 PWM_Tone_Library

Revision:
0:63db1c7ee975
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/5Pages.h	Wed Apr 19 14:57:15 2017 +0000
@@ -0,0 +1,403 @@
+//------------------------------------------------------------------------------
+//                      PAGES FUNCTION DEFINITIONS
+//------------------------------------------------------------------------------
+
+void TimeSetup() 
+{
+    //Variables
+    int point = 1;  //Points to which digit
+    int valid = 0;  //Exit confirmation
+    int num = 0;    //Temporary number holder
+    int xc = 25;    //Initial cursor's x-position
+    
+    //Screen Setup
+    oled.FillScreen(COLOR_BLACK);
+    
+    strcpy((char *) str, "Set time and date");
+    oled.Label((uint8_t *) str, 0, 0);
+
+    strcpy((char *) str, "HH:MM");
+    oled.Label((uint8_t *) str, 30, 20);
+    
+    strcpy((char *) str, "Hours");
+    oled.Label((uint8_t *) str, 2, 80);
+    
+    strcpy((char *) str, "Mins/OK");
+    oled.Label((uint8_t *) str, 43, 80);
+    
+    while (valid != 1)  //This is a loop for time input
+    {
+        if (butflg == 1)
+        {
+            if (butmem == BUT_RIGHT && point == 1)  //Go right to minutes
+            {
+                hours = num;
+                num = mins;
+                point = 2;
+                xc = 45;
+            }
+            else if (butmem == BUT_RIGHT && point == 2 && valid == 0) //Exit
+            {
+                mins = num;
+                valid = 1;
+            }
+            else if (butmem == BUT_LEFT && point == 2 && valid == 0) //Go left to seconds
+            {
+                mins = num;
+                num = hours;
+                point = 1;
+                xc = 25;
+            }
+            
+            //Increases the number of the hours/minutes using the up or down button
+            if (butmem == BUT_UP && ((point == 1 && num != 23) || (point == 2 && num != 59))) num++;
+            else if (butmem == BUT_DOWN && num != 0) num--;
+            butflg = 0;
+        }
+        
+        //Updates the display
+        sprintf((char *) str, "%d", num);
+        oled.TextBox((uint8_t *) str, xc, 40, 15, 15);
+        Thread::wait(500);
+    }
+    
+    numCount = 0;   //Activate the time flag
+}
+
+void TimeDisplay() 
+{
+    sprintf((char *) str, "%.2d : %.2d", hours, mins);
+    oled.Label((uint8_t *) str, 30, 0);
+}
+
+void MainDisp() 
+{
+    //This is the home screen    
+    strcpy((char *) str, "Delete");
+    oled.Label((uint8_t *) str, 5, 80);
+    
+    strcpy((char *) str, "Add");
+    oled.Label((uint8_t *) str, 60, 80);   
+}
+
+void ReminderList()
+{
+    int m;
+    //For the other two buttons
+    if (nDisp == 5) 
+    {
+        oled.DrawBox(0, 30, 96, 96-30-15, COLOR_BLACK);
+        strcpy((char *) str, "No Data");
+        oled.Label((uint8_t *) str, 10, 45);
+    }
+    else
+    { 
+        if (butmem == BUT_UP)
+        {
+            for (m = nDisp+1; m < 5; m++)
+            {
+                if (remData[m].rExist == 1) 
+                {
+                    nDisp = m;
+                    break;
+                }
+            }
+        }
+        else if (butmem == BUT_DOWN)
+        {
+            for (m = nDisp-1; m >= 0; m--)
+            {
+                if (remData[m].rExist == 1) 
+                {
+                    nDisp = m;
+                    break;
+                }
+            }
+        }
+        
+        //Display the result
+        oled.DrawBox(0, 30, 96, 96-30-15, COLOR_BLACK);
+        oled.Label((uint8_t *) remData[nDisp].rText, 10, 40);
+        sprintf((char *) str, "    %d:%d", remData[nDisp].rHours, remData[nDisp].rMins);
+        oled.Label((uint8_t *) str, 20, 55);
+    }
+}
+
+void AddReminder() 
+{    
+    //Temporary Variable for Input Acknowledgement
+    int inputAck = 0;
+    int xc = 25;
+    int num = 0;
+    int total = 0;
+    
+    //Clear Screen
+    oled.DrawBox(0, 30, 96, 96-30, COLOR_BLACK);
+    
+    //Count how many reminders are in there
+    //For now, limit to 5 data
+    for (num = 0; num < 5; num++) total = total+remData[num].rExist;
+    
+    //Since num is used in the time input code block, clear it
+    num = 0;
+    
+    if (total == 5)   
+    {
+        strcpy((char *) str, "Reminder Full");
+        oled.Label((uint8_t *) str, 10, 45);
+        
+        DelayProg(6);
+    }
+    else    //Here is the main program for AddReminder()
+    {
+        //First we offset to the first entry with rExist = 0;
+        
+        for (rNumber = 0; rNumber < 5; rNumber++)
+        {
+            if (remData[rNumber].rExist == 0) break;
+        }
+        
+        //Then we display whatever we need to display
+        
+        //Display Entry Number
+        sprintf((char *) str, "Entry #%d", rNumber+1);
+        oled.Label((uint8_t *) str, 0, 30);
+        
+        //Text Input---------------------------------------------
+        strcpy((char *) str, "Agenda:");
+        oled.Label((uint8_t *) str, 0, 45);
+                        
+        inputAck = CharInput(60, rNumber);
+        //DelayProg(6);
+        
+        oled.DrawBox(0, 45, 96, 96-45, COLOR_BLACK);
+        
+        if (inputAck == 0)
+        {
+            oled.DrawBox(0, 30, 96, 96-30, COLOR_BLACK);
+            
+            strcpy((char *) str, "Canceled");
+            oled.Label((uint8_t *) str, 0, 45);
+            
+            DelayProg(6);
+            
+            //Break the hell out of this function.
+            goto AddRemExit;
+        }
+        
+        //Else, proceed to time input
+        
+        //Time input----------------------------------------------
+        strcpy((char *) str, "Time(HH:MM):");
+        oled.Label((uint8_t *) str, 0, 30);
+        
+        strcpy((char *) str, "Hours");
+        oled.Label((uint8_t *) str, 2, 80);
+        
+        strcpy((char *) str, "Mins/OK");
+        oled.Label((uint8_t *) str, 43, 80);
+        
+        //Breakdown of the variables
+        //  xc = x-position, as well as the reference of hours or minutes
+        //  inputAck 
+        //  num = temporary variable
+        
+        while (1)  //This is a time input loop for reminders
+        {
+            if (butflg == 1)
+            {
+                if (butmem == BUT_RIGHT && xc == 25)    //Go right to minutes
+                {
+                    remData[rNumber].rHours = num;    //num is recycled from previous functions
+                    num = remData[rNumber].rMins;
+                    xc = 45;
+                }
+                else if (butmem == BUT_LEFT && xc == 25)        //Exit  (Cancelled)
+                {
+                    remData[rNumber].rHours = 0;
+                    remData[rNumber].rMins = 0;
+                    strcpy(remData[rNumber].rText, "         ");
+                    inputAck = 0;
+                    break;      //Don't forget this is the second 'if loop'.
+                }                    
+                else if (butmem == BUT_RIGHT && xc == 45)       //Exit  (Confirmed)
+                {
+                    remData[rNumber].rMins = num;
+                    inputAck = 1;
+                    break;      //Don't forget this is the second 'if loop'.
+                }
+                else if (butmem == BUT_LEFT && xc == 45) //Go left to seconds
+                {
+                    remData[rNumber].rMins = num;
+                    num = remData[rNumber].rHours;
+                    xc = 25;
+                }
+                
+                //Increases the number of the hours/minutes using the up or down button
+                if (butmem == BUT_UP && ((xc == 25 && num != 23) || (xc == 45 && num != 59))) num++;
+                else if (butmem == BUT_DOWN && num != 0) num--;
+                butflg = 0;
+            }
+            
+            if (inputAck == 0) goto AddRemExit;    //And this continues from the Exit (Cancelled)
+            
+            //Updates the display
+            sprintf((char *) str, "%d", num);
+            oled.TextBox((uint8_t *) str, xc, 60, 15, 15);
+        }
+        
+        if (inputAck == 0)
+        {
+            oled.DrawBox(0, 30, 96, 96-30, COLOR_BLACK);
+            strcpy((char *) str, "Canceled");
+            oled.Label((uint8_t *) str, 0, 45);
+            
+            DelayProg(6);
+            
+            //Break the hell out of this function.
+            goto AddRemExit;
+        }
+        
+        //All the details are confirmed ----------------------------------------
+        
+        remData[rNumber].rExist = 1;       
+        
+        oled.DrawBox(0, 30, 96, 96-30, COLOR_BLACK);
+        strcpy((char *) str, "Reminder Added");
+        oled.Label((uint8_t *) str, 0, 45);   
+        
+        DelayProg(6);       
+    } 
+    
+AddRemExit:  
+    
+    //Setup Screen before exiting    
+    oled.DrawBox(0, 30, 96, 96-30, COLOR_BLACK);   
+    MainDisp();
+    
+    //Set this flag to 1 to recalculate the display data
+    fReCalc = 1;
+}
+
+void DelReminder() 
+{
+    int n;
+    int total = 0;
+    
+    //Clear Screen
+    oled.DrawBox(0, 30, 96, 96-30, COLOR_BLACK);
+    
+    //If total is 0, then there is no data to delete, ain't it?
+    for (n = 0; n < 5; n++) total = total+remData[n].rExist;
+    
+    if (total == 0)
+    {
+            strcpy((char *) str, "No Data");
+            oled.Label((uint8_t *) str, 10, 45);
+            
+            DelayProg(6);
+    }
+    else        //Case when there is a Data to delete
+    {
+        //First we must offset to the first existing data
+        for (n = 0; n < 5; n++) 
+        {
+            if (remData[n].rExist != 0) break;
+        }
+        
+        //Then we display whatever we need to display
+                
+        //We enter the navigation
+        
+        butmem = 0;
+        
+        //First thing that it should display
+        
+        sprintf((char *) str, "Entry #%d", n+1);    //Entry Number
+        oled.Label((uint8_t *) str, 0, 30);
+        oled.Label((uint8_t *) remData[n].rText, 0, 45);    //Its text
+        sprintf((char *) str, "%d:%d", remData[n].rHours, remData[n].rMins);     //Its time, for SPARTAAAAAAA
+        
+        while (1)       //NOTE: THIS IS TERRIBLY RISKY, BUT whatever
+        {
+            if (butflg == 1)
+            {
+                //There are two parts in this section
+                
+                //FIRST PART: DO I GO NEXT OR PREVIOUS?
+                if (butmem == BUT_UP)
+                {
+                    //Let's recycle total here. total is used as pointer
+                    //So if there is any data after the value n, we can move up
+                    for (total = n+1; total < 5; total++)
+                    {
+                        if (remData[total].rExist != 0) break;
+                    }
+                    
+                    if (total != 5) n = total;
+                    total = 0;      //For various reasons, reset total
+                }
+                else if (butmem == BUT_DOWN)
+                {
+                    //Let's...you know what I'm gonna talk about
+                    for (total = n-1; total >= 0; total--)
+                    {
+                        if (remData[total].rExist != 0) break;
+                    }
+                    
+                    if (total != -1) n = total;
+                    total = 0;      //For the same reason as above, reset total
+                }
+                
+                //SECOND PART: DO I WANT TO DELETE OR NAH
+                if (butmem == BUT_LEFT) total = 0x11;       //Uh, reasons
+                else if (butmem == BUT_RIGHT) total = 0x27; //Fav Number
+                //*That is why I need to reset total everytime*
+                
+                //THIRD PART(DID YOU NOT EXPECT THE SPANISH INQUISITION?)
+                //Display the stuff
+                
+                oled.DrawBox(0, 30, 96, 96-30, COLOR_BLACK);
+                sprintf((char *) str, "Entry #%d", n+1);    //Entry Number
+                oled.Label((uint8_t *) str, 0, 30);                            
+                oled.Label((uint8_t *) remData[n].rText, 0, 45);
+                sprintf((char *) str, "%d:%d", remData[n].rHours, remData[n].rMins);
+                oled.Label((uint8_t *) str, 0, 60);
+
+                butflg = 0;
+            }
+            
+            //Delete Data and Exit
+            if (total == 0x27)
+            {
+                strcpy(remData[n].rText, "          ");
+                remData[n].rHours = 0;
+                remData[n].rMins = 0;
+                remData[n].rExist = 0;
+                
+                oled.DrawBox(0, 30, 96, 96-30, COLOR_BLACK);
+                oled.DrawBox(0, 30, 96, 96-30, COLOR_BLACK);
+                
+                sprintf((char *) str, "Entry #%d Deleted", n+1);
+                oled.Label((uint8_t *) str, 0, 45);
+                
+                DelayProg(6);
+                
+                break;
+            }
+            //Exit this function
+            else if (total == 0x11) break; 
+                    
+        }//End of While Loop
+  
+    }//End of Else Loop
+    
+    //Setup Screen before exiting
+    oled.DrawBox(0, 30, 96, 96-30, COLOR_BLACK);          
+    MainDisp();
+    
+    //Set this flag to 1 to recalculate the display data
+    fReCalc = 1;
+    
+}//End of GOSH HOW CAN YOU NOT KNOW WHAT END IS THIS?
+    
\ No newline at end of file