f

Dependencies:   TS_DISCO_F746NG mbed LCD_DISCO_F746NG mbed-rtos BSP_DISCO_F746NG FatFS X_NUCLEO_IHM02A1

main.cpp

Committer:
emperord
Date:
2019-03-08
Revision:
2:37a61db8b04b
Parent:
0:9933f7db9a9b

File content as of revision 2:37a61db8b04b:

#include "mbed.h"
#include "TS_DISCO_F746NG.h"
#include "LCD_DISCO_F746NG.h"
#include "eeprom.h"
#include <ctype.h>
#include "rtos.h"
#define USE_STM32746G_DISCOVERY
#include "stm32f7xx_hal.h"
#include "stm32746g_discovery.h"
#include "stm32746g_discovery_sd.h"
#include "string.h"
#include "stm32746g_discovery_lcd.h"
#include "ff_gen_drv.h"
#include "sd_diskio.h"
#include "XNucleoIHM02A1.h"
#include "wolfman.h"
#include "hfl.h"
#include "PCF85263AT.h"

#define FRAME_BUFFER    0xC0000000
#define SD_IN_BUFFER    0xC0140000
#define SD_OUT_BUFFER   0xC0280000


I2C i2c(D14,D15);        // sda, scl

char cmd[32];
dt_dat dt;   

FATFS SDFatFs;
FIL MyFile;

Thread thread;
Thread thread2;
Thread thread3;


LCD_DISCO_F746NG lcd;
TS_DISCO_F746NG ts;

extern SD_HandleTypeDef uSdHandle;
DMA2D_HandleTypeDef hdma2d_disco;
Serial pc(USBTX, USBRX);

char SDPath[4];
//char text [40];
char c;

TS_StateTypeDef TS_State;

uint16_t x, y;
uint8_t text1[30];
uint8_t text2[30];
uint8_t text3[30];
uint8_t text4[60];
uint8_t text5[60];
uint8_t textn1[30];
uint8_t textn2[30];
uint8_t textn3[30];
uint8_t textn4[60];
uint8_t textn5[60];
uint8_t savereading[120];
uint8_t currenttime[60];
uint8_t idx;
uint8_t cleared = 0;
uint8_t prev_nb_touches = 0;
static uint8_t nus_buffer[20];
double Silver = 0.0;
double Copper = 0.0;
double LEDCUR = 0.0;
uint8_t cyclestep[7];
bool CuMODE = true;
bool AgMODE = true;
int screenstate = 0;
int MODE = 0;
int ZERO = 0.0;
int DARK = 0.0;
int READ = 0.0;
int LVL = 0.0;
double RAW = 0.0;
double SilverRAW = 0.0;
double CopperRAW = 0.0;
int writefail = 0;
int* toucharrow;
int* touchbutt;
bool ManMode = false;
FRESULT ress;
uint32_t  bytesread;
double TempCurrent = 0.0;

//PwmOut pump1(PA_8);

DigitalOut pump1(D0); // PA_8
DigitalOut pump2(D1);    //PA_15;
DigitalOut pump3(A3);
//DigitalOut pump4(A2);
DigitalOut pump5(A4);
DigitalOut pump6(A5);

PwmOut LED515(D10);
PwmOut LED480(A2);
DigitalOut LEDLD(D8);
DigitalOut LEDBL(D9);
DigitalOut Tempcs(A0);
DigitalOut Heat(A1);


SPI spi(D11, D12, D13); // mosi, miso, sclk
DigitalOut cs(D7);



/* Number of movements per revolution. */
#define MPR_1 4

/* Number of steps. */
#define STEPS_1 (200 * 128)   /* 1 revolution given a 400 steps motor configured at 1/128 microstep mode. */
#define STEPS_2 (STEPS_1 * 2)

/* Delay in milliseconds. */
#define DELAY_1 1000
#define DELAY_2 2000
#define DELAY_3 5000


///XNucleoIHM02A1 *x_nucleo_ihm02a1;
L6470_init_t init[L6470DAISYCHAINSIZE] = {
    /* First Motor. */
    {
               /* Ic configuration. */
    },

    /* Second Motor. */
    {
        12.0,                           /* Motor supply voltage in V. */
        200,                           /* Min number of steps per revolution for the motor. */
        1.5,                           /* Max motor phase voltage in A. */
        4.2,                          /* Max motor phase voltage in V. */
        100.0,                         /* Motor initial speed [step/s]. */
        400.0,                         /* Motor acceleration [step/s^2] (comment for infinite acceleration mode). */
        400.0,                         /* Motor deceleration [step/s^2] (comment for infinite deceleration mode). */
        900.0,                         /* Motor maximum speed [step/s]. */
        0.0,                           /* Motor minimum speed [step/s]. */
        902.7,                         /* Motor full-step speed threshold [step/s]. */
        1.5,                          /* Holding kval [V]. */
        5.2,                          /* Constant speed kval [V]. */
        5.2,                          /* Acceleration starting kval [V]. */
        5.2,                          /* Deceleration starting kval [V]. */
        371.52,                         /* Intersect speed for bemf compensation curve slope changing [step/s]. */
        392.1569e-6,                   /* Start slope [s/step]. */
        643.1372e-6,                   /* Acceleration final slope [s/step]. */
        643.1372e-6,                   /* Deceleration final slope [s/step]. */
        0,                             /* Thermal compensation factor (range [0, 15]). */
        3.06 * 1000 * 1.10,            /* Ocd threshold [ma] (range [375 ma, 6000 ma]). */
        3.06 * 1000 * 1.00,            /* Stall threshold [ma] (range [31.25 ma, 4000 ma]). */
        StepperMotor::STEP_MODE_1_128, /* Step mode selection. */
        0xFF,                          /* Alarm conditions enable. */
        0x2E88                         /* Ic configuration. */
    } 
};
    
XNucleoIHM02A1 *x_nucleo_ihm02a1 = new XNucleoIHM02A1(&init[0], &init[1], D5/*D14*/, D4/*D15*/, D2/*D4*/, D6/*A2*/, D11, D12, D13);
L6470 **motors = x_nucleo_ihm02a1->get_components();



/* Virtual address defined by the user: 0xFFFF value is prohibited */
uint16_t VirtAddVarTab[NB_OF_VAR] = {0x5555, 0x6666, 0x7777, 0x8888, 0x8899, 0x5655, 0x6776, 0x7887, 0x7117};
uint16_t VarDataTab[] = {2, 1, 5, 1, 1, 60, 1, 0, 0};


//ADC Struct for sensor
union LTC2400 {
    unsigned int raw;
    unsigned char byte[4];
    struct {
        unsigned int    
            sub:4,
            reading:24,
            exr:1,
            sgn:1,
            dmy:1,
            eoc:1;
    };
} adc;

//Prime Button
int primeon[4];
int pcount = 0;
//Man Button
int Manonoff[4];
//CuMODE Button
int CuMODEonoff[4];
//AgMODE Button
int AgMODEonoff[4];
//screen mode
int screenmode[4];
//All Button
int Aonoff[4];
bool Aon = 0;
//pump1
double p1count = 3;
int p1up[4];
int p1down[4];
int p1onoff[4];
bool p1on = false;
//pump2
double p2count = 5;
int p2up[4];
int p2down[4];
int p2onoff[4];
bool p2on = false;
//pump3
double p3count = 1;
int p3up[4];
int p3down[4];
int p3onoff[4];
bool p3on = false;
//pump4
double p4count = 1;
int p4up[4];
int p4down[4];
int p4onoff[4];
bool p4on = false;
//Sole5
double p5count = 1;
int p5up[4];
int p5down[4];
int p5onoff[4];
bool p5on = false;
//Pump6
double p6count = 6;
int p6up[4];
int p6down[4];
int p6onoff[4];
bool p6on = false;
//Pump7
double p7count = 1;
int p7up[4];
int p7down[4];
int p7onoff[4];
bool p7on = false;

//date/time
double d1count = 1;
int d1up[4];
int d1down[4];
double d2count = 1;
int d2up[4];
int d2down[4];
double d3count = 1;
int d3up[4];
int d3down[4];
double d4count = 1;
int d4up[4];
int d4down[4];
double d5count = 1;
int d5up[4];
int d5down[4];
int savedate[4];
double d6count = 0;
int d6up[4];
int d6down[4];


void set_ch(char sel)
{    // PCA9541のサンプル
        // MST_0側の自分にスレーブ側の制御権を得る場合
    cmd[0] = 1;                     // PCA9541 コマンドコード Cont Reg
    i2c.write( 0xe2, cmd, 1);       // Cont Regを指定
    i2c.read( 0xe2, cmd, 1);        // Cont Regを読込み
    wait(0.1);                      // 0.1s待つ
    switch(cmd[0] & 0xf)
    {
    case 0:                         // bus off, has control
    case 1:                         // bus off, no control
    case 5:                         // bus on, no control
        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
        cmd[1] = 4;                 // bus on, has control
        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
        break;
    case 2:                         // bus off, no control
    case 3:                         // bus off, has control
    case 6:                         // bus on, no control
        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
        cmd[1] = 5;                 // bus on, has control
        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
        break;
    case 9:                         // bus on, no control
    case 0xc:                       // bus on, no control
    case 0xd:                       // bus off, no control
        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
        cmd[1] = 0;                 // bus on, has control
        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
        break;
    case 0xa:                       // bus on, no control
    case 0xe:                       // bus off, no control
    case 0xf:                       // bus on, has control
        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
        cmd[1] = 1;                 // bus on, has control
        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
        break;
    default:
        break;
    }

    cmd[0] = sel;                   // PCA9546 Cont Reg sel channel enabled
    i2c.write( 0xe8, cmd, 1);       // Send command string
}

