Example using the support package for LPC4088 DisplayModule

Dependencies:   DMBasicGUI DMSupport

Example using a lot of the features in the software package for the LPC4088 Display Module.

This project can be selected as a template when creating a new project based on the LPC4088 Display Module.

Information

This project works on the 4.3" display modules.

Some of the apps works on the 5" display modules. The ImageViewer and Slideshow app will show the images distorted as it does not take the resolution into consideration.

Information

The USB Status app is disabled. The Image viewer looks for images in the root of SD cards, USB memory sticks or the file system on the QSPI flash. The Slideshow app expects to find a slideshow script in /mci/elec14/ea_logo.txt.

This is what it looks like on the 4.3" display:

/media/uploads/embeddedartists/everything_cap_000.png /media/uploads/embeddedartists/everything_cap_001.png /media/uploads/embeddedartists/everything_cap_003.png /media/uploads/embeddedartists/everything_cap_004.png /media/uploads/embeddedartists/everything_cap_006.png /media/uploads/embeddedartists/everything_cap_008.png

Committer:
embeddedartists
Date:
Mon Nov 04 14:33:29 2019 +0000
Revision:
30:e1cded731965
Parent:
27:4fe24decabf9
More updates related to mbed OS 5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
embeddedartists 18:715f542538b3 1 /*
embeddedartists 18:715f542538b3 2 * Copyright 2014 Embedded Artists AB
embeddedartists 18:715f542538b3 3 *
embeddedartists 18:715f542538b3 4 * Licensed under the Apache License, Version 2.0 (the "License");
embeddedartists 18:715f542538b3 5 * you may not use this file except in compliance with the License.
embeddedartists 18:715f542538b3 6 * You may obtain a copy of the License at
embeddedartists 18:715f542538b3 7 *
embeddedartists 18:715f542538b3 8 * http://www.apache.org/licenses/LICENSE-2.0
embeddedartists 18:715f542538b3 9 *
embeddedartists 18:715f542538b3 10 * Unless required by applicable law or agreed to in writing, software
embeddedartists 18:715f542538b3 11 * distributed under the License is distributed on an "AS IS" BASIS,
embeddedartists 18:715f542538b3 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
embeddedartists 18:715f542538b3 13 * See the License for the specific language governing permissions and
embeddedartists 18:715f542538b3 14 * limitations under the License.
embeddedartists 18:715f542538b3 15 */
embeddedartists 18:715f542538b3 16
embeddedartists 18:715f542538b3 17
embeddedartists 18:715f542538b3 18 #include "mbed.h"
embeddedartists 18:715f542538b3 19 #include "AppRTCSettings.h"
embeddedartists 18:715f542538b3 20 #include "lpc_swim_font.h"
embeddedartists 18:715f542538b3 21 #include "image_data.h"
embeddedartists 18:715f542538b3 22
embeddedartists 18:715f542538b3 23 /******************************************************************************
embeddedartists 18:715f542538b3 24 * Defines and typedefs
embeddedartists 18:715f542538b3 25 *****************************************************************************/
embeddedartists 18:715f542538b3 26
embeddedartists 18:715f542538b3 27 #define BTN_WIDTH 40
embeddedartists 18:715f542538b3 28 #define BTN_HEIGHT 40
embeddedartists 18:715f542538b3 29 #define BTN_OFF 20
embeddedartists 18:715f542538b3 30
embeddedartists 18:715f542538b3 31 #define ARROW_WIDTH 52
embeddedartists 18:715f542538b3 32 #define ARROW_HEIGHT 52
embeddedartists 18:715f542538b3 33
embeddedartists 18:715f542538b3 34 /******************************************************************************
embeddedartists 18:715f542538b3 35 * Private variables
embeddedartists 18:715f542538b3 36 *****************************************************************************/
embeddedartists 18:715f542538b3 37
embeddedartists 18:715f542538b3 38 // Ugly but needed for callbacks
embeddedartists 18:715f542538b3 39 static AppRTCSettings* theApp = NULL;
embeddedartists 18:715f542538b3 40
embeddedartists 18:715f542538b3 41 /******************************************************************************
embeddedartists 18:715f542538b3 42 * Private functions
embeddedartists 18:715f542538b3 43 *****************************************************************************/
embeddedartists 18:715f542538b3 44
embeddedartists 18:715f542538b3 45 static void buttonClicked(uint32_t x)
embeddedartists 18:715f542538b3 46 {
embeddedartists 18:715f542538b3 47 bool* done = (bool*)x;
embeddedartists 18:715f542538b3 48 *done = true;
embeddedartists 18:715f542538b3 49 }
embeddedartists 18:715f542538b3 50
embeddedartists 18:715f542538b3 51 static void fieldClicked(uint32_t x)
embeddedartists 18:715f542538b3 52 {
embeddedartists 18:715f542538b3 53 if (theApp != NULL) {
embeddedartists 18:715f542538b3 54 theApp->setActiveField(x);
embeddedartists 18:715f542538b3 55 }
embeddedartists 18:715f542538b3 56 }
embeddedartists 18:715f542538b3 57
embeddedartists 18:715f542538b3 58 static void increaseValue(uint32_t x)
embeddedartists 18:715f542538b3 59 {
embeddedartists 18:715f542538b3 60 AppRTCSettings* app = (AppRTCSettings*)x;
embeddedartists 18:715f542538b3 61 app->modifyValue(1);
embeddedartists 18:715f542538b3 62 }
embeddedartists 18:715f542538b3 63
embeddedartists 18:715f542538b3 64 static void decreaseValue(uint32_t x)
embeddedartists 18:715f542538b3 65 {
embeddedartists 18:715f542538b3 66 AppRTCSettings* app = (AppRTCSettings*)x;
embeddedartists 18:715f542538b3 67 app->modifyValue(-1);
embeddedartists 18:715f542538b3 68 }
embeddedartists 18:715f542538b3 69
embeddedartists 18:715f542538b3 70 static void nextField(uint32_t x)
embeddedartists 18:715f542538b3 71 {
embeddedartists 18:715f542538b3 72 AppRTCSettings* app = (AppRTCSettings*)x;
embeddedartists 18:715f542538b3 73 app->changeActiveField(true);
embeddedartists 18:715f542538b3 74 }
embeddedartists 18:715f542538b3 75
embeddedartists 18:715f542538b3 76 static void prevField(uint32_t x)
embeddedartists 18:715f542538b3 77 {
embeddedartists 18:715f542538b3 78 AppRTCSettings* app = (AppRTCSettings*)x;
embeddedartists 18:715f542538b3 79 app->changeActiveField(false);
embeddedartists 18:715f542538b3 80 }
embeddedartists 18:715f542538b3 81
embeddedartists 18:715f542538b3 82 void AppRTCSettings::draw()
embeddedartists 18:715f542538b3 83 {
embeddedartists 18:715f542538b3 84 // Prepare fullscreen
embeddedartists 18:715f542538b3 85 swim_window_open(_win,
embeddedartists 18:715f542538b3 86 _disp->width(), _disp->height(), // full size
embeddedartists 18:715f542538b3 87 (COLOR_T*)_fb,
embeddedartists 18:715f542538b3 88 0,0,_disp->width()-1, _disp->height()-1, // window position and size
embeddedartists 18:715f542538b3 89 1, // border
embeddedartists 18:715f542538b3 90 GREEN,WHITE,BLACK);/*WHITE, RED, BLACK);*/ // colors: pen, backgr, forgr
embeddedartists 18:715f542538b3 91 swim_set_pen_color(_win, BLACK);
embeddedartists 18:715f542538b3 92 swim_set_title(_win, "Real Time Clock Settings", GREEN);
embeddedartists 18:715f542538b3 93 swim_set_pen_color(_win, GREEN);
embeddedartists 18:715f542538b3 94
embeddedartists 18:715f542538b3 95 //_buttons[ButtonDone] = new Button("Done", _win->fb, _win->xpmax - BTN_OFF - BTN_WIDTH, _win->ypmax - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT);
embeddedartists 18:715f542538b3 96
embeddedartists 18:715f542538b3 97 ImageButton* ib;
embeddedartists 18:715f542538b3 98
embeddedartists 18:715f542538b3 99 ib = new ImageButton(_win->fb, _win->xpmax - 2*BTN_OFF - 2*BTN_WIDTH, _win->ypmax - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT);
embeddedartists 18:715f542538b3 100 ib->loadImages(img_ok, img_size_ok);
embeddedartists 18:715f542538b3 101 ib->draw();
embeddedartists 18:715f542538b3 102 _buttons[ButtonOk] = ib;
embeddedartists 18:715f542538b3 103 ib = new ImageButton(_win->fb, _win->xpmax - BTN_OFF - BTN_WIDTH, _win->ypmax - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT);
embeddedartists 18:715f542538b3 104 ib->loadImages(img_cancel, img_size_cancel);
embeddedartists 18:715f542538b3 105 ib->draw();
embeddedartists 18:715f542538b3 106 _buttons[ButtonCancel] = ib;
embeddedartists 18:715f542538b3 107
embeddedartists 18:715f542538b3 108 ib = new ImageButton(_win->fb, 300, 40, ARROW_WIDTH, ARROW_HEIGHT);
embeddedartists 18:715f542538b3 109 ib->loadImages(img_arrow_up, img_size_arrow_up);
embeddedartists 18:715f542538b3 110 ib->setAction(increaseValue, (uint32_t)this);
embeddedartists 18:715f542538b3 111 ib->draw();
embeddedartists 18:715f542538b3 112 _buttons[ButtonUp] = ib;
embeddedartists 18:715f542538b3 113 ib = new ImageButton(_win->fb, 300, 40+ARROW_HEIGHT+ARROW_HEIGHT, ARROW_WIDTH, ARROW_HEIGHT);
embeddedartists 18:715f542538b3 114 ib->loadImages(img_arrow_down, img_size_arrow_down);
embeddedartists 18:715f542538b3 115 ib->setAction(decreaseValue, (uint32_t)this);
embeddedartists 18:715f542538b3 116 ib->draw();
embeddedartists 18:715f542538b3 117 _buttons[ButtonDown] = ib;
embeddedartists 18:715f542538b3 118 ib = new ImageButton(_win->fb, 300-ARROW_WIDTH/2-10, 40+ARROW_HEIGHT, ARROW_WIDTH, ARROW_HEIGHT);
embeddedartists 18:715f542538b3 119 ib->loadImages(img_arrow_left, img_size_arrow_left);
embeddedartists 18:715f542538b3 120 ib->setAction(prevField, (uint32_t)this);
embeddedartists 18:715f542538b3 121 ib->draw();
embeddedartists 18:715f542538b3 122 _buttons[ButtonLeft] = ib;
embeddedartists 18:715f542538b3 123 ib = new ImageButton(_win->fb, 300+ARROW_WIDTH/2+10, 40+ARROW_HEIGHT, ARROW_WIDTH, ARROW_HEIGHT);
embeddedartists 18:715f542538b3 124 ib->loadImages(img_arrow_right, img_size_arrow_right);
embeddedartists 18:715f542538b3 125 ib->setAction(nextField, (uint32_t)this);
embeddedartists 18:715f542538b3 126 ib->draw();
embeddedartists 18:715f542538b3 127 _buttons[ButtonRight] = ib;
embeddedartists 18:715f542538b3 128
embeddedartists 18:715f542538b3 129 // To avoid having each DigitButton deallocate the shared image
embeddedartists 18:715f542538b3 130 void* pointerToFree = _digitImage.pointerToFree;
embeddedartists 18:715f542538b3 131 _digitImage.pointerToFree = NULL;
embeddedartists 18:715f542538b3 132
embeddedartists 18:715f542538b3 133 addDateFields(0, 20);
embeddedartists 18:715f542538b3 134 addTimeFields(0, 20+65);
embeddedartists 18:715f542538b3 135
embeddedartists 18:715f542538b3 136 // Restore shared image so that it will be deallocated during teardown
embeddedartists 18:715f542538b3 137 _digitImage.pointerToFree = pointerToFree;
embeddedartists 18:715f542538b3 138
embeddedartists 18:715f542538b3 139 for (int i = 0; i < NumButtons; i++) {
embeddedartists 18:715f542538b3 140 _buttons[i]->draw();
embeddedartists 18:715f542538b3 141 }
embeddedartists 18:715f542538b3 142
embeddedartists 18:715f542538b3 143 markField(_activeField, true);
embeddedartists 18:715f542538b3 144 }
embeddedartists 18:715f542538b3 145
embeddedartists 18:715f542538b3 146 void AppRTCSettings::addDateFields(int xoff, int yoff)
embeddedartists 18:715f542538b3 147 {
embeddedartists 18:715f542538b3 148 DigitButton* db;
embeddedartists 18:715f542538b3 149
embeddedartists 18:715f542538b3 150 int y = yoff + 15;
embeddedartists 18:715f542538b3 151 int btny = y-7;
embeddedartists 18:715f542538b3 152 y += _win->ypvmin; // compensate for title bar
embeddedartists 18:715f542538b3 153 int x = xoff+20;
embeddedartists 18:715f542538b3 154 int idx = ButtonYear;
embeddedartists 18:715f542538b3 155 int btnw;
embeddedartists 18:715f542538b3 156
embeddedartists 18:715f542538b3 157 swim_put_text_xy(_win, "Year", x, y-15);
embeddedartists 18:715f542538b3 158 btnw = 65;
embeddedartists 18:715f542538b3 159 db = new DigitButton(_win->fb, x, y, btnw, 34);
embeddedartists 18:715f542538b3 160 db->loadImages(&_digitImage);//img_numbers, img_size_numbers);
embeddedartists 18:715f542538b3 161 db->setNumDigits(4);
embeddedartists 18:715f542538b3 162 db->setValue(_values[idx]);
embeddedartists 18:715f542538b3 163 db->setAction(fieldClicked, idx);
embeddedartists 18:715f542538b3 164 _buttons[idx++] = db;
embeddedartists 18:715f542538b3 165
embeddedartists 18:715f542538b3 166 x += btnw + 20;
embeddedartists 18:715f542538b3 167 btnw = 45;
embeddedartists 18:715f542538b3 168 swim_put_text_xy(_win, "Month", x, y-15);
embeddedartists 18:715f542538b3 169 db = new DigitButton(_win->fb, x, y, btnw, 34);
embeddedartists 18:715f542538b3 170 db->loadImages(&_digitImage);//img_numbers, img_size_numbers);
embeddedartists 18:715f542538b3 171 db->setNumDigits(2);
embeddedartists 18:715f542538b3 172 db->setValue(_values[idx]);
embeddedartists 18:715f542538b3 173 db->setAction(fieldClicked, idx);
embeddedartists 18:715f542538b3 174 _buttons[idx++] = db;
embeddedartists 18:715f542538b3 175 swim_put_box(_win, x-13, btny+20, x-2, btny+23);
embeddedartists 18:715f542538b3 176
embeddedartists 18:715f542538b3 177 x += btnw + 10;
embeddedartists 18:715f542538b3 178 swim_put_text_xy(_win, "Day", x, y-15);
embeddedartists 18:715f542538b3 179 db = new DigitButton(_win->fb, x, y, btnw, 34);
embeddedartists 18:715f542538b3 180 db->loadImages(&_digitImage);//img_numbers, img_size_numbers);
embeddedartists 18:715f542538b3 181 db->setNumDigits(2);
embeddedartists 18:715f542538b3 182 db->setValue(_values[idx]);
embeddedartists 18:715f542538b3 183 db->setAction(fieldClicked, idx);
embeddedartists 18:715f542538b3 184 _buttons[idx++] = db;
embeddedartists 18:715f542538b3 185 swim_put_box(_win, x-13, btny+20, x-2, btny+23);
embeddedartists 18:715f542538b3 186 }
embeddedartists 18:715f542538b3 187
embeddedartists 18:715f542538b3 188 void AppRTCSettings::addTimeFields(int xoff, int yoff)
embeddedartists 18:715f542538b3 189 {
embeddedartists 18:715f542538b3 190 DigitButton* db;
embeddedartists 18:715f542538b3 191
embeddedartists 18:715f542538b3 192 int y = yoff + 15;
embeddedartists 18:715f542538b3 193 int btny = y-7;
embeddedartists 18:715f542538b3 194 y += _win->ypvmin; // compensate for title bar
embeddedartists 18:715f542538b3 195 int x = xoff+20;
embeddedartists 18:715f542538b3 196 int idx = ButtonHour;
embeddedartists 18:715f542538b3 197 int btnw = 45;
embeddedartists 18:715f542538b3 198
embeddedartists 18:715f542538b3 199 swim_put_text_xy(_win, "Hour", x, y-15);
embeddedartists 18:715f542538b3 200 db = new DigitButton(_win->fb, x, y, btnw, 34);
embeddedartists 18:715f542538b3 201 db->loadImages(&_digitImage);//img_numbers, img_size_numbers);
embeddedartists 18:715f542538b3 202 db->setNumDigits(2);
embeddedartists 18:715f542538b3 203 db->setValue(_values[idx]);
embeddedartists 18:715f542538b3 204 db->setAction(fieldClicked, idx);
embeddedartists 18:715f542538b3 205 _buttons[idx++] = db;
embeddedartists 18:715f542538b3 206
embeddedartists 18:715f542538b3 207 x += btnw + 10;
embeddedartists 18:715f542538b3 208 swim_put_text_xy(_win, "Minutes", x, y-15);
embeddedartists 18:715f542538b3 209 db = new DigitButton(_win->fb, x, y, btnw, 34);
embeddedartists 18:715f542538b3 210 db->loadImages(&_digitImage);//img_numbers, img_size_numbers);
embeddedartists 18:715f542538b3 211 db->setNumDigits(2);
embeddedartists 18:715f542538b3 212 db->setValue(_values[idx]);
embeddedartists 18:715f542538b3 213 db->setAction(fieldClicked, idx);
embeddedartists 18:715f542538b3 214 _buttons[idx++] = db;
embeddedartists 18:715f542538b3 215 swim_put_box(_win, x-13, btny+22, x-2, btny+25);
embeddedartists 18:715f542538b3 216
embeddedartists 18:715f542538b3 217 x += btnw + 10;
embeddedartists 18:715f542538b3 218 swim_put_text_xy(_win, "Seconds", x, y-15);
embeddedartists 18:715f542538b3 219 db = new DigitButton(_win->fb, x, y, btnw, 34);
embeddedartists 18:715f542538b3 220 db->loadImages(&_digitImage);//img_numbers, img_size_numbers);
embeddedartists 18:715f542538b3 221 db->setNumDigits(2);
embeddedartists 18:715f542538b3 222 db->setValue(_values[idx]);
embeddedartists 18:715f542538b3 223 db->setAction(fieldClicked, idx);
embeddedartists 18:715f542538b3 224 _buttons[idx++] = db;
embeddedartists 18:715f542538b3 225 swim_put_box(_win, x-13, btny+22, x-2, btny+25);
embeddedartists 18:715f542538b3 226 }
embeddedartists 18:715f542538b3 227
embeddedartists 18:715f542538b3 228 void AppRTCSettings::markField(int field, bool active)
embeddedartists 18:715f542538b3 229 {
embeddedartists 18:715f542538b3 230 COLOR_T oldPen = _win->pen;
embeddedartists 18:715f542538b3 231 COLOR_T oldFill = _win->fill;
embeddedartists 18:715f542538b3 232 _win->fill = active ? BLACK : _win->bkg;
embeddedartists 18:715f542538b3 233 _win->pen = active ? BLACK : _win->bkg;
embeddedartists 18:715f542538b3 234 if (field >= 0 && field < NumFields) {
embeddedartists 18:715f542538b3 235 int x0, y0, x1, y1;
embeddedartists 18:715f542538b3 236 _buttons[field]->bounds(x0,y0,x1,y1);
embeddedartists 18:715f542538b3 237 y1 -= _win->ypvmin+1;
embeddedartists 18:715f542538b3 238 x0--;
embeddedartists 18:715f542538b3 239 swim_put_box(_win, x0, y1, x1, y1+3);
embeddedartists 18:715f542538b3 240 }
embeddedartists 18:715f542538b3 241 _win->fill = oldFill;
embeddedartists 18:715f542538b3 242 _win->pen = oldPen;
embeddedartists 18:715f542538b3 243 }
embeddedartists 18:715f542538b3 244
embeddedartists 18:715f542538b3 245 /******************************************************************************
embeddedartists 18:715f542538b3 246 * Public functions
embeddedartists 18:715f542538b3 247 *****************************************************************************/
embeddedartists 18:715f542538b3 248
embeddedartists 18:715f542538b3 249 AppRTCSettings::AppRTCSettings() : _disp(NULL), _win(NULL), _fb(NULL), _activeField(0)
embeddedartists 18:715f542538b3 250 {
embeddedartists 18:715f542538b3 251 for (int i = 0; i < NumButtons; i++) {
embeddedartists 18:715f542538b3 252 _buttons[i] = NULL;
embeddedartists 18:715f542538b3 253 }
embeddedartists 24:768f5958c308 254 time_t rawtime;
embeddedartists 24:768f5958c308 255 struct tm * timeinfo;
embeddedartists 24:768f5958c308 256
embeddedartists 24:768f5958c308 257 time (&rawtime);
embeddedartists 24:768f5958c308 258 timeinfo = localtime (&rawtime);
embeddedartists 24:768f5958c308 259
embeddedartists 24:768f5958c308 260 _values[ButtonYear] = timeinfo->tm_year + 1900;
embeddedartists 24:768f5958c308 261 _values[ButtonMonth] = timeinfo->tm_mon + 1;
embeddedartists 24:768f5958c308 262 _values[ButtonDay] = timeinfo->tm_mday;
embeddedartists 24:768f5958c308 263 _values[ButtonHour] = timeinfo->tm_hour;
embeddedartists 24:768f5958c308 264 _values[ButtonMinute] = timeinfo->tm_min;
embeddedartists 24:768f5958c308 265 _values[ButtonSecond] = timeinfo->tm_sec;
embeddedartists 18:715f542538b3 266
embeddedartists 18:715f542538b3 267 _digitImage.pointerToFree = NULL;
embeddedartists 18:715f542538b3 268
embeddedartists 18:715f542538b3 269 theApp = this;
embeddedartists 18:715f542538b3 270 }
embeddedartists 18:715f542538b3 271
embeddedartists 18:715f542538b3 272 AppRTCSettings::~AppRTCSettings()
embeddedartists 18:715f542538b3 273 {
embeddedartists 18:715f542538b3 274 theApp = NULL;
embeddedartists 18:715f542538b3 275 teardown();
embeddedartists 18:715f542538b3 276 }
embeddedartists 18:715f542538b3 277
embeddedartists 18:715f542538b3 278 bool AppRTCSettings::setup()
embeddedartists 18:715f542538b3 279 {
embeddedartists 18:715f542538b3 280 _disp = DMBoard::instance().display();
embeddedartists 18:715f542538b3 281 _win = (SWIM_WINDOW_T*)malloc(sizeof(SWIM_WINDOW_T));
embeddedartists 18:715f542538b3 282 _fb = _disp->allocateFramebuffer();
embeddedartists 18:715f542538b3 283 int res = Image::decode(img_numbers, img_size_numbers, Image::RES_16BIT, &_digitImage);
embeddedartists 18:715f542538b3 284
embeddedartists 18:715f542538b3 285 return (_win != NULL && _fb != NULL && res == 0);
embeddedartists 18:715f542538b3 286 }
embeddedartists 18:715f542538b3 287
embeddedartists 18:715f542538b3 288 void AppRTCSettings::runToCompletion()
embeddedartists 18:715f542538b3 289 {
embeddedartists 18:715f542538b3 290 // Alternative 1: use the calling thread's context to run in
embeddedartists 18:715f542538b3 291 bool done = false;
embeddedartists 18:715f542538b3 292 bool abort = false;
embeddedartists 18:715f542538b3 293 draw();
embeddedartists 18:715f542538b3 294 _buttons[ButtonOk]->setAction(buttonClicked, (uint32_t)&done);
embeddedartists 18:715f542538b3 295 _buttons[ButtonCancel]->setAction(buttonClicked, (uint32_t)&abort);
embeddedartists 18:715f542538b3 296 void* oldFB = _disp->swapFramebuffer(_fb);
embeddedartists 18:715f542538b3 297
embeddedartists 18:715f542538b3 298 // Wait for touches
embeddedartists 18:715f542538b3 299 TouchPanel* touch = DMBoard::instance().touchPanel();
embeddedartists 18:715f542538b3 300 touch_coordinate_t coord;
embeddedartists 18:715f542538b3 301
embeddedartists 18:715f542538b3 302 int lastPressed = NumButtons;
embeddedartists 18:715f542538b3 303 Timer t;
embeddedartists 18:715f542538b3 304 t.start();
alindvall 27:4fe24decabf9 305 int repeatAt = 0;
embeddedartists 18:715f542538b3 306
embeddedartists 18:715f542538b3 307 uint32_t maxDelay = osWaitForever;
embeddedartists 18:715f542538b3 308 while(!done && !abort) {
embeddedartists 30:e1cded731965 309 ThisThread::flags_wait_all(0x1, maxDelay);
embeddedartists 18:715f542538b3 310 if (touch->read(coord) == TouchPanel::TouchError_Ok) {
embeddedartists 18:715f542538b3 311 for (int i = 0; i < NumButtons; i++) {
embeddedartists 18:715f542538b3 312 if (_buttons[i]->handle(coord.x, coord.y, coord.z > 0)) {
embeddedartists 18:715f542538b3 313 _buttons[i]->draw();
embeddedartists 18:715f542538b3 314 if (_buttons[i]->pressed()) {
embeddedartists 18:715f542538b3 315 lastPressed = i; // new button pressed
embeddedartists 18:715f542538b3 316 t.reset();
embeddedartists 18:715f542538b3 317 repeatAt = 1000;
embeddedartists 18:715f542538b3 318 }
embeddedartists 18:715f542538b3 319 }
embeddedartists 18:715f542538b3 320 }
embeddedartists 18:715f542538b3 321 if (lastPressed == ButtonUp || lastPressed == ButtonDown) {
embeddedartists 18:715f542538b3 322 maxDelay = 10;
embeddedartists 18:715f542538b3 323 if (_buttons[lastPressed]->pressed() && t.read_ms() > repeatAt) {
embeddedartists 18:715f542538b3 324 modifyValue((lastPressed == ButtonUp) ? 1 : -1);
embeddedartists 18:715f542538b3 325 repeatAt = t.read_ms()+(200/(t.read_ms()/1000));
embeddedartists 18:715f542538b3 326 }
embeddedartists 18:715f542538b3 327 } else {
embeddedartists 18:715f542538b3 328 maxDelay = osWaitForever;
embeddedartists 18:715f542538b3 329 }
embeddedartists 18:715f542538b3 330 }
embeddedartists 18:715f542538b3 331 }
embeddedartists 18:715f542538b3 332
embeddedartists 18:715f542538b3 333 if (!abort) {
embeddedartists 18:715f542538b3 334 RtosLog* log = DMBoard::instance().logger();
embeddedartists 18:715f542538b3 335 log->printf("New time: %04d-%02d-%02d %02d:%02d:%02d\n", _values[0], _values[1],
embeddedartists 18:715f542538b3 336 _values[2], _values[3], _values[4], _values[5]);
embeddedartists 18:715f542538b3 337 tm t;
embeddedartists 18:715f542538b3 338 t.tm_year = _values[ButtonYear] - 1900; // years since 1900
embeddedartists 18:715f542538b3 339 t.tm_mon = _values[ButtonMonth] - 1; // month is 0..11
embeddedartists 18:715f542538b3 340 t.tm_mday = _values[ButtonDay];
embeddedartists 18:715f542538b3 341 t.tm_hour = _values[ButtonHour];
embeddedartists 18:715f542538b3 342 t.tm_min = _values[ButtonMinute];
embeddedartists 18:715f542538b3 343 t.tm_sec = _values[ButtonSecond];
embeddedartists 18:715f542538b3 344 set_time(mktime(&t));
embeddedartists 18:715f542538b3 345 }
embeddedartists 18:715f542538b3 346
embeddedartists 18:715f542538b3 347 // User has clicked the button, restore the original FB
embeddedartists 18:715f542538b3 348 _disp->swapFramebuffer(oldFB);
embeddedartists 18:715f542538b3 349 swim_window_close(_win);
embeddedartists 18:715f542538b3 350 }
embeddedartists 18:715f542538b3 351
embeddedartists 18:715f542538b3 352 bool AppRTCSettings::teardown()
embeddedartists 18:715f542538b3 353 {
embeddedartists 18:715f542538b3 354 if (_win != NULL) {
embeddedartists 18:715f542538b3 355 free(_win);
embeddedartists 18:715f542538b3 356 _win = NULL;
embeddedartists 18:715f542538b3 357 }
embeddedartists 18:715f542538b3 358 if (_fb != NULL) {
embeddedartists 18:715f542538b3 359 free(_fb);
embeddedartists 18:715f542538b3 360 _fb = NULL;
embeddedartists 18:715f542538b3 361 }
embeddedartists 18:715f542538b3 362 for (int i = 0; i < NumButtons; i++) {
embeddedartists 18:715f542538b3 363 if (_buttons[i] != NULL) {
embeddedartists 18:715f542538b3 364 delete _buttons[i];
embeddedartists 18:715f542538b3 365 _buttons[i] = NULL;
embeddedartists 18:715f542538b3 366 }
embeddedartists 18:715f542538b3 367 }
embeddedartists 18:715f542538b3 368 if (_digitImage.pointerToFree != NULL) {
embeddedartists 18:715f542538b3 369 free(_digitImage.pointerToFree);
embeddedartists 18:715f542538b3 370 _digitImage.pointerToFree = NULL;
embeddedartists 18:715f542538b3 371 }
embeddedartists 18:715f542538b3 372 return true;
embeddedartists 18:715f542538b3 373 }
embeddedartists 18:715f542538b3 374
embeddedartists 18:715f542538b3 375 void AppRTCSettings::modifyValue(int mod)
embeddedartists 18:715f542538b3 376 {
embeddedartists 18:715f542538b3 377 uint32_t v = _values[_activeField];
embeddedartists 18:715f542538b3 378 switch (_activeField) {
embeddedartists 18:715f542538b3 379 case ButtonYear:
embeddedartists 18:715f542538b3 380 // 1970..2100
embeddedartists 18:715f542538b3 381 _values[_activeField] = (((v - 1970 + (2100-1970)) + mod) % (2100-1970)) + 1970;
embeddedartists 18:715f542538b3 382 break;
embeddedartists 18:715f542538b3 383 case ButtonMonth:
embeddedartists 18:715f542538b3 384 // 1..12
embeddedartists 18:715f542538b3 385 _values[_activeField] = (((v - 1 + 12) + mod) % 12) + 1;
embeddedartists 18:715f542538b3 386 break;
embeddedartists 18:715f542538b3 387 case ButtonDay:
embeddedartists 18:715f542538b3 388 // 1..31
embeddedartists 18:715f542538b3 389 _values[_activeField] = (((v - 1 + 31) + mod) % 31) + 1;
embeddedartists 18:715f542538b3 390 break;
embeddedartists 18:715f542538b3 391 case ButtonHour:
embeddedartists 18:715f542538b3 392 // 0..23
embeddedartists 18:715f542538b3 393 _values[_activeField] = (v + 24 + mod) % 24;
embeddedartists 18:715f542538b3 394 break;
embeddedartists 18:715f542538b3 395 case ButtonMinute:
embeddedartists 18:715f542538b3 396 case ButtonSecond:
embeddedartists 18:715f542538b3 397 // 0..59
embeddedartists 18:715f542538b3 398 _values[_activeField] = (v + 60 + mod) % 60;
embeddedartists 18:715f542538b3 399 break;
embeddedartists 18:715f542538b3 400 }
embeddedartists 18:715f542538b3 401 ((DigitButton*)_buttons[_activeField])->setValue(_values[_activeField]);
embeddedartists 18:715f542538b3 402 }
embeddedartists 18:715f542538b3 403
embeddedartists 18:715f542538b3 404 void AppRTCSettings::changeActiveField(bool next)
embeddedartists 18:715f542538b3 405 {
embeddedartists 18:715f542538b3 406 markField(_activeField, false);
embeddedartists 18:715f542538b3 407 if (next) {
embeddedartists 18:715f542538b3 408 _activeField = (_activeField+1) % NumFields;
embeddedartists 18:715f542538b3 409 } else {
embeddedartists 18:715f542538b3 410 _activeField = (_activeField+NumFields-1) % NumFields;
embeddedartists 18:715f542538b3 411 }
embeddedartists 18:715f542538b3 412 markField(_activeField, true);
embeddedartists 18:715f542538b3 413 }
embeddedartists 18:715f542538b3 414
embeddedartists 18:715f542538b3 415 void AppRTCSettings::setActiveField(uint32_t newField)
embeddedartists 18:715f542538b3 416 {
embeddedartists 18:715f542538b3 417 if (_activeField != newField && newField < NumFields) {
embeddedartists 18:715f542538b3 418 markField(_activeField, false);
embeddedartists 18:715f542538b3 419 _activeField = newField;
embeddedartists 18:715f542538b3 420 markField(_activeField, true);
embeddedartists 18:715f542538b3 421 }
embeddedartists 18:715f542538b3 422 }