375 lines
12 KiB
C
375 lines
12 KiB
C
/*
|
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
|
* Copyright 2016-2017 NXP
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include "fsl_device_registers.h"
|
|
#include "fsl_debug_console.h"
|
|
#include "pin_mux.h"
|
|
#include "board.h"
|
|
#include "emwin_support.h"
|
|
|
|
#include "GUI.h"
|
|
#include "BUTTON.h"
|
|
#include "CHECKBOX.h"
|
|
#include "SLIDER.h"
|
|
#include "DROPDOWN.h"
|
|
#include "RADIO.h"
|
|
#include "MULTIPAGE.h"
|
|
|
|
#include <stdbool.h>
|
|
#include "fsl_power.h"
|
|
#include "fsl_dma.h"
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
#define EXAMPLE_LPSPI_MASTER_DMA_BASEADDR DMA0
|
|
#define EXAMPLE_SPI_MASTER SPI8
|
|
#define EXAMPLE_SPI_MASTER_IRQ LSPI_HS_IRQn
|
|
#define EXAMPLE_SPI_MASTER_CLK_SRC kCLOCK_HsLspi
|
|
#define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetHsLspiClkFreq()
|
|
#define EXAMPLE_SPI_SSEL 1
|
|
#define EXAMPLE_DMA DMA0
|
|
#define EXAMPLE_SPI_MASTER_RX_CHANNEL 2
|
|
#define EXAMPLE_SPI_MASTER_TX_CHANNEL 3
|
|
#define EXAMPLE_MASTER_SPI_SPOL kSPI_SpolActiveAllLow
|
|
|
|
|
|
#ifndef GUI_NORMAL_FONT
|
|
#define GUI_NORMAL_FONT (&GUI_Font16_ASCII)
|
|
#endif
|
|
|
|
#ifndef GUI_LARGE_FONT
|
|
#define GUI_LARGE_FONT (&GUI_Font16B_ASCII)
|
|
#endif
|
|
|
|
#ifndef GUI_SCALE_FACTOR
|
|
#define GUI_SCALE_FACTOR 1
|
|
#endif
|
|
|
|
#ifndef GUI_SCALE_FACTOR_X
|
|
#define GUI_SCALE_FACTOR_X GUI_SCALE_FACTOR
|
|
#endif
|
|
|
|
#ifndef GUI_SCALE_FACTOR_Y
|
|
#define GUI_SCALE_FACTOR_Y GUI_SCALE_FACTOR
|
|
#endif
|
|
|
|
#define GUI_SCALE(a) ((int)((a) * (GUI_SCALE_FACTOR)))
|
|
#define GUI_SCALE_X(x) ((int)((x) * (GUI_SCALE_FACTOR_X)))
|
|
#define GUI_SCALE_Y(y) ((int)((y) * (GUI_SCALE_FACTOR_Y)))
|
|
#define GUI_SCALE_COORDS(x, y) GUI_SCALE_X(x), GUI_SCALE_Y(y)
|
|
#define GUI_SCALE_RECT(x0, y0, xs, ys) GUI_SCALE_X(x0), GUI_SCALE_Y(y0), GUI_SCALE_X(xs), GUI_SCALE_Y(ys)
|
|
|
|
#define GUI_ID_DRAWAREA (GUI_ID_USER + 0)
|
|
#define GUI_ID_PAGEWIN1 (GUI_ID_USER + 1)
|
|
#define GUI_ID_PAGEWIN2 (GUI_ID_USER + 2)
|
|
|
|
/*******************************************************************************
|
|
* Prototypes
|
|
******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
|
|
uint32_t SPI8_GetFreq(void)
|
|
{
|
|
return CLOCK_GetHsLspiClkFreq();
|
|
}
|
|
|
|
uint32_t I2C4_GetFreq(void)
|
|
{
|
|
return CLOCK_GetFlexCommClkFreq(4U);
|
|
}
|
|
|
|
|
|
static DROPDOWN_Handle hDropdown0;
|
|
static RADIO_Handle hRadio0;
|
|
static CHECKBOX_Handle hCheck0;
|
|
static WM_HWIN hDrawArea;
|
|
|
|
static SLIDER_Handle hSlider0;
|
|
static SLIDER_Handle hSlider1;
|
|
static SPINBOX_Handle hSpinbox0;
|
|
static PROGBAR_Handle hProgbar0;
|
|
|
|
static const GUI_COLOR color_list[] = {GUI_BLACK, GUI_YELLOW, GUI_ORANGE, GUI_RED,
|
|
GUI_MAGENTA, GUI_BLUE, GUI_CYAN, GUI_GREEN};
|
|
static const GUI_POINT triangle_points[] = {
|
|
{GUI_SCALE(0), GUI_SCALE(0)}, {GUI_SCALE(-50), GUI_SCALE(100)}, {GUI_SCALE(50), GUI_SCALE(100)}};
|
|
|
|
static void cbDrawArea(WM_MESSAGE *pMsg)
|
|
{
|
|
switch (pMsg->MsgId)
|
|
{
|
|
case WM_PAINT:
|
|
GUI_SetColor(color_list[DROPDOWN_GetSel(hDropdown0)]);
|
|
switch (RADIO_GetValue(hRadio0))
|
|
{
|
|
case 0:
|
|
if (CHECKBOX_GetState(hCheck0))
|
|
{
|
|
GUI_FillRect(GUI_SCALE_X(70) - GUI_SCALE(50), GUI_SCALE_Y(70) - GUI_SCALE(50),
|
|
GUI_SCALE_X(70) + GUI_SCALE(50), GUI_SCALE_Y(70) + GUI_SCALE(50));
|
|
}
|
|
else
|
|
{
|
|
GUI_DrawRect(GUI_SCALE_X(70) - GUI_SCALE(50), GUI_SCALE_Y(70) - GUI_SCALE(50),
|
|
GUI_SCALE_X(70) + GUI_SCALE(50), GUI_SCALE_Y(70) + GUI_SCALE(50));
|
|
}
|
|
break;
|
|
case 1:
|
|
if (CHECKBOX_GetState(hCheck0))
|
|
{
|
|
GUI_FillPolygon(triangle_points, 3, GUI_SCALE_COORDS(70, 20));
|
|
}
|
|
else
|
|
{
|
|
GUI_DrawPolygon(triangle_points, 3, GUI_SCALE_COORDS(70, 20));
|
|
}
|
|
break;
|
|
case 2:
|
|
if (CHECKBOX_GetState(hCheck0))
|
|
{
|
|
GUI_FillEllipse(GUI_SCALE_COORDS(70, 70), GUI_SCALE(50), GUI_SCALE(50));
|
|
}
|
|
else
|
|
{
|
|
GUI_DrawEllipse(GUI_SCALE_COORDS(70, 70), GUI_SCALE(50), GUI_SCALE(50));
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
WM_DefaultProc(pMsg);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void cbPageWin1(WM_MESSAGE *pMsg)
|
|
{
|
|
int NCode;
|
|
int Id;
|
|
|
|
switch (pMsg->MsgId)
|
|
{
|
|
case WM_NOTIFY_PARENT:
|
|
Id = WM_GetId(pMsg->hWinSrc);
|
|
NCode = pMsg->Data.v;
|
|
|
|
switch (Id)
|
|
{
|
|
case GUI_ID_RADIO0:
|
|
switch (NCode)
|
|
{
|
|
case WM_NOTIFICATION_VALUE_CHANGED:
|
|
WM_InvalidateWindow(hDrawArea);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case GUI_ID_DROPDOWN0:
|
|
switch (NCode)
|
|
{
|
|
case WM_NOTIFICATION_SEL_CHANGED:
|
|
WM_InvalidateWindow(hDrawArea);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case GUI_ID_CHECK0:
|
|
switch (NCode)
|
|
{
|
|
case WM_NOTIFICATION_VALUE_CHANGED:
|
|
WM_InvalidateWindow(hDrawArea);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
WM_DefaultProc(pMsg);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void cbPageWin2(WM_MESSAGE *pMsg)
|
|
{
|
|
int NCode;
|
|
int Id;
|
|
|
|
switch (pMsg->MsgId)
|
|
{
|
|
case WM_NOTIFY_PARENT:
|
|
Id = WM_GetId(pMsg->hWinSrc);
|
|
NCode = pMsg->Data.v;
|
|
|
|
switch (Id)
|
|
{
|
|
case GUI_ID_SLIDER0:
|
|
switch (NCode)
|
|
{
|
|
case WM_NOTIFICATION_VALUE_CHANGED:
|
|
PROGBAR_SetValue(hProgbar0, SLIDER_GetValue(hSlider0));
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case GUI_ID_SLIDER1:
|
|
switch (NCode)
|
|
{
|
|
case WM_NOTIFICATION_VALUE_CHANGED:
|
|
SPINBOX_SetValue(hSpinbox0, SLIDER_GetValue(hSlider1));
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case GUI_ID_SPINBOX0:
|
|
switch (NCode)
|
|
{
|
|
case WM_NOTIFICATION_VALUE_CHANGED:
|
|
SLIDER_SetValue(hSlider1, SPINBOX_GetValue(hSpinbox0));
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
WM_DefaultProc(pMsg);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*!
|
|
* @brief Main function
|
|
*/
|
|
int main(void)
|
|
{
|
|
/* set BOD VBAT level to 1.65V */
|
|
POWER_SetBodVbatLevel(kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false);
|
|
/* Disable SysTick interrupt as it seems to be enabled upon startup */
|
|
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
|
|
|
|
/* attach 12 MHz clock to FLEXCOMM0 (debug console) */
|
|
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
|
|
|
|
BOARD_InitBootPins();
|
|
BOARD_InitBootClocks();
|
|
BOARD_InitDebugConsole();
|
|
|
|
/* attach 12 MHz clock to FLEXCOMM4 (I2C master) */
|
|
CLOCK_AttachClk(kFRO12M_to_FLEXCOMM4);
|
|
|
|
/* reset FLEXCOMM for I2C */
|
|
RESET_PeripheralReset(kFC4_RST_SHIFT_RSTn);
|
|
|
|
CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 0U, true);
|
|
CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 3U, false);
|
|
|
|
/* attach 50 MHz clock to HSLSPI */
|
|
CLOCK_AttachClk(kPLL0_DIV_to_HSLSPI);
|
|
|
|
/* reset FLEXCOMM for SPI */
|
|
RESET_PeripheralReset(kHSLSPI_RST_SHIFT_RSTn);
|
|
|
|
/* reset DMA for SPI */
|
|
RESET_PeripheralReset(kDMA0_RST_SHIFT_RSTn);
|
|
|
|
DMA_Init(EXAMPLE_LPSPI_MASTER_DMA_BASEADDR);
|
|
|
|
PRINTF("GUI demo start.\r\n");
|
|
|
|
GUI_Init();
|
|
|
|
CHECKBOX_SetDefaultFont(GUI_NORMAL_FONT);
|
|
DROPDOWN_SetDefaultFont(GUI_NORMAL_FONT);
|
|
MULTIPAGE_SetDefaultFont(GUI_NORMAL_FONT);
|
|
RADIO_SetDefaultFont(GUI_NORMAL_FONT);
|
|
|
|
/* Create multipage widget */
|
|
MULTIPAGE_Handle hMultipage0;
|
|
hMultipage0 = MULTIPAGE_CreateEx(GUI_SCALE_RECT(10, 10, 300, 220), 0, WM_CF_SHOW, 0, GUI_ID_MULTIPAGE0);
|
|
|
|
WM_HWIN hPageWin;
|
|
|
|
/* Create window for page 1 and add it */
|
|
hPageWin = WINDOW_CreateEx(GUI_SCALE_RECT(0, 0, 300, 200), WM_HBKWIN, 0, 0, GUI_ID_PAGEWIN1, cbPageWin1);
|
|
MULTIPAGE_AddPage(hMultipage0, hPageWin, "Shapes & Colors");
|
|
|
|
/* Create widgets on page 1 */
|
|
hDropdown0 = DROPDOWN_CreateEx(GUI_SCALE_RECT(10, 10, 100, 80), hPageWin, WM_CF_SHOW, DROPDOWN_CF_AUTOSCROLLBAR,
|
|
GUI_ID_DROPDOWN0);
|
|
DROPDOWN_SetTextHeight(hDropdown0, GUI_SCALE_Y(20));
|
|
DROPDOWN_SetScrollbarWidth(hDropdown0, GUI_SCALE_X(20));
|
|
DROPDOWN_AddString(hDropdown0, "Black");
|
|
DROPDOWN_AddString(hDropdown0, "Yellow");
|
|
DROPDOWN_AddString(hDropdown0, "Orange");
|
|
DROPDOWN_AddString(hDropdown0, "Red");
|
|
DROPDOWN_AddString(hDropdown0, "Purple");
|
|
DROPDOWN_AddString(hDropdown0, "Blue");
|
|
DROPDOWN_AddString(hDropdown0, "Cyan");
|
|
DROPDOWN_AddString(hDropdown0, "Green");
|
|
|
|
hRadio0 =
|
|
RADIO_CreateEx(GUI_SCALE_RECT(10, 50, 100, 90), hPageWin, WM_CF_SHOW, 0, GUI_ID_RADIO0, 3, GUI_SCALE_Y(30));
|
|
RADIO_SetText(hRadio0, "Square", 0);
|
|
RADIO_SetText(hRadio0, "Triangle", 1);
|
|
RADIO_SetText(hRadio0, "Circle", 2);
|
|
|
|
hCheck0 = CHECKBOX_CreateEx(GUI_SCALE_RECT(10, 150, 100, 16), hPageWin, WM_CF_SHOW, 0, GUI_ID_CHECK0);
|
|
CHECKBOX_SetText(hCheck0, "Fill");
|
|
|
|
hDrawArea =
|
|
WINDOW_CreateEx(GUI_SCALE_RECT(130, 30, 140, 140), hPageWin, WM_CF_SHOW, 0, GUI_ID_DRAWAREA, cbDrawArea);
|
|
|
|
/* Create window for page 2 and add it */
|
|
hPageWin = WINDOW_CreateEx(GUI_SCALE_RECT(0, 0, 300, 200), WM_HBKWIN, 0, 0, GUI_ID_PAGEWIN2, cbPageWin2);
|
|
MULTIPAGE_AddPage(hMultipage0, hPageWin, "Sliders & spinbox");
|
|
|
|
/* Create widgets on page 2 */
|
|
hSlider0 = SLIDER_CreateEx(GUI_SCALE_RECT(60, 160, 200, 30), hPageWin, WM_CF_SHOW, 0, GUI_ID_SLIDER0);
|
|
SLIDER_SetWidth(hSlider0, GUI_SCALE(10));
|
|
SLIDER_SetValue(hSlider0, 50);
|
|
|
|
hSlider1 =
|
|
SLIDER_CreateEx(GUI_SCALE_RECT(10, 10, 30, 180), hPageWin, WM_CF_SHOW, SLIDER_CF_VERTICAL, GUI_ID_SLIDER1);
|
|
SLIDER_SetWidth(hSlider1, GUI_SCALE(10));
|
|
SLIDER_SetValue(hSlider1, 50);
|
|
|
|
hSpinbox0 = SPINBOX_CreateEx(GUI_SCALE_RECT(100, 80, 100, 50), hPageWin, WM_CF_SHOW, GUI_ID_SPINBOX0, 0, 100);
|
|
SPINBOX_SetFont(hSpinbox0, GUI_LARGE_FONT);
|
|
SPINBOX_SetValue(hSpinbox0, 50);
|
|
|
|
hProgbar0 =
|
|
PROGBAR_CreateEx(GUI_SCALE_RECT(60, 10, 200, 40), hPageWin, WM_CF_SHOW, PROGBAR_CF_HORIZONTAL, GUI_ID_PROGBAR0);
|
|
PROGBAR_SetFont(hProgbar0, GUI_LARGE_FONT);
|
|
PROGBAR_SetValue(hProgbar0, 50);
|
|
PROGBAR_SKINFLEX_PROPS pProps = {0};
|
|
PROGBAR_GetSkinFlexProps(&pProps, 0);
|
|
pProps.ColorText = GUI_BLACK;
|
|
PROGBAR_SetSkinFlexProps(&pProps, 0);
|
|
|
|
WM_SetDesktopColor(GUI_WHITE);
|
|
|
|
GUI_MULTIBUF_Begin();
|
|
GUI_Exec();
|
|
GUI_MULTIBUF_End();
|
|
|
|
while (1)
|
|
{
|
|
/* Poll touch controller for update */
|
|
if (BOARD_Touch_Poll())
|
|
{
|
|
GUI_MULTIBUF_Begin();
|
|
GUI_Exec();
|
|
GUI_MULTIBUF_End();
|
|
}
|
|
}
|
|
}
|