void  get_time(dt_dat *dt)      // 日時の取得
{
    cmd[0] = Seconds_100th;                       // 取得はレジスタSecondsから
    i2c.write(PCF85263AT_ADDR, cmd, 1);      // レジスタの設定
    i2c.read(PCF85263AT_ADDR, cmd, 8);       // SecondsからYearsまで取得
    cmd[1] &= 0x7f;                         // 有効なのは下位7ビット
    dt->s = (cmd[1] >> 4) * 10 + (cmd[1] & 0xf);    // BCDの数値化
    cmd[2] &= 0x7f;                         // 有効なのは下位7ビット
    dt->m = (cmd[2] >> 4) * 10 + (cmd[2] & 0xf);    // BCDの数値化
    cmd[3] &= 0x3f;                         // 有効なのは下位6ビット
    dt->h = (cmd[3] >> 4) * 10 + (cmd[3] & 0xf);    // BCDの数値化
    cmd[4] &= 0x3f;                         // 有効なのは下位6ビット
    dt->d = (cmd[4] >> 4) * 10 + (cmd[4] & 0xf);    // BCDの数値化
    dt->wd = (cmd[5] & 0x3);                        // BCDの数値化
    cmd[6] &= 0x1f;                         // 有効なのは下位5ビット
    dt->mm = (cmd[6] >> 4) * 10 + (cmd[6] & 0xf);   // BCDの数値化
    dt->y = (cmd[7] >> 4) * 10 + (cmd[7] & 0xf);    // BCDの数値化
}        

void set_time(dt_dat *dt)       // 日時の設定
{
    cmd[0] = Seconds_100th;                // 設定はレジスタSeconds_100thから
    cmd[1] = ((dt->s100th / 10) << 4) + (dt->s100th % 10);// 0.01秒のBCD化
    cmd[2] = ((dt->s / 10) << 4) + (dt->s % 10) + 0x80; // 秒のBCD化
    cmd[3] = ((dt->m / 10) << 4) + (dt->m % 10);        // 分のBCD化
    cmd[4] = ((dt->h / 10) << 4) + (dt->h % 10);        // 時のBCD化
    cmd[5] = ((dt->d / 10) << 4) + (dt->d % 10);        // 日のBCD化
    cmd[7] = ((dt->mm / 10) << 4) + (dt->mm % 10);      // 月のBCD化
    dt->y = dt->y - 2000;       
    cmd[8] = ((dt->y / 10) << 4) + (dt->y % 10);        // 年のBCD化
    i2c.write(PCF85263AT_ADDR, cmd, 9);      // 日時の設定
}




int * DrawButton(int x, int y, int w, int h){
    int* pointer;
    int butttouch[4];
    pointer = butttouch;                         
    lcd.FillRect(x, y, w, h);
    butttouch[0] = x;
    butttouch[1] = x+w;
    butttouch[2] = y;
    butttouch[3] = y+h;
    return pointer;     
}

