20190816

Dependencies:   LCD_DISCO_F429ZI TS_DISCO_F429ZI BSP_DISCO_F429ZI

TS_Thread.cpp

Committer:
VASKO
Date:
2019-08-16
Revision:
0:81007dc65bac

File content as of revision 0:81007dc65bac:

#include "PrjDefs.h"

#define mSperTick 10
#define DelayBetweenTouch 5
#define DelayAfter1stTouch 50
#define PauseDelay 10
#define DelayBefore1stTouch 1

int32_t TickCtr = 0;
int32_t TouchNum = 0;
uint32_t TouchDelay = DelayBefore1stTouch;
float pwm = 0;
uint16_t x;
uint16_t y;

void Incrementer(float *f,float step,float max){
    (*f) += step;
    if((*f) > max) (*f) = max;
    }
    
void Decrementer(float *f,float step,float min){
    (*f) -= step;
    if((*f) < min) (*f) = min;
    }

bool HitTest(RT_Pars *rp){
    if(x < ((rp->xr) + (rp->gap))) return false;
    if(x > ((rp->xr) + (rp->wr) - (rp->gap))) return false;
    if(y < ((rp->yr) + (rp->gap))) return false;
    if(y > ((rp->yr) + (rp->hr) - (rp->gap))) return false;
    return true; 
    }//HitTest

void SetChangingParam(uint8_t v){
    if(ChangingParam == v)ChangingParam = ChangingParamNone;
    else ChangingParam = v;
    MsgType *_mail;
    _mail = MsgMail.alloc();
    _mail->cmd = dTdt_Selected;
    _mail->pars.f[0] = dTdt;
    MsgMail.put(_mail);
    _mail = MsgMail.alloc();
    _mail->cmd = TempS_Selected;
    _mail->pars.f[0] = TempS;
    MsgMail.put(_mail);
    _mail = MsgMail.alloc();
                    switch (ExtraSelected){
                        case KP_Selected: { _mail->cmd = KP_Selected; _mail->pars.f[0] = KProp; break; }
                        case KI_Selected: { _mail->cmd = KI_Selected; _mail->pars.f[0] = KInt; break; }
                        case KD_Selected: { _mail->cmd = KD_Selected; _mail->pars.f[0] = KDif; break; }
                        case PWM_Selected: { _mail->cmd = PWM_Selected; _mail->pars.f[0] = PWM; break; }
                        default: { _mail->cmd = PrjEventNone; break; }
                        }//switch (ExtraSelected)
    MsgMail.put(_mail);
    }//SetChangingParam
    
void SelExtraPar(uint8_t v){
    if(++ExtraSelected > PWM_Selected) ExtraSelected = KP_Selected;
    SetChangingParam(ChangingParamNone);
    }//SelExtraPar

