Wei Chang Shen / DMemWin

Dependencies:   emwin_lib

Fork of DMemWin by Embedded Artists

Committer:
destinyXfate
Date:
Thu Jun 02 04:55:08 2016 +0000
Revision:
4:20387dbf7ecf
Parent:
0:582739e02e4d
;

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