int * DrawArrow(int x, int y, int d, int s){
    int* pointer;
    int arrowtouch[4];
    pointer = arrowtouch;
    if (d == 1) {
       Point points[] = {{x-10*s,y+10*s},{x,y},{x+10*s,y+10*s},{x+2*s,y+10*s},{x+2*s,y+20*s},{x-2*s,y+20*s},{x-2*s,y+10*s}};     
       lcd.FillPolygon(points,7);                
       arrowtouch[0] = x-10*s;
       arrowtouch[1] = x+10*s;
       arrowtouch[2] = y;
       arrowtouch[3] = y+20*s;
    } else if (d == 2) {
       Point points[] = {{x+10*s,y-10*s},{x,y},{x-10*s,y-10*s},{x-2*s,y-10*s},{x-2*s,y-20*s},{x+2*s,y-20*s},{x+2*s,y-10*s}};     
       lcd.FillPolygon(points,7);
       arrowtouch[0] = x-10*s;
       arrowtouch[1] = x+10*s;
       arrowtouch[2] = y-20*s;
       arrowtouch[3] = y;              
    } else if (d == 3) {
       Point points[] = {{x,y},{x-10*s,y-10*s},{x-10*s,y-2*s},{x-20*s,y-2*s},{x-20*s,y+2*s},{x-10*s,y+2*s},{x-10*s,y+10*s}};     
       lcd.FillPolygon(points,7);   
       arrowtouch[0] = x-10*s;
       arrowtouch[1] = x+10*s;
       arrowtouch[2] = y-20*s;
       arrowtouch[3] = y;     
    } else if (d == 4) {
       Point points[] = {{x,y},{x+10*s,y+10*s},{x+10*s,y+2*s},{x+20*s,y+2*s},{x+20*s,y-2*s},{x+10*s,y-2*s},{x+10*s,y-10*s}};     
       lcd.FillPolygon(points,7);   
       arrowtouch[0] = x-10*s;
       arrowtouch[1] = x+10*s;
       arrowtouch[2] = y-20*s;
       arrowtouch[3] = y;     
    } 
    return pointer;    
}
void runpump(){
    if (ManMode == true) {
        while (1) {
            //pump1
            if (p1on == true) {
                for (int j = 1; j<=p1count; j++) {
                    pump1 = 1;
                    Thread::wait(400);
                    pump1 = 0;
                    Thread::wait(600);
                }
            }
            //pump2
            if (p2on == true) {
                for (int j = 1; j<=p2count; j++) {
                    pump2 = 1;
                    Thread::wait(400);
                    pump2 = 0;
                    Thread::wait(600);
                }
            }
            //pump3
            if (p3on == true) {
                for (int j = 1; j<=p3count; j++) {
                    pump3 = 1;
                    Thread::wait(400);
                    pump3 = 0;
                    Thread::wait(600);
                }
            }
          /*  //pump4
            if (p4on == true) {
                for (int j = 1; j<=p4count; j++) {
                    pump4 = 1;
                    Thread::wait(400);
                    pump4 = 0;
                    Thread::wait(600);
                }
            } */
            //Sole5
            if (p5on == true) {
                for (int j = 1; j<=p5count; j++) {
                    pump5 = 1;
                    Thread::wait(5000);
                    pump5 = 0;
                    Thread::wait(300);
                }
            }
            //Pump6
            if (p6on == true) {
                for (int j = 1; j<=p6count; j++) {
                    pump6 = 1;
                    Thread::wait(100);
                    pump6 = 0;
                    Thread::wait(100);
                }
            }
            //Pump7
            if (p7on == true) {
                for (int j = 1; j<=p7count; j++) {
                    motors[1]->move(StepperMotor::BWD, STEPS_1*6.15);
                    //motors[1]->wait_while_active();
                    Thread::wait(300);
                }
            }            
            Thread::wait(2000);
        }
    } else {
        //pump1
        if (p1on == true) {
            for (int j = 1; j<=p1count; j++) {
                pump1 = 1;
                Thread::wait(400);
                pump1 = 0;
                Thread::wait(600);
            }
        }
        //pump2
        if (p2on == true) {
            for (int j = 1; j<=p2count; j++) {
                pump2 = 1;
                Thread::wait(400);
                pump2 = 0;
                Thread::wait(600);
            }
        }
        //pump3
        if (p3on == true) {
            for (int j = 1; j<=p3count; j++) {
                pump3 = 1;
                Thread::wait(400);
                pump3 = 0;
                Thread::wait(600);
            }
        }
      /*  //pump4
        if (p4on == true) {
            for (int j = 1; j<=p4count; j++) {
                pump4 = 1;
                Thread::wait(400);
                pump4 = 0;
                Thread::wait(600);
            }
        } */
        //Sole5
        if (p5on == true) {
            for (int j = 1; j<=p5count; j++) {
                pump5 = 1;
                Thread::wait(5000);
                //Wash cycle will go here
                pump5 = 0;
                Thread::wait(300);
            }
        }
        //Pump6
        if (p6on == true) {
            for (int j = 1; j<=p6count; j++) {
                pump6 = 1;
                Thread::wait(100);
                pump6 = 0;
                Thread::wait(100);
            }
        }
        //Pump7
        if (p7on == true) {
            for (int j = 1; j<=p7count; j++) {
                motors[1]->move(StepperMotor::BWD, STEPS_1*6.15);
                //motors[1]->wait_while_active();
                Thread::wait(4000);
            }
        }            

    }

}
void fill() {
    if (MODE != 6) { MODE = 5; }           
    p1on = false;
    p2on = false;
    p3on = false;
    p4on = false;
    p5on = false;
    p6on = false;   
    p7on = true;
    runpump();    
    if (MODE != 6) { MODE = 4; }  
}
void drain() {      
    p1on = false;
    p2on = false;
    p3on = false;
    p4on = false;
    p5on = true;
    p6on = false;   
    p7on = false;
    runpump();    
}
void wash() {
    MODE = 6;
    pump5 = 1;
    motors[1]->move(StepperMotor::BWD, STEPS_1*18.45);
    Thread::wait(4000);
    //motors[1]->wait_while_active();
    pump5 = 0;
    motors[1]->move(StepperMotor::BWD, STEPS_1*18.45);
    Thread::wait(4000);
    //motors[1]->wait_while_active();
    pump5 = 1;  
    Thread::wait(3000);
    pump5 = 0;               
    MODE = 4;    
   /* drain();       
    Thread::wait(100);
    fill();
    Thread::wait(100);
    drain();
    Thread::wait(100) ;     
    fill();
    Thread::wait(100);
    drain();
    Thread::wait(100) ; 
    fill();
    Thread::wait(100);
    drain();
    Thread::wait(100);
    fill();
    Thread::wait(100);
    fill();
    Thread::wait(100);
    fill();    
    Thread::wait(100);
    drain();
    Thread::wait(100);
    MODE = 4; */
}
void mix() {
    MODE = 7;
    p1on = false;
    p2on = false;
    p3on = false;
    p4on = false;
    p5on = false;
    p6on = true;
    p7on = false;    
    runpump();    
    Thread::wait(1000);
    MODE = 4;
    
}
void Agbuffer() {
    MODE = 8;
    p1on = true;
    p2on = false;
    p3on = false;
    p4on = false;
    p5on = false;
    p6on = false;
    p7on = false;      
    runpump();
    MODE = 4;
}
void Agindicator() {
    MODE = 9;
    p1on = false;
    p2on = true;
    p3on = false;
    p4on = false;
    p5on = false;
    p6on = false;
    p7on = false;      
    runpump();
    MODE = 4;   
}
void CuIndicator() {
    MODE = 10;
    p1on = false;
    p2on = false;
    p3on = true;
    p4on = false;
    p5on = false;
    p6on = false;
    p7on = false;      
    runpump();
    MODE = 4;      
}
void ClSoln() {
    MODE = 11;
    p1on = false;
    p2on = false;
    p3on = false;
    p4on = true;
    p5on = false;
    p6on = false;
    p7on = false;      
    runpump();
    MODE = 4;  
}
unsigned int read() {
    spi.format(8,0);
    cs = 0;
    Thread::wait(200);
    for( int i = 3; i >= 0; i-- ) {
        adc.byte[i] = spi.write( 0xFF );
    }
    cs = 1;    
 
    return adc.reading;
    
}
unsigned int readtemp() {
    spi.format(8,0);
    Tempcs = 0;
    Thread::wait(200);
    for( int i = 3; i >= 0; i-- ) {
        adc.byte[i] = spi.write( 0xFF );
    }
    Tempcs = 1;    
 
    return adc.reading;
    
}
unsigned int readl(int take) { 
    LED515.write(0.0);
    LED480.write(0.0);
    LEDLD = 0;
    LEDBL = 0;        
    unsigned int res = 1;
    unsigned int resp = 0;
    if (take == 0) {
        MODE = 0;
        LEDCUR=0.0;
        Thread::wait(2000);
        while (resp < res) {
            resp = read();
            res = read();
        }
        Thread::wait(2000);  
        unsigned int DF = read();
        unsigned int basereading = 0;  
        double i = 0.0;
        while (basereading <= DF) {        
            i = i + 0.001;
            LED515.write(i);
            res = 1;
            resp = 0; 
            while (resp < res) {
                resp = read();
                res = read();
            } 
            basereading = read();
        }
        LEDCUR = i + 0.001f;  
        LED515.write(i + 0.001f);
        Thread::wait(2000);
        while (resp < res) {
            resp = read();
            res = read();
        }                   
        res = read();           
        MODE = 4;        
        pc.printf("DARK: %d  LEDCUR: %f\r\n", res, LEDCUR);
        
    }
    if (take == 1) {
        MODE = 1;
        LED515.write(LEDCUR);
        while (read() <= 12000000) {
            LEDCUR = LEDCUR + 0.001f;
            LED515.write(LEDCUR);
        }
        Thread::wait(2000);
        while (resp < res) {
            resp = read();
            res = read();
        }                   
        res = read();        
        MODE = 4;
        pc.printf("ZERO: %d\r\n", res);
    }
    if (take == 2) {
        MODE = 2;
        LED515.write(LEDCUR);
        Thread::wait(2000);
        while (resp < res) {
            resp = read();
            res = read();
        }   
        res = read(); 
        MODE = 4;       
        pc.printf("READ: %d\r\n", res);
    }    
    if (take == 3) {
        MODE = 12;    
        LEDLD=1;
        Thread::wait(2000);
        while (resp < res) {
            resp = read();
            res = read();
        }   
        res = read();
        LEDLD=0; 
        MODE = 4;       
        pc.printf("Level: %d\r\n", res);
    }
    
    
    ///
        if (take == 4) {
        MODE = 0;
        LEDCUR=0.0;
        Thread::wait(2000);
        while (resp < res) {
            resp = read();
            res = read();
        }  
        Thread::wait(2000);
        unsigned int DF = read();
        unsigned int basereading = 0;  
        double i = 0.0;
        while (basereading <= DF) {        
            i = i + 0.001;
            LED480.write(i);
            res = 1;
            resp = 0; 
            while (resp < res) {
                resp = read();
                res = read();
            } 
            basereading = read();
        }
        LEDCUR = i + 0.001f;  
        LED480.write(i + 0.001f);
        Thread::wait(2000);
        while (resp < res) {
            resp = read();
            res = read();
        }                   
        res = read();           
        LED480.write(0.0);
        MODE = 4;        
        pc.printf("DARK: %d  LEDCUR: %f\r\n", res, LEDCUR);
        
    }
    if (take == 5) {
        MODE = 1; 
        LED480.write(LEDCUR);
        while (read() <= 12000000) {
            LEDCUR = LEDCUR + 0.001f;
            LED480.write(LEDCUR);
        }
        Thread::wait(2000);
        while (resp < res) {
            resp = read();
            res = read();
        }                   
        res = read();     
        LED480.write(0.0);   
        MODE = 4;
        pc.printf("ZERO: %d\r\n", res);
    }
    if (take == 6) {
        MODE = 2;
        LED480.write(LEDCUR);
        Thread::wait(2000);
        while (resp < res) {
            resp = read();
            res = read();
        }   
        res = read(); 
        LED480.write(0.0);
        MODE = 4;       
        pc.printf("READ: %d\r\n", res);
    }   
    ///         
    LEDBL=1;                
    return res;
}

void saveit() {
    Thread::wait(200);  
    get_time(&dt);
    Thread::wait(200);
    memset((char*)savereading,0,sizeof(savereading));
    Thread::wait(1000);  
    sprintf((char*)savereading, "%04d/%02d/%02d %02d:%02d:%02d,%0.1f,%0.5f,%0.1f,%0.5f,%0.5f,%0.5f,%0.5f\n", 2000 + dt.y, dt.mm, dt.d, dt.h, dt.m, dt.s, Silver, SilverRAW, Copper, CopperRAW, ((double)DARK/16777216)*3.302, ((double)ZERO/16777216)*3.302, ((double)READ/16777216)*3.302);
    Thread::wait(1000);       

    ress = f_open(&MyFile, "Log.csv", FA_WRITE);   
    Thread::wait(200);   
    if(ress!= FR_OK) {
            pc.printf("Failed to open file\n");
            ress = f_open(&MyFile, "Log.csv", FA_CREATE_ALWAYS); 
            if(ress!= FR_OK) {
                pc.printf("Failed to open file\n");
            }
        }
    Thread::wait(200);      
    f_lseek(&MyFile, f_size(&MyFile));
    Thread::wait(200);  
    ress = f_write(&MyFile, savereading, sizeof(savereading), &bytesread);
    Thread::wait(200);  
    if(ress!= FR_OK) {
        pc.printf("Failed to write file 1\n");
        MODE = 13;
        writefail = 1;
        Thread::wait(3000);                  
    } else {    
        pc.printf("Done!\n");
        MODE = 11;
        writefail = 0;
    }                    
    Thread::wait(200);  
    f_close(&MyFile);
   /* Thread::wait(200);  
    FATFS_UnLinkDriver(SDPath); */
}

