Support for the emWin GUI library from Segger.

Dependents:   lpc4088_displaymodule_emwin

This library contains the porting layer needed to start working with emWin from Segger. Details about emWin can be found both segger.com as well as lpcware.com.

The high performance emWin embedded graphics library developed by SEGGER Microcontroller is now offered by NXP Semiconductors in library form for free commercial use with NXP microcontrollers.

For a better description of what is included and the limitations, see emWin Graphics Library.

Note

The emWin library and PNG support files must be downloaded as the downloaders contains the license info. The steps are described in the readme.h file.

Committer:
embeddedartists
Date:
Fri Mar 27 15:27:47 2015 +0100
Revision:
1:2847cc35a84f
Parent:
0:582739e02e4d
- Updated the readme.txt file with links to the wiki and added some information
regarding LPCXpresso

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alindvall 0:582739e02e4d 1 /*
alindvall 0:582739e02e4d 2 * Copyright 2014 Embedded Artists AB
alindvall 0:582739e02e4d 3 *
alindvall 0:582739e02e4d 4 * Licensed under the Apache License, Version 2.0 (the "License");
alindvall 0:582739e02e4d 5 * you may not use this file except in compliance with the License.
alindvall 0:582739e02e4d 6 * You may obtain a copy of the License at
alindvall 0:582739e02e4d 7 *
alindvall 0:582739e02e4d 8 * http://www.apache.org/licenses/LICENSE-2.0
alindvall 0:582739e02e4d 9 *
alindvall 0:582739e02e4d 10 * Unless required by applicable law or agreed to in writing, software
alindvall 0:582739e02e4d 11 * distributed under the License is distributed on an "AS IS" BASIS,
alindvall 0:582739e02e4d 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
alindvall 0:582739e02e4d 13 * See the License for the specific language governing permissions and
alindvall 0:582739e02e4d 14 * limitations under the License.
alindvall 0:582739e02e4d 15 */
alindvall 0:582739e02e4d 16 #include "EwHAL.h"
alindvall 0:582739e02e4d 17 #include "GUI.h"
alindvall 0:582739e02e4d 18 #include "GUIDRV_Lin.h"
alindvall 0:582739e02e4d 19 #include "rtos.h"
alindvall 0:582739e02e4d 20
alindvall 0:582739e02e4d 21
alindvall 0:582739e02e4d 22 /******************************************************************************
alindvall 0:582739e02e4d 23 * Defines and typedefs
alindvall 0:582739e02e4d 24 *****************************************************************************/
alindvall 0:582739e02e4d 25
alindvall 0:582739e02e4d 26 /* This value is not important but the same value must be used by both the
alindvall 0:582739e02e4d 27 GUI_X_WaitEvent() and the GUI_X_SignalEvent() functions. */
alindvall 0:582739e02e4d 28 #define EMWIN_TASK_SIGNAL (0x2)
alindvall 0:582739e02e4d 29
alindvall 0:582739e02e4d 30 /******************************************************************************
alindvall 0:582739e02e4d 31 * Local variables
alindvall 0:582739e02e4d 32 *****************************************************************************/
alindvall 0:582739e02e4d 33
alindvall 0:582739e02e4d 34 static EwHAL* _hal = NULL;
alindvall 0:582739e02e4d 35 static int _gettimeoffset = 0;
alindvall 0:582739e02e4d 36 static Semaphore* _emSem;
alindvall 0:582739e02e4d 37
alindvall 0:582739e02e4d 38 static Timer _ewTimer;
alindvall 0:582739e02e4d 39 static osThreadId _emTask = 0;
alindvall 0:582739e02e4d 40
alindvall 0:582739e02e4d 41 /******************************************************************************
alindvall 0:582739e02e4d 42 * Private Functions
alindvall 0:582739e02e4d 43 *****************************************************************************/
alindvall 0:582739e02e4d 44
alindvall 0:582739e02e4d 45 void EwHAL::handleTouchEvent() {
alindvall 0:582739e02e4d 46 GUI_PID_STATE ewCoord = {0};
alindvall 0:582739e02e4d 47
alindvall 0:582739e02e4d 48 if (_touch->read(_coord) == TouchPanel::TouchError_Ok) {
alindvall 0:582739e02e4d 49 ewCoord.x = _coord.x;
alindvall 0:582739e02e4d 50 ewCoord.y = _coord.y;
alindvall 0:582739e02e4d 51 ewCoord.Pressed = (_coord.z == 0) ? 0 : 1;
alindvall 0:582739e02e4d 52 GUI_PID_StoreState(&ewCoord);
alindvall 0:582739e02e4d 53 }
alindvall 0:582739e02e4d 54 }
alindvall 0:582739e02e4d 55
alindvall 0:582739e02e4d 56 /******************************************************************************
alindvall 0:582739e02e4d 57 * Public Functions
alindvall 0:582739e02e4d 58 *****************************************************************************/
alindvall 0:582739e02e4d 59
alindvall 0:582739e02e4d 60 EwHAL::EwHAL(int numFB, uint32_t extraMem) {
alindvall 0:582739e02e4d 61
alindvall 0:582739e02e4d 62 RtosLog* log = DMBoard::instance().logger();
alindvall 0:582739e02e4d 63 _display = DMBoard::instance().display();
alindvall 0:582739e02e4d 64 _touch = DMBoard::instance().touchPanel();
alindvall 0:582739e02e4d 65
alindvall 0:582739e02e4d 66 _width = _display->width();
alindvall 0:582739e02e4d 67 _height = _display->height();
alindvall 0:582739e02e4d 68 _fbSz = _display->fbSize();
alindvall 0:582739e02e4d 69 _numFB = numFB;
alindvall 0:582739e02e4d 70
alindvall 0:582739e02e4d 71 do {
alindvall 0:582739e02e4d 72 if (numFB < 1) {
alindvall 0:582739e02e4d 73 log->printf("Failed. Must have at least one frame buffer, wanted %d\n", numFB);
alindvall 0:582739e02e4d 74 break;
alindvall 0:582739e02e4d 75 }
alindvall 0:582739e02e4d 76
alindvall 0:582739e02e4d 77 _fb = (uint32_t)_display->allocateFramebuffers(numFB);
alindvall 0:582739e02e4d 78 if (_fb == 0) {
alindvall 0:582739e02e4d 79 log->printf("Failed to allocate memory for %d framebuffer(s)\n", numFB);
alindvall 0:582739e02e4d 80 break;
alindvall 0:582739e02e4d 81 }
alindvall 0:582739e02e4d 82 memset((void*)_fb, 0x0, _fbSz * numFB);
alindvall 0:582739e02e4d 83
alindvall 0:582739e02e4d 84 _display->setFramebuffer((void*)_fb);
alindvall 0:582739e02e4d 85
alindvall 0:582739e02e4d 86 _memSz = extraMem;
alindvall 0:582739e02e4d 87 _mem = (uint32_t)malloc(_memSz);
alindvall 0:582739e02e4d 88 if (_mem == 0) {
alindvall 0:582739e02e4d 89 log->printf("Failed to allocate memory block for emwin (wanted %u bytes)\n", _memSz);
alindvall 0:582739e02e4d 90 break;
alindvall 0:582739e02e4d 91 }
alindvall 0:582739e02e4d 92 memset((void*)_mem, 0x0, _memSz);
alindvall 0:582739e02e4d 93
alindvall 0:582739e02e4d 94 _fp = new FunctionPointer(this, &EwHAL::handleTouchEvent);
alindvall 0:582739e02e4d 95 _touch->setListener(_fp);
alindvall 0:582739e02e4d 96
alindvall 0:582739e02e4d 97 _hal = this;
alindvall 0:582739e02e4d 98 } while(false);
alindvall 0:582739e02e4d 99 }
alindvall 0:582739e02e4d 100
alindvall 0:582739e02e4d 101 EwHAL::~EwHAL() {
alindvall 0:582739e02e4d 102 _hal = NULL;
alindvall 0:582739e02e4d 103 if (_mem != 0) {
alindvall 0:582739e02e4d 104 free((void*)_mem);
alindvall 0:582739e02e4d 105 _mem = NULL;
alindvall 0:582739e02e4d 106 }
alindvall 0:582739e02e4d 107 if (_fb != 0) {
alindvall 0:582739e02e4d 108 free((void*)_fb);
alindvall 0:582739e02e4d 109 _fb = NULL;
alindvall 0:582739e02e4d 110 }
alindvall 0:582739e02e4d 111 if (_fp != NULL) {
alindvall 0:582739e02e4d 112 _touch->setListener(NULL);
alindvall 0:582739e02e4d 113 delete(_fp);
alindvall 0:582739e02e4d 114 }
alindvall 0:582739e02e4d 115 }
alindvall 0:582739e02e4d 116
alindvall 0:582739e02e4d 117 void EwHAL::showFrameBuffer(int id) {
alindvall 0:582739e02e4d 118 if (id >= 0 && id < getNumFrameBuffers()) {
alindvall 0:582739e02e4d 119 _display->setFramebuffer((void*)(_fb + id * _fbSz));
alindvall 0:582739e02e4d 120 }
alindvall 0:582739e02e4d 121 }
alindvall 0:582739e02e4d 122
alindvall 0:582739e02e4d 123 /******************************************************************************
alindvall 0:582739e02e4d 124 * emWin HAL functions
alindvall 0:582739e02e4d 125 *****************************************************************************/
alindvall 0:582739e02e4d 126
alindvall 0:582739e02e4d 127 /*********************************************************************
alindvall 0:582739e02e4d 128 *
alindvall 0:582739e02e4d 129 * GUI_X_Config
alindvall 0:582739e02e4d 130 *
alindvall 0:582739e02e4d 131 * Purpose:
alindvall 0:582739e02e4d 132 * Called during the initialization process in order to set up the
alindvall 0:582739e02e4d 133 * available memory for the GUI.
alindvall 0:582739e02e4d 134 */
alindvall 0:582739e02e4d 135 void GUI_X_Config(void) {
alindvall 0:582739e02e4d 136
alindvall 0:582739e02e4d 137 if (_hal == NULL) return;
alindvall 0:582739e02e4d 138
alindvall 0:582739e02e4d 139 //
alindvall 0:582739e02e4d 140 // Assign memory to emWin
alindvall 0:582739e02e4d 141 //
alindvall 0:582739e02e4d 142
alindvall 0:582739e02e4d 143 GUI_ALLOC_AssignMemory(_hal->getMemoryBlockAddress(), _hal->getMemoryBlockSize());
alindvall 0:582739e02e4d 144 GUI_ALLOC_SetAvBlockSize(0x80);
alindvall 0:582739e02e4d 145
alindvall 0:582739e02e4d 146 _emTask = Thread::gettid();
alindvall 0:582739e02e4d 147
alindvall 0:582739e02e4d 148 GUI_SetSignalEventFunc(GUI_X_SignalEvent);
alindvall 0:582739e02e4d 149 GUI_SetWaitEventFunc(GUI_X_WaitEvent);
alindvall 0:582739e02e4d 150 GUI_SetWaitEventTimedFunc(GUI_X_WaitEventTimed);
alindvall 0:582739e02e4d 151 }
alindvall 0:582739e02e4d 152
alindvall 0:582739e02e4d 153 /*********************************************************************
alindvall 0:582739e02e4d 154 *
alindvall 0:582739e02e4d 155 * LCD_X_Config
alindvall 0:582739e02e4d 156 *
alindvall 0:582739e02e4d 157 * Purpose:
alindvall 0:582739e02e4d 158 * Called during the initialization process in order to set up the
alindvall 0:582739e02e4d 159 * display driver configuration.
alindvall 0:582739e02e4d 160 */
alindvall 0:582739e02e4d 161 void LCD_X_Config(void) {
alindvall 0:582739e02e4d 162
alindvall 0:582739e02e4d 163 if (_hal == NULL) return;
alindvall 0:582739e02e4d 164
alindvall 0:582739e02e4d 165 //
alindvall 0:582739e02e4d 166 // Initialize MultiBuffering
alindvall 0:582739e02e4d 167 //
alindvall 0:582739e02e4d 168 if (_hal->getNumFrameBuffers() > 1) {
alindvall 0:582739e02e4d 169 GUI_MULTIBUF_Config(_hal->getNumFrameBuffers());
alindvall 0:582739e02e4d 170 }
alindvall 0:582739e02e4d 171
alindvall 0:582739e02e4d 172
alindvall 0:582739e02e4d 173 GUI_DEVICE_CreateAndLink(&GUIDRV_Lin_16_API, GUICC_M565, 0, 0);
alindvall 0:582739e02e4d 174
alindvall 0:582739e02e4d 175 //
alindvall 0:582739e02e4d 176 // Display driver configuration, required for Lin-driver
alindvall 0:582739e02e4d 177 //
alindvall 0:582739e02e4d 178 LCD_SetPosEx(0, 0, 0);
alindvall 0:582739e02e4d 179 if (LCD_GetSwapXYEx(0)) {
alindvall 0:582739e02e4d 180 LCD_SetSizeEx (0, _hal->getDisplayHeight(), _hal->getDisplayWidth());
alindvall 0:582739e02e4d 181 LCD_SetVSizeEx (0, _hal->getDisplayHeight(), _hal->getDisplayWidth());
alindvall 0:582739e02e4d 182 } else {
alindvall 0:582739e02e4d 183 LCD_SetSizeEx (0, _hal->getDisplayWidth(), _hal->getDisplayHeight());
alindvall 0:582739e02e4d 184 LCD_SetVSizeEx (0, _hal->getDisplayWidth(), _hal->getDisplayHeight());
alindvall 0:582739e02e4d 185 }
alindvall 0:582739e02e4d 186 LCD_SetVRAMAddrEx(0, (void*)0);
alindvall 0:582739e02e4d 187
alindvall 0:582739e02e4d 188 // TODO: Add Custom callback routine (DMA) for copying the buffers
alindvall 0:582739e02e4d 189 // Explained in the emWin User Manual rev 5.26 section 21.4.1
alindvall 0:582739e02e4d 190 }
alindvall 0:582739e02e4d 191
alindvall 0:582739e02e4d 192 /*********************************************************************
alindvall 0:582739e02e4d 193 *
alindvall 0:582739e02e4d 194 * LCD_X_DisplayDriver
alindvall 0:582739e02e4d 195 *
alindvall 0:582739e02e4d 196 * Purpose:
alindvall 0:582739e02e4d 197 * This function is called by the display driver for several purposes.
alindvall 0:582739e02e4d 198 * To support the according task the routine needs to be adapted to
alindvall 0:582739e02e4d 199 * the display controller. Please note that the commands marked with
alindvall 0:582739e02e4d 200 * 'optional' are not cogently required and should only be adapted if
alindvall 0:582739e02e4d 201 * the display controller supports these features.
alindvall 0:582739e02e4d 202 *
alindvall 0:582739e02e4d 203 * Parameter:
alindvall 0:582739e02e4d 204 * LayerIndex - Index of layer to be configured
alindvall 0:582739e02e4d 205 * Cmd - Please refer to the details in the switch statement below
alindvall 0:582739e02e4d 206 * pData - Pointer to a LCD_X_DATA structure
alindvall 0:582739e02e4d 207 *
alindvall 0:582739e02e4d 208 * Return Value:
alindvall 0:582739e02e4d 209 * < -1 - Error
alindvall 0:582739e02e4d 210 * -1 - Command not handled
alindvall 0:582739e02e4d 211 * 0 - Ok
alindvall 0:582739e02e4d 212 */
alindvall 0:582739e02e4d 213 int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
alindvall 0:582739e02e4d 214 // LCD_X_SETORG_INFO * pSetOrg;
alindvall 0:582739e02e4d 215 int r;
alindvall 0:582739e02e4d 216 U32 TouchOrientation;
alindvall 0:582739e02e4d 217
alindvall 0:582739e02e4d 218 if (_hal == NULL) return -1;
alindvall 0:582739e02e4d 219
alindvall 0:582739e02e4d 220 switch (Cmd) {
alindvall 0:582739e02e4d 221 //
alindvall 0:582739e02e4d 222 // Required
alindvall 0:582739e02e4d 223 //
alindvall 0:582739e02e4d 224 case LCD_X_INITCONTROLLER:
alindvall 0:582739e02e4d 225 //
alindvall 0:582739e02e4d 226 // Called during the initialization process in order to set up the
alindvall 0:582739e02e4d 227 // display controller and put it into operation. If the display
alindvall 0:582739e02e4d 228 // controller is not initialized by any external routine this needs
alindvall 0:582739e02e4d 229 // to be adapted by the customer...
alindvall 0:582739e02e4d 230 //
alindvall 0:582739e02e4d 231 // ...
alindvall 0:582739e02e4d 232
alindvall 0:582739e02e4d 233 //
alindvall 0:582739e02e4d 234 // Set display size and video-RAM address
alindvall 0:582739e02e4d 235 //
alindvall 0:582739e02e4d 236 // LCD_SetSizeEx (800, 480, 0);
alindvall 0:582739e02e4d 237 // LCD_SetVSizeEx(800, 480, 0);
alindvall 0:582739e02e4d 238 LCD_SetVRAMAddrEx(0, (void*)_hal->getFrameBufferAddress());
alindvall 0:582739e02e4d 239
alindvall 0:582739e02e4d 240 TouchOrientation = (GUI_MIRROR_X * LCD_GetMirrorXEx(0)) |
alindvall 0:582739e02e4d 241 (GUI_MIRROR_Y * LCD_GetMirrorYEx(0)) |
alindvall 0:582739e02e4d 242 (GUI_SWAP_XY * LCD_GetSwapXYEx (0)) ;
alindvall 0:582739e02e4d 243 GUI_TOUCH_SetOrientation(TouchOrientation);
alindvall 0:582739e02e4d 244
alindvall 0:582739e02e4d 245 return 0;
alindvall 0:582739e02e4d 246 case LCD_X_SETORG:
alindvall 0:582739e02e4d 247 //
alindvall 0:582739e02e4d 248 // Required for setting the display origin which is passed in the 'xPos' and 'yPos' element of p
alindvall 0:582739e02e4d 249 //
alindvall 0:582739e02e4d 250
alindvall 0:582739e02e4d 251 // pSetOrg = (LCD_X_SETORG_INFO *)pData;
alindvall 0:582739e02e4d 252 // LPC_LCD->UPBASE = VRAM_ADDR_PHYS +
alindvall 0:582739e02e4d 253 // (pSetOrg->yPos * YSIZE_PHYS * /*PIXEL_WIDTH*/ 2); // Needs to be set, before LCDC is enabled
alindvall 0:582739e02e4d 254
alindvall 0:582739e02e4d 255 return 0;
alindvall 0:582739e02e4d 256 case LCD_X_SHOWBUFFER:
alindvall 0:582739e02e4d 257 {
alindvall 0:582739e02e4d 258 LCD_X_SHOWBUFFER_INFO * p = (LCD_X_SHOWBUFFER_INFO *)pData;
alindvall 0:582739e02e4d 259 //
alindvall 0:582739e02e4d 260 // Calculate address of the given buffer
alindvall 0:582739e02e4d 261 //
alindvall 0:582739e02e4d 262 //unsigned long BufferSize = (XSIZE * YSIZE * BITSPERPIXEL) / 8;
alindvall 0:582739e02e4d 263 //unsigned long Addr = _VRamBaseAddr + ewGui->getFrameBufferSize() * pData->Index;
alindvall 0:582739e02e4d 264 //
alindvall 0:582739e02e4d 265 // Make the given buffer visible
alindvall 0:582739e02e4d 266 //
alindvall 0:582739e02e4d 267 _hal->showFrameBuffer(p->Index);
alindvall 0:582739e02e4d 268 //
alindvall 0:582739e02e4d 269 // Send a confirmation that the buffer is visible now
alindvall 0:582739e02e4d 270 //
alindvall 0:582739e02e4d 271 GUI_MULTIBUF_Confirm(p->Index);
alindvall 0:582739e02e4d 272 }
alindvall 0:582739e02e4d 273 return 0;
alindvall 0:582739e02e4d 274 default:
alindvall 0:582739e02e4d 275 r = -1;
alindvall 0:582739e02e4d 276 }
alindvall 0:582739e02e4d 277
alindvall 0:582739e02e4d 278 return r;
alindvall 0:582739e02e4d 279 }
alindvall 0:582739e02e4d 280
alindvall 0:582739e02e4d 281
alindvall 0:582739e02e4d 282
alindvall 0:582739e02e4d 283 /*********************************************************************
alindvall 0:582739e02e4d 284 *
alindvall 0:582739e02e4d 285 * Timing:
alindvall 0:582739e02e4d 286 * GUI_X_GetTime()
alindvall 0:582739e02e4d 287 * GUI_X_Delay(int)
alindvall 0:582739e02e4d 288 *
alindvall 0:582739e02e4d 289 * Some timing dependent routines require a GetTime and delay function.
alindvall 0:582739e02e4d 290 * Default time unit (tick), normally is 1 ms.
alindvall 0:582739e02e4d 291 */
alindvall 0:582739e02e4d 292
alindvall 0:582739e02e4d 293 int GUI_X_GetTime(void) {
alindvall 0:582739e02e4d 294 int t = _ewTimer.read_ms();
alindvall 0:582739e02e4d 295 if (t > 3600000) {
alindvall 0:582739e02e4d 296 // reset once per hour
alindvall 0:582739e02e4d 297 _ewTimer.reset();
alindvall 0:582739e02e4d 298 _gettimeoffset += t;
alindvall 0:582739e02e4d 299 t = 0;
alindvall 0:582739e02e4d 300 }
alindvall 0:582739e02e4d 301 return t + _gettimeoffset;
alindvall 0:582739e02e4d 302 }
alindvall 0:582739e02e4d 303
alindvall 0:582739e02e4d 304 void GUI_X_Delay(int ms) {
alindvall 0:582739e02e4d 305 Thread::wait(ms);
alindvall 0:582739e02e4d 306 }
alindvall 0:582739e02e4d 307
alindvall 0:582739e02e4d 308 /*********************************************************************
alindvall 0:582739e02e4d 309 *
alindvall 0:582739e02e4d 310 * GUI_X_Init()
alindvall 0:582739e02e4d 311 *
alindvall 0:582739e02e4d 312 * Note:
alindvall 0:582739e02e4d 313 * GUI_X_Init() is called from GUI_Init is a possibility to init
alindvall 0:582739e02e4d 314 * some hardware which needs to be up and running before the GUI.
alindvall 0:582739e02e4d 315 * If not required, leave this routine blank.
alindvall 0:582739e02e4d 316 */
alindvall 0:582739e02e4d 317 void GUI_X_Init(void) {
alindvall 0:582739e02e4d 318 _ewTimer.start();
alindvall 0:582739e02e4d 319 }
alindvall 0:582739e02e4d 320
alindvall 0:582739e02e4d 321
alindvall 0:582739e02e4d 322 /*********************************************************************
alindvall 0:582739e02e4d 323 *
alindvall 0:582739e02e4d 324 * GUI_X_ExecIdle
alindvall 0:582739e02e4d 325 *
alindvall 0:582739e02e4d 326 * Note:
alindvall 0:582739e02e4d 327 * Called if WM is in idle state
alindvall 0:582739e02e4d 328 */
alindvall 0:582739e02e4d 329
alindvall 0:582739e02e4d 330 void GUI_X_ExecIdle(void) {}
alindvall 0:582739e02e4d 331
alindvall 0:582739e02e4d 332 /*********************************************************************
alindvall 0:582739e02e4d 333 *
alindvall 0:582739e02e4d 334 * Multitasking:
alindvall 0:582739e02e4d 335 *
alindvall 0:582739e02e4d 336 * GUI_X_InitOS()
alindvall 0:582739e02e4d 337 * GUI_X_GetTaskId()
alindvall 0:582739e02e4d 338 * GUI_X_Lock()
alindvall 0:582739e02e4d 339 * GUI_X_Unlock()
alindvall 0:582739e02e4d 340 *
alindvall 0:582739e02e4d 341 * Note:
alindvall 0:582739e02e4d 342 * The following routines are required only if emWin is used in a
alindvall 0:582739e02e4d 343 * true multi task environment, which means you have more than one
alindvall 0:582739e02e4d 344 * thread using the emWin API.
alindvall 0:582739e02e4d 345 * In this case the
alindvall 0:582739e02e4d 346 * #define GUI_OS 1
alindvall 0:582739e02e4d 347 * needs to be in GUIConf.h
alindvall 0:582739e02e4d 348 */
alindvall 0:582739e02e4d 349
alindvall 0:582739e02e4d 350
alindvall 0:582739e02e4d 351 static void emTimeout(void const* args) {
alindvall 0:582739e02e4d 352 GUI_X_SignalEvent();
alindvall 0:582739e02e4d 353 }
alindvall 0:582739e02e4d 354
alindvall 0:582739e02e4d 355 void GUI_X_InitOS(void) {
alindvall 0:582739e02e4d 356 _emSem = new Semaphore(1);
alindvall 0:582739e02e4d 357 }
alindvall 0:582739e02e4d 358
alindvall 0:582739e02e4d 359 void GUI_X_Unlock(void) {
alindvall 0:582739e02e4d 360 _emSem->release();
alindvall 0:582739e02e4d 361 }
alindvall 0:582739e02e4d 362
alindvall 0:582739e02e4d 363 void GUI_X_Lock(void) {
alindvall 0:582739e02e4d 364 _emSem->wait();
alindvall 0:582739e02e4d 365 }
alindvall 0:582739e02e4d 366
alindvall 0:582739e02e4d 367 U32 GUI_X_GetTaskId(void) {
alindvall 0:582739e02e4d 368 return (U32)Thread::gettid();
alindvall 0:582739e02e4d 369 }
alindvall 0:582739e02e4d 370
alindvall 0:582739e02e4d 371 void GUI_X_WaitEvent(void) {
alindvall 0:582739e02e4d 372 Thread::signal_wait(EMWIN_TASK_SIGNAL); //wait forever
alindvall 0:582739e02e4d 373 }
alindvall 0:582739e02e4d 374
alindvall 0:582739e02e4d 375 void GUI_X_SignalEvent(void) {
alindvall 0:582739e02e4d 376 if (_emTask) {
alindvall 0:582739e02e4d 377 osSignalSet(_emTask, EMWIN_TASK_SIGNAL);
alindvall 0:582739e02e4d 378 }
alindvall 0:582739e02e4d 379 }
alindvall 0:582739e02e4d 380
alindvall 0:582739e02e4d 381 void GUI_X_WaitEventTimed(int Period) {
alindvall 0:582739e02e4d 382 static RtosTimer _emTim(emTimeout, osTimerOnce);
alindvall 0:582739e02e4d 383 if (Period > 0) {
alindvall 0:582739e02e4d 384
alindvall 0:582739e02e4d 385 //wait no more than Period milliseconds
alindvall 0:582739e02e4d 386 _emTim.start(Period);
alindvall 0:582739e02e4d 387 Thread::signal_wait(EMWIN_TASK_SIGNAL);
alindvall 0:582739e02e4d 388 _emTim.stop();
alindvall 0:582739e02e4d 389 }
alindvall 0:582739e02e4d 390 }
alindvall 0:582739e02e4d 391
alindvall 0:582739e02e4d 392 /*********************************************************************
alindvall 0:582739e02e4d 393 *
alindvall 0:582739e02e4d 394 * Logging: OS dependent
alindvall 0:582739e02e4d 395
alindvall 0:582739e02e4d 396 Note:
alindvall 0:582739e02e4d 397 Logging is used in higher debug levels only. The typical target
alindvall 0:582739e02e4d 398 build does not use logging and does therefor not require any of
alindvall 0:582739e02e4d 399 the logging routines below. For a release build without logging
alindvall 0:582739e02e4d 400 the routines below may be eliminated to save some space.
alindvall 0:582739e02e4d 401 (If the linker is not function aware and eliminates unreferenced
alindvall 0:582739e02e4d 402 functions automatically)
alindvall 0:582739e02e4d 403
alindvall 0:582739e02e4d 404 */
alindvall 0:582739e02e4d 405
alindvall 0:582739e02e4d 406 void GUI_X_Log (const char *s) { DMBoard::instance().logger()->printf("emWin[Log] %s\n", s); }
alindvall 0:582739e02e4d 407 void GUI_X_Warn (const char *s) { DMBoard::instance().logger()->printf("emWin[Log] %s\n", s); }
alindvall 0:582739e02e4d 408 void GUI_X_ErrorOut(const char *s) { DMBoard::instance().logger()->printf("emWin[Log] %s\n", s); }
alindvall 0:582739e02e4d 409
alindvall 0:582739e02e4d 410
alindvall 0:582739e02e4d 411
alindvall 0:582739e02e4d 412 /*********************************************************************
alindvall 0:582739e02e4d 413 *
alindvall 0:582739e02e4d 414 * GUI_TOUCH_X_ActivateX()
alindvall 0:582739e02e4d 415 *
alindvall 0:582739e02e4d 416 * Function decription:
alindvall 0:582739e02e4d 417 * Called from GUI, if touch support is enabled.
alindvall 0:582739e02e4d 418 * Switches on voltage on X-axis,
alindvall 0:582739e02e4d 419 * prepares measurement for Y-axis.
alindvall 0:582739e02e4d 420 * Voltage on Y-axis is switched off.
alindvall 0:582739e02e4d 421 */
alindvall 0:582739e02e4d 422 void GUI_TOUCH_X_ActivateX(void) {
alindvall 0:582739e02e4d 423 }
alindvall 0:582739e02e4d 424
alindvall 0:582739e02e4d 425 /*********************************************************************
alindvall 0:582739e02e4d 426 *
alindvall 0:582739e02e4d 427 * GUI_TOUCH_X_ActivateY()
alindvall 0:582739e02e4d 428 *
alindvall 0:582739e02e4d 429 * Function decription:
alindvall 0:582739e02e4d 430 * Called from GUI, if touch support is enabled.
alindvall 0:582739e02e4d 431 * Switches on voltage on Y-axis,
alindvall 0:582739e02e4d 432 * prepares measurement for X-axis.
alindvall 0:582739e02e4d 433 * Voltage on X-axis is switched off.
alindvall 0:582739e02e4d 434 */
alindvall 0:582739e02e4d 435 void GUI_TOUCH_X_ActivateY(void) {
alindvall 0:582739e02e4d 436 }
alindvall 0:582739e02e4d 437
alindvall 0:582739e02e4d 438 /*********************************************************************
alindvall 0:582739e02e4d 439 *
alindvall 0:582739e02e4d 440 * GUI_TOUCH_X_MeasureX()
alindvall 0:582739e02e4d 441 *
alindvall 0:582739e02e4d 442 * Function decription:
alindvall 0:582739e02e4d 443 * Called from GUI, if touch support is enabled.
alindvall 0:582739e02e4d 444 * Measures voltage of X-axis.
alindvall 0:582739e02e4d 445 */
alindvall 0:582739e02e4d 446 int GUI_TOUCH_X_MeasureX(void) {
alindvall 0:582739e02e4d 447 if (_hal == NULL) return 0;
alindvall 0:582739e02e4d 448
alindvall 0:582739e02e4d 449 return _hal->getTouchX();
alindvall 0:582739e02e4d 450 }
alindvall 0:582739e02e4d 451
alindvall 0:582739e02e4d 452 /*********************************************************************
alindvall 0:582739e02e4d 453 *
alindvall 0:582739e02e4d 454 * GUI_TOUCH_X_MeasureY()
alindvall 0:582739e02e4d 455 *
alindvall 0:582739e02e4d 456 * Function decription:
alindvall 0:582739e02e4d 457 * Called from GUI, if touch support is enabled.
alindvall 0:582739e02e4d 458 * Measures voltage of Y-axis.
alindvall 0:582739e02e4d 459 */
alindvall 0:582739e02e4d 460 int GUI_TOUCH_X_MeasureY(void) {
alindvall 0:582739e02e4d 461 if (_hal == NULL) return 0;
alindvall 0:582739e02e4d 462
alindvall 0:582739e02e4d 463 return _hal->getTouchY();
alindvall 0:582739e02e4d 464 }
alindvall 0:582739e02e4d 465
alindvall 0:582739e02e4d 466
alindvall 0:582739e02e4d 467
alindvall 0:582739e02e4d 468