bool TouchDispatcher(){
            
    MsgType _msg;
    

            if(HitTest(&Start_Rect)){
                if(TouchNum == 1){
                    MsgType *_mail = MsgMail.alloc();
                    _mail->cmd = CmdStart;
                    if(Start) { PWM = 0; StopH(); }
                    else { Start_H();}
                    _mail->pars.ui8[0] = Start;
                    MsgMail.put(_mail);
                    }//if(TouchNum == 1)
                }//if(HitTest(&Start_Rect))
            else if(HitTest(&TempR_Rect)){
                if(TouchNum == 1){
                    MsgType *_mail = MsgMail.alloc();
                    if(TempR_Selected == cT_Selected){
                        TempR_Selected = dT_Selected;
                        _mail->cmd = cT_Selected;
                        _mail->pars.f[0] = cT;
                        }else{
                            TempR_Selected = cT_Selected;
                            _mail->cmd = dT_Selected;
                            _mail->pars.f[0] = dT;
                            }
                    MsgMail.put(_mail);
                    }//if(TouchNum == 1)
                }//if(HitTest(&TempR_Rect))
            else if(HitTest(&TempS_Rect)){
                if(TouchNum == 1){
                    MsgType *_mail = MsgMail.alloc();
                    if(ChangingParam != TempS_Changing) SetChangingParam(TempS_Changing);
                    else SetChangingParam(TempS_Selected);
                    _mail->cmd = ChangingParam;
                    _mail->pars.f[0] = TempS;
                    MsgMail.put(_mail);
                    }//if(TouchNum == 1)
                }//if(HitTest(&TempS_Rect))
            else if(HitTest(&dTdt_Rect)){
                if(TouchNum == 1){
                    MsgType *_mail = MsgMail.alloc();
                    if(ChangingParam != dTdt_Changing) SetChangingParam(dTdt_Changing);
                    else SetChangingParam(dTdt_Selected);
                    _mail->cmd = ChangingParam;
                    _mail->pars.f[0] = dTdt;
                    MsgMail.put(_mail);
                    }//if(TouchNum == 1)
                }//if(HitTest(&dTdt_Rect))
            else if(HitTest(&SelExtra_Rect)){
                if(TouchNum == 1){
                    MsgType *_mail = MsgMail.alloc();
                    SelExtraPar(0);
                    switch (ExtraSelected){
                        case KP_Selected: { _mail->cmd = KP_Selected; _mail->pars.f[0] = KProp; break; }
                        case KI_Selected: { _mail->cmd = KI_Selected; _mail->pars.f[0] = KInt; break; }
                        case KD_Selected: { _mail->cmd = KD_Selected; _mail->pars.f[0] = KDif; break; }
                        case PWM_Selected: { _mail->cmd = PWM_Selected; _mail->pars.f[0] = PWM; break; }
                        default: { _mail->cmd = PrjEventNone; break; }
                        }//switch (ExtraSelected)
                    MsgMail.put(_mail);
                    }//if(TouchNum == 1)
                }//if(HitTest(&ChooseExOpt_Rect))
            else if(HitTest(&Extra_Rect)){
                if(TouchNum == 1){
                    MsgType *_mail = MsgMail.alloc();
                    switch (ExtraSelected){
                        case KP_Selected: {
                            if(ChangingParam != KP_Changing) SetChangingParam(KP_Changing);
                            else SetChangingParam(KP_Selected); 
                            _mail->cmd = ChangingParam; 
                            _mail->pars.f[0] = KProp; 
                            break; }//KP_Selected
                        case KI_Selected: { 
                            if(ChangingParam != KI_Changing) SetChangingParam(KI_Changing);
                            else SetChangingParam(KI_Selected); 
                            _mail->cmd = ChangingParam; 
                            _mail->pars.f[0] = KInt; 
                            break; }
                        case KD_Selected: { 
                            if(ChangingParam != KD_Changing) SetChangingParam(KD_Changing);
                            else SetChangingParam(KD_Selected); 
                            _mail->cmd = ChangingParam; 
                            _mail->pars.f[0] = KDif; 
                            break; }
                        case PWM_Selected: { 
                            if(ChangingParam != PWM_Changing) SetChangingParam(PWM_Changing);
                            else SetChangingParam(PWM_Selected); 
                            _mail->cmd = ChangingParam; 
                            _mail->pars.f[0] = PWM; 
                            break; }
                        default: { _mail->cmd = PrjEventNone; break; }
                        }//switch (ExtraSelected)
                    MsgMail.put(_mail);
                    }//if(TouchNum == 1)
                }//if(HitTest(&Extra_Rect))
            else if(HitTest(&Plus_Rect)){
                MsgType *_mail = MsgMail.alloc();
                switch(ChangingParam){
                    case TempS_Changing:{
                        Incrementer(&TempS,1,MaxTempS);
                        _mail->cmd = TempS_Changing;
                        _mail->pars.f[0] = TempS;
                        ReStartH();
                        break;}
                    case dTdt_Changing:{
                        Incrementer(&dTdt,dTdtStep,Max_dTdt);
                        _mail->cmd = dTdt_Changing;
                        _mail->pars.f[0] = dTdt;
                        break;}
                    case KP_Changing:{
                        Incrementer(&KProp,KPropStep,MaxKProp);
                        _mail->cmd = KP_Changing;
                        _mail->pars.f[0] = KProp;
                        break;}
                    case KI_Changing:{
                        Incrementer(&KInt,KIntStep,MaxKInt);
                        _mail->cmd = KI_Changing;
                        _mail->pars.f[0] = KInt;
                        break;}
                    case KD_Changing:{
                        Incrementer(&KDif,KDifStep,MaxKDif);
                        _mail->cmd = KD_Changing;
                        _mail->pars.f[0] = KDif;
                        break;}
                    case PWM_Changing:{
                        Incrementer(&PWM,PWM_Step,MaxPWM);
                        _mail->cmd = PWM_Changing;
                        _mail->pars.f[0] = PWM;
                        break;}
                    default: { _mail->cmd = PrjEventNone; break; }
                    }//switch(ChangingParam)
                MsgMail.put(_mail);
                }//if(HitTest(&Plus_Rect))
            else if(HitTest(&Minus_Rect)){
                MsgType *_mail = MsgMail.alloc();
                switch(ChangingParam){
                    case TempS_Changing:{
                        Decrementer(&TempS,1,0);
                        _mail->cmd = TempS_Changing;
                        _mail->pars.f[0] = TempS;
                        ReStartH();
                        break;}
                    case dTdt_Changing:{
                        Decrementer(&dTdt,dTdtStep,0);
                        _mail->cmd = dTdt_Changing;
                        _mail->pars.f[0] = dTdt;
                        break;}
                    case KP_Changing:{
                        Decrementer(&KProp,KPropStep,0); //_f=(*(float *))ui32;
                        _mail->cmd = KP_Changing;
                        _mail->pars.f[0] = KProp;
                        break;}
                    case KI_Changing:{
                        Decrementer(&KInt,KIntStep,0);
                        _mail->cmd = KI_Changing;
                        _mail->pars.f[0] = KInt;
                        break;}
                    case KD_Changing:{
                        Decrementer(&KDif,KDifStep,0);
                        _mail->cmd = KD_Changing;
                        _mail->pars.f[0] = KDif;
                        break;}
                    case PWM_Changing:{
                        Decrementer(&PWM,PWM_Step,0);
                        _mail->cmd = PWM_Changing;
                        _mail->pars.f[0] = PWM;
                        break;}
                    default: { _mail->cmd = PrjEventNone; break; }
                    }//switch(ChangingParam)
                MsgMail.put(_mail);
                }//if(HitTest(&Minus_Rect))
            else return 0;
            return 1;
/*
            if(HitTest(&ExOptions_Rect,TS_State.X,TS_State.Y)){
                MsgType *_mail = MsgMail.alloc();
                _mail->cmd = ExOptSetting;
                MsgMail.put(_mail);
                }
            if(HitTest(&ChooseExOpt_Rect,TS_State.X,TS_State.Y)){
                MsgType *_mail = MsgMail.alloc();
                _mail->cmd = ExOptChoosing;
                MsgMail.put(_mail);
                }
*/
}//TouchDispatcher

void TouchScreenThrdFunc(){
TS_StateTypeDef TS_State;
while(1){
    ts.GetState(&TS_State);      
    if(TS_State.TouchDetected){
        x = TS_State.X;
        y = TS_State.Y;
        if(++TickCtr > TouchDelay){
            TickCtr=0;
            TouchNum++;
            if(!TouchDispatcher()){
                TickCtr=0;
                TouchNum=0;
                TouchDelay = DelayBefore1stTouch;
                }
            if(TouchNum == 1) TouchDelay = DelayAfter1stTouch;
            else TouchDelay = DelayBetweenTouch;
            }//if(++TickCtr>TouchDelay)
            
        }else{//if(TS_State.TouchDetected)
            TickCtr=0;
            TouchNum=0;
            TouchDelay = DelayBefore1stTouch;
            }
    ThisThread::sleep_for(mSperTick);
}//while(1) 
}//TouchScreenThrdFunc
/*
                pwm += 0.001; if (pwm > 1) pwm = 0;
                _msg.cmd = 0x17;
                _msg.pars.f[0] =  pwm;
                SendMsg(&_msg.cmd);
*/