void ReadSilver() {
    sprintf((char*)cyclestep, " - Ag");
    wash();
    //Thread::wait(30000); //to give heater time to warm water 
    LVL = readl(3);
    while (LVL > 9000000) {
        fill();
        LVL = readl(3);
    }       
    Thread::wait(2000);
    DARK = readl(0); 
    Thread::wait(2000);
    ZERO = readl(1);
    Agbuffer();
    mix();
    Agindicator();
    mix();
    Thread::wait(60000);
    sprintf((char*)cyclestep, " - Ag");
    READ = readl(2); 
    double x = abs(((float)READ-(float)DARK)/((float)ZERO-(float)DARK));
    x = 2-log10(x*100);
    RAW = x;
    SilverRAW = RAW;   
    //y = 10726x^2 – 301.98x – 5.1693
    x = 10726*pow(x,2) - 301.98*x - 5.1693;
    if (x<0.0){ x=0.0;}
    Silver = x;
    sprintf((char*)cyclestep, "");     
    saveit(); 
}
void ReadCopper() {
    sprintf((char*)cyclestep, " - Cu");
    wash();
    //Thread::wait(30000); //to give heater time to warm water   
    LVL = readl(3);
    while (LVL > 9000000) {
        fill();
        LVL = readl(3);
    }    
    Thread::wait(2000);
    DARK = readl(4);      
    Thread::wait(2000);    
    ZERO = readl(5);
    CuIndicator();
    mix();
    Thread::wait(60000);
    sprintf((char*)cyclestep, " - Cu");
    READ = readl(6); 
    double x = abs(((float)READ-(float)DARK)/((float)ZERO-(float)DARK));
    x = 2-log10(x*100);
    RAW = x;
    CopperRAW = RAW;
    //y = 4852.2x – 9.5947  
    x = 4852.2*x - 9.5947;
    if (x<0.0){ x=0.0;}
    Copper = x;
    sprintf((char*)cyclestep, "");      
    saveit();
}
void ThermoStat() {
    TempCurrent = ((readtemp()/16777216.0) - 0.3756) * 660;
    pc.printf("%0.2f",TempCurrent);
    if (TempCurrent >= 41.0) { Heat = 0;}
    if (TempCurrent < 38.0) { Heat = 1;}
    }
void reprime();
void takereading() {
    while (1) {
        LED515.write(0.0);
        LED480.write(0.0);
        LEDLD = 0;
        LEDBL = 0;
        LEDCUR = 0.0;        
        if (ManMode == true) {
            DARK = readl(0);
            ZERO = readl(1);
            Thread::wait(5000);
            READ = readl(2);
            double x = abs(((float)READ-(float)DARK)/((float)ZERO-(float)DARK));
            x = 2-log10(x*100);
            //x = 10.297*pow(x,2) - 21.909*x + 11.453;
            if (x < 0.0) { x = 0.0; }
            Copper = x;
            Silver = x;            
        }
        if (ManMode == false) {
            ThermoStat();
            if (AgMODE == true) { ReadSilver(); }
            if (CuMODE == true) { ReadCopper(); } 
            drain(); 
            for (int d6chld = 0; d6chld < d6count*56; d6chld++){             
                Thread::wait(60000);
            }    
            if (d6count > 0) { reprime(); }
        }
    }
}

void prime(){
    MODE = 3;
    thread3.terminate(); 
    pump5 = 1;
    for (pcount = 0; pcount < 25; pcount++) {
        
        pump1 = 1;
        Thread::wait(200);
        pump1 = 0;

        pump2 = 1;
        Thread::wait(200);
        pump2 = 0;

        pump3 = 1;
        Thread::wait(200);
        pump3 = 0;

       /* pump4 = 1;
        Thread::wait(200);
        pump4 = 0; */
 
        pump6 = 1;
        Thread::wait(200);
        pump6 = 0;
        
        motors[1]->move(StepperMotor::BWD, STEPS_1*6.15);
        //motors[1]->wait_while_active();       


    }      
    Thread::wait(5000);
    pump5 = 0;
    Thread::wait(300);
    if (ManMode == true) {  thread2.start(runpump); }
    thread3.start(takereading); 
    pcount = 0;
    MODE = 4;
}

void reprime(){
    MODE = 3;
    pump5 = 1;
    for (pcount = 0; pcount < 5; pcount++) {
        
        pump1 = 1;
        Thread::wait(200);
        pump1 = 0;

        pump2 = 1;
        Thread::wait(200);
        pump2 = 0;

        pump3 = 1;
        Thread::wait(200);
        pump3 = 0;

       /* pump4 = 1;
        Thread::wait(200);
        pump4 = 0; */
 
        pump6 = 1;
        Thread::wait(200);
        pump6 = 0;
      
    }      
    Thread::wait(2000);
    pump5 = 0;
    Thread::wait(300);
    pcount = 0;
    MODE = 4;
}

