A basic graphics package for the LPC4088 Display Module.

Dependents:   lpc4088_displaymodule_demo_sphere sampleGUI sampleEmptyGUI lpc4088_displaymodule_fs_aid ... more

Fork of DMBasicGUI by EmbeddedArtists AB

Revision:
7:4ba7bd9d32ef
Child:
9:ce69a7adfe9c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Application/DigitButton.cpp	Thu Jan 08 19:28:22 2015 +0100
@@ -0,0 +1,144 @@
+/*
+ *  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 "DigitButton.h"
+#include "mbed.h"
+#include "DMBoard.h"
+
+#include "lpc_swim_image.h"
+
+DigitButton::DigitButton(COLOR_T* fb, uint16_t x, uint16_t y, uint16_t width, uint16_t height) :
+  Clickable(fb, x, y, width, height), _value(0), _digits(1), _img_y_offset(0),
+  _img_digit_height(0), _img_digit_width(0), _img_digit_size(0)
+{
+  _imgUp.pixels = NULL;
+  _imgDown.pixels = NULL;
+  _win.fill = WHITE;
+  swim_clear_screen(&_win, _win.fill);
+}
+
+DigitButton::~DigitButton()
+{
+  if (_imgUp.pixels != NULL) {
+    free(_imgUp.pixels);
+    _imgUp.pixels = NULL;
+  }
+  if (_imgDown.pixels != NULL) {
+    free(_imgDown.pixels);
+    _imgDown.pixels = NULL;
+  }
+}
+
+bool DigitButton::loadImages(const char* imgUp, const char* imgDown)
+{
+  if (_imgUp.pixels != NULL) {
+    free(_imgUp.pixels);
+    _imgUp.pixels = NULL;
+  }
+  if (_imgDown.pixels != NULL) {
+    free(_imgDown.pixels);
+    _imgDown.pixels = NULL;
+  }
+  if (Image::decode(imgUp, Image::RES_16BIT, &_imgUp) != 0) {
+    DMBoard::instance().logger()->printf("Failed to load %s\n", imgUp);
+    return false;
+  }
+  if (imgDown != NULL) {
+    if (Image::decode(imgDown, Image::RES_16BIT, &_imgDown) == 0) {
+      DMBoard::instance().logger()->printf("Failed to load %s\n", imgDown);
+      return false;
+    }
+  }
+  _img_digit_width = _imgUp.width;
+  _img_digit_height = _imgUp.height/10;
+  _img_y_offset = _imgUp.height - 10*_img_digit_height;
+  _img_digit_size = ((_imgUp.res == Image::RES_16BIT)?1:2) * _img_digit_height * _img_digit_width;
+  return true;
+}
+
+bool DigitButton::loadImages(const unsigned char* imgUp, unsigned int imgUpSize, 
+                             const unsigned char* imgDown, unsigned int imgDownSize)
+{
+  if (_imgUp.pixels != NULL) {
+    free(_imgUp.pixels);
+    _imgUp.pixels = NULL;
+  }
+  if (_imgDown.pixels != NULL) {
+    free(_imgDown.pixels);
+    _imgDown.pixels = NULL;
+  }
+  if (Image::decode(imgUp, imgUpSize, Image::RES_16BIT, &_imgUp) != 0) {
+    DMBoard::instance().logger()->printf("Failed to load %s\n", imgUp);
+    return false;
+  }
+  if (imgDown != NULL) {
+    if (Image::decode(imgDown, imgDownSize, Image::RES_16BIT, &_imgDown) == 0) {
+      DMBoard::instance().logger()->printf("Failed to load %s\n", imgDown);
+      return false;
+    }
+  }
+  _img_digit_width = _imgUp.width;
+  _img_digit_height = _imgUp.height/10;
+  _img_y_offset = _imgUp.height - 10*_img_digit_height;
+  _img_digit_size = ((_imgUp.res == Image::RES_16BIT)?1:2) * _img_digit_height * _img_digit_width;
+  return true;
+}
+
+void DigitButton::setNumDigits(unsigned int num)
+{
+  _digits = num;
+  draw();
+}
+
+void DigitButton::setValue(unsigned int val)
+{
+  _value = val;
+  draw();
+}
+
+void DigitButton::draw(COLOR_T* fb)
+{
+  if (fb != NULL) {
+    _win.fb = fb;
+  }
+//  if (_pressed) {
+//    if (_imgDown.pixels != NULL) {
+//      swim_put_image(&_win, _imgDown.pixels, _imgDown.width, _imgDown.height);
+//    }
+//  } else {
+//    if (_imgUp.pixels != NULL) {
+//      swim_put_image(&_win, _imgUp.pixels, _imgUp.width, _imgUp.height);
+//    }
+//  }
+  drawDigits(_pressed ? _imgDown : _imgUp);
+}
+
+void DigitButton::drawDigits(Image::ImageData_t& img)
+{
+  if (img.pixels != NULL) {
+    uint32_t v = _value;
+    int x = (_win.xvsize - (_digits*_img_digit_width))/2;
+    if (x < 0) {
+      x = 0;
+    }
+    int y = (_win.yvsize - _img_digit_height)/2;
+    for (int i = 0; i < _digits; i++) {
+      uint32_t off = (v % 10)*_img_digit_size + _img_y_offset*_img_digit_width;
+      swim_put_image_xy(&_win, _imgUp.pixels+off, _img_digit_width, _img_digit_height, x+(_digits-i-1)*_img_digit_width, y);
+      v = v/10;
+    }
+  }
+}