The out-of-the-box demo application flashed on all display modules before they are shipped.

Dependencies:   DMBasicGUI DMSupport

This is the software that is flashed on the LPC4088 Display Modules before they are shipped from Embedded Artists.

Information

This project works on both the 4.3" and 5" display modules but requires different file systems to handle the different display resolutions.

For the 4.3" displays first drag-n-drop the media/fs_480_raw.fs5 (if you are using the new DAPLINK firmware use fs_480_raw.hex) 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.

For the 5" displays first drag-n-drop the media/fs_800_raw.fsF (if you are using the new DAPLINK firmware use fs_800_raw.hex) 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.

There is a prebuilt version of the demo binary here.

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

/media/uploads/embeddedartists/demo480_cap_000.png /media/uploads/embeddedartists/demo480_cap_001.png /media/uploads/embeddedartists/demo480_cap_002.png /media/uploads/embeddedartists/demo480_cap_004.png /media/uploads/embeddedartists/demo480_cap_006.png /media/uploads/embeddedartists/demo480_cap_007.png /media/uploads/embeddedartists/demo480_cap_008.png
The first slide from the Slideshow:
/media/uploads/embeddedartists/demo480_cap_003.png
A couple of images from the Image Viewer
/media/uploads/embeddedartists/demo480_cap_009.png /media/uploads/embeddedartists/demo480_cap_010.png

Committer:
alindvall
Date:
Tue Apr 28 12:21:14 2015 +0000
Revision:
4:a7cbb22e4348
Parent:
2:229f88d6f56b
Child:
5:6ca8470ba8f8
Updated to latest version of the DMSupport and DMBasicGUI libraries

Who changed what in which revision?

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