20190816

Dependencies:   LCD_DISCO_F429ZI TS_DISCO_F429ZI BSP_DISCO_F429ZI

RxMsgThread.cpp

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

File content as of revision 0:81007dc65bac:

#include "PrjDefs.h"

DigitalOut xx(PG_13);
//Ticker Tick;

float dTprev = 0;
float IntPart = 0;
float PL = 0;
float Power = 0;
float RefT = 0;
bool Expired;
bool Down;

void ResetPID(){
    dTprev = 0;
    IntPart = 0;
    PL = 0;
    Power = 0;
    }//ResetPID
    
float GetRefT(float r){
    if (Expired) return TempS;
    float _f = r;
    if(Start){
        if(Down) _f -= dTdt * 0.1;
        else _f += dTdt * 0.1;
        }
    else _f = 0;
    if(Down && (_f<=TempS)) { Expired = 1; return TempS; } 
    else if((!Down) && (_f>=TempS)){ Expired = 1; return TempS; }
    else return _f; 
    }//GetRefT

void ReStartH(){
    RefT = cT;
    Expired = 0;
    if(cT<=TempS) Down =0;
    else Down = 1;
    }//StartH        
    
void Start_H(){
    ReStartH();
    Start = 1;
    }//StartH        
    
void StopH(){
    RefT = 0;
    Expired = 0;
    Down = 0;
    Start = 0;
    ResetPID();
    PWM = 0;
    }//StopH        
    
void PID(){
    float _f = dT * KProp / 10.0;
    Power = _f;
    LoUpLimit(Power, 0, MaxPower);
    IntPart += (dT * KInt / 100.0);
    LoUpLimit(IntPart, 0, MaxPower);
    Power += IntPart;
    _f = -(KDif * (dT - dTprev) / 10.0);
    LoUpLimit(_f, 0, MaxPower);
    Power += _f;
    LoUpLimit(Power, 0, MaxPower);
    PWM = Power;
    dTprev = dT;
    }//PID

void RxMsgThrdFunc(){
MsgType _msg;
MsgType *_mail;
TxRxServiceInit();
while (1) {
    TxRxStates _trs = GetMsg(&_msg.cmd);
    if(_trs == RxRcvd){
        cT = _msg.pars.f[0];
        if(Start){
            RefT = GetRefT(RefT);
            dT = RefT - cT;
            xx=1;
            PID();
            xx=0;
            _mail = MsgMail.alloc();
            if(ExtraSelected == PWM_Selected) _mail->cmd = PWM_Selected;
            else if(ExtraSelected == PWM_Changing) _mail->cmd = PWM_Changing;
            else _mail->cmd = PrjEventNone;
            _mail->pars.f[0] = PWM;
            MsgMail.put(_mail);
                
            _mail = MsgMail.alloc();
            if(TempR_Selected == cT_Selected){
                _mail->cmd = cT_Selected;
                _mail->pars.f[0] = cT;
                }else{
                    _mail->cmd = dT_Selected;
                    _mail->pars.f[0] = dT;
                    }
            MsgMail.put(_mail);
            }else{//if(Start)
                PWM = 0;
                ResetPID();
                _mail = MsgMail.alloc();
                _mail->cmd = cT_Selected;
                _mail->pars.f[0] = cT;
                MsgMail.put(_mail);
                }//else{//if(Start)
        
        
        
        _msg.cmd = CmdPWM;
        _msg.pars.f[0] =  PWM;
        SendMsg(&_msg.cmd);
        
        }//if(_trs == RxRcvd)
    ThisThread::sleep_for(1);
    }//while(1)
}//RxMsgThrdFunc