Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of DMBasicGUI by
DigitButton.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 #include "DigitButton.h" 00018 #include "mbed.h" 00019 #include "DMBoard.h" 00020 00021 #include "lpc_swim_image.h" 00022 00023 DigitButton::DigitButton(COLOR_T* fb, uint16_t x, uint16_t y, uint16_t width, uint16_t height) : 00024 Clickable(fb, x, y, width, height), _value(0), _digits(1), _img_y_offset(0), 00025 _img_digit_height(0), _img_digit_width(0), _img_digit_size(0) 00026 { 00027 _imgUp.pointerToFree = NULL; 00028 _imgUp.pixels = NULL; 00029 _imgDown.pointerToFree = NULL; 00030 _imgDown.pixels = NULL; 00031 _win.fill = WHITE; 00032 swim_clear_screen(&_win, _win.fill); 00033 } 00034 00035 DigitButton::~DigitButton() 00036 { 00037 if (_imgUp.pointerToFree != NULL) { 00038 free(_imgUp.pointerToFree); 00039 _imgUp.pointerToFree = NULL; 00040 } 00041 if (_imgDown.pointerToFree != NULL) { 00042 free(_imgDown.pointerToFree); 00043 _imgDown.pointerToFree = NULL; 00044 } 00045 } 00046 00047 bool DigitButton::loadImages(const char* imgUp, const char* imgDown) 00048 { 00049 if (_imgUp.pointerToFree != NULL) { 00050 free(_imgUp.pointerToFree); 00051 _imgUp.pointerToFree = NULL; 00052 } 00053 if (_imgDown.pointerToFree != NULL) { 00054 free(_imgDown.pointerToFree); 00055 _imgDown.pointerToFree = NULL; 00056 } 00057 if (Image::decode(imgUp, Image::RES_16BIT, &_imgUp) != 0) { 00058 DMBoard::instance().logger()->printf("Failed to load %s\n", imgUp); 00059 return false; 00060 } 00061 if (imgDown != NULL) { 00062 if (Image::decode(imgDown, Image::RES_16BIT, &_imgDown) == 0) { 00063 DMBoard::instance().logger()->printf("Failed to load %s\n", imgDown); 00064 return false; 00065 } 00066 } 00067 _img_digit_width = _imgUp.width; 00068 _img_digit_height = _imgUp.height/10; 00069 _img_y_offset = _imgUp.height - 10*_img_digit_height; 00070 _img_digit_size = ((_imgUp.res == Image::RES_16BIT)?1:2) * _img_digit_height * _img_digit_width; 00071 return true; 00072 } 00073 00074 bool DigitButton::loadImages(const Image::ImageData_t* imgUp, const Image::ImageData_t* imgDown) 00075 { 00076 if (_imgUp.pointerToFree != NULL) { 00077 free(_imgUp.pointerToFree); 00078 _imgUp.pointerToFree = NULL; 00079 } 00080 if (_imgDown.pointerToFree != NULL) { 00081 free(_imgDown.pointerToFree); 00082 _imgDown.pointerToFree = NULL; 00083 } 00084 memcpy(&_imgUp, imgUp, sizeof(Image::ImageData_t)); 00085 if (imgDown != NULL) { 00086 memcpy(&_imgDown, imgDown, sizeof(Image::ImageData_t)); 00087 } 00088 _img_digit_width = _imgUp.width; 00089 _img_digit_height = _imgUp.height/10; 00090 _img_y_offset = _imgUp.height - 10*_img_digit_height; 00091 _img_digit_size = ((_imgUp.res == Image::RES_16BIT)?1:2) * _img_digit_height * _img_digit_width; 00092 return true; 00093 } 00094 00095 bool DigitButton::loadImages(const unsigned char* imgUp, unsigned int imgUpSize, 00096 const unsigned char* imgDown, unsigned int imgDownSize) 00097 { 00098 if (_imgUp.pointerToFree != NULL) { 00099 free(_imgUp.pointerToFree); 00100 _imgUp.pointerToFree = NULL; 00101 } 00102 if (_imgDown.pointerToFree != NULL) { 00103 free(_imgDown.pointerToFree); 00104 _imgDown.pointerToFree = NULL; 00105 } 00106 if (Image::decode(imgUp, imgUpSize, Image::RES_16BIT, &_imgUp) != 0) { 00107 DMBoard::instance().logger()->printf("Failed to load %s\n", imgUp); 00108 return false; 00109 } 00110 if (imgDown != NULL) { 00111 if (Image::decode(imgDown, imgDownSize, Image::RES_16BIT, &_imgDown) == 0) { 00112 DMBoard::instance().logger()->printf("Failed to load %s\n", imgDown); 00113 return false; 00114 } 00115 } 00116 _img_digit_width = _imgUp.width; 00117 _img_digit_height = _imgUp.height/10; 00118 _img_y_offset = _imgUp.height - 10*_img_digit_height; 00119 _img_digit_size = ((_imgUp.res == Image::RES_16BIT)?1:2) * _img_digit_height * _img_digit_width; 00120 return true; 00121 } 00122 00123 void DigitButton::setNumDigits(unsigned int num) 00124 { 00125 _digits = num; 00126 draw(); 00127 } 00128 00129 void DigitButton::setValue(unsigned int val) 00130 { 00131 _value = val; 00132 draw(); 00133 } 00134 00135 void DigitButton::draw(COLOR_T* fb) 00136 { 00137 if (fb != NULL) { 00138 _win.fb = fb; 00139 } 00140 // if (_pressed) { 00141 // if (_imgDown.pixels != NULL) { 00142 // swim_put_image(&_win, _imgDown.pixels, _imgDown.width, _imgDown.height); 00143 // } 00144 // } else { 00145 // if (_imgUp.pixels != NULL) { 00146 // swim_put_image(&_win, _imgUp.pixels, _imgUp.width, _imgUp.height); 00147 // } 00148 // } 00149 drawDigits(_pressed ? _imgDown : _imgUp); 00150 } 00151 00152 void DigitButton::drawDigits(Image::ImageData_t& img) 00153 { 00154 if (img.pixels != NULL) { 00155 uint32_t v = _value; 00156 int x = (_win.xvsize - (_digits*_img_digit_width))/2; 00157 if (x < 0) { 00158 x = 0; 00159 } 00160 int y = (_win.yvsize - _img_digit_height)/2; 00161 for (unsigned int i = 0; i < _digits; i++) { 00162 uint32_t off = (v % 10)*_img_digit_size + _img_y_offset*_img_digit_width; 00163 swim_put_image_xy(&_win, _imgUp.pixels+off, _img_digit_width, _img_digit_height, x+(_digits-i-1)*_img_digit_width, y); 00164 v = v/10; 00165 } 00166 } 00167 }
Generated on Wed Jul 13 2022 03:01:50 by
1.7.2
