Demo for Embedded World 2015.
Dependencies: DMBasicGUI DMSupport
Demo running on several LPC4088 Display Modules on the Embedded World 2015 exhibition.
Information
To run the demo first drag-n-drop the to_sync.fs3 file to the MBED drive and then drag-n-drop the demo itself. This way both the file system and software are up to date.
This is what the launcher will look like:
AppDraw.cpp@1:1a01ef434a72, 2019-11-05 (annotated)
- Committer:
- embeddedartists
- Date:
- Tue Nov 05 08:20:16 2019 +0000
- Revision:
- 1:1a01ef434a72
- Parent:
- 0:6bd24cbb88a1
Updates related to mbed OS 5
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alindvall | 0:6bd24cbb88a1 | 1 | /* |
alindvall | 0:6bd24cbb88a1 | 2 | * Copyright 2014 Embedded Artists AB |
alindvall | 0:6bd24cbb88a1 | 3 | * |
alindvall | 0:6bd24cbb88a1 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
alindvall | 0:6bd24cbb88a1 | 5 | * you may not use this file except in compliance with the License. |
alindvall | 0:6bd24cbb88a1 | 6 | * You may obtain a copy of the License at |
alindvall | 0:6bd24cbb88a1 | 7 | * |
alindvall | 0:6bd24cbb88a1 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
alindvall | 0:6bd24cbb88a1 | 9 | * |
alindvall | 0:6bd24cbb88a1 | 10 | * Unless required by applicable law or agreed to in writing, software |
alindvall | 0:6bd24cbb88a1 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
alindvall | 0:6bd24cbb88a1 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
alindvall | 0:6bd24cbb88a1 | 13 | * See the License for the specific language governing permissions and |
alindvall | 0:6bd24cbb88a1 | 14 | * limitations under the License. |
alindvall | 0:6bd24cbb88a1 | 15 | */ |
alindvall | 0:6bd24cbb88a1 | 16 | |
alindvall | 0:6bd24cbb88a1 | 17 | |
alindvall | 0:6bd24cbb88a1 | 18 | #include "mbed.h" |
alindvall | 0:6bd24cbb88a1 | 19 | #include "EthernetInterface.h" |
alindvall | 0:6bd24cbb88a1 | 20 | #include "AppDraw.h" |
alindvall | 0:6bd24cbb88a1 | 21 | #include "lpc_swim_font.h" |
alindvall | 0:6bd24cbb88a1 | 22 | #include "lpc_colors.h" |
alindvall | 0:6bd24cbb88a1 | 23 | #include "image_data.h" |
alindvall | 0:6bd24cbb88a1 | 24 | |
alindvall | 0:6bd24cbb88a1 | 25 | /****************************************************************************** |
alindvall | 0:6bd24cbb88a1 | 26 | * Defines and typedefs |
alindvall | 0:6bd24cbb88a1 | 27 | *****************************************************************************/ |
alindvall | 0:6bd24cbb88a1 | 28 | |
alindvall | 0:6bd24cbb88a1 | 29 | #define BOX_SIDE 192 //256 |
alindvall | 0:6bd24cbb88a1 | 30 | |
alindvall | 0:6bd24cbb88a1 | 31 | #define BTN_WIDTH 65 |
alindvall | 0:6bd24cbb88a1 | 32 | #define BTN_HEIGHT 40 |
alindvall | 0:6bd24cbb88a1 | 33 | #define BTN_OFF 20 |
alindvall | 0:6bd24cbb88a1 | 34 | |
alindvall | 0:6bd24cbb88a1 | 35 | /****************************************************************************** |
alindvall | 0:6bd24cbb88a1 | 36 | * Local variables |
alindvall | 0:6bd24cbb88a1 | 37 | *****************************************************************************/ |
alindvall | 0:6bd24cbb88a1 | 38 | |
alindvall | 0:6bd24cbb88a1 | 39 | static const COLOR_T COLORS[] = { |
alindvall | 0:6bd24cbb88a1 | 40 | RED, |
alindvall | 0:6bd24cbb88a1 | 41 | GREEN, |
alindvall | 0:6bd24cbb88a1 | 42 | BLUE, |
alindvall | 0:6bd24cbb88a1 | 43 | CYAN, |
alindvall | 0:6bd24cbb88a1 | 44 | MAGENTA, |
alindvall | 0:6bd24cbb88a1 | 45 | YELLOW, |
alindvall | 0:6bd24cbb88a1 | 46 | BLACK, |
alindvall | 0:6bd24cbb88a1 | 47 | }; |
alindvall | 0:6bd24cbb88a1 | 48 | |
alindvall | 0:6bd24cbb88a1 | 49 | /****************************************************************************** |
alindvall | 0:6bd24cbb88a1 | 50 | * Private functions |
alindvall | 0:6bd24cbb88a1 | 51 | *****************************************************************************/ |
alindvall | 0:6bd24cbb88a1 | 52 | |
alindvall | 0:6bd24cbb88a1 | 53 | static void buttonClicked(uint32_t x) |
alindvall | 0:6bd24cbb88a1 | 54 | { |
alindvall | 0:6bd24cbb88a1 | 55 | bool* done = (bool*)x; |
alindvall | 0:6bd24cbb88a1 | 56 | *done = true; |
alindvall | 0:6bd24cbb88a1 | 57 | } |
alindvall | 0:6bd24cbb88a1 | 58 | |
alindvall | 0:6bd24cbb88a1 | 59 | void AppDraw::draw() |
alindvall | 0:6bd24cbb88a1 | 60 | { |
alindvall | 0:6bd24cbb88a1 | 61 | // Prepare fullscreen |
alindvall | 0:6bd24cbb88a1 | 62 | swim_window_open(_win, |
alindvall | 0:6bd24cbb88a1 | 63 | _disp->width(), _disp->height(), // full size |
alindvall | 0:6bd24cbb88a1 | 64 | (COLOR_T*)_fb, |
alindvall | 0:6bd24cbb88a1 | 65 | 0,0,_disp->width()-1, _disp->height()-1, // window position and size |
alindvall | 0:6bd24cbb88a1 | 66 | 0, // border |
alindvall | 0:6bd24cbb88a1 | 67 | WHITE, WHITE, BLACK); // colors: pen, backgr, forgr |
alindvall | 0:6bd24cbb88a1 | 68 | |
alindvall | 0:6bd24cbb88a1 | 69 | _btn = new ImageButton(_win->fb, _win->xpmax - BTN_OFF - BTN_WIDTH, _win->ypmax - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT); |
alindvall | 0:6bd24cbb88a1 | 70 | _btn->loadImages(img_ok, img_size_ok); |
alindvall | 0:6bd24cbb88a1 | 71 | _btn->draw(); |
alindvall | 0:6bd24cbb88a1 | 72 | } |
alindvall | 0:6bd24cbb88a1 | 73 | |
alindvall | 0:6bd24cbb88a1 | 74 | /****************************************************************************** |
alindvall | 0:6bd24cbb88a1 | 75 | * Public functions |
alindvall | 0:6bd24cbb88a1 | 76 | *****************************************************************************/ |
alindvall | 0:6bd24cbb88a1 | 77 | |
alindvall | 0:6bd24cbb88a1 | 78 | AppDraw::AppDraw() : _disp(NULL), _win(NULL), _fb(NULL), _btn(NULL) |
alindvall | 0:6bd24cbb88a1 | 79 | { |
alindvall | 0:6bd24cbb88a1 | 80 | } |
alindvall | 0:6bd24cbb88a1 | 81 | |
alindvall | 0:6bd24cbb88a1 | 82 | AppDraw::~AppDraw() |
alindvall | 0:6bd24cbb88a1 | 83 | { |
alindvall | 0:6bd24cbb88a1 | 84 | teardown(); |
alindvall | 0:6bd24cbb88a1 | 85 | } |
alindvall | 0:6bd24cbb88a1 | 86 | |
alindvall | 0:6bd24cbb88a1 | 87 | bool AppDraw::setup() |
alindvall | 0:6bd24cbb88a1 | 88 | { |
alindvall | 0:6bd24cbb88a1 | 89 | _disp = DMBoard::instance().display(); |
alindvall | 0:6bd24cbb88a1 | 90 | _win = (SWIM_WINDOW_T*)malloc(sizeof(SWIM_WINDOW_T)); |
alindvall | 0:6bd24cbb88a1 | 91 | _fb = _disp->allocateFramebuffer(); |
alindvall | 0:6bd24cbb88a1 | 92 | |
alindvall | 0:6bd24cbb88a1 | 93 | return (_win != NULL && _fb != NULL); |
alindvall | 0:6bd24cbb88a1 | 94 | } |
alindvall | 0:6bd24cbb88a1 | 95 | |
alindvall | 0:6bd24cbb88a1 | 96 | void AppDraw::runToCompletion() |
alindvall | 0:6bd24cbb88a1 | 97 | { |
alindvall | 0:6bd24cbb88a1 | 98 | // Alternative 1: use the calling thread's context to run in |
alindvall | 0:6bd24cbb88a1 | 99 | bool done = false; |
alindvall | 0:6bd24cbb88a1 | 100 | draw(); |
alindvall | 0:6bd24cbb88a1 | 101 | _btn->setAction(buttonClicked, (uint32_t)&done); |
alindvall | 0:6bd24cbb88a1 | 102 | void* oldFB = _disp->swapFramebuffer(_fb); |
alindvall | 0:6bd24cbb88a1 | 103 | |
alindvall | 0:6bd24cbb88a1 | 104 | // Wait for touches |
alindvall | 0:6bd24cbb88a1 | 105 | TouchPanel* touch = DMBoard::instance().touchPanel(); |
alindvall | 0:6bd24cbb88a1 | 106 | bool ignore; |
alindvall | 0:6bd24cbb88a1 | 107 | int fingers = 0; |
alindvall | 0:6bd24cbb88a1 | 108 | touch->info(&ignore, &fingers, &ignore); |
alindvall | 0:6bd24cbb88a1 | 109 | if (fingers > MaxSupportedFingers) { |
alindvall | 0:6bd24cbb88a1 | 110 | fingers = MaxSupportedFingers; |
alindvall | 0:6bd24cbb88a1 | 111 | } |
alindvall | 0:6bd24cbb88a1 | 112 | while(!done) { |
alindvall | 0:6bd24cbb88a1 | 113 | // wait for a new touch signal (signal is sent from AppLauncher, |
alindvall | 0:6bd24cbb88a1 | 114 | // which listens for touch events) |
alindvall | 0:6bd24cbb88a1 | 115 | Thread::signal_wait(0x1); |
alindvall | 0:6bd24cbb88a1 | 116 | if (touch->read(_coords, fingers) == TouchPanel::TouchError_Ok) { |
alindvall | 0:6bd24cbb88a1 | 117 | for (int i = 0; i < fingers; i++) { |
alindvall | 0:6bd24cbb88a1 | 118 | if (_coords[i].z > 0) { |
alindvall | 0:6bd24cbb88a1 | 119 | _win->pen = COLORS[i]; |
alindvall | 0:6bd24cbb88a1 | 120 | swim_put_circle(_win, _coords[i].x, _coords[i].y, 2, 1); |
alindvall | 0:6bd24cbb88a1 | 121 | } |
alindvall | 0:6bd24cbb88a1 | 122 | } |
alindvall | 0:6bd24cbb88a1 | 123 | if (_btn->handle(_coords[0].x, _coords[0].y, _coords[0].z > 0)) { |
alindvall | 0:6bd24cbb88a1 | 124 | _btn->draw(); |
alindvall | 0:6bd24cbb88a1 | 125 | } |
alindvall | 0:6bd24cbb88a1 | 126 | } |
alindvall | 0:6bd24cbb88a1 | 127 | } |
alindvall | 0:6bd24cbb88a1 | 128 | |
alindvall | 0:6bd24cbb88a1 | 129 | // User has clicked the button, restore the original FB |
alindvall | 0:6bd24cbb88a1 | 130 | _disp->swapFramebuffer(oldFB); |
alindvall | 0:6bd24cbb88a1 | 131 | swim_window_close(_win); |
alindvall | 0:6bd24cbb88a1 | 132 | } |
alindvall | 0:6bd24cbb88a1 | 133 | |
alindvall | 0:6bd24cbb88a1 | 134 | bool AppDraw::teardown() |
alindvall | 0:6bd24cbb88a1 | 135 | { |
alindvall | 0:6bd24cbb88a1 | 136 | if (_win != NULL) { |
alindvall | 0:6bd24cbb88a1 | 137 | free(_win); |
alindvall | 0:6bd24cbb88a1 | 138 | _win = NULL; |
alindvall | 0:6bd24cbb88a1 | 139 | } |
alindvall | 0:6bd24cbb88a1 | 140 | if (_fb != NULL) { |
alindvall | 0:6bd24cbb88a1 | 141 | free(_fb); |
alindvall | 0:6bd24cbb88a1 | 142 | _fb = NULL; |
alindvall | 0:6bd24cbb88a1 | 143 | } |
alindvall | 0:6bd24cbb88a1 | 144 | if (_btn != NULL) { |
alindvall | 0:6bd24cbb88a1 | 145 | delete _btn; |
alindvall | 0:6bd24cbb88a1 | 146 | _btn = NULL; |
alindvall | 0:6bd24cbb88a1 | 147 | } |
alindvall | 0:6bd24cbb88a1 | 148 | return true; |
alindvall | 0:6bd24cbb88a1 | 149 | } |
alindvall | 0:6bd24cbb88a1 | 150 |