void screencycle();
void setdatetime() {
    cmd[0] = Oscillator;              // Aging_offset
    cmd[1] = 0x80 + 0x40 + 0x1;                       // -1ppm
    i2c.write(PCF85263AT_ADDR, cmd, 2);  // Aging_offset

    cmd[0] = Function;              // Aging_offset
    cmd[1] = 0x1;                       // -1ppm
    i2c.write(PCF85263AT_ADDR, cmd, 2);  // Aging_offset

    cmd[0] = Offset;              // Aging_offset
    cmd[1] = 60;                       // -1ppm
    i2c.write(PCF85263AT_ADDR, cmd, 2);  // Aging_offse


    dt.y = 2000+(int)d3count;                
    dt.mm = (int)d1count;                 
    dt.d = (int)d2count;                   
    dt.h = (int)d4count;                  
    dt.m = (int)d5count;                  
    dt.s = 0;                   
    set_time(&dt);              
    
}
void screen() {       
        while(1) {     
        if (p1count<0){p1count=0;}
        if (p2count<0){p2count=0;}
        if (p3count<0){p3count=0;}
        if (p4count<0){p4count=0;}
        if (p5count<0){p5count=0;}
        if (p6count<0){p6count=0;}  
        if (p7count<0){p7count=0;}                       
        //pump1.pulsewidth(p1count/750000);
        
        if (p1on == true || p2on == true || p3on == true || p4on == true || p5on == true || p6on == true || p7on == true) {  Aon = true; }
        if (p1on == false && p2on == false && p3on == false && p4on == false && p5on == false && p6on == false && p7on == false) {  Aon = false; }
        
        
        if (writefail == 1) {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.FillCircle(235,175,10);
        }    
        
        //General Display
        lcd.SetFont(&Font16);  
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);
        sprintf((char*)textn1, "%0.1f/%0.5f Ag", Silver, SilverRAW);
        if (strcmp((char*)text1,(char*)textn1) != 0) {           
            sprintf((char*)text1, "%0.1f/%0.5f Ag", Silver, SilverRAW);
            lcd.ClearStringLine(13);
        }
        lcd.DisplayStringAt(0, LINE(13), (uint8_t *)&text1, CENTER_MODE);       
       
        
        lcd.SetFont(&Font16);  
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);                                
        sprintf((char*)textn4, "%0.1f/%0.5f Cu L:%d", Copper, CopperRAW, LVL);
        if (strcmp((char*)text4,(char*)textn4) != 0) {         
            sprintf((char*)text4, "%0.1f/%0.5f Cu L:%d", Copper, CopperRAW, LVL);
            lcd.ClearStringLine(14);
        }
        lcd.DisplayStringAt(0, LINE(14), (uint8_t *)&text4, CENTER_MODE);  
        
        
        
        lcd.SetTextColor(LCD_COLOR_DARKGRAY);                                  
        sprintf((char*)textn4, "RAW=%0.4f | %d | %d | %d", RAW, DARK, ZERO, READ);
        if (strcmp((char*)text4,(char*)textn4) != 0) {         
            sprintf((char*)text4, "RAW=%0.4f | %d | %d | %d", RAW, DARK, ZERO, READ);
            lcd.ClearStringLine(15);
        }
        lcd.DisplayStringAt(0, LINE(15), (uint8_t *)&text4, CENTER_MODE);                                          
                                          
        sprintf((char*)textn5, "RAW Volts=%0.3f | %0.3f | %0.3f", ((double)DARK/16777216)*3.302, ((double)ZERO/16777216)*3.302, ((double)READ/16777216)*3.302);
        if (strcmp((char*)text5,(char*)textn5) != 0) {         
            sprintf((char*)text5, "RAW Volts=%0.3f | %0.3f | %0.3f", ((double)DARK/16777216)*3.302, ((double)ZERO/16777216)*3.302, ((double)READ/16777216)*3.302);
            lcd.ClearStringLine(16);
        }
        lcd.DisplayStringAt(0, LINE(16), (uint8_t *)&text5, CENTER_MODE);     
            
            
                                          
        if (MODE == 0 && (strcmp((char*)text3,"Dark Reading") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Dark Reading");             
        }
        if (MODE == 1 && (strcmp((char*)text3,"Zeroing") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Zeroing"); 
        }
        if (MODE == 2 && (strcmp((char*)text3,"Reading") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Reading"); 
        }  
        if (MODE == 3 && (strcmp((char*)text3,"Priming") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Priming"); 
        }  
        sprintf((char*)textn3, "Waiting%s", cyclestep);         
        if (MODE == 4 && (strcmp((char*)text3,(char*)textn3) != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Waiting%s", cyclestep);             
        }
        if (MODE == 5 && (strcmp((char*)text3,"Sampling") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Sampling"); 
        }
        if (MODE == 6 && (strcmp((char*)text3,"Washing") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Washing"); 
        }
        if (MODE == 7 && (strcmp((char*)text3,"Mixing") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Mixing"); 
        }
        if (MODE == 8 && (strcmp((char*)text3,"Ag Buffer Dosing") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Ag Buffer Dosing"); 
        }                
        if (MODE == 9 && (strcmp((char*)text3,"Ag Indicator Dosing") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Ag Indicator Dosing"); 
        }
        if (MODE == 10 && (strcmp((char*)text3,"Cu Indicator Dosing") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Cu Indicator Dosing"); 
        }     
        if (MODE == 11 && (strcmp((char*)text3,"Write Success") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Write Success"); 
        }
        if (MODE == 12 && (strcmp((char*)text3,"Level") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Level"); 
        }
        if (MODE == 13 && (strcmp((char*)text3,"Write Fail") != 0)) { 
            lcd.ClearStringLine(12);
            sprintf((char*)text3, "Write Fail"); 
        }             
             
        lcd.SetTextColor(LCD_COLOR_LIGHTRED);   
        lcd.DisplayStringAt(0, LINE(12), (uint8_t *)&text3, CENTER_MODE); 
        
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);   
        lcd.SetFont(&Font24);
        lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"WOLFMAN", CENTER_MODE);


        //Prime Button
        lcd.SetFont(&Font12);
        if (pcount == 0) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(20,  2, 50, 15);
            for( int i = 0 ; i < 4 ; ++i ){ primeon[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(20,  2, (uint8_t *)"Prime", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(20, 2, 50, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ primeon[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            sprintf((char*)nus_buffer, "%d", (int)pcount);
            lcd.DisplayStringAt(20, 2, (uint8_t *)nus_buffer, LEFT_MODE); 
        }  

       //Screen Mode
        //lcd.SetTextColor(LCD_COLOR_GREEN);
        //lcd.SetBackColor(LCD_COLOR_GREEN);
        touchbutt = DrawButton(230, 30, 50, 15);
        for( int i = 0 ; i < 4 ; ++i ){ screenmode[ i ] = touchbutt[ i ]; }    


        //Cu Only Button
        lcd.SetFont(&Font12);
        if (CuMODE == false) { 
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(90, 2, 25, 15);
            for( int i = 0 ; i < 4 ; ++i ){ CuMODEonoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(90, 2, (uint8_t *)"Cu", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(90, 2, 25, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ CuMODEonoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(90, 2, (uint8_t *)"Cu", LEFT_MODE); 
        }  
        //Ag Only Button
        lcd.SetFont(&Font12);
        if (AgMODE == false) { 
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(130, 2, 25, 15);
            for( int i = 0 ; i < 4 ; ++i ){ AgMODEonoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(130, 2, (uint8_t *)"Ag", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(130, 2, 25, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ AgMODEonoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(130, 2, (uint8_t *)"Ag", LEFT_MODE); 
        }  
        


        //Mode Button
        lcd.SetFont(&Font12);
        if (ManMode == true) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(340, 2, 50, 15);
            for( int i = 0 ; i < 4 ; ++i ){ Manonoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(346, 5, (uint8_t *)"Manual", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(340, 2, 50, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ Manonoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(348, 5, (uint8_t *)"Auto", LEFT_MODE); 
        }  
              
        
        
        
        //All Button
        lcd.SetFont(&Font12);
        if (Aon == true) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(410, 2, 50, 15);
            for( int i = 0 ; i < 4 ; ++i ){ Aonoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(411, 5, (uint8_t *)"All ON", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(410, 2, 50, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ Aonoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(410, 5, (uint8_t *)"All OFF", LEFT_MODE); 
        }           
      
        //pump 1 controls
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        lcd.DisplayStringAt(10, 30, (uint8_t *)"AgBuf", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(30,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ p1up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(30,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ p1down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)p1count);
        lcd.DisplayStringAt(30, 95, (uint8_t *)nus_buffer, LEFT_MODE);        
        if (p1on == true) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(10, 165, 40, 15);
            for( int i = 0 ; i < 4 ; ++i ){ p1onoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(20, 168, (uint8_t *)"ON", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(10, 165, 40, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ p1onoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(20, 168, (uint8_t *)"OFF", LEFT_MODE); 
        }              



        //pump 2 controls
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE); 
        lcd.DisplayStringAt(80, 30, (uint8_t *)"AgInd", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(100,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ p2up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(100,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ p2down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)p2count);
        lcd.DisplayStringAt(100, 95, (uint8_t *)nus_buffer, LEFT_MODE);
        if (p2on == true) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(80, 165, 40, 15);
            for( int i = 0 ; i < 4 ; ++i ){ p2onoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(90, 168, (uint8_t *)"ON", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(80, 165, 40, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ p2onoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(90, 168, (uint8_t *)"OFF", LEFT_MODE); 
        }      



        //pump 3 controls
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE); 
        lcd.DisplayStringAt(150, 30, (uint8_t *)"CuInd", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(170,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ p3up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(170,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ p3down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)p3count);
        lcd.DisplayStringAt(170, 95, (uint8_t *)nus_buffer, LEFT_MODE);
        if (p3on == true) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(150, 165, 40, 15);
            for( int i = 0 ; i < 4 ; ++i ){ p3onoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(160, 168, (uint8_t *)"ON", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(150, 165, 40, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ p3onoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(160, 168, (uint8_t *)"OFF", LEFT_MODE); 
        }      



/*
        //pump 4 controls
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        lcd.DisplayStringAt(220, 30, (uint8_t *)"OCl", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(240,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ p4up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(240,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ p4down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)p4count);
        lcd.DisplayStringAt(240, 95, (uint8_t *)nus_buffer, LEFT_MODE);
        if (p4on == true) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(220, 165, 40, 15);
            for( int i = 0 ; i < 4 ; ++i ){ p4onoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(230, 168, (uint8_t *)"ON", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(220, 165, 40, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ p4onoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(230, 168, (uint8_t *)"OFF", LEFT_MODE); 
        }         
 */       
        
        //Solenoid 5 controls
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        lcd.DisplayStringAt(285, 30, (uint8_t *)"Drain", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(310,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ p5up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(310,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ p5down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)p5count);
        lcd.DisplayStringAt(310, 95, (uint8_t *)nus_buffer, LEFT_MODE);        
        if (p5on == true) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(290, 165, 40, 15);
            for( int i = 0 ; i < 4 ; ++i ){ p5onoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(300, 168, (uint8_t *)"ON", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(290, 165, 40, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ p5onoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(300, 168, (uint8_t *)"OFF", LEFT_MODE); 
        }      
        //Pump 6 controls
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        lcd.DisplayStringAt(360, 30, (uint8_t *)"Mix", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(380,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ p6up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(380,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ p6down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)p6count);
        lcd.DisplayStringAt(380, 95, (uint8_t *)nus_buffer, LEFT_MODE);        
        if (p6on == true) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(360, 165, 40, 15);
            for( int i = 0 ; i < 4 ; ++i ){ p6onoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(370, 168, (uint8_t *)"ON", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(360, 165, 40, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ p6onoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(370, 168, (uint8_t *)"OFF", LEFT_MODE); 
        }    
        //Pump 7 controls
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        lcd.DisplayStringAt(430, 30, (uint8_t *)"Fill", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(450,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ p7up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(450,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ p7down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)p7count);
        lcd.DisplayStringAt(450, 95, (uint8_t *)nus_buffer, LEFT_MODE);        
        if (p7on == true) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(430, 165, 40, 15);
            for( int i = 0 ; i < 4 ; ++i ){ p7onoff[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(440, 168, (uint8_t *)"ON", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(430, 165, 40, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ p7onoff[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DisplayStringAt(440, 168, (uint8_t *)"OFF", LEFT_MODE); 
        }         
     
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE); 
        ts.GetState(&TS_State);
        if (TS_State.touchDetected) {
            // Clear lines corresponding to old touches coordinates
            if (TS_State.touchDetected < prev_nb_touches) {
                for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) {
                    lcd.ClearStringLine(idx);
                }
            }
            prev_nb_touches = TS_State.touchDetected;

            cleared = 0;

      /*      sprintf((char*)text, "Touches: %d", TS_State.touchDetected);
            lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE); */



            for (idx = 0; idx < TS_State.touchDetected; idx++) {
                x = TS_State.touchX[idx];
                y = TS_State.touchY[idx];
                double touchsensativity = 0.075; //(0.055 originaly)             
                

                if (( x >= primeon[0] && x <= primeon[1] ) && (y >= primeon[2] && y <= primeon[3])) {
                    thread2.terminate();
                    if (pcount != 0) {
                        pcount = 0;                           
                        thread2.start(takereading);
                    }
                    else {
                        ManMode = false;
                        Aon = false;
                        p1on = false;
                        p2on = false;
                        p3on = false;
                        p4on = false;
                        p5on = false;
                        p6on = false;   
                        p7on = false;                                              
                        thread2.start(prime);
                    }
                    Thread::wait(300);
                }

                
              if (( x >= Manonoff[0] && x <= Manonoff[1] ) && (y >= Manonoff[2] && y <= Manonoff[3])){
                    ManMode = !ManMode;
                    //motors[1]->wait_while_active();
                    if (ManMode == true) {
                        thread2.terminate();
                        p1on = false;
                        p2on = false;
                        p3on = false;
                        p4on = false;
                        p5on = false;
                        p6on = false;   
                        p7on = false;                                                                       
                        thread2.start(runpump);
                        thread3.terminate();
                        thread3.start(takereading);                            
                    } else {                        
                        thread2.terminate();
                        thread3.terminate();
                        thread3.start(takereading);                                                                       
                    }
                    Thread::wait(200); 
                }
                
                if (( x >= CuMODEonoff[0] && x <= CuMODEonoff[1] ) && (y >= CuMODEonoff[2] && y <= CuMODEonoff[3])){ CuMODE = !CuMODE; }                   
                if (( x >= AgMODEonoff[0] && x <= AgMODEonoff[1] ) && (y >= AgMODEonoff[2] && y <= AgMODEonoff[3])){ AgMODE = !AgMODE; } 
                 
                if (( x >= screenmode[0] && x <= screenmode[1] ) && (y >= screenmode[2] && y <= screenmode[3])){ 
                    screenstate = screenstate + 1;
                    if (screenstate > 2){ screenstate = 0; } 
                    Thread::wait(200);
                    EE_WriteVariable(VirtAddVarTab[7], (uint16_t)screenstate);          
                    screencycle();
                    return;                           
                }         
                            
  
                if (( x >= Aonoff[0] && x <= Aonoff[1] ) && (y >= Aonoff[2] && y <= Aonoff[3])){
                    Aon = !Aon;
                    if (Aon == true) {
                        p1on = true;
                        p2on = true;
                        p3on = true;
                        p4on = true;
                        p5on = true;
                        p6on = true;
                        p7on = true;                         
                    } else {
                        p1on = false;
                        p2on = false;
                        p3on = false;
                        p4on = false;
                        p5on = false;
                        p6on = false;                        
                        p7on = false;                         
                    }
                    Thread::wait(200);
                    //EE_WriteVariable(VirtAddVarTab[0], (uint16_t)p1count);  
                }     
                              
                //pump1
                if (( x >= p1up[0] && x <= p1up[1] ) && (y >= p1up[2] && y <= p1up[3])){
                    p1count = p1count + touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[0], (uint16_t)p1count);                                                         
                    
                }
                if (( x >= p1down[0] && x <= p1down[1] ) && (y >= p1down[2] && y <= p1down[3])){
                    p1count = p1count - touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[0], (uint16_t)p1count);  
                } 
                if (( x >= p1onoff[0] && x <= p1onoff[1] ) && (y >= p1onoff[2] && y <= p1onoff[3])){
                    p1on = !p1on;
                    Thread::wait(200);
                }          
                //pump2
                if (( x >= p2up[0] && x <= p2up[1] ) && (y >= p2up[2] && y <= p2up[3])){
                    p2count = p2count + touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[1], (uint16_t)p2count);                                                         
                    
                }
                if (( x >= p2down[0] && x <= p2down[1] ) && (y >= p2down[2] && y <= p2down[3])){
                    p2count = p2count - touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[1], (uint16_t)p2count);  
                }               
                if (( x >= p2onoff[0] && x <= p2onoff[1] ) && (y >= p2onoff[2] && y <= p2onoff[3])){
                    p2on = !p2on;
                    Thread::wait(200);
                }          
                //pump3
                if (( x >= p3up[0] && x <= p3up[1] ) && (y >= p3up[2] && y <= p3up[3])){
                    p3count = p3count + touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[2], (uint16_t)p3count);                                                         
                    
                }
                if (( x >= p3down[0] && x <= p3down[1] ) && (y >= p3down[2] && y <= p3down[3])){
                    p3count = p3count - touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[2], (uint16_t)p3count);  
                }
                if (( x >= p3onoff[0] && x <= p3onoff[1] ) && (y >= p3onoff[2] && y <= p3onoff[3])){
                    p3on = !p3on;
                    Thread::wait(200);
                }                                        
              /*  //pump4
                if (( x >= p4up[0] && x <= p4up[1] ) && (y >= p4up[2] && y <= p4up[3])){
                    p4count = p4count + touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[3], (uint16_t)p4count);                                                         
                    
                }
                if (( x >= p4down[0] && x <= p4down[1] ) && (y >= p4down[2] && y <= p4down[3])){
                    p4count = p4count - touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[3], (uint16_t)p4count);  
                }
                if (( x >= p4onoff[0] && x <= p4onoff[1] ) && (y >= p4onoff[2] && y <= p4onoff[3])){
                    p4on = !p4on;
                    Thread::wait(200);
                }                  */ 
                //Sole5
                if (( x >= p5up[0] && x <= p5up[1] ) && (y >= p5up[2] && y <= p5up[3])){
                    p5count = p5count + touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[4], (uint16_t)p5count);                                                         
                    
                }
                if (( x >= p5down[0] && x <= p5down[1] ) && (y >= p5down[2] && y <= p5down[3])){
                    p5count = p5count - touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[4], (uint16_t)p5count);  
                }                      
                if (( x >= p5onoff[0] && x <= p5onoff[1] ) && (y >= p5onoff[2] && y <= p5onoff[3])){
                    p5on = !p5on;
                    Thread::wait(200);
                }    
                //Pump6
                if (( x >= p6up[0] && x <= p6up[1] ) && (y >= p6up[2] && y <= p6up[3])){
                    p6count = p6count + touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[5], (uint16_t)p6count);                                                         
                    
                }
                if (( x >= p6down[0] && x <= p6down[1] ) && (y >= p6down[2] && y <= p6down[3])){
                    p6count = p6count - touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[5], (uint16_t)p6count);  
                }                      
                if (( x >= p6onoff[0] && x <= p6onoff[1] ) && (y >= p6onoff[2] && y <= p6onoff[3])){
                    p6on = !p6on;
                    Thread::wait(200);
                }                        
                //Pump7
                if (( x >= p7up[0] && x <= p7up[1] ) && (y >= p7up[2] && y <= p7up[3])){
                    p7count = p7count + touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[6], (uint16_t)p7count);                                                         
                    
                }
                if (( x >= p7down[0] && x <= p7down[1] ) && (y >= p7down[2] && y <= p7down[3])){
                    p7count = p7count - touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[6], (uint16_t)p7count);  
                }                      
                if (( x >= p7onoff[0] && x <= p7onoff[1] ) && (y >= p7onoff[2] && y <= p7onoff[3])){
                    p7on = !p7on;
                    Thread::wait(200);
                }                                            
                               
          /*      sprintf((char*)text, "Touch %d: x=%d y=%d    ", idx+1, x, y);
                lcd.DisplayStringAt(0, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);            */
            } 
            lcd.DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE);
        } else {
            if (!cleared) {
                lcd.Clear(LCD_COLOR_BLACK);
              /*  sprintf((char*)text, "Touches: 0");
                lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);            */
                cleared = 1;
            }
        }
        
    }
}

////////////
void screen2() {
        while(1) {     
        if (p1count<0){p1count=0;}
        if (p2count<0){p2count=0;}
        if (p3count<0){p3count=0;}
        if (p4count<0){p4count=0;}
        if (p5count<0){p5count=0;}
        if (p6count<0){p6count=0;}  
        if (p7count<0){p7count=0;}                       
        //pump1.pulsewidth(p1count/750000);
        
        if (p1on == true || p2on == true || p3on == true || p4on == true || p5on == true || p6on == true || p7on == true) {  Aon = true; }
        if (p1on == false && p2on == false && p3on == false && p4on == false && p5on == false && p6on == false && p7on == false) {  Aon = false; }
        
        if (writefail == 1) {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.FillCircle(235,190,10);
        }    
        
        //General Display
        lcd.SetFont(&Font20);  
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);
        sprintf((char*)textn1, "%0.1f ppb Ag+", Silver);
        /* if (strcmp((char*)text1,(char*)textn1) != 0) {           
            sprintf((char*)text1, "%0.1f ppm Ag+", Silver);
            lcd.ClearStringLine(4);
        } */
        lcd.DisplayStringAt(0, LINE(4), (uint8_t *)&textn1, CENTER_MODE);       
        
        lcd.SetFont(&Font20);  
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);
        sprintf((char*)textn1, "%0.1f ppb Cu2+", Copper);
       /* if (strcmp((char*)text1,(char*)textn1) != 0) {           
            sprintf((char*)text1, "%0.1f ppm Cu2+", Copper);
            lcd.ClearStringLine(9);
        } */
        lcd.DisplayStringAt(0, LINE(7), (uint8_t *)&textn1, CENTER_MODE); 
        
       
            
            
        lcd.SetFont(&Font16);                                   
        if (MODE == 0 && (strcmp((char*)text3,"Dark Reading") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Dark Reading");             
        }
        if (MODE == 1 && (strcmp((char*)text3,"Zeroing") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Zeroing"); 
        }
        if (MODE == 2 && (strcmp((char*)text3,"Reading") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Reading"); 
        }  
        if (MODE == 3 && (strcmp((char*)text3,"Priming") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Priming"); 
        }  
        sprintf((char*)textn3, "Waiting%s", cyclestep);         
        if (MODE == 4 && (strcmp((char*)text3,(char*)textn3) != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Waiting%s", cyclestep);             
        }
        if (MODE == 5 && (strcmp((char*)text3,"Sampling") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Sampling"); 
        }
        if (MODE == 6 && (strcmp((char*)text3,"Washing") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Washing"); 
        }
        if (MODE == 7 && (strcmp((char*)text3,"Mixing") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Mixing"); 
        }
        if (MODE == 8 && (strcmp((char*)text3,"Ag Buffer Dosing") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Ag Buffer Dosing"); 
        }                
        if (MODE == 9 && (strcmp((char*)text3,"Ag Indicator Dosing") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Ag Indicator Dosing"); 
        }
        if (MODE == 10 && (strcmp((char*)text3,"Cu Indicator Dosing") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Cu Indicator Dosing"); 
        }     
        if (MODE == 11 && (strcmp((char*)text3,"Write Success") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Write Success"); 
        }
        if (MODE == 12 && (strcmp((char*)text3,"Level") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Level"); 
        }             
        if (MODE == 13 && (strcmp((char*)text3,"Write Fail") != 0)) { 
            lcd.ClearStringLine(15);
            sprintf((char*)text3, "Write Fail"); 
        }
             
        lcd.SetTextColor(LCD_COLOR_LIGHTRED);   
        lcd.DisplayStringAt(0, LINE(15), (uint8_t *)&text3, CENTER_MODE); 
        
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);   
        lcd.SetFont(&Font24);
        lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Cu/Ag Ion Monitor", CENTER_MODE);


        //Prime Button
        lcd.SetFont(&Font12);
        if (pcount == 0) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(20,  2, 50, 15);
            for( int i = 0 ; i < 4 ; ++i ){ primeon[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(20,  2, (uint8_t *)"Prime", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(20, 2, 50, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ primeon[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            sprintf((char*)nus_buffer, "%d", (int)pcount);
            lcd.DisplayStringAt(20, 2, (uint8_t *)nus_buffer, LEFT_MODE); 
        }  


       //Screen Mode
        //lcd.SetTextColor(LCD_COLOR_GREEN);
        //lcd.SetBackColor(LCD_COLOR_GREEN);
        touchbutt = DrawButton(230, 30, 50, 15);
        for( int i = 0 ; i < 4 ; ++i ){ screenmode[ i ] = touchbutt[ i ]; }             



    
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE); 
        ts.GetState(&TS_State);
        if (TS_State.touchDetected) {
            // Clear lines corresponding to old touches coordinates
            if (TS_State.touchDetected < prev_nb_touches) {
                for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) {
                    lcd.ClearStringLine(idx);
                }
            }
            prev_nb_touches = TS_State.touchDetected;

            cleared = 0;

      /*      sprintf((char*)text, "Touches: %d", TS_State.touchDetected);
            lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE); */



            for (idx = 0; idx < TS_State.touchDetected; idx++) {
                x = TS_State.touchX[idx];
                y = TS_State.touchY[idx];
                double touchsensativity = 0.075; //(0.055 originaly)             
                

                if (( x >= primeon[0] && x <= primeon[1] ) && (y >= primeon[2] && y <= primeon[3])) {
                    thread2.terminate();
                    if (pcount != 0) {
                        pcount = 0;                           
                        thread2.start(takereading);
                    }
                    else {
                        ManMode = false;
                        Aon = false;
                        p1on = false;
                        p2on = false;
                        p3on = false;
                        p4on = false;
                        p5on = false;
                        p6on = false;   
                        p7on = false;                                              
                        thread2.start(prime);
                    }
                    Thread::wait(300);
                }

                
              if (( x >= Manonoff[0] && x <= Manonoff[1] ) && (y >= Manonoff[2] && y <= Manonoff[3])){
                    ManMode = !ManMode;
                    //motors[1]->wait_while_active();
                    if (ManMode == true) {
                        thread2.terminate();
                        p1on = false;
                        p2on = false;
                        p3on = false;
                        p4on = false;
                        p5on = false;
                        p6on = false;   
                        p7on = false;                                                                       
                        thread2.start(runpump);
                        thread3.terminate();
                        thread3.start(takereading);                            
                    } else {                        
                        thread2.terminate();
                        thread3.terminate();
                        thread3.start(takereading);                                                                       
                    }
                    Thread::wait(200); 
                }
                
                if (( x >= CuMODEonoff[0] && x <= CuMODEonoff[1] ) && (y >= CuMODEonoff[2] && y <= CuMODEonoff[3])){ CuMODE = !CuMODE; }                   
                if (( x >= AgMODEonoff[0] && x <= AgMODEonoff[1] ) && (y >= AgMODEonoff[2] && y <= AgMODEonoff[3])){ AgMODE = !AgMODE; } 

                if (( x >= screenmode[0] && x <= screenmode[1] ) && (y >= screenmode[2] && y <= screenmode[3])){ 
                    screenstate = screenstate + 1;
                    if (screenstate > 2){ screenstate = 0; } 
                    Thread::wait(200);
                    EE_WriteVariable(VirtAddVarTab[7], (uint16_t)screenstate);          
                    screencycle();
                    return;                           
                }       
                                                     
  
                if (( x >= Aonoff[0] && x <= Aonoff[1] ) && (y >= Aonoff[2] && y <= Aonoff[3])){
                    Aon = !Aon;
                    if (Aon == true) {
                        p1on = true;
                        p2on = true;
                        p3on = true;
                        p4on = true;
                        p5on = true;
                        p6on = true;
                        p7on = true;                         
                    } else {
                        p1on = false;
                        p2on = false;
                        p3on = false;
                        p4on = false;
                        p5on = false;
                        p6on = false;                        
                        p7on = false;                         
                    }
                    Thread::wait(200);
                    //EE_WriteVariable(VirtAddVarTab[0], (uint16_t)p1count);  
                }     
                              
                                          
                               
          /*      sprintf((char*)text, "Touch %d: x=%d y=%d    ", idx+1, x, y);
                lcd.DisplayStringAt(0, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);            */
            } 
            lcd.DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE);
        } else {
            if (!cleared) {
                lcd.Clear(LCD_COLOR_BLACK);
              /*  sprintf((char*)text, "Touches: 0");
                lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);            */
                cleared = 1;
            }
        }
        
    }
}

void screen3() {       
        while(1) {     
        if (d1count<0){d1count=0;}
        if (d2count<0){d2count=0;}
        if (d3count<0){d3count=0;}
        if (d4count<0){d4count=0;}
        if (d5count<0){d5count=0;}
        if (d6count<0){d6count=0;}                  

        


     /*   //Prime Button
        lcd.SetFont(&Font12);
        if (pcount == 0) { 
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(20,  2, 50, 15);
            for( int i = 0 ; i < 4 ; ++i ){ primeon[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(20,  2, (uint8_t *)"Prime", LEFT_MODE); 
        } else {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.SetBackColor(LCD_COLOR_RED);
            touchbutt = DrawButton(20, 2, 50, 15); 
            for( int i = 0 ; i < 4 ; ++i ){ primeon[ i ] = touchbutt[ i ]; }   
            lcd.SetTextColor(LCD_COLOR_BLACK);
            sprintf((char*)nus_buffer, "%d", (int)pcount);
            lcd.DisplayStringAt(20, 2, (uint8_t *)nus_buffer, LEFT_MODE); 
        }  */

       //Screen Mode
        lcd.SetTextColor(LCD_COLOR_GREEN);
        lcd.SetBackColor(LCD_COLOR_GREEN);
        touchbutt = DrawButton(230, 2, 50, 15);
        for( int i = 0 ; i < 4 ; ++i ){ screenmode[ i ] = touchbutt[ i ]; }    
        lcd.SetTextColor(LCD_COLOR_BLACK);    
        lcd.DisplayStringAt(230, 2, (uint8_t *)"Exit", LEFT_MODE);         



      //Save
        lcd.SetFont(&Font12);
            lcd.SetTextColor(LCD_COLOR_GREEN);
            lcd.SetBackColor(LCD_COLOR_GREEN);
            touchbutt = DrawButton(90, 2, 50, 15);
            for( int i = 0 ; i < 4 ; ++i ){ savedate[ i ] = touchbutt[ i ]; }            
            lcd.SetTextColor(LCD_COLOR_BLACK);    
            lcd.DisplayStringAt(90, 2, (uint8_t *)"Save", LEFT_MODE); 

      
        get_time(&dt);   
        sprintf((char*)currenttime, "%02d/%02d/%04d %02d:%02d:%02d\n", dt.mm, dt.d, 2000 + dt.y, dt.h, dt.m, dt.s);      
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);   
        lcd.SetFont(&Font12);
        lcd.DisplayStringAt(0, LINE(13), (uint8_t *)currenttime, CENTER_MODE);      
      
      


        //Month
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        lcd.DisplayStringAt(10, 30, (uint8_t *)"Month", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(30,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ d1up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(30,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ d1down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)d1count);
        lcd.DisplayStringAt(30, 95, (uint8_t *)nus_buffer, LEFT_MODE);        
        


        //Day
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE); 
        lcd.DisplayStringAt(80, 30, (uint8_t *)"Day", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(100,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ d2up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(100,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ d2down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)d2count);
        lcd.DisplayStringAt(100, 95, (uint8_t *)nus_buffer, LEFT_MODE);
  


        //Year
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE); 
        lcd.DisplayStringAt(150, 30, (uint8_t *)"Year", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(170,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ d3up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(170,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ d3down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)d3count);
        lcd.DisplayStringAt(170, 95, (uint8_t *)nus_buffer, LEFT_MODE);
 




        //Hour
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        lcd.DisplayStringAt(220, 30, (uint8_t *)"Hour", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(240,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ d4up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(240,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ d4down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)d4count);
        lcd.DisplayStringAt(240, 95, (uint8_t *)nus_buffer, LEFT_MODE);
      
        
        
        //Min
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        lcd.DisplayStringAt(285, 30, (uint8_t *)"Min", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(310,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ d5up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(310,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ d5down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)d5count);
        lcd.DisplayStringAt(310, 95, (uint8_t *)nus_buffer, LEFT_MODE);        
        
    
        //Interval
        lcd.SetFont(&Font16);
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        lcd.DisplayStringAt(360, 30, (uint8_t *)"Interval(h)", LEFT_MODE); 
        lcd.SetFont(&Font12);
        lcd.SetTextColor(LCD_COLOR_YELLOW);        
        toucharrow = DrawArrow(380,50,1,2);
        for( int i = 0 ; i < 4 ; ++i ){ d6up[ i ] = toucharrow[ i ]; }
        lcd.SetTextColor(LCD_COLOR_GREEN);
        toucharrow = DrawArrow(380,150,2,2);
        for( int i = 0 ; i < 4 ; ++i ){ d6down[ i ] = toucharrow[ i ]; }       
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);         
        sprintf((char*)nus_buffer, "%d", (int)d6count);
        lcd.DisplayStringAt(380, 95, (uint8_t *)nus_buffer, LEFT_MODE);  
    
    
     
        lcd.SetBackColor(LCD_COLOR_BLACK); 
        lcd.SetTextColor(LCD_COLOR_LIGHTBLUE); 
        ts.GetState(&TS_State);
        if (TS_State.touchDetected) {
            // Clear lines corresponding to old touches coordinates
            if (TS_State.touchDetected < prev_nb_touches) {
                for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) {
                    lcd.ClearStringLine(idx);
                }
            }
            prev_nb_touches = TS_State.touchDetected;

            cleared = 0;

      /*      sprintf((char*)text, "Touches: %d", TS_State.touchDetected);
            lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE); */



            for (idx = 0; idx < TS_State.touchDetected; idx++) {
                x = TS_State.touchX[idx];
                y = TS_State.touchY[idx];
                double touchsensativity = 0.075; //(0.055 originaly)             
                

     
 
                if (( x >= screenmode[0] && x <= screenmode[1] ) && (y >= screenmode[2] && y <= screenmode[3])){ 
                    screenstate = screenstate + 1;
                    if (screenstate > 2){ screenstate = 0; } 
                    Thread::wait(200);
                    EE_WriteVariable(VirtAddVarTab[7], (uint16_t)screenstate);          
                    screencycle();
                    return;                           
                }         
                            
                if (( x >= savedate[0] && x <= savedate[1] ) && (y >= savedate[2] && y <= savedate[3])){ setdatetime(); }   
                              
                //Month
                if (( x >= d1up[0] && x <= d1up[1] ) && (y >= d1up[2] && y <= d1up[3])){
                    d1count = d1count + touchsensativity;                                                                            
                }
                if (( x >= d1down[0] && x <= d1down[1] ) && (y >= d1down[2] && y <= d1down[3])){
                    d1count = d1count - touchsensativity;
                } 
    
                //Day
                if (( x >= d2up[0] && x <= d2up[1] ) && (y >= d2up[2] && y <= d2up[3])){
                    d2count = d2count + touchsensativity;
    
                }
                if (( x >= d2down[0] && x <= d2down[1] ) && (y >= d2down[2] && y <= d2down[3])){
                    d2count = d2count - touchsensativity;

                }               
   
                //year
                if (( x >= d3up[0] && x <= d3up[1] ) && (y >= d3up[2] && y <= d3up[3])){
                    d3count = d3count + touchsensativity;                                                       
                    
                }
                if (( x >= d3down[0] && x <= d3down[1] ) && (y >= d3down[2] && y <= d3down[3])){
                    d3count = d3count - touchsensativity;
                }
                                 
                //hour
                if (( x >= d4up[0] && x <= d4up[1] ) && (y >= d4up[2] && y <= d4up[3])){
                    d4count = d4count + touchsensativity;                                                                     
                    
                }
                if (( x >= d4down[0] && x <= d4down[1] ) && (y >= d4down[2] && y <= d4down[3])){
                    d4count = d4count - touchsensativity; 
                }

                //Min
                if (( x >= d5up[0] && x <= d5up[1] ) && (y >= d5up[2] && y <= d5up[3])){
                    d5count = d5count + touchsensativity;                                                                       
                }
                if (( x >= d5down[0] && x <= d5down[1] ) && (y >= d5down[2] && y <= d5down[3])){
                    d5count = d5count - touchsensativity;
                }   
                   
                //Interval
                if (( x >= d6up[0] && x <= d6up[1] ) && (y >= d6up[2] && y <= d6up[3])){
                    d6count = d6count + touchsensativity; 
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[8], (uint16_t)d6count);                                                                           
                }
                if (( x >= d6down[0] && x <= d6down[1] ) && (y >= d6down[2] && y <= d6down[3])){
                    d6count = d6count - touchsensativity;
                    Thread::wait(2);
                    EE_WriteVariable(VirtAddVarTab[8], (uint16_t)d6count);                           
                }                                   

                               
          /*      sprintf((char*)text, "Touch %d: x=%d y=%d    ", idx+1, x, y);
                lcd.DisplayStringAt(0, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);            */
            } 
            lcd.DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE);
        } else {
            if (!cleared) {
                lcd.Clear(LCD_COLOR_BLACK);
              /*  sprintf((char*)text, "Touches: 0");
                lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);            */
                cleared = 1;
            }
        }
        
    }
}



void screencycle() {
    if (screenstate == 1) {screen();}
    if (screenstate == 0) {screen2();}  
    if (screenstate == 2) {screen3();}  
}
/////////////

int main()
{
    i2c.frequency(100000);
    set_ch(1);
    pc.baud(9600);
    LED515.write(0.0);
    LED480.write(0.0);
  /*  sd.mount();
    FILE *fp = fopen("/sd/Readings.txt", "w");
    if (fp == NULL)
    {
        fprintf(stderr, "Open error for writing!!\r\n");
        while (true) {}
    } 
        fprintf(fp, "Hello!\n");
    fprintf(fp, "Example of writing and reading of text file.\n");
    fclose(fp);    */
    //Setup LED515
    //LED515.period(-1.0f);      // 4 second period
    //LED515.write(0);      // 50% duty cycle, relative to period     
    HAL_FLASH_Unlock();
    EE_Init();
    //pump1
    EE_ReadVariable(VirtAddVarTab[0], &VarDataTab[0]);
    p1count = (double)VarDataTab[0];
    //pump2
    EE_ReadVariable(VirtAddVarTab[1], &VarDataTab[1]);
    p2count = (double)VarDataTab[1];     
    //pump3
    EE_ReadVariable(VirtAddVarTab[2], &VarDataTab[2]);
    p3count = (double)VarDataTab[2];     
    //pump4
    EE_ReadVariable(VirtAddVarTab[3], &VarDataTab[3]);
    p4count = (double)VarDataTab[3];  
    //Sole5
    EE_ReadVariable(VirtAddVarTab[4], &VarDataTab[4]);
    p5count = (double)VarDataTab[4];     
    //Pump6
    EE_ReadVariable(VirtAddVarTab[5], &VarDataTab[5]);
    p6count = (double)VarDataTab[5];           
    //Pump7
    EE_ReadVariable(VirtAddVarTab[6], &VarDataTab[6]);
    p7count = (double)VarDataTab[6]; 
    //Screen
    EE_ReadVariable(VirtAddVarTab[7], &VarDataTab[7]);
    screenstate = (int)VarDataTab[7];
    //Interval
    EE_ReadVariable(VirtAddVarTab[8], &VarDataTab[8]);
    d6count = (int)VarDataTab[8];      

    //Draw WolfMan
  /*  lcd.Clear(LCD_COLOR_RED);
    lcd.SetTextColor(LCD_COLOR_BLACK);
    lcd.SetBackColor(LCD_COLOR_RED);
    lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"WolfMan", RIGHT_MODE); 
    lcd.SetTextColor(LCD_COLOR_LIGHTBLUE);*/    
    lcd.Clear(LCD_COLOR_WHITE);
    lcd.SetBackColor(LCD_COLOR_WHITE);
    lcd.DrawBitmap(150,25,(uint8_t *)hfl);
                   
    //motors[1]->reset_device();          
    wait(2);
    
    FATFS_LinkDriver(&SD_Driver, SDPath);
    ress = f_mount(&SDFatFs, (TCHAR const*)SDPath, 0);
    Thread::wait(200);  
    if(ress!= FR_OK){ pc.printf("Failed to mount SD\n"); }
    
    saveit();
    ts.Init(lcd.GetXSize(), lcd.GetYSize());
    lcd.SetFont(&Font12);
    lcd.SetBackColor(LCD_COLOR_BLACK);
    lcd.SetTextColor(LCD_COLOR_WHITE);
    thread.start(screencycle); 
    sprintf((char*)cyclestep, "");
    //reprime();    
    LED515.period(1.0/10000);
    LED480.period(1.0/10000);
    thread3.start(takereading);       

    
}