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 でも動くようになりました。

/media/uploads/Rhyme/img_1194.jpg

TFTMenu.cpp

Committer:
Rhyme
Date:
2017-04-11
Revision:
4:d4c937bcc469
Parent:
0:659a74b77279

File content as of revision 4:d4c937bcc469:

/** 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) ;
}