Release 1.01

Dependents:   mbed_escm2000

EditTimeMenu.cpp

Committer:
foxbrianr
Date:
2020-03-17
Revision:
8:9d4e684d8eb8
Parent:
5:9f4d4f8ffc00

File content as of revision 8:9d4e684d8eb8:


/**************************************************************************
 * @file     EditTimeMenu.cpp
 * @brief    Base class for implementing the Edit Time Menu display
 * @version: V1.0
 * @date:    9/17/2019

 *
 * @note
 * Copyright (C) 2019 E3 Design. All rights reserved.
 *
 * @par
 * E3 Designers LLC is supplying this software for use with Cortex-M3 LPC1768
 * processor based microcontroller for the ESCM 2000 Monitor and Display.  
 *  *
 * @par
 * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
 *
 ******************************************************************************/
#include "mbed.h"
#include "EditTimeMenu.h"
#include "TimeUtilities.h"

/******************************************************************************/
EditTimeMenu::EditTimeMenu(char* id): Menu(id)
{
   
    active_selection = 0;
    row=0;
    column=0;
    
    time_t rawtime;
    struct tm * timeinfo;
    
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );  timeinfo = localtime (&rawtime);
                
    hours = timeinfo->tm_hour;
    mins  = timeinfo->tm_min;
    secs  = timeinfo->tm_sec;
    
    years   = timeinfo->tm_year + 1900;
    months  = timeinfo->tm_mon + 1 ;
    days    = timeinfo->tm_mday;
    
       
}
   

/******************************************************************************/
void EditTimeMenu::init()
{
    active_selection = 0;
    update_needed    = 1;
}


/******************************************************************************/
void EditTimeMenu::display(LCD * lcd) 
{
    char     setTime = 1;
    char     setDate = 1;
    
    char current[40];
    
    time_t rawtime;
    struct tm * timeinfo;
    
    int cur_hours,cur_mins,cur_secs,cur_year,cur_month,cur_day;
    
            
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );  timeinfo = localtime (&rawtime);
    
    cur_hours   = timeinfo->tm_hour;
    cur_mins    = timeinfo->tm_min;
    cur_secs    = timeinfo->tm_sec;
    cur_year    = timeinfo->tm_year+1900;
    cur_month   = timeinfo->tm_mon + 1;
    cur_day     = timeinfo->tm_mday;
    
    
    
    
    if ( update_needed ) 
    {
        lcd->cls();
        
        lcd->locate(0,0);
         lcd->printf("Current Time/Date :");
        
        time ( &rawtime );
        timeinfo = localtime ( &rawtime );  timeinfo = localtime (&rawtime);
        
        if (!active_selection)
        {
            hours   = cur_hours;
            mins    = cur_mins;
            secs    = cur_secs;
            years   = cur_year;
            months  = cur_month;
            days    = cur_day;
            //lcd->setCursorMode (0) ;
        }
        else
        {
            
            // edit mode
            secs  = timeinfo->tm_sec;
            
            if ( hours < 12 ) {
                cur_hours = (hours == 0) ? 12 : hours;
        
            } else  {
                cur_hours = (hours - 12);
            }
        
            lcd->locate(2,0);
            switch(active_selection)
            {
              case 1:  

#if 1
                    if ( hours < 12 ) {
                        cur_hours = (hours == 0) ? 12 : hours;
                        lcd->printf("Set Time (hours)  :  %02dam", cur_hours);

                    } else  {
                        cur_hours = (hours - 12);
                        cur_hours = (cur_hours == 0) ? 12 : cur_hours;
                        
                        lcd->printf("Set Time (hours)  :  %02dpm", cur_hours);
                    }
#else
                    lcd->printf("Set Time (hours)  :  %02d", hours);
#endif
                 break;
              case 2:  
                 lcd->printf("Set Time (min)    :  %02d", mins);
                 break;
              case 3:  
                 lcd->printf("Set Time (sec)    :  %02d", secs);
                 break;
              case 4:  
                 lcd->printf("Set Date (month)  :  %02d", months);
                 break;
              case 5:  
                 lcd->printf("Set Date (day)    :  %02d", days);
                 break;
              case 6:  
                 lcd->printf("Set Date (year)   :  %02d", years);
                 break;
            default:
                break;
            };
        
            lcd->locate(3,0);
            lcd->printf("Updated Time      :");
#if 1

            if ( hours < 12 ) {
        
                cur_hours = (hours == 0) ? 12 : hours;
                cur_hours = (cur_hours == 0) ? 12 : cur_hours;
                lcd->locate(3,20);
                lcd->printf(" %02d:%02d:%02dam %02d/%02d/%02d",
                            cur_hours, mins, secs, months, days, (years%100));
        
            } else  {
        
                cur_hours = (hours - 12);
                cur_hours = (cur_hours == 0) ? 12 : cur_hours;
                lcd->locate(3,20);
                lcd->printf(" %02d:%02d:%02dpm %02d/%02d/%02d",
                            cur_hours, mins, secs, months, days, (years%100));
        
        
            }
#else
            lcd->locate(3,20);
            lcd->printf(" %02d:%02d %02d/%02d/%04d", hours, mins, months, days, years);

#endif    
            
        
        }
        
        update_needed = 0;
    }
    displayCurrentTime(lcd);
    

        
}

/******************************************************************************/
void EditTimeMenu::pressMode()
{   
    // advance thru
    if (active_selection++ >  6 )
    {
        active_selection = 0;  
    }
    
    update_needed = 1;
}
        
/******************************************************************************/
void EditTimeMenu::pressSet()
{
    
    struct tm t;
    
    t.tm_hour = hours;
    t.tm_min  = mins;
    t.tm_sec  = 0;
    
    t.tm_year = years - 1900;
    t.tm_mon  = months - 1;
    t.tm_mday = days;
    
    // set the time
    set_time(mktime(&t));

   
    // go back to normal display
    // ---------------------------------
    active_selection = 0;
    update_needed = 1;
}

/******************************************************************************/
void EditTimeMenu::pressUp()
{    
    switch(active_selection)
    {
        case 1: hours++;break;
        case 2: mins++;break;
        case 3: secs++;break;
        case 4: months++;break;
        case 5: days++;break;
        case 6: years++;break;
        default:break;
        
    }
    if (hours > 23)    hours  = 0;
    if (mins > 60)     mins   = 0;
    if (secs > 60)     secs   = 0;
    if (months > 12)   months  = 1;
    if (days > 31)     days    = 1;
    if (years > 2050) years  =2011;
    
    update_needed = 1;
}
        
/******************************************************************************/
void EditTimeMenu::pressDown()
{
    switch(active_selection)
    {
        case 1: hours--;break;
        case 2: mins--;break;
        case 3: secs--;break;
        case 4: months--;break;
        case 5: days--;break;
        case 6: years--;break;
        default:break;
        
    }
    
    if (hours < 0)    hours  += 23;
    if (mins < 0)     mins   += 60;
    if (secs < 0)     secs   += 60;
    if (months < 1)   months += 12;
    if (days < 1)     days   += 31;
    if (years < 2011) years  =2050;
        
    update_needed = 1;   
}
/******************************************************************************/