Simple integer calculator using FRDM-KL25Z and Adafruit 2.8" TFT with touch \\ "Dentaku" means "Desktop Calculator" in Japanese \\ On 5-Dec-2015, Support for FRDM-K64F, FRDM-K22F, NUCLEO-F411RE added.
Dependencies: SPI_STMPE610 UniGraphic mbed vt100
Yet another simple desktop calculator program, only for integer.
As usual I used FRDM-KL25Z, Adafruit 2.8" TFT with touch and UniGraphic library.
Now works with FRDM-K64F, FRDM-K22F, and NUCLEO-F411RE.
整数計算のみの簡単な電卓プログラムです。
例によって、FRDM-KL25Z, Adafruit 2.8" TFT with touch, そして UniGraphic を使用しています。
FRDM-K64F, FRDM-K22F, NUCLEO-F411RE でも動くようになりました。
Diff: TFTMenu.cpp
- Revision:
- 0:659a74b77279
diff -r 000000000000 -r 659a74b77279 TFTMenu.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TFTMenu.cpp Sun Aug 02 14:00:59 2015 +0000 @@ -0,0 +1,180 @@ +/** mbed oscilloscope my implementation of a oscillo scope + * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab + * + * TFTMenu.cpp + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "mbed.h" +#include <ILI9341.h> +#include "SPI_STMPE610.h" +#include "Arial12x12.h" +//#include "Arial24x23.h" +#include "Arial28x28.h" +//#include "Arial43x48_numb.h" +#include "vt100.h" +#include <string.h> + +#include "TFTMenu.h" + +extern ILI9341 TFT ; +extern SPI_STMPE610 TSC ; +extern vt100 *tty ; + + +TFTMenuItem::TFTMenuItem(int x1, int y1, int x2, int y2, FuncPtr fnc, + char *name, uint16_t mcolor, uint16_t fcolor, int l_margin, int t_margin ) +{ + left = x1 ; + right = x2 ; + top = y1 ; + bottom = y2 ; + if (name) { + label = new char[strlen(name)+1] ; + strcpy(label, name) ; + font_color = fcolor ; + } + menu_color = mcolor ; + + left_margin = l_margin ; // 7 ; + top_margin = t_margin ; // 10 ; + func = fnc ; +} + +TFTMenuItem::~TFTMenuItem() +{ + left = 0 ; + right = 0 ; + top = 0 ; + bottom = 0 ; + if (label) { + free(label) ; + } +} + +TFTRadioButton::TFTRadioButton(int x1, int y1, int x2, int y2, FuncPtr fnc, + char *name, uint16_t mcolor, uint16_t fcolor, + char *altname, uint16_t altmcolor, uint16_t altfcolor, + bool sel) : TFTMenuItem(x1,y1,x2,y2,fnc,name,mcolor,fcolor) +{ + if (altname) { + alt_label = new char[strlen(altname) + 1] ; + strcpy(alt_label, altname) ; + } else { + alt_label = 0 ; + } + alt_font_color = altfcolor ; + alt_menu_color = altmcolor ; + selected = sel ; +} + +TFTRadioButton::~TFTRadioButton() +{ + left = 0 ; + right = 0 ; + top = 0 ; + bottom = 0 ; + if (label) { + delete label ; + } + if (alt_label) { + delete alt_label ; + } +} + +bool TFTRadioButton::hit(int x, int y) +{ + bool result = false ; + if ((left <= x)&&(x <= right)&&(top <= y)&&(y <= bottom)) { + result = true ; + if (selected) { + selected = false ; + } else { + selected = true ; + } + draw() ; + } + return( result ) ; +} + +void TFTRadioButton::select(bool value) +{ + selected = value ; +} + +uint16_t TFTMenuItem::getColor(void) +{ + return(menu_color) ; +} + +bool TFTMenuItem::hit(int x, int y) +{ + bool result = false ; + if ((left <= x)&&(x <= right)&&(top <= y)&&(y <= bottom)) { + result = true ; + draw() ; + } +// draw() ; + return( result ) ; +} + +void TFTMenuItem::doIt(void) +{ + if (func) { + func() ; + } +} + +void TFTMenuItem::font_margin(int x, int y) +{ + top_margin = y ; + left_margin = x ; +} + +void TFTMenuItem::draw(int offset_x, int offset_y) +{ + TFT.BusEnable(true) ; + TFT.fillrect(left+offset_x, top+offset_y, right+offset_x, bottom+offset_y, Black) ; + TFT.fillrect(left+offset_x, top+offset_y, right+offset_x, bottom+offset_y, menu_color) ; + wait(0.1) ; + TFT.locate(left+offset_x+left_margin, top+offset_y+top_margin) ; + TFT.foreground(font_color) ; + TFT.background(menu_color) ; + TFT.set_font((unsigned char *)Arial28x28) ; + wait(0.1) ; + TFT.printf(label) ; + TFT.BusEnable(false) ; +} + +void TFTRadioButton::draw(int offset_x, int offset_y) +{ + TFT.BusEnable(true) ; + if (selected) { + TFT.fillrect(left+offset_x, top+offset_y, right+offset_x, bottom+offset_y, Black) ; + TFT.fillrect(left+offset_x, top+offset_y, right+offset_x, bottom+offset_y, alt_menu_color) ; + wait(0.1) ; + TFT.locate(left+offset_x+left_margin, top+offset_y+top_margin) ; + TFT.foreground(alt_font_color) ; + TFT.background(alt_menu_color) ; + TFT.set_font((unsigned char *)Arial12x12) ; + wait(0.1) ; + TFT.printf(alt_label) ; + } else { + TFTMenuItem::draw(offset_x, offset_y) ; + } + TFT.BusEnable(false) ; +} + + +void TFTMenuItem::highlight(int offset_x, int offset_y) +{ + TFT.BusEnable(true) ; + TFT.rect(left+offset_x, top+offset_y, right+offset_x, bottom+offset_y, font_color) ; + TFT.BusEnable(false) ; +} \ No newline at end of file