192 lines
6.9 KiB
C
192 lines
6.9 KiB
C
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <utils/ustdlib.h>
|
|
#include "driverlib/rom.h"
|
|
#include "driverlib/sysctl.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 "inc/hw_ints.h"
|
|
#include "inc/hw_memmap.h"
|
|
#include "inc/hw_types.h"
|
|
#include "driverlib/interrupt.h"
|
|
#include "driverlib/timer.h"
|
|
|
|
extern tCanvasWidget g_sBackground;
|
|
extern tPushButtonWidget g_sPushBtn;
|
|
extern tPushButtonWidget g_sPushReset;
|
|
|
|
tContext g_sContext;
|
|
uint32_t g_ui32Flags;
|
|
|
|
const char Counter[6] = "Stoper";
|
|
char flagStart = 0;
|
|
unsigned int msec = 0;
|
|
unsigned int sec = 0;
|
|
unsigned int min = 0;
|
|
unsigned int hrs = 0;
|
|
char charTime[] = "00:00:00.0 ";
|
|
|
|
void stoperTick(void)
|
|
{
|
|
msec++;
|
|
|
|
if (msec == 10){
|
|
msec = 0;
|
|
sec++;
|
|
}
|
|
else if (sec == 60){
|
|
sec = 0;
|
|
min++;
|
|
}
|
|
else if (min == 60){
|
|
min = 0;
|
|
hrs++;
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
void Timer0IntHandler(void)
|
|
{
|
|
ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // Clear the timer interrupt.
|
|
|
|
if(flagStart == 1){
|
|
stoperTick(); // zliczanie ms
|
|
}
|
|
|
|
}
|
|
|
|
void OnButtonPress(tWidget *psWidget); // The canvas widget acting as the background to the display.
|
|
void OnButtonReset(tWidget *psWidget);
|
|
|
|
Canvas(g_sBackground, WIDGET_ROOT, 0, &g_sPushBtn,
|
|
&g_sKentec320x240x16_SSD2119, 10, 25, 300, (240 - 25 -10),
|
|
CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0);
|
|
|
|
RectangularButton(g_sPushBtn, &g_sBackground, 0, &g_sPushReset, // The button used to hide or display the "Hello World" message.
|
|
&g_sKentec320x240x16_SSD2119, 40, 140, 80, 40,
|
|
(PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT |
|
|
PB_STYLE_FILL | PB_STYLE_RELEASE_NOTIFY),
|
|
ClrDarkBlue, ClrBlue, ClrWhite, ClrWhite,
|
|
g_psFontCmss22b, "START", 0, 0, 0, 0, OnButtonPress);
|
|
|
|
RectangularButton(g_sPushReset, &g_sPushBtn, 0, 0,
|
|
&g_sKentec320x240x16_SSD2119, 180, 140, 80, 40,
|
|
(PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT |
|
|
PB_STYLE_FILL | PB_STYLE_RELEASE_NOTIFY),
|
|
ClrDarkRed, ClrRed, ClrWhite, ClrWhite,
|
|
g_psFontCmss22b, "RESET", 0, 0, 0, 0, OnButtonReset);
|
|
|
|
//*****************************************************************************
|
|
//*****************************************************************************
|
|
//
|
|
// A global we use to keep track of whether or not the "Hello" widget is
|
|
// currently visible.
|
|
//
|
|
//*****************************************************************************
|
|
bool g_bHelloVisible = false;
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// 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 is called by the graphics library widget manager in the
|
|
// context of WidgetMessageQueueProcess whenever the user releases the
|
|
// "Press Me!" button. We use this notification to display or hide the
|
|
// "Hello!" widget.
|
|
//
|
|
// This is actually a rather inefficient way to accomplish this but it's
|
|
// a good example of how to add and remove widgets dynamically. In
|
|
// normal circumstances, you would likely leave the g_sHello widget
|
|
// linked into the tree and merely add or remove the text by changing
|
|
// its style then repainting.
|
|
//
|
|
// If using this dynamic add/remove strategy, another useful optimization
|
|
// is to use a black canvas widget that covers the same area of the screen
|
|
// as the widgets that you will be adding and removing. If this is the used
|
|
// as the point in the tree where the subtree is added or removed, you can
|
|
// repaint just the desired area by repainting the black canvas rather than
|
|
// repainting the whole tree.
|
|
//
|
|
//*****************************************************************************
|
|
void OnButtonPress(tWidget *psWidget) // funkcja obslugujaca przycisk start
|
|
{
|
|
g_bHelloVisible = !g_bHelloVisible;
|
|
|
|
if(g_bHelloVisible)
|
|
{
|
|
WidgetRemove((tWidget *)&g_sPushReset);
|
|
flagStart = 1;
|
|
PushButtonTextSet(&g_sPushBtn, "STOP");
|
|
WidgetPaint(WIDGET_ROOT);
|
|
}
|
|
else
|
|
{
|
|
WidgetAdd((tWidget *)&g_sPushBtn, (tWidget *)&g_sPushReset);
|
|
flagStart = 0;
|
|
PushButtonTextSet(&g_sPushBtn, "START");
|
|
WidgetPaint((tWidget *)&g_sPushBtn);
|
|
}
|
|
}
|
|
|
|
void OnButtonReset(tWidget *psWidget) // funkcja obslugujaca przycisk reset
|
|
{
|
|
flagStart = 0;
|
|
msec = 0;
|
|
sec = 0;
|
|
min = 0;
|
|
hrs = 0;
|
|
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
// Run from the PLL at 120 MHz.
|
|
uint32_t ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
|
|
SYSCTL_OSC_MAIN |
|
|
SYSCTL_USE_PLL |
|
|
SYSCTL_CFG_VCO_480), 120000000);
|
|
|
|
// Konfiguracja wyswietlacza
|
|
PinoutSet(); // Configure the device pins.
|
|
Kentec320x240x16_SSD2119Init(ui32SysClock); // Initialize the display driver.
|
|
GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); // Initialize the graphics context.
|
|
FrameDraw(&g_sContext, "StOpErEk"); // Draw the application frame.
|
|
TouchScreenInit(ui32SysClock); // Initialize the touch screen driver.
|
|
TouchScreenCallbackSet(WidgetPointerMessage); // Set the touch screen event handler.
|
|
WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sBackground); // Add the compile-time defined widgets to the widget tree.
|
|
WidgetPaint(WIDGET_ROOT); // Paint the widget tree to make sure they all appear on the display.
|
|
|
|
// Konfiguracja timera
|
|
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
|
|
ROM_IntMasterEnable(); // Enable processor interrupts.
|
|
ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); // Configure the two 32-bit periodic timers.
|
|
ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ui32SysClock/10);
|
|
ROM_IntEnable(INT_TIMER0A); // Setup the interrupts for the timer timeouts.
|
|
ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
|
|
ROM_TimerEnable(TIMER0_BASE, TIMER_A); // Enable the timers
|
|
|
|
while(1)
|
|
{
|
|
usprintf(charTime,"%02u:%02u:%02u.%01u ",hrs,min,sec,msec); // Convert unsigned ints to one char
|
|
GrStringDraw(&g_sContext, charTime, -1, 140, 55, 1); // Draw a stopwatch result
|
|
WidgetMessageQueueProcess(); // Process any messages from or for the widgets.
|
|
}
|
|
}
|