Sample GUI for LPC4088. Base code to begin dev

Dependencies:   DMBasicGUI DMSupport

Fork of lpc4088_displaymodule_shipped_demo by Embedded Artists

Committer:
alindvall
Date:
Tue Apr 28 12:21:14 2015 +0000
Revision:
4:a7cbb22e4348
Parent:
2:229f88d6f56b
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