Test

Dependencies:   mbed-dev-OS5_10_4

RawSerial/SendTelToHost.cpp

Committer:
kevman
Date:
2020-08-07
Revision:
0:014fad4dfb9d

File content as of revision 0:014fad4dfb9d:

/*-------------------------------------------------------------------------------
Programm Name:  SendTelToHost.cpp
Version:        1.0
Sprache:        C
Compiler:       mbed Ver. 5.0
Autor:          PS
Copyright:      PS
                
Funktion:       Sendet die Telegramme an den EcmWin Rechner
28.10.2012: 
-------------------------------------------------------------------------------*/
#include "Headers.h"

/*-------------------------------------------------------------------------------
SendAnalogValues: Schickt was fertig ist
-------------------------------------------------------------------------------*/
int SendAnalogValues()
{
#ifdef PGU_EDUCATION
	SendAnalogFromEdu();
#endif
#ifdef PGU_RPA                
	SendRpaAnalogValues();
#else
	SendAnalogFromTouch();
#endif
    return(true);
}

/*-------------------------------------------------------------------------------
SendAnalogValues: Schickt was fertig ist
-------------------------------------------------------------------------------*/
int SendAnalogFromEdu()
{
    int j, Ret;
    
    Ret = false;
    if(MVars.m_fStartTel == 0x01)   // STX schicken
    {
        if(MVars.m_fFinishMeasurement == true)
        {
            MVars.nMessZustand[0] = 0;
            MVars.m_fSendStatus = true;
            MVars.m_fFinishMeasurement = false;
            MVars.m_fMeasurementFinished = true;
        }
            
        if(MVars.m_fSendStatus == true) // Status senden
            SendStatus();
        if(HostIf.fSendMessage == true) // Status senden
        {
            HostIf.fSendMessage = false;
            RpaDev.puts(HostIf.strMessageBuf);
        }
        if(HostIf.fSendError == true) // Status senden
        {
            HostIf.fSendError = false;
            RpaDev.puts(HostIf.strErrorBuf);
        }
        
        MVars.nTelLen = sprintf(STemp,"%c#MW#%d#",STX,MVars.m_nAnzValue);
        strcpy(HostIf.strTempBuf, STemp);
        MVars.m_fStartTel = 0x00;
    }

    for(j=0;j<2;j++)
    {
            if(MVars.m_fChnValid[j] == true)
            {
                MVars.nTelLen += sprintf(STemp,"%06lu#",(UINT32)MVars.dbAdResult[j]);
                strcat(HostIf.strTempBuf, STemp);
            }
    }
    MVars.m_nSendAnz++;
    if(MVars.m_nSendAnz >= MVars.m_nAnzValue)
    {
        MVars.nTelLen += sprintf(STemp,"%c",ETX);
        strcat(HostIf.strTempBuf, STemp);
        MVars.m_fStartTel = 0x01;
        MVars.m_nSendAnz = 0;
        if(MVars.m_fMeasurementFinished == true)
        {
            SetMessungEnde();
        }
#ifndef PGU_RPA                
        if(g_fDoCheckIRange == true)
        {     
            CheckIRange();
            g_fDoCheckIRange = false;
        }
#endif        
        Ret = true;
    }
    if(MVars.m_nSendValues == 2)    // senden während Messung
    {
//        if(g_fDisableSendMw == false)
        	RpaDev.puts((const char *)HostIf.strTempBuf);
        MVars.nTelLen = 0;
        HostIf.strTempBuf[0] = 0x00;
    }
    else
    {
//        if(g_fDisableSendMw == false)
	        RpaDev.puts(HostIf.strTempBuf);
        MVars.nDestCount = 0;
        HostIf.strTempBuf[0] = 0x00;
    }
  
    return(Ret);
}


