The out-of-the-box demo application flashed on all display modules before they are shipped.
Dependencies: DMBasicGUI DMSupport
AppStatus.cpp
00001 /* 00002 * Copyright 2014 Embedded Artists AB 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 00018 #include "mbed.h" 00019 #include "EthernetInterface.h" 00020 #include "AppStatus.h" 00021 #include "lpc_swim_image.h" 00022 #include "lpc_swim_font.h" 00023 #include "BiosLoader.h" 00024 00025 /****************************************************************************** 00026 * Defines and typedefs 00027 *****************************************************************************/ 00028 00029 #define HEADER_X_OFF (20-5) 00030 #define HEADER_Y_SPACING (20-5) 00031 #define ITEM_CAPTION_X_OFF (40-15) 00032 #define ITEM_CAPTION_Y_SPACING (swim_get_font_height(_win) + 5) 00033 #define ITEM_VALUE_X_OFF (140-25) 00034 #define COL3_OFF (230+70) 00035 #define COL4 (COL3_OFF + ITEM_VALUE_X_OFF - 5) 00036 00037 #define BIG_HEADER_X_OFF (25) 00038 #define BIG_HEADER_Y_SPACING (25) 00039 #define BIG_ITEM_CAPTION_X_OFF (BIG_HEADER_X_OFF + 10) 00040 #define BIG_ITEM_CAPTION_Y_SPACING (swim_get_font_height(_win) + 10) 00041 #define BIG_ITEM_VALUE_X_OFF (160) 00042 #define BIG_COL3_OFF (520) 00043 #define BIG_COL4 (BIG_COL3_OFF + BIG_ITEM_VALUE_X_OFF - 5) 00044 00045 #define BTN_OFF 20 00046 00047 #define DEMO_VERSION "v1.0" 00048 #define DEMO_BUILD_INFO __DATE__ " " __TIME__ 00049 00050 #define DESCR(__res, __disp) \ 00051 (((__res) == ((__disp)->currentResolution())) ? ("Active") : (((__disp)->isSupported(__res)) ? ("Supported") : ("N/A"))) 00052 00053 00054 /****************************************************************************** 00055 * Global variables 00056 *****************************************************************************/ 00057 00058 extern EthernetInterface eth; 00059 extern bool ethInitialized; 00060 extern bool ethUsingDHCP; 00061 00062 /****************************************************************************** 00063 * Private functions 00064 *****************************************************************************/ 00065 00066 static void buttonClicked(uint32_t x) 00067 { 00068 bool* done = (bool*)x; 00069 *done = true; 00070 } 00071 00072 void AppStatus::draw() 00073 { 00074 swim_window_open(_win, 00075 _disp->width(), _disp->height(), // full size 00076 (COLOR_T*)_fb, 00077 0,0,_disp->width()-1, _disp->height()-1, // window position and size 00078 1, // border 00079 BLACK, WHITE, BLACK); // colors: pen, backgr, forgr 00080 00081 00082 swim_put_image_xy(_win, _bgImg.pixels, _bgImg.width, _bgImg.height, 00083 (_disp->width()-_bgImg.width)/2, (_disp->height()-_bgImg.height)/2); 00084 00085 if (_disp->width() == 480) { 00086 draw480x272(); 00087 } else { 00088 draw800x480(); 00089 } 00090 00091 _btn = new ImageButton(_win->fb, _win->xpmax - BTN_OFF - _resOk->width(), _win->ypmax - BTN_OFF - _resOk->height(), _resOk->width(), _resOk->height()); 00092 _btn->loadImages(_resOk); 00093 _btn->draw(); 00094 } 00095 00096 void AppStatus::draw480x272() 00097 { 00098 char buff[120]; 00099 00100 // Column 1 00101 swim_put_text_xy(_win, "Demo:", HEADER_X_OFF, HEADER_Y_SPACING); 00102 swim_put_text_xy(_win, "Version:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 1); 00103 swim_put_text_xy(_win, "Build:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 2); 00104 00105 swim_put_text_xy(_win, "Network:", HEADER_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 4); 00106 swim_put_text_xy(_win, "DHCP/Static:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 5); 00107 swim_put_text_xy(_win, "IP Address:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 6); 00108 swim_put_text_xy(_win, "NetMask:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 7); 00109 swim_put_text_xy(_win, "Gateway:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 8); 00110 swim_put_text_xy(_win, "MAC Address:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 9); 00111 00112 char mac[6]; 00113 mbed_mac_address(mac); 00114 snprintf(buff, 19, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 00115 swim_put_text_xy(_win, buff, ITEM_CAPTION_X_OFF+10, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 10); 00116 00117 // Column 2 00118 swim_put_text_xy(_win, DEMO_VERSION, ITEM_VALUE_X_OFF-20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 1); 00119 swim_put_text_xy(_win, DEMO_BUILD_INFO, ITEM_VALUE_X_OFF-20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 2); 00120 00121 swim_put_text_xy(_win, ethUsingDHCP?"DHCP":"Static IP", ITEM_VALUE_X_OFF-20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 5); 00122 if (ethInitialized) { 00123 swim_put_text_xy(_win, eth.get_ip_address(), ITEM_VALUE_X_OFF-20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 6); 00124 swim_put_text_xy(_win, eth.get_netmask(), ITEM_VALUE_X_OFF-20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 7); 00125 swim_put_text_xy(_win, eth.get_gateway(), ITEM_VALUE_X_OFF-20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 8); 00126 //swim_put_text_xy(_win, eth.getMACAddress(), ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 4); 00127 } else { 00128 swim_put_text_xy(_win, "Not Initialized", ITEM_VALUE_X_OFF-20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 6); 00129 swim_put_text_xy(_win, "Not Initialized", ITEM_VALUE_X_OFF-20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 7); 00130 swim_put_text_xy(_win, "Not Initialized", ITEM_VALUE_X_OFF-20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 8); 00131 } 00132 00133 // Column 3 00134 swim_put_text_xy(_win, "Display:", COL3_OFF+HEADER_X_OFF, HEADER_Y_SPACING); 00135 swim_put_text_xy(_win, "Size:", COL3_OFF+ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 1); 00136 swim_put_text_xy(_win, "Landscape:", COL3_OFF+ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 2); 00137 swim_put_text_xy(_win, "Resolutions:", COL3_OFF+ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 3); 00138 swim_put_text_xy(_win, "16bit rgb565:", COL3_OFF+ITEM_CAPTION_X_OFF+10, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 4); 00139 swim_put_text_xy(_win, "18bit rgb666:", COL3_OFF+ITEM_CAPTION_X_OFF+10, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 5); 00140 swim_put_text_xy(_win, "24bit rgb888:", COL3_OFF+ITEM_CAPTION_X_OFF+10, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 6); 00141 00142 swim_put_text_xy(_win, "BIOS:", COL3_OFF+HEADER_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 8); 00143 { 00144 uint8_t type, maj, min, rev; 00145 BiosLoader::instance().getBiosStats(type, maj, min, rev); 00146 snprintf(buff, 25, "v%u.%u.%u (board type %u)", maj, min, rev, type); 00147 swim_put_text_xy(_win, buff, COL3_OFF+ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 9); 00148 } 00149 00150 // Column 4 00151 sprintf(buff, "%d x %d pixels", _disp->width(), _disp->height()); 00152 swim_put_text_xy(_win, buff, COL4 -20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 1); 00153 00154 sprintf(buff, "%s", _disp->landscape()?"YES":"NO"); 00155 swim_put_text_xy(_win, buff, COL4 -20, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 2); 00156 00157 sprintf(buff, "%s", DESCR(Display::Resolution_16bit_rgb565, _disp)); 00158 swim_put_text_xy(_win, buff, COL4, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 4); 00159 00160 sprintf(buff, "%s", DESCR(Display::Resolution_18bit_rgb666, _disp)); 00161 swim_put_text_xy(_win, buff, COL4, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 5); 00162 00163 sprintf(buff, "%s", DESCR(Display::Resolution_24bit_rgb888, _disp)); 00164 swim_put_text_xy(_win, buff, COL4, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 6); 00165 } 00166 00167 void AppStatus::draw800x480() 00168 { 00169 char buff[120]; 00170 00171 // Column 1 00172 swim_put_text_xy(_win, "Demo:", BIG_HEADER_X_OFF, BIG_HEADER_Y_SPACING); 00173 swim_put_text_xy(_win, "Version:", BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 1); 00174 swim_put_text_xy(_win, "Build:", BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 2); 00175 00176 swim_put_text_xy(_win, "Network:", BIG_HEADER_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 4); 00177 swim_put_text_xy(_win, "DHCP/Static:", BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 5); 00178 swim_put_text_xy(_win, "IP Address:", BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 6); 00179 swim_put_text_xy(_win, "NetMask:", BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 7); 00180 swim_put_text_xy(_win, "Gateway:", BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 8); 00181 swim_put_text_xy(_win, "MAC Address:", BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 9); 00182 00183 // Column 2 00184 swim_put_text_xy(_win, DEMO_VERSION, BIG_ITEM_VALUE_X_OFF-20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 1); 00185 swim_put_text_xy(_win, DEMO_BUILD_INFO, BIG_ITEM_VALUE_X_OFF-20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 2); 00186 00187 swim_put_text_xy(_win, ethUsingDHCP?"DHCP":"Static IP", BIG_ITEM_VALUE_X_OFF-20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 5); 00188 if (ethInitialized) { 00189 swim_put_text_xy(_win, eth.get_ip_address(), BIG_ITEM_VALUE_X_OFF-20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 6); 00190 swim_put_text_xy(_win, eth.get_netmask(), BIG_ITEM_VALUE_X_OFF-20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 7); 00191 swim_put_text_xy(_win, eth.get_gateway(), BIG_ITEM_VALUE_X_OFF-20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 8); 00192 } else { 00193 swim_put_text_xy(_win, "Not Initialized", BIG_ITEM_VALUE_X_OFF-20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 6); 00194 swim_put_text_xy(_win, "Not Initialized", BIG_ITEM_VALUE_X_OFF-20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 7); 00195 swim_put_text_xy(_win, "Not Initialized", BIG_ITEM_VALUE_X_OFF-20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 8); 00196 } 00197 char mac[6]; 00198 mbed_mac_address(mac); 00199 snprintf(buff, 19, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 00200 swim_put_text_xy(_win, buff, BIG_ITEM_VALUE_X_OFF-20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 9); 00201 00202 // Column 3 00203 swim_put_text_xy(_win, "Display:", BIG_COL3_OFF+BIG_HEADER_X_OFF, BIG_HEADER_Y_SPACING); 00204 swim_put_text_xy(_win, "Size:", BIG_COL3_OFF+BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 1); 00205 swim_put_text_xy(_win, "Landscape:", BIG_COL3_OFF+BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 2); 00206 swim_put_text_xy(_win, "Resolutions:", BIG_COL3_OFF+BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 3); 00207 swim_put_text_xy(_win, "16bit rgb565:", BIG_COL3_OFF+BIG_ITEM_CAPTION_X_OFF+10, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 4); 00208 swim_put_text_xy(_win, "18bit rgb666:", BIG_COL3_OFF+BIG_ITEM_CAPTION_X_OFF+10, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 5); 00209 swim_put_text_xy(_win, "24bit rgb888:", BIG_COL3_OFF+BIG_ITEM_CAPTION_X_OFF+10, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 6); 00210 00211 swim_put_text_xy(_win, "BIOS:", BIG_COL3_OFF+BIG_HEADER_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 8); 00212 { 00213 uint8_t type, maj, min, rev; 00214 BiosLoader::instance().getBiosStats(type, maj, min, rev); 00215 snprintf(buff, 25, "v%u.%u.%u (board type %u)", maj, min, rev, type); 00216 swim_put_text_xy(_win, buff, BIG_COL3_OFF+BIG_ITEM_CAPTION_X_OFF, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 9); 00217 } 00218 00219 // Column 4 00220 sprintf(buff, "%d x %d pixels", _disp->width(), _disp->height()); 00221 swim_put_text_xy(_win, buff, BIG_COL4 -20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 1); 00222 00223 sprintf(buff, "%s", _disp->landscape()?"YES":"NO"); 00224 swim_put_text_xy(_win, buff, BIG_COL4 -20, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 2); 00225 00226 sprintf(buff, "%s", DESCR(Display::Resolution_16bit_rgb565, _disp)); 00227 swim_put_text_xy(_win, buff, BIG_COL4, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 4); 00228 00229 sprintf(buff, "%s", DESCR(Display::Resolution_18bit_rgb666, _disp)); 00230 swim_put_text_xy(_win, buff, BIG_COL4, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 5); 00231 00232 sprintf(buff, "%s", DESCR(Display::Resolution_24bit_rgb888, _disp)); 00233 swim_put_text_xy(_win, buff, BIG_COL4, BIG_HEADER_Y_SPACING + BIG_ITEM_CAPTION_Y_SPACING * 6); 00234 } 00235 00236 /****************************************************************************** 00237 * Public functions 00238 *****************************************************************************/ 00239 00240 AppStatus::AppStatus() : _disp(NULL), _win(NULL), _fb(NULL), _btn(NULL) 00241 { 00242 _bgImg.pointerToFree = NULL; 00243 _bgImg.pixels = NULL; 00244 } 00245 00246 AppStatus::~AppStatus() 00247 { 00248 teardown(); 00249 } 00250 00251 bool AppStatus::setup() 00252 { 00253 RtosLog* log = DMBoard::instance().logger(); 00254 00255 _disp = DMBoard::instance().display(); 00256 _win = (SWIM_WINDOW_T*)malloc(sizeof(SWIM_WINDOW_T)); 00257 _fb = _disp->allocateFramebuffer(); 00258 00259 if (_win == NULL || _fb == NULL) { 00260 log->printf("Failed to allocate memory for framebuffer\r\n"); 00261 return false; 00262 } 00263 00264 if (Image::decode(_resAbout, Image::RES_16BIT, &_bgImg) != 0) { 00265 log->printf("Failed to load background image\n"); 00266 return false; 00267 } 00268 00269 return true; 00270 } 00271 00272 void AppStatus::runToCompletion() 00273 { 00274 bool done = false; 00275 draw(); 00276 _btn->setAction(buttonClicked, (uint32_t)&done); 00277 void* oldFB = _disp->swapFramebuffer(_fb); 00278 00279 // Wait for touches, but the AppLauncher is already listening 00280 // for new touch event and sends a signal to its thread which 00281 // is the same as runs this function so it is enough to wait 00282 // for that signal. 00283 TouchPanel* touch = DMBoard::instance().touchPanel(); 00284 touch_coordinate_t coord; 00285 while(!done) { 00286 ThisThread::flags_wait_all(0x1); 00287 if (touch->read(coord) == TouchPanel::TouchError_Ok) { 00288 if (_btn->handle(coord.x, coord.y, coord.z > 0)) { 00289 _btn->draw(); 00290 } 00291 } 00292 } 00293 00294 // User has clicked the button, restore the original FB 00295 _disp->swapFramebuffer(oldFB); 00296 swim_window_close(_win); 00297 } 00298 00299 bool AppStatus::teardown() 00300 { 00301 if (_win != NULL) { 00302 free(_win); 00303 _win = NULL; 00304 } 00305 if (_fb != NULL) { 00306 free(_fb); 00307 _fb = NULL; 00308 } 00309 if (_btn != NULL) { 00310 delete _btn; 00311 _btn = NULL; 00312 } 00313 if (_bgImg.pointerToFree != NULL) { 00314 free(_bgImg.pointerToFree); 00315 _bgImg.pointerToFree = NULL; 00316 } 00317 return true; 00318 } 00319 00320 void AppStatus::addResource(Resources id, Resource* res) 00321 { 00322 if (id == Resource_Ok_button) { 00323 _resOk = res; 00324 } else { 00325 _resAbout = res; 00326 } 00327 } 00328 00329 00330 00331
Generated on Wed Jul 13 2022 05:17:56 by 1.7.2