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:

/media/uploads/embeddedartists/ew2015_cap_000.png /media/uploads/embeddedartists/ew2015_cap_002.png /media/uploads/embeddedartists/ew2015_cap_003.png /media/uploads/embeddedartists/ew2015_cap_004.png /media/uploads/embeddedartists/ew2015_cap_005.png /media/uploads/embeddedartists/ew2015_cap_006.png

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?

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