/*-------------------------------------------------------------------------------
SendAnalogValues: Schickt was fertig ist
-------------------------------------------------------------------------------*/
int SendAnalogFromTouch()
{
    int j, Ret;
    
#ifndef PGU_RPA    
    if(MVars.m_fMessDlgOpened == false)
        return(true);   // wenn im Config Mode, keine Messtelegramme schicken

    Ret = false;
    if(MVars.m_fStartTel == 0x01)   // STX schicken
    {
        if(MVars.m_fFinishMeasurement == true)
        {
//            MVars.nMessZustand[0] = 0;
            MVars.m_fSendStatus = true;
            MVars.m_fFinishMeasurement = false;
            MVars.m_fMeasurementFinished = true;
        }
        if(HostIf.fIsConnected == false)    // hat keine Verbindung hergestellt
            return(true);
        if(g_nSendDisableTimer > 0)
        	return(true);
        	    
//        CheckIRange();  // wenn er hier umschaltet, dann ist der SendDisableTimer > 0 und ein Status wird gesendet
        if(MVars.m_fSendStatus == true) // Status senden
        {
            SendStatus();
	        if(g_nSendDisableTimer > 0)
    	    	return(true);
        }
        if(IrComp.fSendInfo == true)
        {
            SendInfo();
            IrComp.fSendInfo = false;
        }
        if(HostIf.fSendMessage == true) // Status senden
        {
            HostIf.fSendMessage = false;
            RpaDev.puts(HostIf.strMessageBuf);
        }
        if(HostIf.fSendError == true) // Status senden
        {
            HostIf.fSendError = false;
            RpaDev.puts(HostIf.strErrorBuf);
        }
        
        MVars.nTelLen = sprintf(STemp,"%c#MW#%d#",STX,MVars.m_nAnzValue);
        strcpy(HostIf.strTempBuf, STemp);
        MVars.m_fStartTel = 0x00;
    }

    for(j=0;j<2;j++)
    {
        if(MVars.m_fChnValid[j] == true)
        {
            MVars.nTelLen += sprintf(STemp,"%08lu#",(UINT32)AdVal->AdResult[j][g_nAdCount]);
			strcat(HostIf.strTempBuf, STemp);
#ifdef TFT_DEBUG 
//     printf ("Buf:%s   Val:%f   j:%d    Pos:%d  \n",STemp, AdVal->AdResult[j][g_nAdCount], j, g_nAdCount );
#endif
        }
    }
    if(MVars.m_fChnValid[2] == true)
    {
        MVars.nTelLen += sprintf(STemp,"%08lu#",(UINT32)AdVal->dbUFkResult);
        strcat(HostIf.strTempBuf, STemp);
    }
    if(MVars.m_fChnValid[3] == true)
    {
        MVars.nTelLen += sprintf(STemp,"%08lu#",(UINT32)AdVal->dbIFkResult);
        strcat(HostIf.strTempBuf, STemp);
    }
    
    MVars.m_nSendAnz++;
    if(MVars.m_nSendAnz >= MVars.m_nAnzValue)
    {
//        sprintf(STemp,"%d#%d#%c\r\n",g_fAd0State, g_fAd1State,ETX);
        MVars.nTelLen += sprintf(STemp,"%c\r\n",ETX);
        strcat(HostIf.strTempBuf, STemp);
        MVars.m_fStartTel = 0x01;
        MVars.m_nSendAnz = 0;
        if(MVars.m_fMeasurementFinished == true)
        {
            SetMessungEnde();
        }        
        Ret = true;
    }
    if(MVars.m_nSendValues == 2)    // senden während Messung
    {
        if(g_fDisableSendMw == false)
        	RpaDev.puts((const char *)HostIf.strTempBuf);
        MVars.nTelLen = 0;
        HostIf.strTempBuf[0] = 0x00;
    }
    else
    {
        if(g_fDisableSendMw == false)
	        RpaDev.puts(HostIf.strTempBuf);
        MVars.nDestCount = 0;
        HostIf.strTempBuf[0] = 0x00;
    }
#endif    
    return(Ret);
}

