RT1050 GUI demo using emWin library

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002  * The Clear BSD License
00003  * Copyright (c) 2016, Freescale Semiconductor, Inc.
00004  * Copyright 2016-2017 NXP
00005  * All rights reserved.
00006  * 
00007  * Redistribution and use in source and binary forms, with or without modification,
00008  * are permitted (subject to the limitations in the disclaimer below) provided
00009  *  that the following conditions are met:
00010  *
00011  * o Redistributions of source code must retain the above copyright notice, this list
00012  *   of conditions and the following disclaimer.
00013  *
00014  * o Redistributions in binary form must reproduce the above copyright notice, this
00015  *   list of conditions and the following disclaimer in the documentation and/or
00016  *   other materials provided with the distribution.
00017  *
00018  * o Neither the name of the copyright holder nor the names of its
00019  *   contributors may be used to endorse or promote products derived from this
00020  *   software without specific prior written permission.
00021  *
00022  * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
00023  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
00024  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00025  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00026  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
00027  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00028  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00029  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
00030  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00031  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00032  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00033  */
00034 
00035 #include "mbed.h"
00036 
00037 #include "GUI.h"
00038 #include "BUTTON.h"
00039 #include "CHECKBOX.h"
00040 #include "SLIDER.h"
00041 #include "DROPDOWN.h"
00042 #include "RADIO.h"
00043 #include "MULTIPAGE.h"
00044 
00045 extern "C" {
00046 #include "board.h"
00047 #include "pin_mux.h"    
00048 #include "emwin_support.h"
00049 }
00050 /*******************************************************************************
00051  * Definitions
00052  ******************************************************************************/
00053 
00054 #ifndef GUI_NORMAL_FONT
00055 #define GUI_NORMAL_FONT (&GUI_Font16_ASCII)
00056 #endif
00057 
00058 #ifndef GUI_LARGE_FONT
00059 #define GUI_LARGE_FONT (&GUI_Font16B_ASCII)
00060 #endif
00061 
00062 #ifndef GUI_SCALE_FACTOR
00063 #define GUI_SCALE_FACTOR 1
00064 #endif
00065 
00066 #ifndef GUI_SCALE_FACTOR_X
00067 #define GUI_SCALE_FACTOR_X GUI_SCALE_FACTOR
00068 #endif
00069 
00070 #ifndef GUI_SCALE_FACTOR_Y
00071 #define GUI_SCALE_FACTOR_Y GUI_SCALE_FACTOR
00072 #endif
00073 
00074 #define GUI_SCALE(a) ((int)((a) * (GUI_SCALE_FACTOR)))
00075 #define GUI_SCALE_X(x) ((int)((x) * (GUI_SCALE_FACTOR_X)))
00076 #define GUI_SCALE_Y(y) ((int)((y) * (GUI_SCALE_FACTOR_Y)))
00077 #define GUI_SCALE_COORDS(x, y) GUI_SCALE_X(x), GUI_SCALE_Y(y)
00078 #define GUI_SCALE_RECT(x0, y0, xs, ys) GUI_SCALE_X(x0), GUI_SCALE_Y(y0), GUI_SCALE_X(xs), GUI_SCALE_Y(ys)
00079 
00080 #define GUI_ID_DRAWAREA (GUI_ID_USER + 0)
00081 #define GUI_ID_PAGEWIN1 (GUI_ID_USER + 1)
00082 #define GUI_ID_PAGEWIN2 (GUI_ID_USER + 2)
00083 
00084 /*******************************************************************************
00085  * Variables
00086  ******************************************************************************/
00087 Serial pc(USBTX, USBRX);
00088 
00089 /*******************************************************************************
00090  * Prototypes
00091  ******************************************************************************/
00092 void BOARD_EnableLcdInterrupt(void);
00093 
00094 /*******************************************************************************
00095  * Code
00096  ******************************************************************************/
00097 
00098 static DROPDOWN_Handle hDropdown0;
00099 static RADIO_Handle hRadio0;
00100 static CHECKBOX_Handle hCheck0;
00101 static WM_HWIN hDrawArea;
00102 
00103 static SLIDER_Handle hSlider0;
00104 static SLIDER_Handle hSlider1;
00105 static SPINBOX_Handle hSpinbox0;
00106 static PROGBAR_Handle hProgbar0;
00107 
00108 static const GUI_COLOR color_list[] = {GUI_BLACK,   GUI_YELLOW, GUI_ORANGE, GUI_RED,
00109                                        GUI_MAGENTA, GUI_BLUE,   GUI_CYAN,   GUI_GREEN};
00110 static const GUI_POINT triangle_points[] = {
00111     {GUI_SCALE(0), GUI_SCALE(0)}, {GUI_SCALE(-50), GUI_SCALE(100)}, {GUI_SCALE(50), GUI_SCALE(100)}};
00112 
00113 static void cbDrawArea(WM_MESSAGE *pMsg)
00114 {
00115     switch (pMsg->MsgId)
00116     {
00117         case WM_PAINT:
00118             GUI_SetColor(color_list[DROPDOWN_GetSel(hDropdown0)]);
00119             switch (RADIO_GetValue(hRadio0))
00120             {
00121                 case 0:
00122                     if (CHECKBOX_GetState(hCheck0))
00123                     {
00124                         GUI_FillRect(GUI_SCALE_X(70) - GUI_SCALE(50), GUI_SCALE_Y(70) - GUI_SCALE(50),
00125                                      GUI_SCALE_X(70) + GUI_SCALE(50), GUI_SCALE_Y(70) + GUI_SCALE(50));
00126                     }
00127                     else
00128                     {
00129                         GUI_DrawRect(GUI_SCALE_X(70) - GUI_SCALE(50), GUI_SCALE_Y(70) - GUI_SCALE(50),
00130                                      GUI_SCALE_X(70) + GUI_SCALE(50), GUI_SCALE_Y(70) + GUI_SCALE(50));
00131                     }
00132                     break;
00133                 case 1:
00134                     if (CHECKBOX_GetState(hCheck0))
00135                     {
00136                         GUI_FillPolygon(triangle_points, 3, GUI_SCALE_COORDS(70, 20));
00137                     }
00138                     else
00139                     {
00140                         GUI_DrawPolygon(triangle_points, 3, GUI_SCALE_COORDS(70, 20));
00141                     }
00142                     break;
00143                 case 2:
00144                     if (CHECKBOX_GetState(hCheck0))
00145                     {
00146                         GUI_FillEllipse(GUI_SCALE_COORDS(70, 70), GUI_SCALE(50), GUI_SCALE(50));
00147                     }
00148                     else
00149                     {
00150                         GUI_DrawEllipse(GUI_SCALE_COORDS(70, 70), GUI_SCALE(50), GUI_SCALE(50));
00151                     }
00152                     break;
00153             }
00154             break;
00155         default:
00156             WM_DefaultProc(pMsg);
00157             break;
00158     }
00159 }
00160 
00161 static void cbPageWin1(WM_MESSAGE *pMsg)
00162 {
00163     int NCode;
00164     int Id;
00165 
00166     switch (pMsg->MsgId)
00167     {
00168         case WM_NOTIFY_PARENT:
00169             Id = WM_GetId(pMsg->hWinSrc);
00170             NCode = pMsg->Data.v;
00171 
00172             switch (Id)
00173             {
00174                 case GUI_ID_RADIO0:
00175                     switch (NCode)
00176                     {
00177                         case WM_NOTIFICATION_VALUE_CHANGED:
00178                             WM_InvalidateWindow(hDrawArea);
00179                             break;
00180                     }
00181                     break;
00182 
00183                 case GUI_ID_DROPDOWN0:
00184                     switch (NCode)
00185                     {
00186                         case WM_NOTIFICATION_SEL_CHANGED:
00187                             WM_InvalidateWindow(hDrawArea);
00188                             break;
00189                     }
00190                     break;
00191 
00192                 case GUI_ID_CHECK0:
00193                     switch (NCode)
00194                     {
00195                         case WM_NOTIFICATION_VALUE_CHANGED:
00196                             WM_InvalidateWindow(hDrawArea);
00197                             break;
00198                     }
00199                     break;
00200             }
00201             break;
00202 
00203         default:
00204             WM_DefaultProc(pMsg);
00205             break;
00206     }
00207 }
00208 
00209 static void cbPageWin2(WM_MESSAGE *pMsg)
00210 {
00211     int NCode;
00212     int Id;
00213 
00214     switch (pMsg->MsgId)
00215     {
00216         case WM_NOTIFY_PARENT:
00217             Id = WM_GetId(pMsg->hWinSrc);
00218             NCode = pMsg->Data.v;
00219 
00220             switch (Id)
00221             {
00222                 case GUI_ID_SLIDER0:
00223                     switch (NCode)
00224                     {
00225                         case WM_NOTIFICATION_VALUE_CHANGED:
00226                             PROGBAR_SetValue(hProgbar0, SLIDER_GetValue(hSlider0));
00227                             break;
00228                     }
00229                     break;
00230 
00231                 case GUI_ID_SLIDER1:
00232                     switch (NCode)
00233                     {
00234                         case WM_NOTIFICATION_VALUE_CHANGED:
00235                             SPINBOX_SetValue(hSpinbox0, SLIDER_GetValue(hSlider1));
00236                             break;
00237                     }
00238                     break;
00239 
00240                 case GUI_ID_SPINBOX0:
00241                     switch (NCode)
00242                     {
00243                         case WM_NOTIFICATION_VALUE_CHANGED:
00244                             SLIDER_SetValue(hSlider1, SPINBOX_GetValue(hSpinbox0));
00245                             break;
00246                     }
00247                     break;
00248             }
00249             break;
00250 
00251         default:
00252             WM_DefaultProc(pMsg);
00253             break;
00254     }
00255 }
00256 
00257 /*!
00258  * @brief Main function
00259  */
00260 int main(void)
00261 {
00262     BOARD_InitPins();
00263     BOARD_InitI2C1Pins();
00264     BOARD_InitSemcPins();
00265     BOARD_InitLcdifPixelClock();
00266     BOARD_InitLcd();
00267     
00268     pc.baud(115200);
00269     pc.printf("GUI demo start.\r\n");
00270 
00271     GUI_Init();
00272 
00273     CHECKBOX_SetDefaultFont(GUI_NORMAL_FONT);
00274     DROPDOWN_SetDefaultFont(GUI_NORMAL_FONT);
00275     MULTIPAGE_SetDefaultFont(GUI_NORMAL_FONT);
00276     RADIO_SetDefaultFont(GUI_NORMAL_FONT);
00277 
00278     /* Create multipage widget */
00279     MULTIPAGE_Handle hMultipage0;
00280     hMultipage0 = MULTIPAGE_CreateEx(GUI_SCALE_RECT(10, 10, 300, 220), 0, WM_CF_SHOW, 0, GUI_ID_MULTIPAGE0);
00281 
00282     WM_HWIN hPageWin;
00283 
00284     /* Create window for page 1 and add it */
00285     hPageWin = WINDOW_CreateEx(GUI_SCALE_RECT(0, 0, 300, 200), WM_HBKWIN, 0, 0, GUI_ID_PAGEWIN1, cbPageWin1);
00286     MULTIPAGE_AddPage(hMultipage0, hPageWin, "Shapes & Colors");
00287 
00288     /* Create widgets on page 1 */
00289     hDropdown0 = DROPDOWN_CreateEx(GUI_SCALE_RECT(10, 10, 100, 80), hPageWin, WM_CF_SHOW, DROPDOWN_CF_AUTOSCROLLBAR,
00290                                    GUI_ID_DROPDOWN0);
00291     DROPDOWN_SetTextHeight(hDropdown0, GUI_SCALE_Y(20));
00292     DROPDOWN_SetScrollbarWidth(hDropdown0, GUI_SCALE_X(20));
00293     DROPDOWN_AddString(hDropdown0, "Black");
00294     DROPDOWN_AddString(hDropdown0, "Yellow");
00295     DROPDOWN_AddString(hDropdown0, "Orange");
00296     DROPDOWN_AddString(hDropdown0, "Red");
00297     DROPDOWN_AddString(hDropdown0, "Purple");
00298     DROPDOWN_AddString(hDropdown0, "Blue");
00299     DROPDOWN_AddString(hDropdown0, "Cyan");
00300     DROPDOWN_AddString(hDropdown0, "Green");
00301 
00302     hRadio0 =
00303         RADIO_CreateEx(GUI_SCALE_RECT(10, 50, 100, 90), hPageWin, WM_CF_SHOW, 0, GUI_ID_RADIO0, 3, GUI_SCALE_Y(30));
00304     RADIO_SetText(hRadio0, "Square", 0);
00305     RADIO_SetText(hRadio0, "Triangle", 1);
00306     RADIO_SetText(hRadio0, "Circle", 2);
00307 
00308     hCheck0 = CHECKBOX_CreateEx(GUI_SCALE_RECT(10, 150, 100, 16), hPageWin, WM_CF_SHOW, 0, GUI_ID_CHECK0);
00309     CHECKBOX_SetText(hCheck0, "Fill");
00310 
00311     hDrawArea =
00312         WINDOW_CreateEx(GUI_SCALE_RECT(130, 30, 140, 140), hPageWin, WM_CF_SHOW, 0, GUI_ID_DRAWAREA, cbDrawArea);
00313 
00314     /* Create window for page 2 and add it */
00315     hPageWin = WINDOW_CreateEx(GUI_SCALE_RECT(0, 0, 300, 200), WM_HBKWIN, 0, 0, GUI_ID_PAGEWIN2, cbPageWin2);
00316     MULTIPAGE_AddPage(hMultipage0, hPageWin, "Sliders & spinbox");
00317 
00318     /* Create widgets on page 2 */
00319     hSlider0 = SLIDER_CreateEx(GUI_SCALE_RECT(60, 160, 200, 30), hPageWin, WM_CF_SHOW, 0, GUI_ID_SLIDER0);
00320     SLIDER_SetWidth(hSlider0, GUI_SCALE(10));
00321     SLIDER_SetValue(hSlider0, 50);
00322 
00323     hSlider1 =
00324         SLIDER_CreateEx(GUI_SCALE_RECT(10, 10, 30, 180), hPageWin, WM_CF_SHOW, SLIDER_CF_VERTICAL, GUI_ID_SLIDER1);
00325     SLIDER_SetWidth(hSlider1, GUI_SCALE(10));
00326     SLIDER_SetValue(hSlider1, 50);
00327 
00328     hSpinbox0 = SPINBOX_CreateEx(GUI_SCALE_RECT(100, 80, 100, 50), hPageWin, WM_CF_SHOW, GUI_ID_SPINBOX0, 0, 100);
00329     SPINBOX_SetFont(hSpinbox0, GUI_LARGE_FONT);
00330     SPINBOX_SetValue(hSpinbox0, 50);
00331 
00332     hProgbar0 =
00333         PROGBAR_CreateEx(GUI_SCALE_RECT(60, 10, 200, 40), hPageWin, WM_CF_SHOW, PROGBAR_CF_HORIZONTAL, GUI_ID_PROGBAR0);
00334     PROGBAR_SetFont(hProgbar0, GUI_LARGE_FONT);
00335     PROGBAR_SetValue(hProgbar0, 50);
00336 
00337     WM_SetDesktopColor(GUI_WHITE);
00338     WM_Exec();
00339 
00340     while (1)
00341     {
00342         /* Poll touch controller for update */
00343         if (BOARD_Touch_Poll())
00344         {
00345             GUI_Exec();
00346         }
00347     }
00348 }