summaryrefslogtreecommitdiff
path: root/boards/dk-tm4c129x/hibernate/hibernate.c
diff options
context:
space:
mode:
authorYuval Adam <yuv.adm@gmail.com>2014-06-29 12:34:32 +0300
committerYuval Adam <yuv.adm@gmail.com>2014-06-29 12:34:32 +0300
commitc3e4c9a25c2910d2d66d52215b3406b13d5b23d5 (patch)
treeadded370d1e356901f8579f076e3263fb0464db7 /boards/dk-tm4c129x/hibernate/hibernate.c
parent990090a4cc9070837d31e66b58d40f0c3d038741 (diff)
Add more board models
Diffstat (limited to 'boards/dk-tm4c129x/hibernate/hibernate.c')
-rw-r--r--boards/dk-tm4c129x/hibernate/hibernate.c1568
1 files changed, 1568 insertions, 0 deletions
diff --git a/boards/dk-tm4c129x/hibernate/hibernate.c b/boards/dk-tm4c129x/hibernate/hibernate.c
new file mode 100644
index 0000000..0062fd3
--- /dev/null
+++ b/boards/dk-tm4c129x/hibernate/hibernate.c
@@ -0,0 +1,1568 @@
+//*****************************************************************************
+//
+// hibernate.c - Hibernation Example.
+//
+// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// 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. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package.
+//
+//*****************************************************************************
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+#include <time.h>
+#include "inc/hw_gpio.h"
+#include "inc/hw_hibernate.h"
+#include "inc/hw_ints.h"
+#include "inc/hw_memmap.h"
+#include "inc/hw_sysctl.h"
+#include "inc/hw_types.h"
+#include "driverlib/debug.h"
+#include "driverlib/gpio.h"
+#include "driverlib/hibernate.h"
+#include "driverlib/interrupt.h"
+#include "driverlib/pin_map.h"
+#include "driverlib/rom.h"
+#include "driverlib/rom_map.h"
+#include "driverlib/sysctl.h"
+#include "driverlib/uart.h"
+#include "grlib/grlib.h"
+#include "grlib/widget.h"
+#include "grlib/canvas.h"
+#include "grlib/pushbutton.h"
+#include "drivers/frame.h"
+#include "drivers/kentec320x240x16_ssd2119.h"
+#include "drivers/pinout.h"
+#include "drivers/touch.h"
+#include "utils/ustdlib.h"
+
+//*****************************************************************************
+//
+//! \addtogroup example_list
+//! <h1>Hibernate Example (hibernate)</h1>
+//!
+//! An example to demonstrate the use of the Hibernation module. The user
+//! can put the microcontroller in hibernation by touching the display. The
+//! microcontroller will then wake on its own after 5 seconds, or immediately
+//! if the user presses the RESET button. External WAKE pin and GPIO (PK5)
+//! wake sources can also be used to wake immediately from hibernation. The
+//! following wiring enables the use of these pins as wake sources.
+//! WAKE on J27 to SEL on J37
+//! PK5 on J28 to UP on J37
+//!
+//! The program keeps a count of the number of times it has entered
+//! hibernation. The value of the counter is stored in the battery backed
+//! memory of the Hibernation module so that it can be retrieved when the
+//! microcontroller wakes. The program displays the wall time and date by
+//! making use of the calendar function of the Hibernate module. User can
+//! modify the date and time if so desired.
+//
+//*****************************************************************************
+
+//*****************************************************************************
+//
+// A collection of wake sources that will be displayed to indicate the source
+// of the most recent wake.
+//
+//*****************************************************************************
+static char *g_ppcWakeSource[] =
+{
+ "RTC TIMEOUT",
+ "RESET",
+ "WAKE PIN",
+ "GPIO WAKE",
+ "SYSTEM RESET"
+};
+
+//*****************************************************************************
+//
+// Lookup table to convert numerical value of a month into text.
+//
+//*****************************************************************************
+static char *g_ppcMonth[12] =
+{
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+};
+
+//*****************************************************************************
+//
+// Flag to indicate that main screen is active so that main screen buffers can
+// be updated and widgets redrawn.
+//
+//*****************************************************************************
+bool g_bMainScreen;
+
+//*****************************************************************************
+//
+// Flag that informs that the user has requested hibernation.
+//
+//*****************************************************************************
+volatile bool g_bHibernate;
+
+//*****************************************************************************
+//
+// Flag that informs that date and time have to be set.
+//
+//*****************************************************************************
+volatile bool g_bSetDate;
+
+//*****************************************************************************
+//
+// Buffers to store widget display information.
+//
+//*****************************************************************************
+char g_pcWakeBuf[40], g_pcHibBuf[40], g_pcDateTimeBuf[40];
+char g_pcInfoBuf0[40], g_pcInfoBuf1[40], g_pcInfoBuf2[40], g_pcInfoBuf3[40];
+char g_pcMonBuf[4], g_pcDayBuf[3], g_pcYearBuf[5];
+char g_pcHourBuf[3], g_pcMinBuf[3], g_pcAMPMBuf[3];
+
+//*****************************************************************************
+//
+// Variables that keep track of the date and time across different screens.
+//
+//*****************************************************************************
+uint32_t g_ui32MonthIdx, g_ui32DayIdx, g_ui32YearIdx;
+uint32_t g_ui32HourIdx, g_ui32MinIdx;
+
+//*****************************************************************************
+//
+// Forward reference for widget structures.
+//
+//*****************************************************************************
+extern tCanvasWidget g_sMainScreen;
+extern tCanvasWidget g_sWakeInfo, g_sHibCount, g_sDateTime;
+extern tPushButtonWidget g_sInfoStrBtn;
+extern tCanvasWidget g_sInfoStr1, g_sInfoStr2, g_sInfoStr3;
+extern tPushButtonWidget g_sDateTimeSetBtn;
+extern tCanvasWidget g_sDateScreen;
+extern tCanvasWidget g_sMonText;
+extern tPushButtonWidget g_sMonUpBtn, g_sMonDwnBtn;
+extern tCanvasWidget g_sDayText;
+extern tPushButtonWidget g_sDayUpBtn, g_sDayDwnBtn;
+extern tCanvasWidget g_sYearText;
+extern tPushButtonWidget g_sYearUpBtn, g_sYearDwnBtn;
+extern tPushButtonWidget g_sDateNextBtn;
+extern tCanvasWidget g_sTimeScreen;
+extern tCanvasWidget g_sHourText;
+extern tPushButtonWidget g_sHourUpBtn, g_sHourDwnBtn;
+extern tCanvasWidget g_sMinText;
+extern tPushButtonWidget g_sMinUpBtn, g_sMinDwnBtn;
+extern tCanvasWidget g_sAMPMText;
+extern tPushButtonWidget g_sAMPMUpBtn, g_sAMPMDwnBtn;
+extern tPushButtonWidget g_sTimeDoneBtn;
+
+//*****************************************************************************
+//
+// Forward reference of functions that are called on a button press.
+//
+//*****************************************************************************
+void OnInfoStrBtnPress(tWidget *psWidget);
+void OnDateTimeSetBtnPress(tWidget *psWidget);
+void OnMonUpBtnPress(tWidget *psWidget);
+void OnMonDwnBtnPress(tWidget *psWidget);
+void OnDayUpBtnPress(tWidget *psWidget);
+void OnDayDwnBtnPress(tWidget *psWidget);
+void OnYearUpBtnPress(tWidget *psWidget);
+void OnYearDwnBtnPress(tWidget *psWidget);
+void OnDateNextBtnPress(tWidget *psWidget);
+void OnHourUpBtnPress(tWidget *psWidget);
+void OnHourDwnBtnPress(tWidget *psWidget);
+void OnMinUpBtnPress(tWidget *psWidget);
+void OnMinDwnBtnPress(tWidget *psWidget);
+void OnAMPMBtnPress(tWidget *psWidget);
+void OnTimeDoneBtnPress(tWidget *psWidget);
+
+//*****************************************************************************
+//
+// The graphics library structures for the Main screen.
+//
+//*****************************************************************************
+RectangularButton(g_sDateTimeSetBtn, &g_sMainScreen, 0, 0,
+ &g_sKentec320x240x16_SSD2119, (319 - 9 - 95), 34, 95, 45,
+ (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE |
+ PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite,
+ g_psFontCm16, "DATE/TIME", 0, 0, 0, 0,
+ OnDateTimeSetBtnPress);
+Canvas(g_sDateTime, &g_sMainScreen, &g_sDateTimeSetBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 9, 50, (310 - 9 - 100), 17,
+ (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, 0, ClrWhite,
+ g_psFontCm16, g_pcDateTimeBuf, 0, 0);
+Canvas(g_sWakeInfo, &g_sMainScreen, &g_sDateTime, 0,
+ &g_sKentec320x240x16_SSD2119, 9, 100, (310 - 9), 17, CANVAS_STYLE_TEXT,
+ ClrBlack, 0, ClrWhite, g_psFontCm16, g_pcWakeBuf, 0, 0);
+Canvas(g_sHibCount, &g_sMainScreen, &g_sWakeInfo, 0,
+ &g_sKentec320x240x16_SSD2119, 9, 120, (310 - 9), 17, CANVAS_STYLE_TEXT,
+ ClrBlack, 0, ClrWhite, g_psFontCm16, g_pcHibBuf, 0, 0);
+RectangularButton(g_sInfoStrBtn, &g_sMainScreen, &g_sHibCount, 0,
+ &g_sKentec320x240x16_SSD2119, 9, 150, (310 - 9), 25,
+ (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE |
+ PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite,
+ g_psFontCm16, g_pcInfoBuf0, 0, 0, 0, 0, OnInfoStrBtnPress);
+Canvas(g_sInfoStr1, &g_sMainScreen, &g_sInfoStrBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 9, 175, (310 - 9), 17,
+ (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, 0, ClrWhite,
+ g_psFontCm16, g_pcInfoBuf1, 0, 0);
+Canvas(g_sInfoStr2, &g_sMainScreen, &g_sInfoStr1, 0,
+ &g_sKentec320x240x16_SSD2119, 9, 192, (310 - 9), 17,
+ (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, 0, ClrWhite,
+ g_psFontCm16, g_pcInfoBuf2, 0, 0);
+Canvas(g_sInfoStr3, &g_sMainScreen, &g_sInfoStr2, 0,
+ &g_sKentec320x240x16_SSD2119, 9, 209, (310 - 9), 17,
+ (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, 0, ClrWhite,
+ g_psFontCm16, g_pcInfoBuf3, 0, 0);
+Canvas(g_sMainScreen, WIDGET_ROOT, 0, &g_sInfoStr3,
+ &g_sKentec320x240x16_SSD2119, 9, 25, (310 - 9), (230 - 25),
+ CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0);
+
+//*****************************************************************************
+//
+// The graphics library structures for the Date screen.
+//
+//*****************************************************************************
+RectangularButton(g_sDateNextBtn, &g_sDateScreen, 0, 0,
+ &g_sKentec320x240x16_SSD2119, 240, 190, 60, 30,
+ (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE |
+ PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite,
+ g_psFontCm16, "NEXT", 0, 0, 0, 0, OnDateNextBtnPress);
+CircularButton(g_sYearDwnBtn, &g_sDateScreen, &g_sDateNextBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 260, 90, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT),
+ ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100,
+ 10, OnYearDwnBtnPress);
+CircularButton(g_sYearUpBtn, &g_sDateScreen, &g_sYearDwnBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 260, 153, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT),
+ ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100,
+ 10, OnYearUpBtnPress);
+Canvas(g_sYearText, &g_sDateScreen, &g_sYearUpBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 230, 110, 60, 25, (CANVAS_STYLE_OUTLINE |
+ CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite,
+ g_psFontCm16, g_pcYearBuf, 0, 0);
+CircularButton(g_sDayDwnBtn, &g_sDateScreen, &g_sYearText, 0,
+ &g_sKentec320x240x16_SSD2119, 160, 90, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT),
+ ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100,
+ 10, OnDayDwnBtnPress);
+CircularButton(g_sDayUpBtn, &g_sDateScreen, &g_sDayDwnBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 160, 153, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT),
+ ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100,
+ 10, OnDayUpBtnPress);
+Canvas(g_sDayText, &g_sDateScreen, &g_sDayUpBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 130, 110, 60, 25, (CANVAS_STYLE_OUTLINE |
+ CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite,
+ g_psFontCm16, g_pcDayBuf, 0, 0);
+CircularButton(g_sMonDwnBtn, &g_sDateScreen, &g_sDayText, 0,
+ &g_sKentec320x240x16_SSD2119, 60, 90, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT),
+ ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100,
+ 20, OnMonDwnBtnPress);
+CircularButton(g_sMonUpBtn, &g_sDateScreen, &g_sMonDwnBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 60, 153, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT),
+ ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100,
+ 20, OnMonUpBtnPress);
+Canvas(g_sMonText, &g_sDateScreen, &g_sMonUpBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 30, 110, 60, 25, (CANVAS_STYLE_OUTLINE |
+ CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite,
+ g_psFontCm16, g_pcMonBuf, 0, 0);
+Canvas(g_sDateScreen, WIDGET_ROOT, 0, &g_sMonText,
+ &g_sKentec320x240x16_SSD2119, 9, 25, (310 - 9), (230 - 25),
+ CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0);
+
+//*****************************************************************************
+//
+// The graphics library structures for the Time screen.
+//
+//*****************************************************************************
+RectangularButton(g_sTimeDoneBtn, &g_sTimeScreen, 0, 0,
+ &g_sKentec320x240x16_SSD2119, 240, 190, 60, 30,
+ (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE |
+ PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite,
+ g_psFontCm16, "DONE", 0, 0, 0, 0, OnTimeDoneBtnPress);
+CircularButton(g_sAMPMDwnBtn, &g_sTimeScreen, &g_sTimeDoneBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 260, 90, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0,
+ ClrWhite, g_psFontCm20, "+", 0, 0, 0, 0, OnAMPMBtnPress);
+CircularButton(g_sAMPMUpBtn, &g_sTimeScreen, &g_sAMPMDwnBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 260, 153, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0,
+ ClrWhite, g_psFontCm20, "-", 0, 0, 0, 0, OnAMPMBtnPress);
+Canvas(g_sAMPMText, &g_sTimeScreen, &g_sAMPMUpBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 230, 110, 60, 25, (CANVAS_STYLE_OUTLINE |
+ CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite,
+ g_psFontCm16, g_pcAMPMBuf, 0, 0);
+CircularButton(g_sMinDwnBtn, &g_sTimeScreen, &g_sAMPMText, 0,
+ &g_sKentec320x240x16_SSD2119, 160, 90, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT),
+ ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100,
+ 10, OnMinDwnBtnPress);
+CircularButton(g_sMinUpBtn, &g_sTimeScreen, &g_sMinDwnBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 160, 153, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT),
+ ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100,
+ 10, OnMinUpBtnPress);
+Canvas(g_sMinText, &g_sTimeScreen, &g_sMinUpBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 130, 110, 60, 25, (CANVAS_STYLE_OUTLINE |
+ CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite,
+ g_psFontCm16, g_pcMinBuf, 0, 0);
+CircularButton(g_sHourDwnBtn, &g_sTimeScreen, &g_sMinText, 0,
+ &g_sKentec320x240x16_SSD2119, 60, 90, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT),
+ ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100,
+ 20, OnHourDwnBtnPress);
+CircularButton(g_sHourUpBtn, &g_sTimeScreen, &g_sHourDwnBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 60, 153, 15, (PB_STYLE_TEXT |
+ PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT),
+ ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100,
+ 20, OnHourUpBtnPress);
+Canvas(g_sHourText, &g_sTimeScreen, &g_sHourUpBtn, 0,
+ &g_sKentec320x240x16_SSD2119, 30, 110, 60, 25, (CANVAS_STYLE_OUTLINE |
+ CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite,
+ g_psFontCm16, g_pcHourBuf, 0, 0);
+Canvas(g_sTimeScreen, WIDGET_ROOT, 0, &g_sHourText,
+ &g_sKentec320x240x16_SSD2119, 9, 25, (310 - 9), (230 - 25),
+ CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0);
+
+//*****************************************************************************
+//
+// The error routine that is called if the driver library encounters an error.
+//
+//*****************************************************************************
+#ifdef DEBUG
+void
+__error__(char *pcFilename, uint32_t ui32Line)
+{
+}
+#endif
+
+//*****************************************************************************
+//
+// This function reads the current date and time from the calendar logic of the
+// hibernate module. Return status indicates the validity of the data read.
+// If the received data is valid, the 24-hour time format is converted to
+// 12-hour format.
+//
+//*****************************************************************************
+bool
+DateTimeGet(struct tm *sTime, char *pcAMPM)
+{
+ //
+ // Get the latest time.
+ //
+ HibernateCalendarGet(sTime);
+
+ //
+ // Is valid data read?
+ //
+ if(((sTime->tm_sec < 0) || (sTime->tm_sec > 59)) ||
+ ((sTime->tm_min < 0) || (sTime->tm_min > 59)) ||
+ ((sTime->tm_hour < 0) || (sTime->tm_hour > 23)) ||
+ ((sTime->tm_mday < 1) || (sTime->tm_mday > 31)) ||
+ ((sTime->tm_mon < 0) || (sTime->tm_mon > 11)) ||
+ ((sTime->tm_year < 100) || (sTime->tm_year > 199)))
+ {
+ //
+ // No - Let the application know the same by returning relevant
+ // message.
+ //
+ return false;
+ }
+
+ //
+ // Set AM as default.
+ //
+ strcpy(pcAMPM, "AM");
+
+ //
+ // Convert 24-hour format into 12-hour format with AM/PM indication.
+ //
+ if(sTime->tm_hour == 0)
+ {
+ sTime->tm_hour = 12;
+ strcpy(pcAMPM, "AM");
+ }
+ else if(sTime->tm_hour == 12)
+ {
+ strcpy(pcAMPM, "PM");
+ }
+ else if(sTime->tm_hour > 12)
+ {
+ sTime->tm_hour -= 12;
+ strcpy(pcAMPM, "PM");
+ }
+
+ //
+ // Return that new data is available so that it can be displayed.
+ //
+ return true;
+}
+
+//*****************************************************************************
+//
+// This function formats valid new date and time to be displayed on the home
+// screen in the format "MMM DD, YYYY HH : MM : SS AM/PM". Example of this
+// format is Aug 01, 2013 08:15:30 AM. It also indicates if valid new data
+// is available or not. If date and time is invalid, this function sets the
+// date and time to default value.
+//
+//*****************************************************************************
+bool
+DateTimeDisplayGet(char *pcBuf, uint32_t ui32BufSize)
+{
+ static uint32_t ui32SecondsPrev = 0xFF;
+ struct tm sTime;
+ char pcAMPM[3];
+ uint32_t ui32Len;
+
+ //
+ // Get the latest date and time and check the validity.
+ //
+ if(DateTimeGet(&sTime, pcAMPM) == false)
+ {
+ //
+ // Invalid - Force set the date and time to default values and return
+ // false to indicate no information to display.
+ //
+ g_bSetDate = true;
+ return false;
+ }
+
+ //
+ // If date and time is valid, check if seconds have updated from previous
+ // visit.
+ //
+ if(ui32SecondsPrev == sTime.tm_sec)
+ {
+ //
+ // No - Return false to indicate no information to display.
+ //
+ return false;
+ }
+
+ //
+ // If valid new date and time is available, update a local variable to keep
+ // track of seconds to determine new data for next visit.
+ //
+ ui32SecondsPrev = sTime.tm_sec;
+
+ //
+ // Format the date and time into a user readable format.
+ //
+ ui32Len = usnprintf(pcBuf, ui32BufSize, "%s %02u, 20%02u ",
+ g_ppcMonth[sTime.tm_mon], sTime.tm_mday,
+ sTime.tm_year - 100);
+ usnprintf(&pcBuf[ui32Len], ui32BufSize - ui32Len, "%02u : %02u : %02u %s",
+ sTime.tm_hour, sTime.tm_min, sTime.tm_sec, pcAMPM);
+
+ //
+ // Return true to indicate new information to display.
+ //
+ return true;
+}
+
+//*****************************************************************************
+//
+// This function updates individual buffers with valid date and time to be
+// displayed on the date screen so that the date and time can be updated.
+//
+//*****************************************************************************
+bool
+DateTimeUpdateGet(char *pcMon, char *pcDay, char *pcYear, char *pcHour,
+ char *pcMin, char *pcAMPM)
+{
+ struct tm sTime;
+
+ //
+ // Get the latest date and time and check the validity.
+ //
+ if(DateTimeGet(&sTime, pcAMPM) == false)
+ {
+ //
+ // Invalid - Return here with false as no information to update. So
+ // use default values.
+ //
+ return false;
+ }
+
+ //
+ // If date and time is valid, copy the date and time values into respective
+ // indexes.
+ //
+ g_ui32MonthIdx = sTime.tm_mon;
+ g_ui32DayIdx = sTime.tm_mday;
+ g_ui32YearIdx = sTime.tm_year - 100;
+ g_ui32HourIdx = sTime.tm_hour;
+ g_ui32MinIdx = sTime.tm_min;
+
+ //
+ // Convert the date and time into string format and copy into supplied
+ // buffers.
+ //
+ usnprintf(pcMon, 4, "%s", g_ppcMonth[g_ui32MonthIdx]);
+ usnprintf(pcDay, 3, "%u", g_ui32DayIdx);
+ usnprintf(pcYear, 5, "20%02u", g_ui32YearIdx);
+ usnprintf(pcHour, 3, "%u", g_ui32HourIdx);
+ usnprintf(pcMin, 3, "%02u", g_ui32MinIdx);
+
+ //
+ // Return true to indicate new information has been updated.
+ //
+ return true;
+}
+
+//*****************************************************************************
+//
+// This function writes the requested date and time to the calendar logic of
+// hibernation module.
+//
+//*****************************************************************************
+void
+DateTimeSet(void)
+{
+ struct tm sTime;
+
+ //
+ // Get the latest date and time. This is done here so that unchanged
+ // parts of date and time can be written back as is.
+ //
+ HibernateCalendarGet(&sTime);
+
+ //
+ // Set the date and time values that are to be updated.
+ //
+ sTime.tm_hour = g_ui32HourIdx;
+ sTime.tm_min = g_ui32MinIdx;
+ sTime.tm_mon = g_ui32MonthIdx;
+ sTime.tm_mday = g_ui32DayIdx;
+ sTime.tm_year = 100 + g_ui32YearIdx;
+
+ //
+ // Convert 12-hour format into 24-hour format.
+ //
+ if(strcmp(g_pcAMPMBuf, "PM") == 0)
+ {
+ if(sTime.tm_hour < 12)
+ {
+ sTime.tm_hour += 12;
+ }
+ }
+ else
+ {
+ if(sTime.tm_hour > 11)
+ {
+ sTime.tm_hour -= 12;
+ }
+ }
+
+ //
+ // Update the calendar logic of hibernation module with the requested data.
+ //
+ HibernateCalendarSet(&sTime);
+}
+
+//*****************************************************************************
+//
+// This function returns the number of days in a month including for a leap
+// year.
+//
+//*****************************************************************************
+uint32_t
+GetDaysInMonth(uint32_t ui32Year, uint32_t ui32Mon)
+{
+ //
+ // Return the number of days based on the month.
+ //
+ if(ui32Mon == 1)
+ {
+ //
+ // For February return the number of days based on the year being a
+ // leap year or not.
+ //
+ if((ui32Year % 4) == 0)
+ {
+ //
+ // If leap year return 29.
+ //
+ return 29;
+ }
+ else
+ {
+ //
+ // If not leap year return 28.
+ //
+ return 28;
+ }
+ }
+ else if((ui32Mon == 3) || (ui32Mon == 5) || (ui32Mon == 8) ||
+ (ui32Mon == 10))
+ {
+ //
+ // For April, June, September and November return 30.
+ //
+ return 30;
+ }
+
+ //
+ // For all the other months return 31.
+ //
+ return 31;
+}
+
+//*****************************************************************************
+//
+// This function returns the date and time value that is written to the
+// calendar match register. 5 seconds are added to the current time. Any
+// side-effects due to this addition are handled here.
+//
+//*****************************************************************************
+void
+GetCalendarMatchValue(struct tm* sTime)
+{
+ uint32_t ui32MonthDays;
+
+ //
+ // Get the current date and time and add 5 secs to it.
+ //
+ HibernateCalendarGet(sTime);
+ sTime->tm_sec += 5;
+
+ //
+ // Check if seconds is out of bounds. If so subtract seconds by 60 and
+ // increment minutes.
+ //
+ if(sTime->tm_sec > 59)
+ {
+ sTime->tm_sec -= 60;
+ sTime->tm_min++;
+ }
+
+ //
+ // Check if minutes is out of bounds. If so subtract minutes by 60 and
+ // increment hours.
+ //
+ if(sTime->tm_min > 59)
+ {
+ sTime->tm_min -= 60;
+ sTime->tm_hour++;
+ }
+
+ //
+ // Check if hours is out of bounds. If so subtract minutes by 24 and
+ // increment days.
+ //
+ if(sTime->tm_hour > 23)
+ {
+ sTime->tm_hour -= 24;
+ sTime->tm_mday++;
+ }
+
+ //
+ // Since different months have varying number of days, get the number of
+ // days for the current month and year.
+ //
+ ui32MonthDays = GetDaysInMonth(sTime->tm_year, sTime->tm_mon);
+
+ //
+ // Check if days is out of bounds for the current month and year. If so
+ // subtract days by the number of days in the current month and increment
+ // months.
+ //
+ if(sTime->tm_mday > ui32MonthDays)
+ {
+ sTime->tm_mday -= ui32MonthDays;
+ sTime->tm_mon++;
+ }
+
+ //
+ // Check if months is out of bounds. If so subtract months by 11 and
+ // increment years.
+ //
+ if(sTime->tm_mon > 11)
+ {
+ sTime->tm_mon -= 11;
+ sTime->tm_year++;
+ }
+
+ //
+ // Check if years is out of bounds. If so subtract years by 100.
+ //
+ if(sTime->tm_year > 99)
+ {
+ sTime->tm_year -= 100;
+ }
+}
+//*****************************************************************************
+//
+// Handle the Info String button press on Main Screen.
+//
+//*****************************************************************************
+void
+OnInfoStrBtnPress(tWidget *psWidget)
+{
+ //
+ // If this button is pressed then user wants to enter hibernation. So
+ // set the respective flag.
+ //
+ g_bHibernate = true;
+}
+
+//*****************************************************************************
+//
+// Handle the "Date/Time" button press on Main Screen.
+//
+//*****************************************************************************
+void
+OnDateTimeSetBtnPress(tWidget *psWidget)
+{
+ //
+ // Update the date and time screen buffers before painting the screens.
+ // Even though only buffers used with the date screen are needed at this
+ // time, we update both to save few cycles.
+ //
+ DateTimeUpdateGet(g_pcMonBuf, g_pcDayBuf, g_pcYearBuf, g_pcHourBuf,
+ g_pcMinBuf, g_pcAMPMBuf);
+
+ //
+ // Remove the main screen from the root.
+ //
+ WidgetRemove((tWidget *)&g_sMainScreen);
+
+ //
+ // Add the date screen to the root.
+ //
+ WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sDateScreen);
+
+ //
+ // Add the widget tree to message queue so that it can be drawn on the
+ // display.
+ //
+ WidgetPaint(WIDGET_ROOT);
+
+ //
+ // Set the flag to indicate that the main screen is not active.
+ //
+ g_bMainScreen = false;
+}
+
+//*****************************************************************************
+//
+// Handle the Month "-" button press on Date Screen.
+//
+//*****************************************************************************
+void
+OnMonUpBtnPress(tWidget *psWidget)
+{
+ uint32_t ui32DaysInMonth;
+
+ //
+ // User wants to decrement the month. So reduce index by one such that the
+ // index cycles back to the bottom of the list if it is at the top.
+ //
+ g_ui32MonthIdx = (g_ui32MonthIdx == 0) ? 11 : g_ui32MonthIdx - 1;
+
+ //
+ // Store the index in a buffer as a string and add the widget to the
+ // message queue so that it can be redrawn.
+ //
+ strcpy(g_pcMonBuf, g_ppcMonth[g_ui32MonthIdx]);
+ WidgetPaint(&g_sMonText.sBase);
+
+ //
+ // Makes sure that the day value does not exceed the number of days for the
+ // selected month.
+ //
+ ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx);
+ g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth :
+ g_ui32DayIdx;
+
+ //
+ // Since the day value might also have been modified, store the day index
+ // in a buffer as a string and add the widget to the message queue so that
+ // it can be redrawn.
+ //
+ usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx);
+ WidgetPaint(&g_sDayText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the Month "+" button press on Date Screen.
+//
+//*****************************************************************************
+void
+OnMonDwnBtnPress(tWidget *psWidget)
+{
+ uint32_t ui32DaysInMonth;
+
+ //
+ // User wants to increment the month. So increment index by one such that
+ // the index cycles back to the top of the list if it is at the bottom.
+ //
+ g_ui32MonthIdx = (g_ui32MonthIdx == 11) ? 0 : g_ui32MonthIdx + 1;
+
+ //
+ // Store the index in a buffer as a string and add the widget to the
+ // message queue so that it can be redrawn.
+ //
+ strcpy(g_pcMonBuf, g_ppcMonth[g_ui32MonthIdx]);
+ WidgetPaint(&g_sMonText.sBase);
+
+ //
+ // Makes sure that the day value does not exceed the number of days for the
+ // selected month.
+ //
+ ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx);
+ g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth :
+ g_ui32DayIdx;
+
+ //
+ // Since the day value might also have been modified, store the day index
+ // in a buffer as a string and add the widget to the message queue so that
+ // it can be redrawn.
+ //
+ usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx);
+ WidgetPaint(&g_sDayText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the Day "-" button press on Date Screen.
+//
+//*****************************************************************************
+void
+OnDayUpBtnPress(tWidget *psWidget)
+{
+ uint32_t ui32DaysInMonth;
+
+ //
+ // User wants to decrement the day. So reduce index by one such that the
+ // index cycles back to the bottom of the list if it is at the top. Make
+ // sure that the day index is adjusted based on the number of days in a
+ // month.
+ //
+ ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx);
+ g_ui32DayIdx = (g_ui32DayIdx < 2) ? ui32DaysInMonth : g_ui32DayIdx - 1;
+
+ //
+ // Store the index in a buffer as a string and add the widget to the
+ // message queue so that it can be redrawn.
+ //
+ usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx);
+ WidgetPaint(&g_sDayText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the Day "+" button press on Date Screen.
+//
+//*****************************************************************************
+void
+OnDayDwnBtnPress(tWidget *psWidget)
+{
+ uint32_t ui32DaysInMonth;
+
+ //
+ // User wants to increment the day. So increment index by one such that
+ // the index cycles back to the top of the list if it is at the bottom.
+ // Make sure that the day index does not exceed the number of days for the
+ // selected month.
+ //
+ ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx);
+ g_ui32DayIdx = (g_ui32DayIdx > (ui32DaysInMonth - 1)) ? 1 :
+ (g_ui32DayIdx + 1);
+
+ //
+ // Store the index in a buffer as a string and add the widget to the
+ // message queue so that it can be redrawn.
+ //
+ usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx);
+ WidgetPaint(&g_sDayText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the Year "-" button press on Date Screen.
+//
+//*****************************************************************************
+void
+OnYearUpBtnPress(tWidget *psWidget)
+{
+ uint32_t ui32DaysInMonth;
+
+ //
+ // User wants to decrement the year. So reduce index by one such that the
+ // index cycles back to the bottom of the list if it is at the top.
+ //
+ g_ui32YearIdx = (g_ui32YearIdx == 0) ? 99 : g_ui32YearIdx - 1;
+
+ //
+ // Store the index in a buffer as a string and add the widget to the
+ // message queue so that it can be redrawn.
+ //
+ usnprintf(g_pcYearBuf, sizeof(g_pcYearBuf), "20%02u", g_ui32YearIdx);
+ WidgetPaint(&g_sYearText.sBase);
+
+ //
+ // Makes sure that the day value does not exceed the number of days for the
+ // selected month.
+ //
+ ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx);
+ g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth :
+ g_ui32DayIdx;
+
+ //
+ // Since the day value might also have been modified, store the day index
+ // in a buffer as a string and add the widget to the message queue so that
+ // it can be redrawn.
+ //
+ usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx);
+ WidgetPaint(&g_sDayText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the Year "+" button press on Date Screen.
+//
+//*****************************************************************************
+void
+OnYearDwnBtnPress(tWidget *psWidget)
+{
+ uint32_t ui32DaysInMonth;
+
+ //
+ // User wants to increment the year. So increment index by one such that
+ // the index cycles back to the top of the list if it is at the bottom.
+ //
+ g_ui32YearIdx = (g_ui32YearIdx == 99) ? 0 : g_ui32YearIdx + 1;
+
+ //
+ // Store the index in a buffer as a string and add the widget to the
+ // message queue so that it can be redrawn.
+ //
+ usnprintf(g_pcYearBuf, sizeof(g_pcYearBuf), "20%02u", g_ui32YearIdx);
+ WidgetPaint(&g_sYearText.sBase);
+
+ //
+ // Makes sure that the day value does not exceed the number of days for the
+ // selected month.
+ //
+ ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx);
+ g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth :
+ g_ui32DayIdx;
+
+ //
+ // Since the day value might also have been modified, store the day index
+ // in a buffer as a string and add the widget to the message queue so that
+ // it can be redrawn.
+ //
+ usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx);
+ WidgetPaint(&g_sDayText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the "NEXT" button press on Date Screen.
+//
+//*****************************************************************************
+void
+OnDateNextBtnPress(tWidget *psWidget)
+{
+ //
+ // Remove the main screen from the root.
+ //
+ WidgetRemove((tWidget *)&g_sDateScreen);
+
+ //
+ // Add the date screen to the root.
+ //
+ WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sTimeScreen);
+
+ //
+ // Add the widget tree to message queue so that it can be drawn on the
+ // display.
+ //
+ WidgetPaint(WIDGET_ROOT);
+}
+
+//*****************************************************************************
+//
+// Handle the Hour "-" button press on Time Screen.
+//
+//*****************************************************************************
+void
+OnHourUpBtnPress(tWidget *psWidget)
+{
+ //
+ // User wants to decrement the hour. So reduce index by one such that the
+ // index cycles back to the bottom of the list if it is at the top.
+ //
+ g_ui32HourIdx = (g_ui32HourIdx == 1) ? 12 : g_ui32HourIdx - 1;
+
+ //
+ // Store the index in a buffer as a string and add the widget to the
+ // message queue so that it can be redrawn.
+ //
+ usnprintf(g_pcHourBuf, sizeof(g_pcHourBuf), "%u", g_ui32HourIdx);
+ WidgetPaint(&g_sHourText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the Hour "+" button press on Time Screen.
+//
+//*****************************************************************************
+void
+OnHourDwnBtnPress(tWidget *psWidget)
+{
+ //
+ // User wants to increment the hour. So increment index by one such that
+ // the index cycles back to the top of the list if it is at the bottom.
+ //
+ g_ui32HourIdx = (g_ui32HourIdx == 12) ? 1 : g_ui32HourIdx + 1;
+
+ //
+ // Store the index in a buffer as a string and add the widget to the
+ // message queue so that it can be redrawn.
+ //
+ usnprintf(g_pcHourBuf, sizeof(g_pcHourBuf), "%u", g_ui32HourIdx);
+ WidgetPaint(&g_sHourText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the Minute "-" button press on Time Screen.
+//
+//*****************************************************************************
+void
+OnMinUpBtnPress(tWidget *psWidget)
+{
+ //
+ // User wants to decrement the minute. So reduce index by one such that
+ // the index cycles back to the bottom of the list if it is at the top.
+ //
+ g_ui32MinIdx = (g_ui32MinIdx == 0) ? 59 : g_ui32MinIdx - 1;
+
+ //
+ // Store the index in a buffer as a string and add the widget to the
+ // message queue so that it can be redrawn.
+ //
+ usnprintf(g_pcMinBuf, sizeof(g_pcMinBuf), "%02u", g_ui32MinIdx);
+ WidgetPaint(&g_sMinText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the Minute "+" button press on Time Screen.
+//
+//*****************************************************************************
+void
+OnMinDwnBtnPress(tWidget *psWidget)
+{
+ //
+ // User wants to increment the minute. So increment index by one such that
+ // the index cycles back to the top of the list if it is at the bottom.
+ //
+ g_ui32MinIdx = (g_ui32MinIdx == 59) ? 0 : g_ui32MinIdx + 1;
+
+ //
+ // Store the index in a buffer as a string and add the widget to the
+ // message queue so that it can be redrawn.
+ //
+ usnprintf(g_pcMinBuf, sizeof(g_pcMinBuf), "%02u", g_ui32MinIdx);
+ WidgetPaint(&g_sMinText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the AM/PM "+" and "-" button press on Time Screen. The same function
+// handles both the button presses.
+//
+//*****************************************************************************
+void
+OnAMPMBtnPress(tWidget *psWidget)
+{
+ //
+ // User wants to change AM to PM or vice versa. Change to "PM" if "AM" and
+ // vice versa.
+ //
+ if(strcmp(g_pcAMPMBuf, "AM") == 0)
+ {
+ strcpy(g_pcAMPMBuf, "PM");
+ }
+ else
+ {
+ strcpy(g_pcAMPMBuf, "AM");
+ }
+
+ //
+ // Add the widget to the message queue so that it can be redrawn.
+ //
+ WidgetPaint(&g_sAMPMText.sBase);
+}
+
+//*****************************************************************************
+//
+// Handle the "DONE" button press on Time Screen.
+//
+//*****************************************************************************
+void
+OnTimeDoneBtnPress(tWidget *psWidget)
+{
+ //
+ // Remove the main screen from the root.
+ //
+ WidgetRemove((tWidget *)&g_sTimeScreen);
+
+ //
+ // Add the date screen to the root.
+ //
+ WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sMainScreen);
+
+ //
+ // Add the widget tree to message queue so that it can be drawn on the
+ // display.
+ //
+ WidgetPaint(WIDGET_ROOT);
+
+ //
+ // Set the flag to indicate that date and time have to updated.
+ //
+ g_bSetDate = true;
+}
+
+//*****************************************************************************
+//
+// This example demonstrates the different hibernate wake sources. The
+// microcontroller is put into hibernation by the user and wakes up based on
+// timeout or one of the user inputs. This example also demonstrates the RTC
+// calendar function that keeps track of date and time.
+//
+//*****************************************************************************
+int
+main(void)
+{
+ tContext sContext;
+ struct tm sTime;
+ bool bUpdate;
+ uint32_t ui32SysClock, ui32Status, ui32HibernateCount, ui32Len;
+
+ //
+ // Run from the PLL at 120 MHz.
+ //
+ ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
+ SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
+ SYSCTL_CFG_VCO_480), 120000000);
+
+ //
+ // Configure the device pins.
+ //
+ PinoutSet();
+
+ //
+ // Initialize the display driver.
+ //
+ Kentec320x240x16_SSD2119Init(ui32SysClock);
+
+ //
+ // Initialize the graphics context.
+ //
+ GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119);
+
+ //
+ // Draw the application frame.
+ //
+ FrameDraw(&sContext, "hibernate");
+
+ //
+ // Flush any cached drawing operations.
+ //
+ GrFlush(&sContext);
+
+ //
+ // Set a font henceforth.
+ //
+ GrContextFontSet(&sContext, g_psFontCm16);
+
+ //
+ // Initialize the touch screen driver.
+ //
+ TouchScreenInit(ui32SysClock);
+ TouchScreenCallbackSet(WidgetPointerMessage);
+
+ //
+ // Add the compile-time defined widgets to the widget tree.
+ //
+ WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sMainScreen);
+
+ //
+ // Enable the hibernate module.
+ //
+ SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);
+
+ //
+ // Initialize these variables before they are used.
+ //
+ ui32Status = 0;
+ ui32HibernateCount = 0;
+
+ //
+ // Check to see if Hibernation module is already active, which could mean
+ // that the processor is waking from a hibernation.
+ //
+ if(HibernateIsActive())
+ {
+ //
+ // Read the status bits to see what caused the wake. Clear the wake
+ // source so that the device can be put into hibernation again.
+ //
+ ui32Status = HibernateIntStatus(0);
+ HibernateIntClear(ui32Status);
+
+ //
+ // Store the common part of the wake information message into a buffer.
+ // The wake source will be appended based on the status bits.
+ //
+ ui32Len = usnprintf(g_pcWakeBuf, sizeof(g_pcWakeBuf),
+ "Wake Due To : ");
+
+ //
+ // Wake was due to RTC match.
+ //
+ if(ui32Status & HIBERNATE_INT_RTC_MATCH_0)
+ {
+ ui32Len = usnprintf(&g_pcWakeBuf[ui32Len],
+ sizeof(g_pcWakeBuf) - ui32Len, "%s",
+ g_ppcWakeSource[0]);
+ }
+
+ //
+ // Wake was due to Reset button.
+ //
+ else if(ui32Status & HIBERNATE_INT_RESET_WAKE)
+ {
+ ui32Len = usnprintf(&g_pcWakeBuf[ui32Len],
+ sizeof(g_pcWakeBuf) - ui32Len, "%s",
+ g_ppcWakeSource[1]);
+ }
+
+ //
+ // Wake was due to the External Wake pin.
+ //
+ else if(ui32Status & HIBERNATE_INT_PIN_WAKE)
+ {
+ ui32Len = usnprintf(&g_pcWakeBuf[ui32Len],
+ sizeof(g_pcWakeBuf) - ui32Len, "%s",
+ g_ppcWakeSource[2]);
+ }
+
+ //
+ // Wake was due to GPIO wake.
+ //
+ else if(ui32Status & HIBERNATE_INT_GPIO_WAKE)
+ {
+ ui32Len = usnprintf(&g_pcWakeBuf[ui32Len],
+ sizeof(g_pcWakeBuf) - ui32Len, "%s",
+ g_ppcWakeSource[3]);
+ }
+
+ //
+ // If the wake is due to any of the configured wake sources, then read
+ // the first location from the battery backed memory, as the
+ // hibernation count.
+ //
+ if(ui32Status & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0 |
+ HIBERNATE_INT_GPIO_WAKE | HIBERNATE_INT_RESET_WAKE))
+ {
+ HibernateDataGet(&ui32HibernateCount, 1);
+ }
+ }
+
+ //
+ // Configure Hibernate module clock.
+ //
+ HibernateEnableExpClk(ui32SysClock);
+
+ //
+ // If the wake was not due to the above sources, then it was a system
+ // reset.
+ //
+ if(!(ui32Status & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0 |
+ HIBERNATE_INT_GPIO_WAKE | HIBERNATE_INT_RESET_WAKE)))
+ {
+ //
+ // Configure the module clock source.
+ //
+ HibernateClockConfig(HIBERNATE_OSC_LOWDRIVE);
+
+ //
+ // Store that this was a system restart, not wake from hibernation.
+ //
+ ui32Len = usnprintf(g_pcWakeBuf, sizeof(g_pcWakeBuf), "%s",
+ g_ppcWakeSource[4]);
+
+ //
+ // Set Calendar time to start from 08/29/2013 at 8:30AM
+ //
+ g_ui32MonthIdx = 7;
+ g_ui32DayIdx = 29;
+ g_ui32YearIdx = 13;
+ g_ui32HourIdx = 8;
+ g_ui32MinIdx = 30;
+ strcpy(g_pcMonBuf, "AUG");
+ strcpy(g_pcDayBuf, "29");
+ strcpy(g_pcYearBuf, "2013");
+ strcpy(g_pcHourBuf, "8");
+ strcpy(g_pcMinBuf, "30");
+ strcpy(g_pcAMPMBuf, "AM");
+ }
+
+ //
+ // Store the hibernation count message into the respective widget buffer.
+ //
+ usnprintf(g_pcHibBuf, sizeof(g_pcHibBuf), "Hibernate count = %u",
+ ui32HibernateCount);
+
+ //
+ // Store the text, that informs the user on how to hibernate, into the
+ // respective widget buffer.
+ //
+ usnprintf(g_pcInfoBuf0, sizeof(g_pcInfoBuf0), "To hibernate touch HERE.");
+
+ //
+ // Add the widget tree to the message queue so that it can be drawn.
+ //
+ WidgetPaint(WIDGET_ROOT);
+
+ //
+ // Enable RTC mode.
+ //
+ HibernateRTCEnable();
+
+ //
+ // Configure the hibernate module counter to 24-hour calendar mode.
+ //
+ HibernateCounterMode(HIBERNATE_COUNTER_24HR);
+
+ //
+ // Configure GPIOs used as Hibernate wake source
+ //
+ GPIOPadConfigSet(GPIO_PORTK_BASE, 0x20, GPIO_STRENGTH_2MA,
+ (GPIO_PIN_TYPE_WAKE_LOW | GPIO_PIN_TYPE_STD_WPU));
+
+ //
+ // Enable processor interrupts.
+ //
+ IntMasterEnable();
+
+ //
+ // If hibernation count is very large, it may be that there was already
+ // a value in the hibernate memory, so reset the count.
+ //
+ ui32HibernateCount = (ui32HibernateCount > 10000) ? 0 : ui32HibernateCount;
+
+ //
+ // Increment the hibernation count, and store it in the battery backed
+ // memory.
+ //
+ ui32HibernateCount++;
+ HibernateDataSet(&ui32HibernateCount, 1);
+
+ //
+ // Initialize the necessary flags before entering indefinite loop.
+ //
+ g_bMainScreen = true;
+ g_bHibernate = false;
+ g_bSetDate = false;
+
+ //
+ // Loop forever.
+ //
+ while(1)
+ {
+ //
+ // Process any messages for/from the widgets.
+ //
+ WidgetMessageQueueProcess();
+
+ //
+ // Check if date and time has to be written to the calendar logic of
+ // hibernate module.
+ //
+ if(g_bSetDate == true)
+ {
+ //
+ // Yes - Clear the flag to avoid unwanted writes to the calendar
+ // logic.
+ //
+ g_bSetDate = false;
+
+ //
+ // Write the requested date and time.
+ //
+ DateTimeSet();
+
+ //
+ // Set the flag to indicate that the main screen is active.
+ //
+ g_bMainScreen = true;
+ }
+
+ //
+ // Check if main screen is active and update the required buffers and
+ // redraw the required widgets.
+ //
+ if(g_bMainScreen)
+ {
+ //
+ // Update the buffer that displays date and time on the main
+ // screen.
+ //
+ bUpdate = DateTimeDisplayGet(g_pcDateTimeBuf,
+ sizeof(g_pcDateTimeBuf));
+
+ //
+ // Is a new value of date and time available to be displayed?
+ //
+ if(bUpdate == true)
+ {
+ //
+ // Yes - Redraw the widget.
+ //
+ WidgetPaint(&g_sDateTime.sBase);
+ }
+ }
+
+ //
+ // Check if user wants to enter hibernation.
+ //
+ if(g_bHibernate == true)
+ {
+ //
+ // Yes - Clear the flag.
+ //
+ g_bHibernate = false;
+
+ //
+ // Store the text, that informs the user on how to wake-up from
+ // hibernation, into the respective widget buffers.
+ //
+ usnprintf(g_pcInfoBuf1, sizeof(g_pcInfoBuf1), "To wake up wait "
+ "for 5 secs or press the");
+ usnprintf(g_pcInfoBuf2, sizeof(g_pcInfoBuf2), "RESET button. "
+ "Refer document for");
+ usnprintf(g_pcInfoBuf3, sizeof(g_pcInfoBuf3), "additional "
+ "wake sources.");
+
+ //
+ // Redraw the widgets to display the updated buffers. These
+ // widgets have to be redrawn here instead of adding to the message
+ // queue by using WidgetPaint() function as
+ // WidgetMessageQueueProcess() function won't be executed before
+ // entering hibernation.
+ //
+ CanvasMsgProc(&g_sInfoStr1.sBase, WIDGET_MSG_PAINT, 0, 0);
+ CanvasMsgProc(&g_sInfoStr2.sBase, WIDGET_MSG_PAINT, 0, 0);
+ CanvasMsgProc(&g_sInfoStr3.sBase, WIDGET_MSG_PAINT, 0, 0);
+
+ //
+ // Get calendar match value to be 5 seconds from the current time.
+ //
+ GetCalendarMatchValue(&sTime);
+
+ //
+ // Set the calendar match register such that it wakes up from
+ // hibernation in 5 seconds.
+ //
+ HibernateCalendarMatchSet(0, &sTime);
+
+ //
+ // Read and clear any status bits that might have been set since
+ // last clearing them.
+ //
+ ui32Status = HibernateIntStatus(0);
+ HibernateIntClear(ui32Status);
+
+ //
+ // Configure Hibernate wake sources.
+ //
+ HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_GPIO |
+ HIBERNATE_WAKE_RESET | HIBERNATE_WAKE_RTC);
+
+ //
+ // Request Hibernation.
+ //
+ HibernateRequest();
+
+ //
+ // Wait for a while for hibernate to activate. It should never get
+ // past this point.
+ //
+ SysCtlDelay(100);
+
+ //
+ // If it ever gets here, store the text, that informs the user on
+ // what to do, into the respective widget buffers.
+ //
+ usnprintf(g_pcInfoBuf1, sizeof(g_pcInfoBuf1), "The controller did "
+ "not enter hibernate mode.");
+ usnprintf(g_pcInfoBuf2, sizeof(g_pcInfoBuf2), "TOUCH THE DISPLAY "
+ "TO RESTART.");
+ usnprintf(g_pcInfoBuf3, sizeof(g_pcInfoBuf3), "");
+
+ //
+ // Redraw the widgets to display the updated buffers.
+ //
+ CanvasMsgProc(&g_sInfoStr1.sBase, WIDGET_MSG_PAINT, 0, 0);
+ CanvasMsgProc(&g_sInfoStr2.sBase, WIDGET_MSG_PAINT, 0, 0);
+ CanvasMsgProc(&g_sInfoStr3.sBase, WIDGET_MSG_PAINT, 0, 0);
+
+ //
+ // Wait for the user request to reset processor. Then reset the
+ // processor.
+ //
+ g_bHibernate = false;
+ while(g_bHibernate != true)
+ {
+ }
+
+ //
+ // Reset the processor.
+ //
+ ROM_SysCtlReset();
+
+ //
+ // Wait here.
+ //
+ while(1)
+ {
+ }
+ }
+ }
+}