//-----------------------------------------------------------------------
// SendStatus: Senden des Status, da sich etwas geändert hat 
//-----------------------------------------------------------------------
void SendStatus(void) 
{
#ifdef PGU_RPA
	SendRpaStatus();
#else	    
    sprintf(HostIf.strTempBuf,"%c#ST#%d#%d#%d#%d#%d#%c\r\n",STX,MVars.nMessZustand[0], IRange.AktRange[0], GenW[0].nAktZyklus,IRange.m_fCheckRange,MVars.m_fPotGal,ETX);
    MVars.m_fSendStatus = false;
    RpaDev.puts(HostIf.strTempBuf);
#endif    
}
//-----------------------------------------------------------------------
// SendInfo: Senden des Infotelegramms
//-----------------------------------------------------------------------
void SendInfo(void) 
{
    IrComp.fSendInfo = false;
    RpaDev.puts(HostIf.strTempBuf);
}/*-------------------------------------------------------------------------------
SendAnalogValues: Schickt was fertig ist
-------------------------------------------------------------------------------*/
int SendRpaAnalogValues()
{
    int j, Ret;
    
    Ret = false;
    if(MVars.m_fStartTel == 0x01)   // STX schicken
    {
        if(MVars.m_fFinishMeasurement == true)
        {
            MVars.nMessZustand[0] = 0;
            MVars.m_fSendStatus = true;
            MVars.m_fFinishMeasurement = false;
            MVars.m_fMeasurementFinished = true;
        }
            
        if(MVars.m_fSendStatus == true) // Status senden
        {
            SendStatus();
            HostIf.strTempBuf[0] = 0x00;
        }
        if(HostIf.fSendMessage == true) // Status senden
        {
            HostIf.fSendMessage = false;
            RpaDev.puts(HostIf.strMessageBuf);
        }
        if(HostIf.fSendError == true) // Status senden
        {
            HostIf.fSendError = false;
            RpaDev.puts(HostIf.strErrorBuf);
        }
        
        MVars.nTelLen = sprintf(STemp,"%c#MW#%d#",STX,MVars.m_nAnzValue);
        strcat(HostIf.strTempBuf, STemp);
        MVars.m_fStartTel = 0x00;
    }

    for(j=0;j<3;j++)
    {
            if(MVars.m_fChnValid[j] == true)
            {
                MVars.nTelLen += sprintf(STemp,"%08u#",(UINT32)MVars.dbAdResult[j]);
#ifdef TFT_DEBUG    
//    printf("AdResult_x: %f  STemp: %s \n",MVars.dbAdResult[j], STemp);
#endif    
                strcat(HostIf.strTempBuf, STemp);
            }
    }
    MVars.m_nSendAnz++;
    if(MVars.m_nSendAnz >= MVars.m_nAnzValue)
    {
//        sprintf(STemp,"%d#%d#%c\r\n",g_fAd0State, g_fAd1State,ETX);
        MVars.nTelLen += sprintf(STemp,"%c",ETX);
        strcat(HostIf.strTempBuf, STemp);
        MVars.m_fStartTel = 0x01;
        MVars.m_nSendAnz = 0;
        if(MVars.m_fMeasurementFinished == true)
        {
            SetMessungEnde();
        }        
        Ret = true;
    }
    if(MVars.m_nSendValues == 2)    // senden während Messung
    {
        RpaDev.puts((const char *)HostIf.strTempBuf);
        MVars.nTelLen = 0;
        HostIf.strTempBuf[0] = 0x00;
    }
    else
    {
        RpaDev.puts(HostIf.strTempBuf);
        MVars.nDestCount = 0;
        HostIf.strTempBuf[0] = 0x00;
    }
    return(Ret);
}
//-----------------------------------------------------------------------
// SendStatus: Senden des Status, da sich etwas geändert hat 
//-----------------------------------------------------------------------
void SendRpaStatus(void) 
{
    
    sprintf(HostIf.strTempBuf,"%c#ST#%d#%c",STX,MVars.nMessZustand[0], ETX);
    MVars.m_fSendStatus = false;
    RpaDev.puts(HostIf.strTempBuf);
}

/*-----------------------------------------------------------------------
// SendTelToHost: Sendemethode fuer alle Telegramme. Die rufende Methode 
uebergibt des zu sendenden String. 
Findet sich in dem String ein CR, dann wird das uebersprungen. Findet sich ein 
LF, dann wird dies durch ein $ ersetzt. Folgen weitere Telegramme zu einem 
Funktionsblock, dann wird kein ETX gesendet. 
Handelt es sich um laengere Telegramme wie z.B. um Messdateien, dann werden 
groessere Bloecke mit Kennung, STX und ETX gesendet. Das letzte Telegramm bekommt
dann eine EOF vor das ETX, damit kann das Zielsystem erkennen, das die Datei 
fertig ist.  
-----------------------------------------------------------------------*/
void SendTelToHost(bool fMoreThanOne, bool fEof, int fReplace) 
{
	int Len, i, j, k;
	
    Len = strlen(HostIf.strTempBuf);
	j = 0; // zur Sicherheit
	for(i=0, j=0, k=0;i<Len;i++, j++)
	{
		if(HostIf.strTempBuf[i] == 0x0D)   j--;  // das naechste j++ wird ausgeglichen
		else if(HostIf.strTempBuf[i] == 0x0A)   
		{
			if(fReplace == 0)
				HostIf.strFinalSendBuf[j] = REPLACE_LATTEN_ZAUN;  // Zeilenende wird mit # gekennzeichnet
			else if(fReplace == 1)
				HostIf.strFinalSendBuf[j] = REPLACE_LF;  // Zeilenende wird mit $ gekennzeichnet
			else
				HostIf.strFinalSendBuf[j] = HostIf.strTempBuf[i];
		}
		else 
			HostIf.strFinalSendBuf[j] = HostIf.strTempBuf[i];
			
    }
	if(fMoreThanOne == true)
	{
		HostIf.strFinalSendBuf[j] = 0x00; // kein ETX, es geht weiter
	}
	else
	{
		if(fEof == true)	// war eine grosse Datei, muss mit EOF gesendet werden
		{
			HostIf.strFinalSendBuf[j] = MCU_EOF;	j++;
		}
		if(Len == 0)	j = 0;
		HostIf.strFinalSendBuf[j] = ETX;
		HostIf.strFinalSendBuf[j+1] = 0x00;
	}
    RpaDev.puts((const char *)HostIf.strFinalSendBuf);
#ifdef TFT_DEBUG    
//     printf("WriteFile is: %s\n",TcpSendBuf);
#endif          
}