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

Files at this revision

API Documentation at this revision

Comitter:
embeddedartists
Date:
Thu Jan 08 19:31:23 2015 +0100
Parent:
12:c8ea0a693a65
Child:
14:73f6c425b2b5
Commit message:
- Moved AppImageViewer and AppStatus here from DMBasicGUI
- Added new AppNetworkSettings
- New images in image_data

Changed in this revision

AppImageViewer.cpp Show annotated file Show diff for this revision Revisions of this file
AppImageViewer.h Show annotated file Show diff for this revision Revisions of this file
AppNetworkSettings.cpp Show annotated file Show diff for this revision Revisions of this file
AppNetworkSettings.h Show annotated file Show diff for this revision Revisions of this file
AppStatus.cpp Show annotated file Show diff for this revision Revisions of this file
AppStatus.h Show annotated file Show diff for this revision Revisions of this file
image_data.c Show annotated file Show diff for this revision Revisions of this file
image_data.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AppImageViewer.cpp	Thu Jan 08 19:31:23 2015 +0100
@@ -0,0 +1,254 @@
+/*
+ *  Copyright 2014 Embedded Artists AB
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+
+#include "mbed.h"
+#include "AppImageViewer.h"
+#include "lpc_swim_font.h"
+#include "lpc_swim_image.h"
+#include "Image.h"
+#include "image_data.h"
+
+/******************************************************************************
+ * Defines and typedefs
+ *****************************************************************************/
+ 
+#define BOX_SIDE   192 //256
+ 
+#define BTN_WIDTH  40
+#define BTN_HEIGHT 40
+#define BTN_OFF    20
+ 
+/******************************************************************************
+ * Global variables
+ *****************************************************************************/
+
+/******************************************************************************
+ * Private functions
+ *****************************************************************************/
+
+static void buttonClicked(uint32_t x)
+{
+  bool* done = (bool*)x;
+  *done = true;
+}
+
+void AppImageViewer::draw()
+{
+    // Prepare fullscreen
+    swim_window_open(_win, 
+                   _disp->width(), _disp->height(),         // full size
+                   (COLOR_T*)_fb1,
+                   0,0,_disp->width()-1, _disp->height()-1, // window position and size
+                   0,                                       // border
+                   BLACK, BLACK, BLACK);                    // colors: pen, backgr, forgr
+
+    _btn = new ImageButton(_win->fb, _win->xpmax - BTN_OFF - BTN_WIDTH, _win->ypmax - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT);
+    _btn->loadImages(img_ok, img_size_ok);
+}
+
+void AppImageViewer::load(const char* file)
+{
+    Image::ImageData_t pre = {0};
+    
+    int res = Image::decode(file, Image::RES_16BIT, &pre);
+    if (res == 0) {
+        DMBoard::instance().logger()->printf("[ImageLoader] Preparing %s\n", file);
+        Image::ImageData_t* data = _mailbox.alloc(osWaitForever);        
+        if (data != NULL) {
+            *data = pre;
+            _mailbox.put(data);
+        } else {
+            DMBoard::instance().logger()->printf("[ImageLoader] Failed to get memory to prepare %s\n", file);
+        }
+    }
+}
+
+static bool recursiveProcessFS(char* buff, const char* name, int maxLen, AppImageViewer* app, int depth, int maxDepth)
+{
+  if (depth > maxDepth) {
+    return true;
+  }
+  uint32_t len = strlen(buff);
+  if (len > 0) {
+    if (buff[len - 1] != '/') {
+      buff[len++] = '/';
+      buff[len] = '\0';
+    }
+  }
+  if ((strlen(name) + len) >= maxLen) {
+    // avoid memory overwrite due to too long file path
+    return true;
+  }
+  strcat(buff, name);
+  len += strlen(name);
+
+  DIR *d = opendir(buff);
+  bool result = true; // success
+  if (d != NULL) {
+    struct dirent *p;
+    while (result && ((p = readdir(d)) != NULL)) {
+      result = recursiveProcessFS(buff, p->d_name, maxLen, app, depth+1, maxDepth);
+      buff[len] = '\0';
+    }
+    closedir(d);
+  } else {
+    // a file
+    if (len > 3) {
+      if ((strncasecmp(buff+len-4, ".bmp", 4)==0) ||
+          (strncasecmp(buff+len-4, ".png", 4)==0) ||
+          (strncasecmp(buff+len-4, ".raw", 4)==0)) {
+        DMBoard::instance().logger()->printf("[ImageLoader] found %s\n", buff);
+        app->load(buff);
+      }
+    }
+  }
+  return result;
+}
+
+static void loaderTask(void const* args)
+{
+  char* buff = (char*)malloc(512);
+  if (buff != NULL)
+  {
+    DMBoard::instance().logger()->printf("Recursive list of file and folders in /mci/\n");
+    buff[0] = '\0';
+    recursiveProcessFS(buff, "/mci/", 512, (AppImageViewer*)args, 0, 2);
+    DMBoard::instance().logger()->printf("Recursive list of file and folders in /usb/\n");
+    buff[0] = '\0';
+    recursiveProcessFS(buff, "/usb/", 512, (AppImageViewer*)args, 0, 2);
+    DMBoard::instance().logger()->printf("Recursive list of file and folders in /qspi/\n");
+    buff[0] = '\0';
+    recursiveProcessFS(buff, "/qspi/", 512, (AppImageViewer*)args, 0, 2);
+    free(buff);
+  }
+  DMBoard::instance().logger()->printf("loaderTask done\n");
+}
+
+/******************************************************************************
+ * Public functions
+ *****************************************************************************/
+
+AppImageViewer::AppImageViewer() : _disp(NULL), _win(NULL), _fb1(NULL), _fb2(NULL), _btn(NULL), _active(0)
+{
+}
+
+AppImageViewer::~AppImageViewer()
+{
+    teardown();
+}
+
+bool AppImageViewer::setup()
+{
+    _disp = DMBoard::instance().display();
+    _win = (SWIM_WINDOW_T*)malloc(sizeof(SWIM_WINDOW_T));
+    _fb1 = _disp->allocateFramebuffer();
+    _fb2 = _disp->allocateFramebuffer();
+
+    return (_win != NULL && _fb1 != NULL && _fb2 != NULL);
+}
+
+void AppImageViewer::runToCompletion()
+{
+    // Alternative 1: use the calling thread's context to run in
+    bool done = false;
+    draw();
+    _btn->setAction(buttonClicked, (uint32_t)&done);
+    void* oldFB = _disp->swapFramebuffer(_fb1);
+
+    _active = 1;
+    
+    Thread* tLoader = new Thread(loaderTask, this, osPriorityNormal, 8192);
+    
+    bool first = true;
+    Timer t;
+    while(!done) {
+      osEvent evt = _mailbox.get(1000);
+      if (evt.status == osEventMail) {
+        COLOR_T* fb;
+        if (_active == 1) {
+          // render on the second frame buffer
+          fb = (COLOR_T*)_fb2;
+        } else {
+          // render on the first frame buffer
+          fb = (COLOR_T*)_fb1;
+        }
+        _win->fb = fb;
+        Image::ImageData_t* data = (Image::ImageData_t*)evt.value.p;
+        swim_put_scale_image(_win, (COLOR_T*)data->pixels, data->width, data->height);
+        free(data->pixels);
+        _mailbox.free(data);
+        if (first) {
+          first = false;
+          t.start();
+        } else {
+          while (t.read_ms() < 2000) {
+            Thread::wait(100);
+          }
+        }
+        _disp->setFramebuffer(fb);
+        _active = (_active == 1 ? 2 : 1);
+        t.reset();
+      } else if (tLoader->get_state() == Thread::Inactive) {
+        // No more images in the queue and the loader thread 
+        // has completed its search
+        break;
+      }
+    }
+    
+    delete tLoader;
+    
+    // The button must be drawn on the current framebuffer
+    _btn->draw(_win->fb);
+
+    // Wait for touches
+    TouchPanel* touch = DMBoard::instance().touchPanel();
+    TouchPanel::touchCoordinate_t coord;
+    while(!done) {
+      if (touch->read(coord) == TouchPanel::TouchError_Ok) {
+        if (_btn->handle(coord.x, coord.y, coord.z > 0)) {
+            _btn->draw();
+        }
+      }
+    }
+    
+    // User has clicked the button, restore the original FB
+    _disp->swapFramebuffer(oldFB);
+    swim_window_close(_win);
+}
+
+bool AppImageViewer::teardown()
+{
+    if (_win != NULL) {
+        free(_win);
+        _win = NULL;
+    }
+    if (_fb1 != NULL) {
+        free(_fb1);
+        _fb1 = NULL;
+    }
+    if (_fb2 != NULL) {
+        free(_fb2);
+        _fb2 = NULL;
+    }
+    if (_btn != NULL) {
+        delete _btn;
+        _btn = NULL;
+    }
+    return true;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AppImageViewer.h	Thu Jan 08 19:31:23 2015 +0100
@@ -0,0 +1,63 @@
+/*
+ *  Copyright 2014 Embedded Artists AB
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+ 
+#ifndef APP_IMAGEVIEWER_H
+#define APP_IMAGEVIEWER_H
+
+#include "App.h"
+#include "DMBoard.h"
+#include "lpc_swim.h"
+#include "ImageButton.h"
+#include "Image.h"
+
+/**
+ * An App example. Searches for images on any connected media (USB Mass Storage, 
+ * SD Card or QSPI File System) and presents the images one at a time, scaled to
+ * fit the display.
+ *
+ * The purpose of this example is to show how to recursively search the file
+ * systems and how to load images. The image scaling could be replaced with 
+ * rotating, cropping or any other image operation. The two second delay between
+ * images could be replaced with buttons or other touch events.
+ */
+class AppImageViewer : public App {
+public:
+
+	AppImageViewer();
+	~AppImageViewer();
+
+    virtual bool setup();
+    virtual void runToCompletion();
+    virtual bool teardown();
+
+    void load(const char* file);
+
+private:
+    Display* _disp;
+    SWIM_WINDOW_T* _win;
+    void* _fb1;
+    void* _fb2;
+    ImageButton* _btn;
+    Mail<Image::ImageData_t, 2> _mailbox;
+    int _active;
+    int _next;
+    Mutex _allowedToRender;
+    Mutex _imageLoaded;
+
+    void draw();
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AppNetworkSettings.cpp	Thu Jan 08 19:31:23 2015 +0100
@@ -0,0 +1,335 @@
+/*
+ *  Copyright 2014 Embedded Artists AB
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+
+#include "mbed.h"
+#include "EthernetInterface.h"
+#include "AppNetworkSettings.h"
+#include "lpc_swim_font.h"
+#include "image_data.h"
+
+/******************************************************************************
+ * Defines and typedefs
+ *****************************************************************************/
+ 
+#define BTN_WIDTH  40
+#define BTN_HEIGHT 40
+#define BTN_OFF    20
+
+#define ARROW_WIDTH   52
+#define ARROW_HEIGHT  52
+ 
+/******************************************************************************
+ * Private variables
+ *****************************************************************************/
+
+// Ugly but needed for callbacks
+static AppNetworkSettings* theApp = NULL;
+
+/******************************************************************************
+ * Private functions
+ *****************************************************************************/
+
+static void buttonClicked(uint32_t x)
+{
+  bool* done = (bool*)x;
+  *done = true;
+}
+
+static void fieldClicked(uint32_t x)
+{
+  if (theApp != NULL) {
+    theApp->setActiveField(x);
+  }
+}
+
+static void increaseValue(uint32_t x)
+{
+  AppNetworkSettings* app = (AppNetworkSettings*)x;
+  app->modifyValue(1);
+}
+
+static void decreaseValue(uint32_t x)
+{
+  AppNetworkSettings* app = (AppNetworkSettings*)x;
+  app->modifyValue(-1);
+}
+
+static void nextField(uint32_t x)
+{
+  AppNetworkSettings* app = (AppNetworkSettings*)x;
+  app->changeActiveField(true);
+}
+
+static void prevField(uint32_t x)
+{
+  AppNetworkSettings* app = (AppNetworkSettings*)x;
+  app->changeActiveField(false);
+}
+
+void AppNetworkSettings::draw()
+{
+    // Prepare fullscreen
+    swim_window_open(_win, 
+                   _disp->width(), _disp->height(),         // full size
+                   (COLOR_T*)_fb,
+                   0,0,_disp->width()-1, _disp->height()-1, // window position and size
+                   1,                                       // border
+                   RED,WHITE,BLACK);/*WHITE, RED,  BLACK);*/                     // colors: pen, backgr, forgr
+    swim_set_pen_color(_win, WHITE);
+    swim_set_title(_win, "Network Settings", RED);
+    swim_set_pen_color(_win, RED);
+
+    //_buttons[ButtonDone] = new Button("Done", _win->fb, _win->xpmax - BTN_OFF - BTN_WIDTH, _win->ypmax - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT);
+  
+    ImageButton* ib;
+    
+    ib =  new ImageButton(_win->fb, _win->xpmax - 2*BTN_OFF - 2*BTN_WIDTH, _win->ypmax - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT);
+    ib->loadImages(img_ok, img_size_ok);
+    ib->draw();
+    _buttons[ButtonOk] = ib;    
+    ib =  new ImageButton(_win->fb, _win->xpmax - BTN_OFF - BTN_WIDTH, _win->ypmax - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT);
+    ib->loadImages(img_cancel, img_size_cancel);
+    ib->draw();
+    _buttons[ButtonCancel] = ib;    
+
+    ib =  new ImageButton(_win->fb, 300, 40, ARROW_WIDTH, ARROW_HEIGHT);
+    ib->loadImages(img_arrow_up, img_size_arrow_up);
+    ib->setAction(increaseValue, (uint32_t)this);
+    ib->draw();
+    _buttons[ButtonUp] = ib;    
+    ib =  new ImageButton(_win->fb, 300, 40+ARROW_HEIGHT+ARROW_HEIGHT, ARROW_WIDTH, ARROW_HEIGHT);
+    ib->loadImages(img_arrow_down, img_size_arrow_down);
+    ib->setAction(decreaseValue, (uint32_t)this);
+    ib->draw();
+    _buttons[ButtonDown] = ib;
+    ib =  new ImageButton(_win->fb, 300-ARROW_WIDTH/2-10, 40+ARROW_HEIGHT, ARROW_WIDTH, ARROW_HEIGHT);
+    ib->loadImages(img_arrow_left, img_size_arrow_left);
+    ib->setAction(prevField, (uint32_t)this);
+    ib->draw();
+    _buttons[ButtonLeft] = ib;
+    ib =  new ImageButton(_win->fb, 300+ARROW_WIDTH/2+10, 40+ARROW_HEIGHT, ARROW_WIDTH, ARROW_HEIGHT);
+    ib->loadImages(img_arrow_right, img_size_arrow_right);
+    ib->setAction(nextField, (uint32_t)this);
+    ib->draw();
+    _buttons[ButtonRight] = ib;
+    
+    addIPField(20, ButtonIp0, "IP Address:");
+    addIPField(20+65, ButtonMask0, "Net Mask:");
+    addIPField(20+65+65, ButtonGw0, "Gateway:");
+    
+  for (int i = 0; i < NumButtons; i++) {
+    _buttons[i]->draw();
+  }
+  
+  markField(_activeField, true);
+}
+
+void AppNetworkSettings::addIPField(int y, int idx, const char* lbl)
+{
+    DigitButton* db;
+    
+    swim_put_text_xy(_win, lbl, 10, y);
+    y += 15;
+    int btny = y-7;
+    y += _win->ypvmin; // compensate for title bar 
+    int x = 20;
+    
+    
+    db =  new DigitButton(_win->fb, x, y, 55, 34);
+    db->loadImages(img_numbers, img_size_numbers);
+    db->setNumDigits(3);
+    db->setValue(_values[idx]);
+    db->setAction(fieldClicked, idx);
+    _buttons[idx++] = db;
+    
+    x += 60;    
+    db =  new DigitButton(_win->fb, x, y, 55, 34);
+    db->loadImages(img_numbers, img_size_numbers);
+    db->setNumDigits(3);
+    db->setValue(_values[idx]);
+    db->setAction(fieldClicked, idx);
+    _buttons[idx++] = db;
+    swim_put_box(_win, x-7, btny+31, x-4, btny+34);    
+    
+    x += 60;    
+    db =  new DigitButton(_win->fb, x, y, 55, 34);
+    db->loadImages(img_numbers, img_size_numbers);
+    db->setNumDigits(3);
+    db->setValue(_values[idx]);
+    db->setAction(fieldClicked, idx);
+    _buttons[idx++] = db;
+    swim_put_box(_win, x-7, btny+31, x-4, btny+34);    
+    
+    x += 60;    
+    db =  new DigitButton(_win->fb, x, y, 55, 34);
+    db->loadImages(img_numbers, img_size_numbers);
+    db->setNumDigits(3);
+    db->setValue(_values[idx]);
+    db->setAction(fieldClicked, idx);
+    _buttons[idx++] = db;
+    swim_put_box(_win, x-7, btny+31, x-4, btny+34);    
+}
+
+void AppNetworkSettings::markField(int field, bool active)
+{
+  COLOR_T oldPen = _win->pen;
+  COLOR_T oldFill = _win->fill;
+  _win->fill = active ? BLACK : _win->bkg;
+  _win->pen = active ? BLACK : _win->bkg;
+  if (field >= 0 && field < NumFields) {
+    int x0, y0, x1, y1;
+    _buttons[field]->bounds(x0,y0,x1,y1);
+    y1 -= _win->ypvmin+1;
+    x0--;
+    swim_put_box(_win, x0, y1, x1, y1+3);
+  }
+  _win->fill = oldFill;
+  _win->pen = oldPen;
+}
+
+/******************************************************************************
+ * Public functions
+ *****************************************************************************/
+
+AppNetworkSettings::AppNetworkSettings() : _disp(NULL), _win(NULL), _fb(NULL), _activeField(0)
+{
+  for (int i = 0; i < NumButtons; i++) {
+    _buttons[i] = NULL;
+  }
+  _values[0] = 192;
+  _values[1] = 168;
+  _values[2] = 5;
+  _values[3] = 220;
+  _values[4] = 255;
+  _values[5] = 255;
+  _values[6] = 255;
+  _values[7] = 0;
+  _values[8] = 192;
+  _values[9] = 168;
+  _values[10] = 5;
+  _values[11] = 1;
+  
+  theApp = this;
+}
+
+AppNetworkSettings::~AppNetworkSettings()
+{
+    theApp = NULL;
+    teardown();
+}
+
+bool AppNetworkSettings::setup()
+{
+    _disp = DMBoard::instance().display();
+    _win = (SWIM_WINDOW_T*)malloc(sizeof(SWIM_WINDOW_T));
+    _fb = _disp->allocateFramebuffer();
+
+    return (_win != NULL && _fb != NULL);
+}
+
+void AppNetworkSettings::runToCompletion()
+{
+    // Alternative 1: use the calling thread's context to run in
+    bool done = false;
+    bool abort = false;
+    draw();
+    _buttons[ButtonOk]->setAction(buttonClicked, (uint32_t)&done);
+    _buttons[ButtonCancel]->setAction(buttonClicked, (uint32_t)&abort);
+    void* oldFB = _disp->swapFramebuffer(_fb);
+    
+    // Wait for touches
+    TouchPanel* touch = DMBoard::instance().touchPanel();
+    TouchPanel::touchCoordinate_t coord;
+
+    int lastPressed = NumButtons;
+    Timer t;
+    t.start();
+    uint32_t repeatAt;
+    while(!done && !abort) {
+      if (touch->read(coord) == TouchPanel::TouchError_Ok) {
+        for (int i = 0; i < NumButtons; i++) {
+          if (_buttons[i]->handle(coord.x, coord.y, coord.z > 0)) {
+            _buttons[i]->draw();
+            if (_buttons[i]->pressed()) {
+              lastPressed = i; // new button pressed
+              t.reset();
+              repeatAt = 1000;
+            }
+          }
+        }
+        if (lastPressed == ButtonUp || lastPressed == ButtonDown) {
+          if (_buttons[lastPressed]->pressed() && t.read_ms() > repeatAt) {
+            modifyValue((lastPressed == ButtonUp) ? 1 : -1);
+            repeatAt = t.read_ms()+(200/(t.read_ms()/1000));
+          }
+        }
+      }
+    }
+
+    if (!abort) {
+      //TODO: Apply settings
+    }
+    
+    // User has clicked the button, restore the original FB
+    _disp->swapFramebuffer(oldFB);
+    swim_window_close(_win);
+}
+
+bool AppNetworkSettings::teardown()
+{
+    if (_win != NULL) {
+        free(_win);
+        _win = NULL;
+    }
+    if (_fb != NULL) {
+        free(_fb);
+        _fb = NULL;
+    }
+    for (int i = 0; i < NumButtons; i++) {
+        if (_buttons[i] != NULL) {
+            delete _buttons[i];
+            _buttons[i] = NULL;
+        }
+    }
+    return true;
+}
+
+void AppNetworkSettings::modifyValue(int mod)
+{
+  _values[_activeField] = (mod + _values[_activeField]) % 256;
+  ((DigitButton*)_buttons[_activeField])->setValue(_values[_activeField]);
+}
+
+void AppNetworkSettings::changeActiveField(bool next)
+{
+  markField(_activeField, false);
+  if (next) {
+    _activeField = (_activeField+1) % NumFields;
+  } else {
+    _activeField = (_activeField+NumFields-1) % NumFields;
+  }
+  markField(_activeField, true);
+}
+
+void AppNetworkSettings::setActiveField(uint32_t newField)
+{
+  if (_activeField != newField && newField < NumFields) {
+    markField(_activeField, false);
+    _activeField = newField;
+    markField(_activeField, true);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AppNetworkSettings.h	Thu Jan 08 19:31:23 2015 +0100
@@ -0,0 +1,85 @@
+/*
+ *  Copyright 2014 Embedded Artists AB
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+ 
+#ifndef APP_NETWORK_SETTINGS_H
+#define APP_NETWORK_SETTINGS_H
+
+#include "App.h"
+#include "DMBoard.h"
+#include "lpc_swim.h"
+#include "Button.h"
+#include "ImageButton.h"
+#include "DigitButton.h"
+
+/**
+ * An App example. Allows changing IP Address, Netmask and Gateway.
+ *
+ * The purpose of this example is to show some of the graphics primitives in
+ * the SWIM library.
+ */
+class AppNetworkSettings : public App {
+public:
+
+	AppNetworkSettings();
+	~AppNetworkSettings();
+
+    virtual bool setup();
+    virtual void runToCompletion();
+    virtual bool teardown();
+
+    void modifyValue(int mod);
+    void changeActiveField(bool next);
+    void setActiveField(uint32_t newField);
+
+private:
+    enum Buttons {
+      ButtonIp0,
+      ButtonIp1,
+      ButtonIp2,
+      ButtonIp3,
+      ButtonMask0,
+      ButtonMask1,
+      ButtonMask2,
+      ButtonMask3,
+      ButtonGw0,
+      ButtonGw1,
+      ButtonGw2,
+      ButtonGw3,
+      ButtonOk,
+      ButtonCancel,
+      ButtonUp,
+      ButtonDown,
+      ButtonLeft,
+      ButtonRight,
+      NumButtons,
+      NumFields = ButtonOk,
+    };
+
+    Display* _disp;
+    SWIM_WINDOW_T* _win;
+    void* _fb;
+
+    Clickable* _buttons[NumButtons];
+    
+    int _activeField;
+    uint32_t _values[NumFields];
+
+    void draw();
+    void markField(int field, bool active);
+    void addIPField(int y, int idx, const char* lbl);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AppStatus.cpp	Thu Jan 08 19:31:23 2015 +0100
@@ -0,0 +1,186 @@
+/*
+ *  Copyright 2014 Embedded Artists AB
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+
+#include "mbed.h"
+#include "EthernetInterface.h"
+#include "AppStatus.h"
+#include "lpc_swim_font.h"
+#include "image_data.h"
+
+/******************************************************************************
+ * Defines and typedefs
+ *****************************************************************************/
+ 
+#define HEADER_X_OFF      20
+#define HEADER_Y_SPACING  20
+#define ITEM_CAPTION_X_OFF      40
+#define ITEM_CAPTION_Y_SPACING  (swim_get_font_height(_win) + 5)
+#define ITEM_VALUE_X_OFF        140
+#define COL3_OFF                230
+
+#define BTN_WIDTH  40
+#define BTN_HEIGHT 40
+#define BTN_OFF    20
+ 
+/******************************************************************************
+ * Global variables
+ *****************************************************************************/
+
+extern EthernetInterface eth;
+extern bool ethInitialized;
+extern bool ethUsingDHCP;
+
+/******************************************************************************
+ * Private functions
+ *****************************************************************************/
+
+static void buttonClicked(uint32_t x)
+{
+  bool* done = (bool*)x;
+  *done = true;
+}
+
+void AppStatus::draw()
+{
+    // Prepare fullscreen
+    swim_window_open(_win, 
+                   _disp->width(), _disp->height(),         // full size
+                   (COLOR_T*)_fb,
+                   0,0,_disp->width()-1, _disp->height()-1, // window position and size
+                   1,                                       // border
+                   WHITE, BLUE, BLACK);                     // colors: pen, backgr, forgr
+    swim_set_title(_win, "Application Status", BLACK);
+
+    char buff[120];
+    
+    // Column 1
+    swim_put_text_xy(_win, "Ethernet:", HEADER_X_OFF, HEADER_Y_SPACING);
+    swim_put_text_xy(_win, "IP Address:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 1);
+    swim_put_text_xy(_win, "NetMask:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 2);
+    swim_put_text_xy(_win, "Gateway Address:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 3);
+    swim_put_text_xy(_win, "MAC Address:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 4);
+    swim_put_text_xy(_win, "DHCP/Static IP:", ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 5);
+
+    // Column 2
+    if (ethInitialized) {
+        swim_put_text_xy(_win, eth.getIPAddress(), ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 1);
+        swim_put_text_xy(_win, eth.getNetworkMask(), ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 2);
+        swim_put_text_xy(_win, eth.getGateway(), ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 3);    
+        swim_put_text_xy(_win, eth.getMACAddress(), ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 4);
+        swim_put_text_xy(_win, ethUsingDHCP?"DHCP":"Static IP", ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 5);
+    } else {
+        swim_put_text_xy(_win, "Not Initialized", ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 1);
+        swim_put_text_xy(_win, "Not Initialized", ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 2);
+        swim_put_text_xy(_win, "Not Initialized", ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 3);    
+        swim_put_text_xy(_win, "Not Initialized", ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 4);
+        swim_put_text_xy(_win, "Not Initialized", ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 5);
+    }
+
+    // Column 3
+    swim_put_text_xy(_win, "Display:", COL3_OFF+HEADER_X_OFF, HEADER_Y_SPACING);
+    swim_put_text_xy(_win, "Size:", COL3_OFF+ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 1);
+    swim_put_text_xy(_win, "Resolutions:", COL3_OFF+ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 2);
+    swim_put_text_xy(_win, "   16bit RGB565:", COL3_OFF+ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 3);
+    swim_put_text_xy(_win, "   18bit RGB666:", COL3_OFF+ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 4);
+    swim_put_text_xy(_win, "   24bit RGB888:", COL3_OFF+ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 5);
+    swim_put_text_xy(_win, "Landscape:", COL3_OFF+ITEM_CAPTION_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 6);
+
+    // Column 4
+    sprintf(buff, "%d x %d pixels", _disp->width(), _disp->height());
+    swim_put_text_xy(_win, buff, COL3_OFF+ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 1);
+    
+    sprintf(buff, "%s %s", _disp->isSupported(Display::Resolution_16bit_rgb565)?"Supported":"N/A", _disp->currentResolution()==Display::Resolution_16bit_rgb565?"  (Active)":"");
+    swim_put_text_xy(_win, buff, COL3_OFF+ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 3);
+    
+    sprintf(buff, "%s %s", _disp->isSupported(Display::Resolution_18bit_rgb666)?"Supported":"N/A", _disp->currentResolution()==Display::Resolution_18bit_rgb666?"  (Active)":"");
+    swim_put_text_xy(_win, buff, COL3_OFF+ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 4);
+    
+    sprintf(buff, "%s %s", _disp->isSupported(Display::Resolution_24bit_rgb888)?"Supported":"N/A", _disp->currentResolution()==Display::Resolution_24bit_rgb888?"  (Active)":"");
+    swim_put_text_xy(_win, buff, COL3_OFF+ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 5);
+    
+    sprintf(buff, "%s", _disp->landscape()?"YES":"NO");
+    swim_put_text_xy(_win, buff, COL3_OFF+ITEM_VALUE_X_OFF, HEADER_Y_SPACING + ITEM_CAPTION_Y_SPACING * 6);
+    
+    _btn = new ImageButton(_win->fb, _win->xpmax - BTN_OFF - BTN_WIDTH, _win->ypmax - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT);
+    _btn->loadImages(img_ok, img_size_ok);
+    _btn->draw();
+}
+
+/******************************************************************************
+ * Public functions
+ *****************************************************************************/
+
+AppStatus::AppStatus() : _disp(NULL), _win(NULL), _fb(NULL), _btn(NULL)
+{
+}
+
+AppStatus::~AppStatus()
+{
+    teardown();
+}
+
+bool AppStatus::setup()
+{
+    _disp = DMBoard::instance().display();
+    _win = (SWIM_WINDOW_T*)malloc(sizeof(SWIM_WINDOW_T));
+    _fb = _disp->allocateFramebuffer();
+
+    return (_win != NULL && _fb != NULL);
+}
+
+void AppStatus::runToCompletion()
+{
+    // Alternative 1: use the calling thread's context to run in
+    bool done = false;
+    draw();
+    _btn->setAction(buttonClicked, (uint32_t)&done);
+    void* oldFB = _disp->swapFramebuffer(_fb);
+    
+    // Wait for touches
+    TouchPanel* touch = DMBoard::instance().touchPanel();
+    TouchPanel::touchCoordinate_t coord;
+    while(!done) {
+      if (touch->read(coord) == TouchPanel::TouchError_Ok) {
+        if (_btn->handle(coord.x, coord.y, coord.z > 0)) {
+            _btn->draw();
+        }
+      }
+    }
+    
+    // User has clicked the button, restore the original FB
+    _disp->swapFramebuffer(oldFB);
+    swim_window_close(_win);
+}
+
+bool AppStatus::teardown()
+{
+    if (_win != NULL) {
+        free(_win);
+        _win = NULL;
+    }
+    if (_fb != NULL) {
+        free(_fb);
+        _fb = NULL;
+    }
+    if (_btn != NULL) {
+        delete _btn;
+        _btn = NULL;
+    }
+    return true;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AppStatus.h	Thu Jan 08 19:31:23 2015 +0100
@@ -0,0 +1,50 @@
+/*
+ *  Copyright 2014 Embedded Artists AB
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+ 
+#ifndef APP_STATUS_H
+#define APP_STATUS_H
+
+#include "App.h"
+#include "DMBoard.h"
+#include "lpc_swim.h"
+#include "ImageButton.h"
+
+/**
+ * An App example. Static display of information.
+ *
+ * The purpose of this example is to show some of the graphics primitives in
+ * the SWIM library.
+ */
+class AppStatus : public App {
+public:
+
+	AppStatus();
+	~AppStatus();
+
+    virtual bool setup();
+    virtual void runToCompletion();
+    virtual bool teardown();
+
+private:
+    Display* _disp;
+    SWIM_WINDOW_T* _win;
+    void* _fb;
+    ImageButton* _btn;
+
+    void draw();
+};
+
+#endif
--- a/image_data.c	Wed Jan 07 13:17:42 2015 +0000
+++ b/image_data.c	Thu Jan 08 19:31:23 2015 +0100
@@ -2058,3 +2058,308 @@
 };
 const unsigned int img_size_utilities_system_monitor = sizeof(img_utilities_system_monitor);
 
+const unsigned char img_arrow_down[] = {
+	0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, 
+	0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x34,0x08,0x06,0x00,0x00,0x00,0xC5,0x78,0x1B, 
+	0xEB,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, 
+	0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, 
+	0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC2,0x00,0x00,0x0E,0xC2,0x01,0x15, 
+	0x28,0x4A,0x80,0x00,0x00,0x01,0x3F,0x49,0x44,0x41,0x54,0x68,0x43,0xED,0xDA,0xC1, 
+	0x8E,0xC2,0x30,0x0C,0x45,0xD1,0x96,0xFF,0xFF,0xE7,0x99,0xB9,0x55,0x8B,0x18,0x11, 
+	0x9A,0xD8,0x7E,0x2E,0x06,0xE5,0x6E,0x60,0x45,0x7D,0x68,0x12,0xA9,0x88,0xF5,0xE7, 
+	0xAF,0xC5,0xD8,0xBA,0xAE,0xFB,0xBB,0xDC,0x1C,0xA3,0x2D,0xB7,0xFD,0x75,0xB8,0xAB, 
+	0x30,0xE4,0xB9,0x96,0x19,0x54,0xBD,0x09,0xAA,0x9E,0xF9,0x50,0x68,0xAD,0x6B,0xCF, 
+	0xE6,0x6D,0xA5,0xF8,0xEC,0xB9,0xE4,0xAA,0x37,0x41,0xD5,0x9B,0xA0,0xEA,0x4D,0x50, 
+	0xF5,0x26,0xA8,0x7A,0x13,0x54,0xBD,0x09,0xAA,0xDE,0x04,0x55,0xEF,0xEB,0x40,0xF7, 
+	0x27,0xD6,0xC8,0xAF,0x39,0x99,0x4F,0xAC,0x23,0x3D,0x5E,0x7F,0xBB,0x43,0x11,0x4C, 
+	0x85,0x98,0xFF,0x30,0xDC,0x3E,0x1D,0xF3,0x18,0x96,0xEF,0x3B,0x14,0xA2,0xEB,0x5F, 
+	0xB5,0x7F,0x48,0x31,0xCB,0x76,0x28,0xF4,0x96,0x9D,0x72,0xE8,0x48,0x23,0x73,0x6E, 
+	0x4B,0xAE,0x37,0x70,0x85,0x7D,0x36,0xFA,0xA5,0xDF,0xF7,0x50,0x65,0x94,0x65,0x05, 
+	0xFD,0x3B,0x14,0x2A,0xA2,0x2C,0x18,0x7A,0x3A,0xE5,0x2A,0xA1,0xAC,0x18,0x6A,0x1E, 
+	0xDB,0x15,0x50,0x1E,0x0C,0x35,0x41,0xF4,0x4E,0x94,0x17,0x43,0x2F,0x41,0xF4,0x0E, 
+	0x54,0x04,0x43,0xA7,0x20,0xBA,0x12,0x15,0xC5,0x50,0x17,0x44,0x57,0xA0,0x14,0x18, 
+	0x1A,0x02,0x51,0x26,0x4A,0x85,0xA1,0x61,0x10,0x65,0xA0,0x94,0x18,0x32,0x81,0x48, 
+	0x89,0x52,0x63,0xC8,0x0C,0x22,0x05,0x2A,0x03,0x43,0x2E,0x10,0x45,0x50,0x59,0x18, 
+	0x72,0x83,0xC8,0x83,0xCA,0xC4,0x50,0x08,0x44,0x16,0x54,0x36,0x86,0x5C,0x7F,0x5E, 
+	0x6A,0xD5,0x1B,0xB6,0x97,0x68,0x8C,0xF8,0x1D,0x3A,0x8A,0x0C,0xA4,0xC2,0x90,0x0C, 
+	0x44,0x9E,0xC1,0x94,0x18,0x92,0x82,0xC8,0x32,0xA0,0x1A,0x43,0x72,0x10,0x8D,0x0C, 
+	0x9A,0x81,0xA1,0x14,0x10,0x9D,0x0D,0x9C,0x85,0x21,0xD9,0x29,0x77,0xD6,0x71,0x02, 
+	0xE6,0x5F,0x6A,0x59,0x7E,0x01,0x3E,0x23,0xBD,0x36,0xCB,0x6F,0xE0,0xD4,0x00,0x00, 
+	0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82
+};
+const unsigned int img_size_arrow_down = sizeof(img_arrow_down);
+
+const unsigned char img_arrow_left[] = {
+	0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, 
+	0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x34,0x08,0x06,0x00,0x00,0x00,0xC5,0x78,0x1B, 
+	0xEB,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, 
+	0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, 
+	0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC4,0x00,0x00,0x0E,0xC4,0x01,0x95, 
+	0x2B,0x0E,0x1B,0x00,0x00,0x01,0x52,0x49,0x44,0x41,0x54,0x68,0x43,0xDD,0xDA,0xD1, 
+	0x0E,0x83,0x20,0x0C,0x40,0x51,0xF5,0xFF,0xFF,0x79,0xDB,0x35,0xD3,0xA0,0x82,0x45, 
+	0xA0,0xD0,0x7A,0x5F,0xDC,0xC3,0x32,0x39,0xA9,0xB8,0x65,0x71,0xFE,0xFC,0x9A,0x94, 
+	0x9B,0xE7,0x79,0x3D,0x76,0x38,0xD5,0xB4,0xFC,0x8F,0x2A,0x01,0xD9,0x30,0x14,0xBE, 
+	0xD6,0x4A,0x0D,0x94,0x5A,0xBC,0x36,0x4A,0x05,0xD4,0x63,0x12,0xA9,0x9A,0x83,0x46, 
+	0x62,0xA8,0x29,0x68,0x34,0x86,0x9A,0x81,0x2C,0x60,0xA8,0x09,0xC8,0x0A,0x86,0xAA, 
+	0x41,0x96,0x30,0x54,0x05,0x92,0x30,0x3D,0xBE,0x48,0xCF,0x15,0x83,0x2C,0x62,0xA8, 
+	0x08,0x64,0x15,0x43,0x8F,0x7F,0xCB,0x3D,0xC5,0xF4,0xDC,0x63,0x9C,0xFB,0xD1,0x84, 
+	0x2C,0x4F,0x86,0x58,0x5F,0x36,0xC8,0x3A,0x66,0x2B,0x0B,0xE4,0x05,0x43,0x22,0xA8, 
+	0x16,0xD3,0x1B,0x7B,0x7B,0x53,0xF0,0xB0,0x67,0xCE,0x25,0x27,0xE4,0xE9,0x32,0x0B, 
+	0x8B,0x82,0xBC,0x62,0xE8,0x02,0xF2,0x8C,0xA1,0x03,0xC8,0x3B,0x86,0x76,0xD0,0x1B, 
+	0x30,0xB4,0x82,0xDE,0x82,0xA1,0xE8,0x4D,0x21,0xCC,0x13,0x86,0x96,0xBB,0xE9,0x78, 
+	0xC3,0x90,0x38,0x21,0x6F,0x2D,0x77,0x53,0x90,0xF6,0x96,0xC5,0xC4,0x09,0x79,0x43, 
+	0xAD,0x20,0x69,0xAF,0x78,0x42,0xED,0x13,0x7A,0x0B,0xEA,0x70,0xC9,0xBD,0x01,0x75, 
+	0xD9,0x43,0xDE,0x51,0xD1,0x9B,0x82,0x67,0x54,0x14,0x44,0x5E,0x51,0xE2,0xDF,0x58, 
+	0xD2,0xC2,0x25,0x38,0xF5,0xC4,0x27,0x27,0xB4,0x55,0x3B,0xA9,0xDE,0x93,0x14,0x41, 
+	0xE4,0xE9,0xF2,0xCB,0x02,0x91,0x17,0x54,0x36,0x88,0xAC,0xA3,0x58,0x5F,0xD1,0x73, 
+	0x0A,0xD2,0xC2,0xC3,0x8F,0x8C,0xBD,0xB7,0xE0,0x94,0xD9,0x3D,0x9A,0xD0,0x96,0xB4, 
+	0xA0,0x91,0x93,0x2A,0x02,0x91,0x55,0x54,0x31,0x88,0x2C,0xA2,0xAA,0x40,0xA4,0xB9, 
+	0x1F,0x4A,0xAA,0x06,0x91,0x25,0x54,0x13,0x10,0x59,0x41,0x35,0x03,0x91,0x05,0x54, 
+	0x53,0x10,0x8D,0x46,0x35,0x07,0xD1,0x1D,0x4A,0x1B,0xAC,0x02,0xA2,0x51,0x93,0x52, 
+	0x03,0x11,0xA8,0x10,0xA6,0x8F,0x9C,0xA6,0x2F,0xFB,0xD6,0xA7,0x56,0x1A,0xFC,0xA5, 
+	0x0F,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82
+};
+const unsigned int img_size_arrow_left = sizeof(img_arrow_left);
+
+const unsigned char img_arrow_right[] = {
+	0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, 
+	0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x34,0x08,0x06,0x00,0x00,0x00,0xC5,0x78,0x1B, 
+	0xEB,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, 
+	0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, 
+	0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC4,0x00,0x00,0x0E,0xC4,0x01,0x95, 
+	0x2B,0x0E,0x1B,0x00,0x00,0x01,0x54,0x49,0x44,0x41,0x54,0x68,0x43,0xD5,0xDA,0xD1, 
+	0x0E,0x82,0x30,0x0C,0x46,0xE1,0xC1,0xFB,0xBF,0xB3,0x7A,0x8C,0x4B,0x88,0xE2,0xCA, 
+	0x58,0xFF,0xB5,0x3B,0x37,0x68,0x44,0xE8,0x97,0x21,0x7A,0xE1,0xF6,0x78,0x55,0xC4, 
+	0x6D,0xDB,0xF6,0xDE,0x4E,0x38,0x55,0xD9,0x3F,0x5B,0x59,0x15,0x43,0x3C,0x3E,0x3E, 
+	0x57,0x24,0x07,0x9D,0xA5,0x44,0x49,0x41,0xAD,0xC1,0x55,0xA8,0x90,0x15,0xAA,0x29, 
+	0x50,0xA1,0x20,0xF2,0x46,0x85,0x83,0xC8,0x13,0x95,0x02,0x44,0x5E,0xA8,0x34,0x20, 
+	0xF2,0x40,0x4D,0x07,0x59,0x5F,0xAE,0xA3,0xA8,0x90,0x15,0x52,0xA2,0xC2,0x2E,0x39, 
+	0x15,0xEA,0xFD,0x5B,0xCE,0xEB,0x03,0x79,0xA5,0x6F,0x88,0x75,0x6E,0x0B,0xFE,0xDD, 
+	0x3E,0x13,0x73,0x96,0xF7,0x4A,0xA5,0xB8,0xCB,0x79,0xA2,0xD2,0xDC,0xB6,0xBD,0x50, 
+	0x53,0x41,0xD6,0xD0,0x1E,0x28,0xF6,0xF8,0x39,0x8A,0x75,0x60,0x75,0xD6,0xE0,0xAD, 
+	0xF9,0xD2,0x5C,0x72,0xC7,0x46,0x56,0x2A,0x25,0x88,0xEE,0xA2,0xD2,0x82,0xE8,0x0E, 
+	0x2A,0x35,0x88,0x7A,0x51,0xE9,0x41,0xD4,0x83,0x5A,0x02,0x44,0x57,0x51,0xCB,0x80, 
+	0xC8,0x42,0xD1,0x52,0x20,0x6A,0xA1,0x58,0xA5,0xE5,0x40,0x56,0xCB,0x81,0xCE,0x6E, 
+	0xD5,0x35,0x56,0x6F,0x29,0x50,0x0B,0x53,0x5B,0x06,0x64,0x61,0xEA,0x67,0x6B,0x09, 
+	0xD0,0x55,0x0C,0xA5,0x07,0xF5,0x60,0x28,0x35,0xA8,0x17,0x43,0x69,0x41,0x77,0x30, 
+	0x94,0x12,0x74,0x17,0x43,0xBC,0xF3,0xFF,0xAB,0xCE,0xB5,0x06,0xA9,0x8D,0x60,0x68, 
+	0xEA,0x0A,0x59,0xC3,0x8E,0x62,0x28,0xCD,0x25,0xE7,0x81,0xA1,0x14,0x20,0x2F,0x0C, 
+	0xED,0x3D,0x3B,0x2B,0xF2,0xC4,0x90,0xF4,0x7F,0x0A,0x67,0xC3,0x1E,0x4F,0xE7,0x8D, 
+	0xA1,0xB0,0x4B,0x4E,0x81,0xA1,0x10,0x90,0x0A,0x43,0xD3,0x41,0x4A,0x0C,0xA5,0xB9, 
+	0x6D,0xD3,0x28,0x86,0xD2,0x80,0x3C,0x30,0x94,0x02,0xE4,0x85,0xA1,0x70,0x90,0x27, 
+	0x86,0x42,0x41,0xDE,0x18,0x0A,0x03,0x29,0x30,0x24,0x05,0xFD,0x1B,0x5A,0x85,0x21, 
+	0xF9,0x0A,0x1D,0x87,0xE7,0xB1,0x12,0x53,0x4A,0x29,0x4F,0xEB,0x87,0xA7,0x50,0xFF, 
+	0xFB,0x7D,0x22,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82
+};
+const unsigned int img_size_arrow_right = sizeof(img_arrow_right);
+
+const unsigned char img_arrow_up[] = {
+	0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, 
+	0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x34,0x08,0x06,0x00,0x00,0x00,0xC5,0x78,0x1B, 
+	0xEB,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, 
+	0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, 
+	0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC4,0x00,0x00,0x0E,0xC4,0x01,0x95, 
+	0x2B,0x0E,0x1B,0x00,0x00,0x01,0x24,0x49,0x44,0x41,0x54,0x68,0x43,0xED,0xD8,0xD1, 
+	0x0E,0x82,0x30,0x0C,0x85,0xE1,0xCD,0xF7,0x7F,0x67,0x75,0x0B,0xC7,0x44,0x05,0xB6, 
+	0xAE,0xA7,0xA3,0x2C,0xFD,0x6F,0x66,0x42,0x94,0x7E,0x8A,0x24,0x2C,0x3F,0xDF,0x25, 
+	0xE3,0x72,0xCE,0x75,0x9D,0x70,0xAA,0x64,0x0A,0x02,0xE4,0x37,0x4B,0xD8,0x63,0x5B, 
+	0xE9,0x1D,0x61,0x4A,0x67,0xC7,0xB4,0x99,0x80,0x7A,0x06,0xB6,0x42,0xD1,0x41,0x92, 
+	0x41,0x2D,0x50,0x54,0xD0,0xC8,0x80,0x6C,0x14,0x0D,0xA4,0x19,0x8C,0x89,0xA2,0x80, 
+	0x5A,0x03,0x95,0xBB,0x5A,0xEB,0xCE,0xC6,0x42,0xA9,0x41,0x3D,0x18,0x34,0x03,0xA5, 
+	0x02,0x49,0x30,0xC8,0x1A,0x35,0x0C,0x1A,0xC1,0x20,0x4B,0xD4,0x10,0x48,0x83,0x41, 
+	0x56,0x28,0x31,0x88,0x81,0x41,0x16,0x28,0x11,0x88,0x89,0x41,0x6C,0x54,0x37,0xC8, 
+	0x02,0x83,0x98,0xA8,0x2E,0x90,0x25,0x06,0xB1,0x50,0x4D,0xD0,0x0C,0x0C,0x62,0xA0, 
+	0x4E,0x41,0x33,0x31,0x48,0x8B,0x3A,0x04,0x5D,0x81,0x41,0x1A,0xD4,0x2E,0xE8,0x4A, 
+	0x0C,0x1A,0x45,0xFD,0x81,0x3C,0x60,0xD0,0x08,0xEA,0x0B,0xE4,0x09,0x83,0xA4,0xA8, 
+	0x0F,0xC8,0x23,0x06,0x49,0x50,0x15,0xE4,0x19,0x83,0x7A,0x51,0x75,0x1B,0xAB,0x05, 
+	0x3A,0x8B,0x8D,0xD5,0xCE,0x52,0xDE,0xAD,0x9E,0x88,0x85,0xD2,0x60,0xD0,0xEE,0x6D, 
+	0xFB,0xCE,0x3D,0xD8,0x97,0xCC,0x95,0x15,0x4B,0xFD,0x85,0xCA,0x8B,0xBB,0xC3,0x30, 
+	0xBF,0x78,0x6F,0x7B,0xEF,0x3A,0x67,0x7D,0x19,0x8C,0xCF,0x5E,0xEF,0x3F,0xB4,0xAD, 
+	0xCB,0x14,0x20,0xEF,0x05,0xC8,0x7B,0x01,0xF2,0x5E,0x80,0xBC,0x17,0x20,0xEF,0x05, 
+	0xC8,0x7B,0x01,0xF2,0xDE,0x72,0x20,0xCA,0x13,0xAB,0x65,0xF1,0xC4,0xBA,0xAD,0xCB, 
+	0x14,0x20,0xD6,0x0E,0x4F,0x4F,0xF2,0x73,0xA5,0xF4,0x02,0xDA,0x87,0xA8,0x57,0x9E, 
+	0xA4,0x0D,0xC4,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82
+};
+const unsigned int img_size_arrow_up = sizeof(img_arrow_up);
+
+const unsigned char img_numbers[] = {
+	0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, 
+	0x00,0x00,0x00,0x10,0x00,0x00,0x01,0x42,0x08,0x02,0x00,0x00,0x00,0x77,0xA0,0xCA, 
+	0x7E,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, 
+	0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, 
+	0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC3,0x00,0x00,0x0E,0xC3,0x01,0xC7, 
+	0x6F,0xA8,0x64,0x00,0x00,0x05,0x65,0x49,0x44,0x41,0x54,0x68,0x43,0xED,0x9B,0x3F, 
+	0x76,0x14,0x39,0x10,0x87,0x07,0xCE,0x62,0x13,0xF8,0x71,0x82,0xE1,0x04,0x86,0x84, 
+	0x88,0x94,0x6C,0x1C,0x2E,0x09,0xD9,0x86,0x64,0x9B,0xD8,0x21,0x1C,0x81,0x88,0x04, 
+	0xCF,0x09,0xF0,0x09,0xFC,0x08,0xF0,0xDC,0xC5,0x2B,0xA9,0xF4,0xE7,0x57,0xD2,0xAF, 
+	0x34,0x35,0xF0,0xE0,0x11,0xE8,0x0B,0x76,0x87,0x6E,0x7D,0x92,0xBA,0x24,0x95,0xBA, 
+	0xA7,0xC7,0x4F,0x1E,0x1F,0x1F,0x37,0xA7,0xF0,0x34,0xFF,0xDF,0xCD,0x12,0x3C,0x74, 
+	0xC2,0xFE,0xEA,0x09,0x72,0xB5,0xCF,0xC7,0x81,0x30,0x70,0xC2,0xC3,0xF5,0x36,0x1F, 
+	0xD2,0xEC,0x6E,0x73,0x01,0xA1,0x08,0xB7,0xBB,0x7C,0x9E,0xB0,0xBD,0x7E,0xC8,0xA5, 
+	0x02,0x22,0x60,0xED,0xA5,0x46,0x76,0x2C,0x90,0x04,0x38,0x87,0xB5,0x41,0xAB,0xCD, 
+	0x88,0x82,0x51,0x9E,0x1B,0x31,0x4A,0x0F,0xDF,0xEF,0xE4,0xE8,0x66,0xF3,0xFC,0xD9, 
+	0x59,0xFE,0x14,0x39,0xBF,0xA8,0x35,0xDD,0xFF,0x38,0xC8,0x87,0x20,0x1C,0x7E,0xDC, 
+	0xCB,0xE7,0x81,0xB3,0x67,0xCF,0xF3,0xA7,0xCD,0xDD,0xF7,0x07,0xF9,0xA0,0xC7,0x61, 
+	0x7B,0x71,0x9E,0x3F,0x99,0xFC,0xEA,0x48,0x1F,0xE7,0x17,0x85,0x7A,0x69,0x36,0x41, 
+	0x80,0x58,0x74,0x40,0xFC,0x6A,0x38,0x62,0x0B,0x2C,0xDC,0x09,0x3A,0x40,0x71,0xF4, 
+	0x4E,0x9D,0x1A,0x7A,0xA2,0x15,0x65,0x36,0xF9,0x02,0x27,0x4E,0xEF,0x08,0xD6,0x88, 
+	0x40,0xED,0x91,0x26,0x24,0xBA,0x86,0xBA,0xC2,0x91,0x95,0x5B,0x3D,0x2C,0xC1,0x03, 
+	0x17,0x0E,0x37,0x2F,0xAC,0x1D,0x82,0x09,0x87,0x9B,0xB7,0xEF,0xEA,0xDA,0xEC,0x19, 
+	0x85,0xFD,0xD5,0xB9,0x5D,0xBC,0x17,0x62,0x57,0x5E,0x7E,0xCA,0xFF,0x30,0x90,0x65, 
+	0x11,0xE0,0x8B,0x74,0x58,0x42,0xD2,0x82,0xA7,0xE6,0xCC,0x78,0x0D,0x61,0xC9,0xCF, 
+	0x32,0x82,0x16,0x62,0x7E,0xF8,0xF6,0x0F,0xEE,0x29,0x03,0x55,0x48,0xB9,0xE4,0x48, 
+	0xE1,0x44,0xBE,0x16,0x05,0x4D,0x79,0x99,0xF1,0x1A,0x8E,0xB0,0x04,0x0F,0x7F,0xA1, 
+	0xB0,0xF6,0x07,0x0F,0x4B,0xF0,0xA0,0x85,0xEE,0xF1,0x81,0x3E,0x40,0x48,0xB6,0x31, 
+	0x6F,0x7E,0x22,0x2A,0x37,0x89,0x30,0x4B,0xA6,0x11,0xB8,0xC5,0x8A,0x82,0xAA,0xBD, 
+	0x9D,0x53,0xB5,0xD4,0x56,0xA2,0x00,0x67,0xA0,0xAA,0x00,0xBB,0xED,0x0B,0x17,0xBD, 
+	0xFF,0x52,0x77,0x86,0xED,0x9B,0x57,0x98,0x8D,0xE9,0x1D,0xAD,0x78,0x06,0x24,0x2B, 
+	0x4F,0xC7,0x01,0xDB,0xAE,0x0F,0x0A,0xE2,0x31,0xF0,0xA2,0xDB,0xB5,0x59,0x82,0x11, 
+	0x39,0x4B,0x50,0x11,0xD5,0x91,0x23,0x82,0x2A,0x3D,0x6C,0x41,0xBD,0x30,0xA9,0x5B, 
+	0x50,0x82,0xEA,0x78,0x5F,0x75,0xA6,0x09,0x58,0x9A,0x55,0x9D,0x29,0x02,0x76,0xC5, 
+	0xA8,0x5B,0x10,0xC1,0x5D,0x5C,0x04,0x1D,0x16,0x03,0x98,0x1A,0x30,0x01,0x1C,0x3C, 
+	0x9D,0x3C,0x8A,0x52,0xD6,0xFE,0xE0,0x61,0x09,0x1E,0x94,0xD0,0x1E,0x1B,0x84,0x17, 
+	0x37,0xF8,0xFC,0x9E,0x91,0x59,0x3E,0x59,0x14,0xDD,0x82,0x12,0x41,0xAD,0xFE,0x01, 
+	0xB5,0xC2,0x93,0xC0,0xD2,0xBA,0x95,0x41,0xA2,0x00,0xE7,0xB0,0x7D,0x38,0x0C,0x6D, 
+	0xD4,0x6B,0x18,0x81,0xAB,0xF2,0x08,0x56,0x22,0x21,0x42,0x17,0xAF,0x2E,0xA9,0x8D, 
+	0x02,0x5E,0x2D,0xC9,0x80,0xA3,0x30,0x0E,0xC8,0x18,0x56,0x8A,0x11,0x57,0x5B,0x08, 
+	0xB0,0x38,0x4D,0x05,0x34,0x4A,0x1B,0x3F,0x33,0x5B,0x71,0x8E,0xEA,0xBB,0x17,0x96, 
+	0x45,0x83,0x80,0xFB,0xFD,0xA7,0x2F,0x60,0x1C,0xBE,0x7E,0xAE,0x4F,0xB1,0x7A,0x9F, 
+	0x56,0x91,0x2C,0x9D,0x9D,0x46,0x49,0x9D,0x1C,0xA1,0x53,0xC3,0x74,0xA6,0x53,0x63, 
+	0x3E,0x8D,0x12,0x6B,0x7F,0xF0,0xB0,0x04,0x0F,0xA6,0x00,0x8F,0x12,0x6A,0x19,0x1A, 
+	0xC2,0xFE,0xCA,0xFA,0xAA,0x86,0x0A,0x87,0x9B,0x0F,0xF6,0x2D,0x94,0xCC,0x72,0x64, 
+	0x58,0x4A,0xB8,0xE0,0xC6,0xBC,0x44,0x56,0xDE,0x4C,0xA0,0x0B,0x55,0x09,0xFA,0x1A, 
+	0xF6,0xFF,0xE5,0xAF,0xC7,0xB6,0xBB,0x9D,0xB1,0xC4,0x51,0x68,0xA1,0xD9,0xFD,0xFB, 
+	0xFE,0x42,0x3E,0x0D,0x34,0x01,0x8A,0xDF,0x7E,0xBC,0x94,0x4F,0x84,0x22,0x38,0x8B, 
+	0x17,0xC1,0x5D,0x5C,0x84,0x36,0x4E,0xDB,0xEB,0xF7,0xF3,0xE2,0x01,0x88,0x24,0xE6, 
+	0x2D,0x8C,0xAF,0x1E,0x07,0x1A,0x79,0x8A,0x78,0x18,0x56,0x17,0x27,0x0B,0x64,0xF2, 
+	0x25,0xCC,0x6B,0xF8,0xFD,0x5D,0x3A,0x59,0x58,0xFB,0x83,0x87,0x25,0xB8,0x90,0x59, 
+	0x1E,0x18,0x6F,0x3F,0x81,0xB6,0xDC,0x6B,0x0B,0xDE,0x87,0xDE,0x2A,0xC0,0xFB,0xC3, 
+	0x39,0xB9,0x25,0x58,0x92,0x6A,0x45,0x0E,0x94,0x16,0x5A,0x03,0x47,0xDE,0xEF,0x66, 
+	0x01,0x1E,0xF3,0xF5,0x1B,0xE7,0x01,0x11,0xF0,0x8D,0xE9,0xFD,0x87,0xBC,0x79,0x46, 
+	0xC8,0x73,0x56,0xEA,0xD8,0x34,0xA4,0x5D,0xAA,0x8C,0xFF,0x39,0x9A,0x2E,0x21,0xEB, 
+	0x26,0x81,0xDC,0x93,0x07,0xE8,0xED,0xEF,0xB8,0x8B,0x22,0x2C,0xFD,0xD5,0x81,0x63, 
+	0x9C,0xBD,0x7A,0x53,0x8D,0xF2,0x9A,0x78,0x2A,0x20,0xE5,0xD5,0xB5,0x5B,0x28,0xB8, 
+	0x85,0x3A,0x01,0x26,0x99,0x1D,0xE3,0x54,0x03,0x1B,0xA3,0xA4,0x86,0xA1,0x85,0x1C, 
+	0xC3,0xDA,0x8E,0x4A,0x58,0xE7,0x23,0x8D,0xE3,0x56,0xC7,0xC1,0x1E,0x6C,0x2C,0x1D, 
+	0x50,0x03,0x37,0x58,0xFA,0x92,0x12,0x6B,0x7F,0xF0,0xB0,0x04,0x0F,0xBD,0xD0,0x7F, 
+	0xC5,0x34,0xBE,0x80,0x90,0x39,0x98,0xB0,0x56,0x85,0x9A,0xE0,0x55,0x98,0xAE,0x21, 
+	0x50,0xB2,0xC0,0x96,0xA3,0x5A,0x1D,0x3A,0xF3,0x59,0x69,0x80,0x1D,0x4F,0x02,0xD4, 
+	0x4F,0xD6,0x98,0x26,0x46,0x89,0xBE,0x35,0xB0,0x20,0xE3,0xA0,0xDE,0xED,0xB0,0xB0, 
+	0x62,0x4F,0xB7,0xDB,0x2E,0x0D,0x44,0x54,0x37,0x3B,0xC1,0x00,0xC2,0x4A,0xBA,0x54, 
+	0x2A,0x84,0x8A,0xEE,0xDE,0xBD,0xAD,0x9B,0x5D,0xDF,0x82,0x15,0xD6,0xD2,0x48,0xDF, 
+	0xC2,0xEE,0x35,0x3C,0x71,0xE0,0x86,0x02,0xFB,0x83,0xFD,0xFB,0x25,0x46,0x6C,0x01, 
+	0x7E,0xBF,0xD4,0xFD,0x80,0x89,0x61,0xF5,0x35,0x41,0xA6,0x40,0x12,0xF4,0x75,0x57, 
+	0x05,0x67,0x64,0x8D,0x85,0x08,0x7D,0xA8,0x7A,0xA0,0xD9,0x22,0x04,0x4C,0xA7,0x1F, 
+	0x69,0x45,0xB7,0x8E,0x54,0xD9,0xC4,0xDA,0x1F,0x3C,0x2C,0xC1,0xC5,0xB1,0x99,0x5D, 
+	0x28,0xD3,0xF0,0x8F,0x74,0xC9,0x42,0x75,0x75,0x58,0xA2,0x03,0x58,0x1C,0x13,0x83, 
+	0x21,0x58,0xC5,0x2D,0x01,0x16,0xAA,0x2E,0xCE,0x05,0x9A,0x5E,0x0A,0x44,0x98,0x54, 
+	0x1F,0x18,0x04,0xEC,0xFD,0x98,0x33,0x46,0x01,0xCA,0x93,0xEA,0x03,0x9D,0x30,0xEF, 
+	0x4E,0x44,0x0B,0xC7,0xCB,0xEB,0xB9,0x84,0x4F,0x67,0xFA,0x17,0x03,0x0D,0x14,0xF0, 
+	0xF5,0x81,0xFD,0xF8,0x97,0x5B,0x8A,0x40,0x87,0x58,0x7C,0x04,0x68,0x01,0x3B,0x64, 
+	0xDF,0x10,0x80,0x60,0xFE,0x02,0x5A,0xD1,0x04,0xE7,0x13,0xB8,0x8A,0x92,0x87,0xB5, 
+	0x3F,0x78,0x58,0x82,0x07,0x25,0xF4,0x0F,0x0F,0xB3,0xDF,0x2F,0xA9,0x74,0xA7,0xD1, 
+	0xE9,0x40,0x04,0x95,0xD9,0x09,0xB0,0x62,0x93,0xA0,0xCA,0xD7,0x93,0xD8,0x66,0x6B, 
+	0x25,0x0A,0x66,0x76,0x64,0x59,0x61,0x1A,0x25,0xBC,0x3F,0x2D,0x44,0xC1,0xBC,0xD3, 
+	0xA5,0x5F,0x6B,0xA5,0x76,0x68,0xA7,0x78,0x9A,0xFA,0xC9,0xB0,0x0A,0x2C,0xB8,0x2A, 
+	0x08,0x91,0x22,0xD8,0x0D,0x74,0x4D,0x24,0x01,0xAB,0x6E,0x67,0xB1,0x8E,0xD6,0x50, 
+	0x14,0xE0,0x8C,0xEE,0x2F,0x3B,0x11,0xC2,0x6A,0xEF,0x0A,0x97,0xAF,0xAB,0x61,0xFC, 
+	0x95,0x88,0x03,0x2D,0xDC,0x7D,0xFE,0x8A,0xCF,0x1B,0xF4,0x67,0x44,0xA1,0x5B,0x3A, 
+	0x9C,0x6C,0xE0,0xE0,0xA8,0x84,0x75,0x16,0xD4,0x08,0xC4,0xA2,0x8C,0xC3,0xC4,0xD1, 
+	0x91,0xAB,0x42,0x62,0xB0,0x86,0x81,0x5E,0xCF,0x0F,0x2E,0x96,0xE0,0x41,0x0B,0x8E, 
+	0x3F,0x8F,0xAB,0xB3,0x95,0x25,0xA5,0x88,0x9E,0xDC,0x75,0x7A,0x4F,0x57,0x90,0x9A, 
+	0xE3,0x49,0xC0,0xE2,0xA5,0x46,0x55,0x05,0x28,0x51,0x80,0x73,0xD8,0x01,0x9A,0xA1, 
+	0xBB,0xBC,0xA4,0x6E,0xF6,0xF0,0x6B,0x90,0xF6,0x6B,0x17,0x1D,0x25,0xFB,0x6E,0x12, 
+	0xFF,0x3E,0x0E,0xB0,0xFF,0x54,0x0C,0x33,0x1F,0x6E,0x40,0xEA,0x8B,0x13,0xFE,0xE2, 
+	0x26,0x5E,0x08,0x8B,0x52,0x3F,0x2E,0xE5,0xB2,0x65,0x1C,0xAC,0x51,0x03,0xB4,0x10, 
+	0x98,0x0E,0x5D,0xA0,0x08,0xF5,0xA2,0x2F,0x3F,0x8E,0x5D,0xA3,0x0D,0x8B,0xC7,0x61, 
+	0x23,0xAA,0xC3,0xAA,0xE1,0x23,0x1A,0x24,0x3E,0x07,0x8C,0xC3,0xA9,0x4B,0x78,0x8A, 
+	0x85,0x15,0x67,0x98,0x27,0xAC,0xD0,0x6A,0x0B,0xAB,0xA9,0xA8,0xD2,0x01,0x15,0xA5, 
+	0x6E,0x2C,0xFA,0xB2,0x89,0xB5,0x3F,0x1C,0x67,0xB3,0xF9,0x1F,0x73,0xFA,0xC6,0x87, 
+	0xA8,0x4E,0x2F,0x85,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82
+};
+const unsigned int img_size_numbers = sizeof(img_numbers);
+
+const unsigned char img_ok[] = {
+	0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, 
+	0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x28,0x08,0x02,0x00,0x00,0x00,0x03,0x9C,0x2F, 
+	0x3A,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, 
+	0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, 
+	0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC3,0x00,0x00,0x0E,0xC3,0x01,0xC7, 
+	0x6F,0xA8,0x64,0x00,0x00,0x01,0xE1,0x49,0x44,0x41,0x54,0x58,0x47,0xED,0x92,0xCB, 
+	0x4A,0xC3,0x40,0x14,0x86,0xFB,0x42,0x0A,0xDD,0xB8,0x10,0xDC,0xB9,0xF2,0x11,0xDC, 
+	0x0A,0x22,0x22,0xDD,0x74,0xE1,0x42,0x70,0x2B,0x0A,0xDE,0x10,0x41,0xD1,0x55,0x51, 
+	0x4A,0x57,0x56,0x11,0x45,0xBC,0x80,0xE0,0x05,0x15,0x04,0x41,0x45,0xD1,0x85,0xE0, 
+	0x23,0x68,0x9A,0x26,0x93,0xA6,0x06,0x73,0xE6,0x27,0x9E,0xCC,0x24,0xAD,0x49,0x83, 
+	0x0B,0x7F,0xBE,0x45,0x66,0xE6,0x9F,0xF3,0xC1,0x90,0x5C,0xEE,0x24,0xDF,0x12,0xC7, 
+	0xA1,0x9D,0x84,0xF0,0x75,0x66,0xF0,0x75,0x66,0xE0,0xAB,0xD7,0x18,0xCE,0x00,0xE8, 
+	0xFE,0xC5,0x9D,0x06,0xBA,0x44,0xE2,0x7E,0xA3,0xD0,0x67,0x8C,0xF4,0x18,0x43,0x6C, 
+	0x3F,0x02,0xE8,0x12,0x89,0x07,0xCC,0x22,0xDB,0x89,0x05,0xBA,0x4E,0x3D,0xF5,0xA8, 
+	0x31,0x33,0x6D,0x96,0x72,0x1F,0xDD,0x6C,0x1F,0xBA,0xF4,0xC5,0x67,0xE2,0xAE,0x29, 
+	0xB3,0x58,0xAF,0xE4,0x8C,0xAE,0xE0,0x29,0x74,0x69,0x8A,0xAF,0x9C,0x07,0x12,0x7E, 
+	0xC7,0x76,0x05,0x2B,0x78,0x40,0x97,0x9A,0x98,0x6C,0x32,0x4F,0xCE,0x1B,0x2B,0xF8, 
+	0x40,0x97,0x82,0x78,0xDD,0xDE,0x21,0x9B,0xCC,0xAA,0x55,0x65,0x1D,0x00,0x5D,0x52, 
+	0x71,0x49,0xEC,0x93,0x4D,0x86,0x15,0x18,0xD0,0x25,0x15,0x93,0x4D,0x86,0x9D,0x86, 
+	0x81,0x2E,0x46,0xBC,0x20,0x2A,0x6C,0x27,0x08,0xD9,0x64,0xA6,0xAC,0x12,0x2B,0x84, 
+	0x81,0x4E,0x2B,0x2E,0x5A,0x4B,0x9F,0x6E,0xCD,0x9F,0x78,0xD9,0xB8,0x67,0xA7,0x1E, 
+	0x77,0x8D,0x57,0xFF,0xD4,0x4F,0xCD,0x35,0x59,0x41,0x09,0x74,0x6A,0xF1,0xA6,0x38, 
+	0xA0,0x79,0x32,0xA2,0xE9,0x04,0x0B,0x1E,0x74,0x20,0x33,0x6D,0x6D,0xB0,0x82,0x12, 
+	0xE8,0x14,0xE2,0x35,0x7B,0x9B,0x86,0xB1,0xB8,0xCD,0x31,0x6B,0xCE,0xEF,0x1C,0x3B, 
+	0x37,0xB4,0x29,0x83,0xEB,0xD1,0x40,0xA7,0x10,0x0B,0xD7,0xA1,0x61,0xAA,0x14,0xBE, 
+	0xDD,0x2E,0xAD,0x28,0x2F,0x8D,0x77,0x5C,0x8F,0x06,0x3A,0xF5,0x53,0xD3,0x3C,0x4D, 
+	0x66,0xED,0x32,0x7D,0xC9,0x1C,0x8A,0xEB,0xE0,0xF5,0x08,0xA0,0xD3,0xFE,0x5C,0xBB, 
+	0xE2,0x9C,0xA6,0xB6,0x90,0x2D,0x71,0xCA,0xAE,0xEB,0x80,0x4E,0x2B,0xF6,0xA1,0xC1, 
+	0x71,0xA9,0xA6,0x2E,0xF6,0xB8,0x75,0x9E,0x69,0xBC,0x3E,0x7B,0xE2,0x82,0xDD,0xD2, 
+	0x01,0x5D,0xBC,0xD8,0x87,0x0C,0x9A,0x1C,0x89,0x1B,0xD6,0xD7,0x01,0x5D,0xAB,0x62, 
+	0x0F,0x92,0xA8,0x92,0xE6,0xCF,0xA5,0x84,0x3C,0xA1,0x54,0xAC,0x23,0xD6,0xD4,0x01, 
+	0x5D,0x7B,0xE2,0xC1,0xDA,0x24,0xA9,0x7E,0x66,0xC2,0x5C,0x61,0x4D,0x1D,0xD0,0xB5, 
+	0x27,0xF6,0xB8,0x16,0x8F,0x64,0x0B,0x84,0x75,0x22,0x80,0xAE,0x6D,0xB1,0x07,0xD9, 
+	0x64,0xC6,0xCD,0x65,0x56,0x88,0x00,0xBA,0x44,0xE2,0xF9,0x7A,0x99,0x1D,0xC5,0x02, 
+	0xDD,0x6F,0xC4,0x49,0x80,0xEE,0x5F,0xDC,0x69,0xA0,0xFB,0x03,0xE2,0xAC,0xE1,0xEB, 
+	0xCC,0xE0,0xEB,0x6C,0x38,0xC9,0x7F,0x01,0x57,0x74,0xDC,0x0C,0x35,0x64,0x6D,0xA8, 
+	0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82
+};
+const unsigned int img_size_ok = sizeof(img_ok);
+
+const unsigned char img_cancel[] = {
+	0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, 
+	0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x28,0x08,0x02,0x00,0x00,0x00,0x03,0x9C,0x2F, 
+	0x3A,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, 
+	0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, 
+	0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC3,0x00,0x00,0x0E,0xC3,0x01,0xC7, 
+	0x6F,0xA8,0x64,0x00,0x00,0x01,0xF8,0x49,0x44,0x41,0x54,0x58,0x47,0xED,0xD8,0x3D, 
+	0x6B,0xC2,0x50,0x18,0x05,0x60,0x13,0x13,0x93,0x76,0xF5,0x1F,0x74,0x11,0x1C,0x74, 
+	0x73,0x2D,0x1D,0xBA,0xB6,0x85,0xB6,0x8A,0x51,0x04,0x1D,0x1C,0x85,0x0E,0x5D,0x0A, 
+	0x45,0xEC,0x60,0x71,0x72,0x2F,0xD4,0xA1,0x9B,0x58,0x8A,0xBA,0x76,0x72,0xED,0x26, 
+	0xFE,0x8B,0x2E,0x05,0x11,0x12,0x3F,0xE2,0xED,0x6D,0x72,0xD2,0x26,0x7E,0xE5,0x0A, 
+	0x36,0x52,0xEA,0x33,0xE8,0x79,0x83,0x78,0xC2,0x8D,0x31,0x51,0xAE,0xE5,0xDB,0x0E, 
+	0x1E,0xCF,0x9E,0xDB,0x5A,0xF1,0xCF,0x52,0x1F,0x9F,0x9E,0x22,0xFD,0xA6,0xD7,0x16, 
+	0x0A,0xFF,0xDF,0x52,0xEF,0x8A,0x3D,0xF3,0x47,0x8A,0xC5,0x48,0x04,0x69,0x11,0xE1, 
+	0xF2,0xD2,0x7F,0x72,0x82,0xC1,0x0D,0x6B,0xB1,0xA4,0x28,0x72,0xBD,0x2E,0xDC,0xDD, 
+	0x49,0x37,0x37,0xD8,0x64,0x23,0x5E,0x5D,0xED,0x35,0x9B,0x62,0x2A,0x15,0xC8,0xE5, 
+	0xB0,0xC9,0x0D,0x53,0xB1,0x5C,0xA9,0xF0,0xF1,0x38,0x27,0x49,0x34,0xF3,0xB1,0x58, 
+	0x20,0x9D,0x36,0xB7,0x9B,0x68,0xA5,0x70,0x78,0x68,0x66,0x32,0x18,0x98,0xC1,0x95, 
+	0x7B,0xB1,0x9C,0x4A,0x71,0xA1,0x10,0x06,0x83,0xFF,0xE2,0x42,0x38,0x38,0xA0,0x81, 
+	0x1F,0x8D,0xE4,0x97,0x17,0x73,0xA3,0x49,0x73,0xEE,0xD3,0x0A,0xEE,0xC5,0x64,0x38, 
+	0x44,0xB2,0x11,0xEE,0xEF,0xBF,0x1E,0xAF,0xAF,0x39,0xFE,0xE7,0x1D,0xC6,0xED,0x36, 
+	0x12,0x03,0xF7,0xE2,0xE1,0xF3,0x33,0xE9,0x76,0x31,0x58,0xE8,0xB2,0xCB,0x8F,0x8F, 
+	0xFE,0xA3,0x23,0xCC,0xC6,0xFE,0x4D,0x6A,0x35,0x0C,0x0C,0x98,0x8E,0xB1,0x56,0x2C, 
+	0x92,0xF7,0x77,0x0C,0x16,0x2E,0x18,0x44,0x32,0x68,0x89,0x04,0x12,0x1B,0xA6,0x62, 
+	0x4A,0xCB,0xE7,0xC9,0xC7,0x07,0x86,0x39,0x7A,0xA7,0x83,0xC4,0x8C,0xB5,0x98,0xD2, 
+	0xB2,0x59,0xD2,0xEF,0x63,0x70,0x1A,0x55,0xAB,0x48,0xCC,0xD6,0x28,0xA6,0xB4,0x4C, 
+	0x06,0xC9,0x49,0x88,0xC7,0x91,0x98,0xAD,0x2A,0xE6,0x44,0x11,0xC9,0x66,0x7C,0x7B, 
+	0x8B,0x64,0x23,0x2A,0x0A,0x21,0x04,0x03,0x9B,0x55,0xC5,0xF4,0x83,0x6A,0x3F,0x5B, 
+	0x4C,0x93,0x5E,0x0F,0xC9,0x69,0xDF,0xBA,0xB5,0x60,0xB4,0x72,0xA9,0x79,0x9E,0x4C, 
+	0xA7,0xC8,0x16,0xA9,0x54,0x42,0x9A,0x13,0x58,0xF4,0x6D,0xBA,0xCC,0x7A,0xC7,0x98, 
+	0xE2,0xA3,0x51,0xA4,0x39,0xFE,0x58,0x8C,0x0B,0x87,0x31,0xB8,0x59,0xAF,0x98,0x7E, 
+	0x2D,0x23,0x19,0x88,0xAE,0x23,0x59,0xE4,0x72,0x19,0xC9,0xCD,0x1A,0xC5,0x33,0xAD, 
+	0x6A,0x32,0xA9,0x9D,0x9F,0x63,0xB0,0x91,0x9D,0x2F,0x5B,0x86,0xB5,0x58,0x6E,0x34, 
+	0x90,0x0C,0xEA,0xD9,0x99,0x4F,0x55,0x11,0x9C,0x38,0xBA,0xE6,0x0C,0x67,0x17,0x6B, 
+	0xF1,0xF7,0xA9,0x35,0xE9,0x74,0x66,0xCA,0xF4,0xB7,0x37,0x24,0x4B,0x40,0x51,0x90, 
+	0x96,0xDB,0xCC,0x0D,0xFD,0xCC,0x51,0x18,0x3D,0x3D,0xE9,0xCE,0xCB,0xE5,0xB7,0x0D, 
+	0xDF,0xD0,0xAB,0x85,0x02,0x12,0xBD,0x9A,0x3D,0x3C,0x2C,0x6B,0xB5,0xDB,0xFD,0x84, 
+	0xF1,0xCC,0xAE,0xD8,0x33,0x5B,0x2B,0xDE,0xFD,0xF9,0xE2,0x11,0x9F,0xEF,0x13,0x73, 
+	0x58,0x88,0xAC,0x57,0x96,0x5C,0x12,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE, 
+	0x42,0x60,0x82
+};
+const unsigned int img_size_cancel = sizeof(img_cancel);
+
--- a/image_data.h	Wed Jan 07 13:17:42 2015 +0000
+++ b/image_data.h	Thu Jan 08 19:31:23 2015 +0100
@@ -1,3 +1,15 @@
+extern const unsigned char img_arrow_down[];
+extern const unsigned int img_size_arrow_down;
+
+extern const unsigned char img_arrow_left[];
+extern const unsigned int img_size_arrow_left;
+
+extern const unsigned char img_arrow_right[];
+extern const unsigned int img_size_arrow_right;
+
+extern const unsigned char img_arrow_up[];
+extern const unsigned int img_size_arrow_up;
+
 extern const unsigned char img_bijiben[];
 extern const unsigned int img_size_bijiben;
 
@@ -25,3 +37,11 @@
 extern const unsigned char img_utilities_system_monitor[];
 extern const unsigned int img_size_utilities_system_monitor;
 
+extern const unsigned char img_numbers[];
+extern const unsigned int img_size_numbers;
+
+extern const unsigned char img_ok[];
+extern const unsigned int img_size_ok;
+
+extern const unsigned char img_cancel[];
+extern const unsigned int img_size_cancel;
--- a/main.cpp	Wed Jan 07 13:17:42 2015 +0000
+++ b/main.cpp	Thu Jan 08 19:31:23 2015 +0100
@@ -17,7 +17,8 @@
 #include "AppLauncher.h"
 #include "meas.h"
 
-#include "AppSettings.h"
+#include "AppNetworkSettings.h"
+#include "AppStatus.h"
 #include "AppTouchCalibration.h"
 #include "AppColorPicker.h"
 #include "AppImageViewer.h"
@@ -122,6 +123,7 @@
     ImageViewerApp,
     SlideshowApp,
     SettingsApp, 
+    StatusApp, 
     TouchTestApp,
     CalibrationApp =  AppLauncher::CalibrationApp,
     Placeholder,
@@ -135,7 +137,7 @@
           a = new AppTouchCalibration();
           break;
       case SettingsApp:
-          a = new AppSettings();
+          a = new AppNetworkSettings();
           break;
       case ColorPickerApp:
           a = new AppColorPicker();
@@ -146,6 +148,9 @@
       case SlideshowApp:
           a = new AppSlideShow();
           break;
+      case StatusApp:
+          a = new AppStatus();
+          break;
       default:
           break;
   }
@@ -170,7 +175,7 @@
     //launcher.addImageButton(EmWinApp,     "emWin");
     launcher.addImageButton(ColorPickerApp,  img_preferences_color, img_size_preferences_color);
     launcher.addImageButton(ImageViewerApp,  img_multimedia_photo_manager, img_size_multimedia_photo_manager);
-    launcher.addImageButton(Placeholder,  img_help_info, img_size_help_info);
+    launcher.addImageButton(StatusApp,  img_help_info, img_size_help_info);
     launcher.addImageButton(Placeholder,  img_unetbootin, img_size_unetbootin);
       
     launcher.setAppCreatorFunc(launchApp);
@@ -269,13 +274,133 @@
   HTTPServerStart(80);
 }
 
-static uint8_t mouse_button, mouse_x, mouse_y, mouse_z;
+static int8_t mouse_button, mouse_x, mouse_y, mouse_z;
+static uint16_t cursor_x=0, cursor_y=0;
 void mouseEvent(uint8_t buttons, int8_t x, int8_t y, int8_t z)
 {
     mouse_button = buttons;
     mouse_x = x;
     mouse_y = y;
     mouse_z = z;
+    
+    if (x < 0) {
+        if (cursor_x > -x) {
+            cursor_x += x;
+        } else {
+            cursor_x = 0;
+        }
+    } else {
+        if ((cursor_x + x) >= 480) {
+            cursor_x = 479;
+        } else {
+            cursor_x += x;
+        }
+    }
+    y = y/8;
+    if (y < 0) {
+        if (cursor_y > -y) {
+            cursor_y += y;
+        } else {
+            cursor_y = 0;
+        }
+    } else {
+        if ((cursor_y + y) >= 272) {
+            cursor_y = 271;
+        } else {
+            cursor_y += y;
+        }
+    }
+    
+    //Chip_LCD_Cursor_SetPos(LPC_LCD, cursor_x, cursor_y);
+    LPC_LCD->CRSR_XY = (cursor_x & 0x3FF) | ((cursor_y & 0x3FF) << 16);
+}
+
+#define LCD_CURSOR_32x32 0
+#define LCD_CURSOR_64x64 1
+#define CURSOR_SIZE  LCD_CURSOR_32x32
+#define CURSOR_H_SIZE 32
+#define CURSOR_V_SIZE 32
+#define CURSOR_NUM   0    
+#define CURSOR_H_OFS (10)
+#define CURSOR_V_OFS (6)
+
+const unsigned char __attribute__ ((aligned(4))) Cursor[(CURSOR_H_SIZE / 4) * CURSOR_V_SIZE] =
+{
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xFA, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAB, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAB, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAB, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAB, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAB, 0xFF, 0xEA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFE, 0xAA, 0xAA,
+	0xAA, 0xAB, 0xFB, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
+	0xAA, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
+	0xAA, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAF, 0xFF, 0xFF, 0xFE, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFE, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFE, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA
+};
+
+void prepareCursor(bool enable) {
+	//Chip_LCD_Cursor_Disable(LPC_LCD, 0);
+    LPC_LCD->CRSR_CTRL = (CURSOR_NUM << 4);
+    
+    if (enable) {
+        //Chip_LCD_Cursor_Config(LPC_LCD, LCD_CURSOR_32x32, true);
+        LPC_LCD->CRSR_CFG = ((true ? 1 : 0) << 1) | CURSOR_SIZE;
+        
+        //Chip_LCD_Cursor_WriteImage(LPC_LCD, 0, (void *) Cursor);
+        {
+            int i, j;
+            uint32_t *fifoptr, *crsr_ptr = (uint32_t *) Cursor;
+
+            /* Check if Cursor Size was configured as 32x32 or 64x64*/
+            if (CURSOR_SIZE == LCD_CURSOR_32x32) {
+                i = CURSOR_NUM * 64;
+                j = i + 64;
+            }
+            else {
+                i = 0;
+                j = 256;
+            }
+            fifoptr = (uint32_t *) &(LPC_LCD->CRSR_IMG[0]);
+
+            /* Copy Cursor Image content to FIFO */
+            for (; i < j; i++) {
+
+                *fifoptr = *crsr_ptr;
+                crsr_ptr++;
+                fifoptr++;
+            }
+        }
+        
+        //Chip_LCD_Cursor_SetClip(LPC_LCD, CURSOR_H_OFS, CURSOR_V_OFS);
+        LPC_LCD->CRSR_CLIP = (CURSOR_H_OFS & 0x3F) | ((CURSOR_V_OFS & 0x3F) << 8);
+        
+        //Chip_LCD_Cursor_SetPos(LPC_LCD, cursor_x, cursor_y);
+        
+        //Chip_LCD_Cursor_Enable(LPC_LCD, 0);
+        LPC_LCD->CRSR_CTRL = (CURSOR_NUM << 4) | 1;
+    }
 }
 
 #define MOUSE_TASK_PREFIX  "[MOUSE] "
@@ -286,11 +411,12 @@
     USBHostMouse* mouse = new USBHostMouse();
     usbInitGuard.unlock();
     RtosLog* log = DMBoard::instance().logger();
-    
+        
     log->printf(MOUSE_TASK_PREFIX"mouseTask started\n");
   
     while(1) {
         
+        prepareCursor(false);
         log->printf(MOUSE_TASK_PREFIX"Attempting to connect...\n");
       
         // try to connect a mouse
@@ -307,6 +433,7 @@
         
         log->printf(MOUSE_TASK_PREFIX"Connected!\n");
         mouse->attachEvent(mouseEvent);
+        prepareCursor(true);
 
         while(mouse->connected()) {
             log->printf(MOUSE_TASK_PREFIX"Buttons: 0x%02x, X %3d, Y %3d, Z %3d\n", mouse_button, mouse_x, mouse_y, mouse_z);