Paint for the FRDM-KL25Z

Dependencies:   mbed TFT_fonts SPI_TFT_ILI9341

main.cpp

Committer:
ecowboy
Date:
2019-01-10
Revision:
4:87b40e5986e7
Parent:
3:1396bac4ae71
Child:
5:80791250acb2

File content as of revision 4:87b40e5986e7:

#include "mbed.h"
#include "SPI_TFT_ILI9341.h"
#include "Arial12x12.h"
#include "BMP565.h"
#include "stdio.h"
#include "touch.h"


#define     PIN_XP          PTB3
#define     PIN_XM          PTB2
#define     PIN_YP          PTB1
#define     PIN_YM          PTB0
#define     PIN_MOSI        PTD2
#define     PIN_MISO        PTD3
#define     PIN_SCLK        PTD1
#define     PIN_CS_TFT      PTA5
#define     PIN_DC_TFT      PTC8
#define     PIN_BL_TFT      PTC9
#define     PIN_CS_SD       PTA4


SPI_TFT_ILI9341 TFT(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, PIN_BL_TFT, PIN_DC_TFT, "TFT");
TouchScreen tft(PIN_XP, PIN_YP, PIN_XM, PIN_YM); //init TouchScreen port pins


// Paint application - Demonstate both TFT and Touch Screen
int ColorPaletteHigh = 15;
int color = White;  //Paint brush color
unsigned int colors[16] = {Red, Green, Blue, Cyan, Yellow, Purple, Pink, Black, Orange, Brown, BlueGreen, White, LightPink, DarkGrey, DarkGreen, Mustard};

int RXPLATE = 350;
int Q = 1024;  //10 bit TSC Resolution

struct point
{
    int x;
    int y;
    int z;
};

typedef struct point Point;


Point point(int xx, int yy, int zz){
    Point p;
    p.x = xx;
    p.y = yy;
    p.z = zz;
    return p;
}

int Read_X(){
    AnalogIn   _yp(PTB2);
    AnalogIn   _ym(PTB0);
    DigitalOut _xp(PTB3);
    DigitalOut _xm(PTB1);
    //uint16_t x1=1;
    //uint16_t x2=0;
    int x1=1;
    int x2=0;
    _xp = 1;
    _xm = 0;
    wait_us(50);
    //while(x1 != x2){
        x1 = _yp.read_u16();
        wait_us(50);
        x2 = _yp.read_u16();
        wait_us(50);
    //}
    _xp=0;
    return (x1+x2)/2;
}

int Read_Y(){
    AnalogIn   _xp(PTB3);
    AnalogIn   _xm(PTB1);
    DigitalOut _yp(PTB2);
    DigitalOut _ym(PTB0);
    //uint16_t y1=1;
    //uint16_t y2=0;
    int y1=1;
    int y2=0;
    _yp = 1;
    _ym = 0;
    wait_us(50);
    //while(y1 != y2){
        y1 = _xp.read_u16();
        wait_us(50);
        y2 = _xp.read_u16();
        wait_us(50);
    //}
    _yp=0;
    return (y1+y2)/2;
}

int Read_Z1(){
    AnalogIn   _ym(PTB0);
    AnalogIn   _xp(PTB3);
    DigitalOut _yp(PTB2);
    DigitalOut _xm(PTB1);
    //uint16_t y1=1;
    //uint16_t y2=0;
    int y1=1;
    int y2=0;
    _yp = 1;
    _xm = 0;
    wait_us(50);
    //while(y1 != y2){
        int z1 = _xp.read_u16();
        wait_us(50);
        int z2 = _xp.read_u16();
        wait_us(50);
    //}
    _yp=0;
    return (z1+z2)/2;
}

int Read_Z2(){
    AnalogIn   _ym(PTB0);
    AnalogIn   _xp(PTB3);
    DigitalOut _yp(PTB2);
    DigitalOut _xm(PTB1);
    //uint16_t y1=1;
    //uint16_t y2=0;
    int y1=1;
    int y2=0;
    _yp = 1;
    _xm = 0;
    wait_us(50);
    //while(y1 != y2){
        int z1 = _ym.read_u16();
        wait_us(50);
        int z2 = _ym.read_u16();
        wait_us(50);
    //}
    _yp=0;
    return (z1+z2)/2;
}


Point getPoint(){

    //PinName _yp, _ym, _xm, _xp;
    float z;
    
    //int y2 = Read_Y();
    int x2 = Read_X();
    int z1 = Read_Z1();
    int z2 = Read_Z2();
    
    //int y2 = tft.readTouch();
    int y2 = tft.readTouch(PTB3, PTB1, PTB2, PTB0);
    //int y2 = tft.readTouch(_yp,_ym,_xp,_xm);
    /*int x2 = tft.readTouch(_xp,_xm,_yp,_ym);
    int y1 = tft.readTouch(_yp,_ym,_xm,_xp);
    int x1 = tft.readTouch(_xp,_xm,_ym,_yp);
    int z2 = tft.readTouch(_yp,_xm,_ym,_xp);
    int z1 = tft.readTouch(_yp,_xm,_xp,_ym);*/
    
    //int y2 = 700;
    //int x2 = 600;
    //int z2 = 110;
    //int z1 = 100;
    
    if (z1!=0){
        z = (float)z2/(float)z1;
    }else{
        z = 0;
    }
    int x = x2;
    int y = y2;
    return point(x,y,z);
}
    
int main(){
    TFT.claim(stdout);          // send stdout to the TFT display
    TFT.set_orientation(0);
    //TFT.Bitmap(28,90,265,65,p1);
    //wait(1);
    //TFT.cls();
    TFT.set_font((unsigned char*) Arial12x12);
    TFT.foreground(Cyan);      // set chars to Cyan
    TFT.background(Purple);      // set background to Purple
    TFT.locate(80,90);
    //printf("Initializing z...\r\n");
    for(int i = 0; i<16; i++){
        TFT.fillrect(i*15, 0, 15*(i+1), ColorPaletteHigh, colors[i]);
    }
    float TS_MINX = 5500;
    float TS_MAXX = 58100;
    float TS_MINY = 4700;
    float TS_MAXY = 57600;
    int PRESSURE = 200;
    while(1){
        // a point object holds x y and z coordinates.
        //TFT.BusEnable(false);
        Point p = getPoint();
        //TFT.BusEnable(true);
        //map the ADC value read to into pixel co-ordinates
        p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240);
        p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320);
        p.z = p.x * RXPLATE / Q * (p.z -1);
        // we have some minimum pressure we consider 'valid'
        // pressure of 0 means no pressing!
        /*TFT.locate(60,90);
        printf("x = %d      \r\n", p.x);
        TFT.locate(60,110);
        printf("y = %d      \r\n", p.y);
        TFT.locate(60,130);
        printf("z = %d      \r\n", p.z);
        //TFT.locate(60,170);*/
        //printf("Initializing z...%d      \r\n",zx);
        if (p.z > 40 && p.z < PRESSURE) {
            // Detect  paint brush color change
            if(int(p.y) < ColorPaletteHigh+2){
                color = colors[int(p.x)/15];
            }else{
                TFT.fillcircle(int(p.x),int(p.y),2,color);
            }
        }
    }
}