Test

Dependencies:   mbed-dev-OS5_10_4

Files at this revision

API Documentation at this revision

Comitter:
kevman
Date:
Fri Aug 07 07:24:21 2020 +0000
Commit message:
Test

Changed in this revision

Main/Dac8532.cpp Show annotated file Show diff for this revision Revisions of this file
Main/Dac8532.h Show annotated file Show diff for this revision Revisions of this file
Main/Headers.h Show annotated file Show diff for this revision Revisions of this file
Main/main.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/AdCalculations.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/AdGlobals.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/AdGlobals.h Show annotated file Show diff for this revision Revisions of this file
MySources/AdInit.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/AdMember.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/AdRead.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/AdRead.h Show annotated file Show diff for this revision Revisions of this file
MySources/CalcScan.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/Chip1768.h Show annotated file Show diff for this revision Revisions of this file
MySources/Dio.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/Dio.h Show annotated file Show diff for this revision Revisions of this file
MySources/EcmTel.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/EcmTel.h Show annotated file Show diff for this revision Revisions of this file
MySources/FT_DataTypes.h Show annotated file Show diff for this revision Revisions of this file
MySources/Globals.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/Globals.h Show annotated file Show diff for this revision Revisions of this file
MySources/InitMain.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/InitMain.h Show annotated file Show diff for this revision Revisions of this file
MySources/LoopTimer.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/LoopTimer.h Show annotated file Show diff for this revision Revisions of this file
MySources/OpenDevId.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/OpenDevId.h Show annotated file Show diff for this revision Revisions of this file
MySources/OpenIni.cpp Show annotated file Show diff for this revision Revisions of this file
MySources/OpenIni.h Show annotated file Show diff for this revision Revisions of this file
MySources/Struct.h Show annotated file Show diff for this revision Revisions of this file
RawSerial/IfGlobals.cpp Show annotated file Show diff for this revision Revisions of this file
RawSerial/IfGlobals.h Show annotated file Show diff for this revision Revisions of this file
RawSerial/RpaSerial.cpp Show annotated file Show diff for this revision Revisions of this file
RawSerial/RpaSerial.h Show annotated file Show diff for this revision Revisions of this file
RawSerial/SendTelToHost.cpp Show annotated file Show diff for this revision Revisions of this file
RawSerial/SendTelToHost.h Show annotated file Show diff for this revision Revisions of this file
SdCard/SdCard.cpp Show annotated file Show diff for this revision Revisions of this file
SdCard/SdCard.h Show annotated file Show diff for this revision Revisions of this file
SdCard/SdGlobals.cpp Show annotated file Show diff for this revision Revisions of this file
SdCard/SdGlobals.h Show annotated file Show diff for this revision Revisions of this file
mbed-dev-OS5_10_4.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/Dac8532.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,166 @@
+/*
+-------------------------------------------------------------------------------
+Programm Name: DaMethoden.C
+Version:       1.0
+Sprache:       C
+Compiler:      CrossStudio Ver. 2.0
+Autor:         PS
+Copyright:     PS
+         
+
+Funktion:      Init und Io fuer den D/A Wandler
+
+28.10.2012: 
+
+-------------------------------------------------------------------------------*/
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+
+// Private Definitionen
+/** Max buffer length */
+
+
+// Rev B und C
+
+
+// Private Variablen
+
+int nDCounter;
+unsigned char Low, High;
+
+
+
+
+/*-------------------------------------------------------------------------------
+Initialisieren der Pins fuer den DA Wandler
+-------------------------------------------------------------------------------*/
+int InitDac(void)
+{
+    int i;
+/*
+Initialisieren der Pins fuer den D/A Zugriff:
+    Mosi = 0;       // Mosi für den D/A Wandler
+    CsDac = 1;      // CS für den D/A Wandler, 0 = Cs aktiv, (low active) 
+    Sck = 0;       // SCK für den D/A Wandler
+
+*/
+    DacCs = 0;
+    DacSck = 1;
+    DacMosi = 0;
+
+    for(i=0;i<3;i++)
+    {
+        DacSck = 0;
+        DacSck = 1;    // D23 bis D21 auf 0
+    }
+    DacMosi = 1;   // D20 auf 1, load DAC A
+    DacSck = 0;
+    DacSck = 1;
+    DacMosi = 0;
+    
+    for(i=4;i<24;i++)
+    {
+        DacSck= 0;
+        DacSck = 1;    // D19 bis D0 auf  0
+    }
+    Low = 0x00;
+    High = 0x00;
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+Testen des D/A Wandlers
+-------------------------------------------------------------------------------*/
+int TestDac(void)
+{
+    Low++;
+    SpiSendDa (0, 0);
+    if(Low == 0xFF)
+    {
+        High++;
+    }
+    return(true);
+}
+/* ********************************************************************
+macht das komplette Out fuer 24 Bit
+ ***********************************************************************/
+int SpiSendDa (uint8_t Channel, uint16_t Mode)
+{
+    uint32_t WData0, WData1,WData2;
+    uint16_t n;
+    uint32_t Mask;
+    uint32_t tmp;
+    
+    DacSck = 0;
+    DacCs = 0;
+    
+    // 2016-06  UFa: Aenderungen aufgrund HW-Revision
+    short_delay(1);
+
+    n = 0;
+    WData0 = 0x10;
+    WData1 = High;
+    WData2 = Low;
+    Mask = 0x0800000;
+    tmp = 0;
+    tmp = ((WData0 << 16) | (WData1 << 8) | (WData2));
+    for(n=0;n<24;n++)
+    {
+        DaSckUp();
+        short_delay(1);
+        if(tmp & Mask)
+          DaMosiUp();
+        else
+          DaMosiDown();
+        short_delay(1);
+        DaSckDown();
+        short_delay(1);
+        Mask >>= 1;
+    }
+    // 2016-06  UFa: Aenderungen aufgrund HW-Revision
+    DacCs = 1;
+    DacSck = 1;
+    short_delay(1);
+    
+    return (0);
+}
+
+/*-------------------------------------------------------------------------------
+Berechnen der Daten an den DA Wandler. Wird erst mal für die Anschlussbox berechnet, 
+bei der jeweils 2 Kanäle auf einen Ausgang addiert werden 
+-------------------------------------------------------------------------------*/
+void CalcDa(double SourceVal, UINT8 Chn)
+{
+//    DigitalOut CsTest(PTC16);    // nur wegen dekativierung durch Ethernet. Ich hoffe, das wird wieder anders
+    unsigned int OutValue;
+    double Counts;
+    double SrcVal;
+
+
+    SrcVal = SourceVal;
+    
+    Counts = SrcVal * 13.107;
+    
+    OutValue = (uint16_t)(Counts);
+
+    Low = OutValue;
+    High = (OutValue >> 8);
+    SpiSendDa(0,1);
+}
+
+/*-------------------------------------------------------------------------------
+Senden der Daten an den DA Wandler
+-------------------------------------------------------------------------------*/
+void SendDataDa(void)
+{
+  SpiSendDa(0,3);
+}
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/Dac8532.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,15 @@
+/*-------------------------------------------------------------------------------
+Programm Name: Dac8532.H
+Version:       1.0
+Sprache:       C
+Compiler:      mbed OS 5.8
+Autor:         PS
+Copyright:     PS
+Funktion:      Dac Variablen und Methoden
+
+-------------------------------------------------------------------------------*/
+
+extern int InitDac(void);
+extern int TestDac(void);
+extern int SpiSendDa (uint8_t Channel, uint16_t Mode);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/Headers.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,93 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  Headers.h
+Version:        1.0
+Sprache:        C
+Compiler:       CrossStudio Ver. 2.0
+Autor:          PS
+Copyright:      PS
+                
+
+Funktion:       Enthält alle relevanten Header
+28.10.2012: 
+-------------------------------------------------------------------------------*/
+// #define PGU_TOUCH        1
+// #define PGU_BI_TOUCH     1
+// #define PGU_EDUCATION    1
+#define PGU_RPA             1
+// #define PGU_LTR          1
+// #define SINE_GEN         1  // wird fuer den Sinusgenerator definiert
+// #define ECN              1  // wird fuers ECN definiert 
+// #define TOUCH_DISPLAY    1  // aktiviert die Display und Touch Methoden
+#define ADC_24BIT           1
+// #define DAC_32BIT        1
+// #define DO_AUTO_START    1
+// #define USE_RTC          1       // wenn die eingebaute Uhr verwendet wird
+
+
+#include <string.h>
+#include <iostream>
+#include <math.h> 
+#include <stdio.h>
+#include <algorithm>
+#include "mbed.h"
+// #include "MK64FK12.h"
+///mbed-dev_577/features/FEATURE_LWIP/lwip-interface/
+// #include "EthernetInterface.h"
+#include "SDBlockDevice.h"
+#include "FATFileSystem.h"
+
+
+
+#include "FT_DataTypes.h"
+#include "Chip1768.h"
+#include "AdRead.h"
+#include "Dio.h"
+#ifndef PGU_RPA
+    #include "Calibration.h"
+#endif
+#include "OpenIni.h"
+#include "OpenDevId.h"
+#ifndef PGU_RPA
+    #include "OpenAutoStart.h"
+    #include "RunAutoStart.h"
+#endif
+#include "Struct.h"
+#ifndef PGU_RPA
+    #include "MethGlobals.h"
+#endif
+#include "Dac8532.h"
+#include "InitMain.h"
+#ifndef PGU_RPA
+    #include "SwitchMode.h"
+    #include "RwConfig.h"
+    #include "RwParameter.h"
+    #include "TftGetSetParaValues.h"
+    #include "RwSeqFile.h"
+    #include "CalcGenValues.h"
+    #include "RwMwFile.h"
+    #include "RwHeaderFile.h"
+#endif
+
+#include "EcmTel.h"
+
+
+#include "LoopTimer.h"
+#include "RpaSerial.h"
+
+// #include "EthGlobals.h"
+
+#ifndef PGU_RPA
+    #include "SequenzMethoden.h"
+    #include "SwitchRanges.h"
+#endif
+#include "SendTelToHost.h"
+#include "Globals.h"
+
+#ifndef PGU_RPA
+    #include "TftServices.h"
+#endif
+#include "SdGlobals.h"
+#include "IfGlobals.h"
+#include "AdGlobals.h"
+#include "SdCard.h"
+// #include "Threads.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/main.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,322 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  Main.C
+Version:        1.0
+Sprache:        C++
+Compiler:       mbed
+Autor:          PS
+Copyright:      PS
+                 
+
+Funktion:       Main Funktionen
+04.08.2016:  Projekt: EcmComFrdm
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+// #define Ad0IsRdyDown()  (LPC_GPIO0->FIOCLR & 0x000800000)
+// #define Ad1IsRdyDown()  (LPC_GPIO0->FIOCLR & 0x001000000)
+
+//const char* MyIp = "192.168.2.99";
+//const char* HostIp = "192.168.2.8";
+//const char* MySub = "255.255.255.0";
+//const char* MyGw = "0.0.0.0";
+
+
+
+/*-------------------------------------------------------------------------------
+Main Funktion. 
+-------------------------------------------------------------------------------*/
+int main() 
+{
+
+	InitMain();
+	ConnectIrq();
+	g_fDisableDataRead = false;
+//    Ad7739Start(0, 0,1);
+// 	MVars.m_fMessDlgOpened = true;
+	MVars.nAktMittelAfter = 500;
+    while (true) 
+    {
+		CheckAnalogIn();
+		
+	    if(nMyTimer > 0) // Scanner Verarbeitung 
+    	{     
+			CheckTimerHandlingAndScanner();
+	    }
+/*	    
+	    if(g_nChn1Counter > 1000)
+	    {
+	    	printf("%c#DG#Channel 1 Counter: %ld %c\n", STX, g_nChn1Counter, ETX);
+	    	g_nChn1Counter = 0;
+	    }
+	    else if(g_nChn2Counter > 1000)
+	    {
+	    	printf("%c#DG#Channel 2 Counter: %ld %c\n", STX, g_nChn2Counter, ETX);
+	    	g_nChn2Counter = 0;
+	    }
+*/
+	   	if(HostIf.nInTel > 0)
+    		CheckCommInterface();
+    		
+    	CheckEcmWinConnect();
+		
+#ifdef	TOUCH_DISPLAY
+ 		CheckEvent();	// TFT Event
+#endif
+#ifdef DO_AUTO_START
+		if(g_fDoAutostart == true)
+    		g_fDoAutostart = CheckAutoStart(); // kommt false zurueck, dann wird der Aufruf beendet
+#endif
+        CheckZustand();		// Zustand der Messung
+    }    
+   
+}
+/*-------------------------------------------------------------------------------
+    Funktion CheckCommInterface prüft ob ueber die Kommunikationsschnittstelle 
+    eine Anforderung kommt.
+-------------------------------------------------------------------------------*/
+int CheckCommInterface()
+{
+	if(TransferSioTel() == true)
+   	{
+//	        ChangeLedColor(); 
+//		    printf("%c#DG#HostIf.strTelAwBuf: %s%c\r\n",STX, HostIf.strTelAwBuf, ETX);
+   		CheckTel();
+   	}
+   	return(true);
+}
+/*-------------------------------------------------------------------------------
+    Funktion CheckEcmWinConnect: Bearbeitet alle Methoden die mit der Messung ueber 
+    EcmWin  zu tun haben.
+-------------------------------------------------------------------------------*/
+int CheckEcmWinConnect()
+{
+    if(!MVars.m_fMessDlgOpened)
+    {
+	    g_nChn2Counter++;
+    	if(g_nChn2Counter > 50000)
+	    {
+//		printf("%c#DG#Channel 2 Counter: %ld %c\n", STX, g_nChn2Counter, ETX);
+    	   	ChangeLedColor(); 
+        	g_nChn2Counter = 0;
+    	}
+    }
+
+    if(MVars.m_fMessDlgOpened)
+    {
+//        ReadAllAdChannels();
+        if(MVars.nMittelTimer >= MVars.nAktMittelAfter)
+        {
+        	CheckDaAd();
+            MVars.nMittelTimer -= MVars.nAktMittelAfter;
+			ChangeLedColor();
+        }
+        CheckZustand();
+    }
+#ifdef DO_AUTO_START    
+	else if(m_fAutoStart == true)	// ist in der Autostart Funktion
+	{
+        if(MVars.nMittelTimer >= MVars.nAktMittelAfter) // nAktMittelAfter muss ueber die Sequenz neu gestzt werden
+        {
+			if(CheckDaAd() == false)
+			{
+				DisableAutoMode();
+			}
+			MVars.nMittelTimer -= MVars.nAktMittelAfter;
+			ChangeLedColor();
+		}
+		if (g_nTftTimer >= 1000) 
+		{
+			RequestDateTime();
+			g_nTftTimer  = 0;
+			if(m_fAutoStart == true)
+				DoStatusLed = !DoStatusLed;
+		}
+	}
+#endif	
+	else
+	{
+		if (g_nTftTimer >= 1000) 
+		{
+//			RequestDateTime();
+			g_nTftTimer  = 0;
+		}
+	}
+    return(true);
+}
+
+/*-------------------------------------------------------------------------------
+    DoReInit: Initialisieren des AD Wandlers
+-------------------------------------------------------------------------------*/
+int DoReInit()
+{
+    uint8_t Status0, Status1; 
+//    DigitalOut Test(PTC16);
+#ifdef TFT_DEBUG     
+    printf("DOR_C: %08X  DIR_C: %08X  DDR_C:%08X \r\n", GPIOC->PDOR, GPIOC->PDIR, GPIOC->PDDR);  // PTC 16 auf Output schalten
+#endif    
+
+//    GPIOC->PDDR |= 0x00010000;  // PTC 16 auf Output schalten
+
+    MVars.fAdReInit = false;
+    MVars.m_nSendValues = 1; // fängt an, in Grundstellung zu senden
+    g_fRdy0 = false; g_fRdy1 = false;
+        
+//	ConnectIrq();
+	g_fDisableDataRead = false;
+    Ad7739Start(0, 0,1); // 0=Kanal mit dem begonnen wird, Wandler 0, Mode
+//    Ad7739CommonStart(0, 1);
+    
+    nMyTimer = 0;
+    g_nAdSetPos = 0;     g_nAdGetPos = 0;
+    g_nAdCount = 0;
+    MVars.m_nSendValues = 1; // fängt an, in Grundstellung zu senden
+    ZustandsTimer = 0;
+    
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+    Funktion CheckZustand prüft alle eingehenden Telegramme auf Inhalt und Befehl
+-------------------------------------------------------------------------------*/
+int CheckZustand()
+{
+        
+    if(MVars.fAdReInit == true)
+    {
+        MVars.fAdReInit = false;
+        DoReInit();
+    }
+        
+    if(MVars.m_nSendValues == 0)    // nichts senden
+    {
+        nMyTimer = 0;
+        ZustandsTimer = 0;
+        return(0);
+    }
+    
+//    MVars.dbAdSum[0] +=  (long double)AdcHs1.read_u16();
+//    MVars.dbAdSum[1] +=  (long double)AdcHs2.read_u16();
+//    MVars.nMwMittelCount++;
+#ifdef TFT_DEBUG    
+//    printf("AdResult_0: %f  \n",MVars.dbAdSum[0]);
+#endif    
+//    g_nAdGetPos++;   g_nAdGetPos &= 0x3FF;
+    
+    
+//    AdVal->AdRingBuf[0][g_nAdSetPos] = AdcHs1.read_u16();
+//    AdVal->AdRingBuf[1][g_nAdSetPos] = AdcHs2.read_u16();
+//    g_nAdSetPos++;     g_nAdSetPos &= 0x03FF;
+//    g_nAdCount++;
+    
+
+//     CheckDaAd();  
+        
+    if(ZustandsTimer >= 100)  // die Zustände werden dadurch alle 100ms überprüft 
+    {
+        MVars.nSecCounter[0] += 100;
+        IrComp.n100msCounter++;
+        ZustandsTimer -= 100;
+
+        if(MVars.m_nSendValues == 1)    // senden in Grundstellung
+        {
+            CheckGrundZustand();
+        }
+        else if(MVars.m_nSendValues == 2)    // senden während Messung
+        {
+            CheckRunZustand();
+        }
+    }
+    
+    return(0);
+}
+
+/*-------------------------------------------------------------------------------
+    CheckGrundZustand:
+-------------------------------------------------------------------------------*/
+int CheckGrundZustand()
+{
+    MVars.m_fDisableStopTel = false;
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+    CheckRunZustand:
+-------------------------------------------------------------------------------*/
+int CheckRunZustand()
+{
+      
+    switch(MVars.nMessZustand[0])
+    {
+        case -1:
+            break;
+        case 0:
+            break;
+        case 1:
+            break;
+        case 2:
+            MVars.nSecCounter[0] = 0;
+            break;
+        case 3:
+            break;
+        case 4:
+            break;
+        case 5:
+            if(MPara.RpDauerNach[0] > 0)
+            {
+                if(MVars.nSecCounter[0] >= 1000)
+                {
+                    MVars.nSecCounter[0] -= 1000;
+                    MPara.RpDauerNach[0]--;
+                }
+            }
+            else
+            {
+                MVars.m_fDoFinishMeasurement = true;
+                MVars.m_fDisableStopTel = true;
+            }
+            break;
+        case 6: // schickt nur kontinuierlich die Werte
+            break;
+        default:
+            break;
+        
+    }
+    if(MVars.m_fDoFinishMeasurement == true) // wird von Stopkommando aus EcmTel gesetzt
+    {
+        MVars.m_fDoFinishMeasurement = false;
+        MVars.m_fFinishMeasurement = true;
+        MVars.m_fScan = false;
+#ifdef SIO_DEBUG    
+        printf("MessZustand: %d \n",MVars.nMessZustand[0]);
+        printf("SwOCP:%d\n",MVars.SwitchChn[0]);
+#endif    
+
+    }
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+ChangeConversionTime: Im Fall dass die Wandlungszeit geändert werden muss
+-------------------------------------------------------------------------------*/
+void ChangeConversionTime()
+{
+    MVars.fChangeCt = false;
+    SetAdConversionTime();
+//            wait(0.2);
+//    led1 = !led1;
+}
+/*-------------------------------------------------------------------------------
+SendMessungStart: Startet die Messung
+-------------------------------------------------------------------------------*/
+int SendMessungStart()
+{
+    sprintf(HostIf.strTempBuf,"%c#MG#%c", STX, ETX);
+	SendTelToHost(false, false, false);
+    return(0);
+}
+/*-------------------------------------------------------------------------------
+SendMessungStop: Stoppt die Messung
+-------------------------------------------------------------------------------*/
+int SendMessungStop()
+{
+    sprintf(HostIf.strTempBuf,"%c#MS#%c", STX, ETX);
+	SendTelToHost(false, false, false);
+    return(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/AdCalculations.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,75 @@
+/*-------------------------------------------------------------------------------
+Programm Name: AdCalculations.C
+Version:       1.0
+Sprache:       C++
+Compiler:      mbed Studio
+Autor:         PS/UF
+Copyright:     IPS
+         
+
+Funktion:      Basiskalkulationen für die Umrechnung der Werte von A/D Wandler
+
+16.06.2017 
+Neu angelegt um die Funktionen in Main zu entzerren
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+/*-------------------------------------------------------------------------------
+File interne Membervariablen
+-------------------------------------------------------------------------------*/
+
+
+/*-------------------------------------------------------------------------------
+CalculateAdBaseValues: macht die Basisumrechnungen der vom A/D Wandler gelieferten 
+Werte. Erst mitteln, dann um den Nullpunkt verschieben, dann Skalieren
+-------------------------------------------------------------------------------*/
+int CalculateAdBaseValues()
+{
+    int i;
+    
+    for(i=0;i<8;i++)
+    {
+        if(MVars.m_fChnValid[i] == true)
+        {
+            if(MVars.nChnAverage[i] > 0)
+            {
+                if( MVars.dbAdSum[i] == 0.0)
+                {
+                    InitBaseInputArray();
+                    printf("No Values, dbAdSum = 0.0\r\n");
+                    return(false);
+                }
+                MVars.dbAdResult[i] = MVars.dbAdSum[i] / (double)MVars.nChnAverage[i];
+                MVars.dbAdResult[i] -= 8388607.;
+                MVars.dbAdResult[i] *= EcmIni.dbUScale[i];  // Potential
+                MVars.dbAdResult[i] += EcmIni.dbUOffset[i]; // Offsetkorrektur für das Potential
+                MVars.dbAdResult[i] += 8388607.;
+            }
+            else
+            {
+                InitBaseInputArray();
+                printf("No Values, ChnAverage = 0\r\n");
+                return(false);
+            }
+        }
+        MVars.dbAdSum[i] = 0.0;
+        MVars.nChnAverage[i] = 0;
+    }            
+    InitBaseInputArray();
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+InitBaseInputArray: setzt die Variablen für die Messdaten, welche im Interrupt gelesen 
+werden, auf Null
+-------------------------------------------------------------------------------*/
+void InitBaseInputArray()
+{
+    int j;
+    
+    for(j=0;j<8;j++)
+    {
+        MVars.dbAdSum[j] = 0.0;
+        MVars.nChnAverage[j] = 0;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/AdGlobals.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,158 @@
+/*-------------------------------------------------------------------------------
+Programm Name: AdGlobals.cpp
+Version:       1.0
+Sprache:       C++
+Compiler:      mbed
+Autor:         PS
+Copyright:     PS
+         
+
+Funktion:      Globale Variablen für den A/D Wandlerzugriff
+
+30.06.2017: 
+
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+
+// I/O's für den A/D Wandler
+DigitalOut AdcSck(PTC10);
+DigitalIn AdcMiso(PTC11);
+DigitalOut AdcMosi(PTB11);
+
+InterruptIn AdcRdy0(PTB10);
+InterruptIn AdcRdy1(PTC9);
+
+DigitalOut Adc0Cs(PTB3);
+DigitalOut Adc1Cs(PTC8);
+
+DigitalIn AdcReset(PTB2);
+
+
+// Globale Variablen
+//-------------------------------------
+uint8_t g_TempDelay;
+uint8_t g_AReadTemp;
+uint8_t g_nAdResultCount;
+
+
+bool g_fAdConversion; 
+bool g_fRdy0, g_fRdy1;
+
+
+AD_VAL *AdVal;
+
+UINT8 g_fARead[8];
+uint8_t g_nAdSetPos, g_nAdGetPos;
+int g_nAdCount;
+UINT32 m_AdTemp[8];
+
+
+/*-------------------------------------------------------------------------------
+Schreibt die Inits auf beide AD Wandler
+-------------------------------------------------------------------------------*/
+void Ad7739CommonWrite(uint8_t b)
+{
+  uint8_t mask = 0x80;
+  AdSckUp();
+  Ad0CsDown();
+  Ad1CsDown();
+  short_delay(2);
+  do
+  {
+      AdSckDown();
+      short_delay(2);  // min. 50ns SCK low
+      (b & mask) ? (AdMosiUp()) : (AdMosiDown());
+      short_delay(2);  // min. 30ns bevor die Flanke hochgeht
+       AdSckUp();
+      short_delay(2);  // min. 50ns SCK high
+  }
+  while(mask >>= 1);
+//  AdMosiUp();
+  Ad0CsUp();
+  Ad1CsUp();
+}
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+void Ad7739OutWrite(uint8_t b, int Wandler)
+{
+    uint8_t mask = 0x80;
+    AdSckUp();
+    if(Wandler == 0)
+        Ad0CsDown();
+    else
+        Ad1CsDown();
+    short_delay(2);  // min. 50ns SCK low
+    do
+    {
+        AdSckDown();
+        short_delay(2);  // min. 50ns SCK low
+        (b & mask) ? (AdMosiUp()) : (AdMosiDown());
+        short_delay(2);  // min. 30ns bevor die Flanke hochgeht
+        AdSckUp();
+        short_delay(2);  // min. 50ns SCK high
+    }
+    while(mask >>= 1);
+    Ad0CsUp();
+    Ad1CsUp();
+    AdMosiDown();
+}
+/*-------------------------------------------------------------------------------
+Startet einen einzelnen A/D Wandler. Wenn Mode = 0, dann single Mode, wenn Mode 
+= 1, dann continous Mode. 
+-------------------------------------------------------------------------------*/
+void Ad7739Start(uint8_t Chn, uint8_t Wandler, uint8_t Mode)
+{
+    
+    if(Mode == 0)   // Single Mode
+    {
+        Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_MODE, Chn)), Wandler);
+        Ad7739OutWrite(0x42, Wandler);   // 0x26 ist continous mode
+    }
+    else // continuous
+    {
+        Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_MODE, Chn)), Wandler);
+        Ad7739OutWrite(0x2E, Wandler);   // 0x26 ist continous mode0x08=Dump Mode, 0x04: Continous Read
+        Ad7739OutWrite(0x48, Wandler);   // the first write of 48 start the continous read mode
+//        g_nIRead = 0;
+        AdMosiDown(); // muss unten sein, da sonst der Continous Mode gestoppt werden kann
+
+    }
+    __enable_irq();             // 2017-05-31
+
+}
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+void Ad7739CommonStart(uint8_t Chn, uint8_t Mode)
+{
+    if(Mode == 0)   // Single Mode
+    {
+        Ad7739CommonWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_MODE,Chn)));
+        Ad7739CommonWrite(0x42);   // 0x26 ist continous mode
+    }
+    else // continuous
+    {
+        Ad7739CommonWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_MODE, Chn)));
+        Ad7739CommonWrite(0x2E);   // 0x26 ist continous mode
+        Ad7739CommonWrite(0x48);   // 0x26 ist continous mode
+    }
+    
+    g_fAdConversion = true;    // 2017-05-31
+    __enable_irq();             // 2017-05-31
+
+}
+
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+void Ad7739Stop(void)
+{
+    // single
+    /* return; */
+
+    // continous
+    Ad7739CommonWrite(AD7739_WRITE_OP(AD7739_ADDR_MODE));
+    Ad7739CommonWrite(0x02);
+    
+    g_fAdConversion = false;    // 2017-05-31
+    __enable_irq();             // 2017-05-31
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/AdGlobals.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,142 @@
+/*-------------------------------------------------------------------------------
+Programm Name: AdGlobals.h
+Version:       1.0
+Sprache:       C++
+Compiler:      mbed
+Autor:         PS
+Copyright:     PS
+         
+
+Funktion:      Globale Variablen für den A/D Wandlerzugriff
+
+30.06.2017: 
+
+-------------------------------------------------------------------------------*/
+
+/*
+#define _nop_() 
+( 
+  asm nop
+)
+*/
+
+// Makros zum lesen des A/D Wandlers
+//-----------------------------------
+#define Ad0CsUp()       (GPIOB->PSOR |= 0x00000008) // PTB3
+#define Ad0CsDown()     (GPIOB->PCOR |= 0x00000008)
+#define Ad1CsUp()       (GPIOC->PSOR |= 0x00000100) // PTC8
+#define Ad1CsDown()     (GPIOC->PCOR |= 0x00000100)
+
+
+
+#define AdSckUp()       (GPIOC->PSOR |= 0x00000400) // PTC10
+#define AdSckDown()     (GPIOC->PCOR |= 0x00000400)
+#define AdMosiUp()      (GPIOB->PSOR |= 0x00000800) // PTB11
+#define AdMosiDown()    (GPIOB->PCOR |= 0x00000800)
+
+#define AdIsMisoUp()    (GPIOC->PDIR & 0x000000800) // PTC11
+
+// Rdy ist der Interrupt von AD7739 
+#define Ad0IsRdyUp()    (GPIOB->PDIR & 0x000000400) // PTB10
+
+#define Ad1IsRdyUp()    (GPIOC->PDIR & 0x000000200) // PTC9
+
+
+
+
+// I/O's für den A/D Wandler
+//-------------------------------------
+extern DigitalOut AdcSck;
+extern DigitalIn AdcMiso;
+extern DigitalOut AdcMosi;
+extern InterruptIn AdcRdy0;
+extern InterruptIn AdcRdy1;
+
+extern DigitalIn AdcReset;
+
+extern DigitalOut Adc0Cs;
+extern DigitalOut Adc1Cs;
+
+
+
+// Globale Variablen
+//-------------------------------------
+extern uint8_t g_TempDelay;
+extern uint8_t g_AReadTemp;
+extern uint8_t g_nAdResultCount;
+
+
+extern AD_VAL *AdVal;
+extern UINT8 g_fARead[8];
+extern uint8_t g_nAdSetPos, g_nAdGetPos;
+extern int g_nAdCount;
+extern UINT32 m_AdTemp[8];
+
+
+extern bool g_fAdConversion; 
+extern bool g_fRdy0, g_fRdy1;
+
+// extern uint8_t m_AiMask, m_Rdy0Mask, m_Rdy1Mask, m_Rdy0Status, m_Rdy1Status;
+
+
+// Funktionen aus AdCalculations.c
+//-------------------------------------
+extern int CalculateAdBaseValues();
+extern int CheckLimitValues();
+extern void InitBaseInputArray();
+
+
+
+// Funktionen aus AdInit.c
+//-------------------------------------
+extern int InitSpiAd(void);
+extern int AdIsRdyUp(int Chn);
+extern void Ad7739Init(int EcmWinCall);   // EcmWinCall == 1, wenn Aufruf durch EcmWin
+extern void SetAdConversionTime();
+extern void InitAdValues();
+extern int ConnectIrq(void);
+extern void AdReset();
+extern void DoAdReset();
+
+
+// Funktionen aus AdRead.cpp
+//------------------------------------
+extern void Rdy0Fall();
+extern void Rdy1Fall();
+extern int AdReadChannels(uint8_t Chn, uint8_t Wandler, uint8_t MitStatus);
+extern void AdInRead(int Chn);
+
+
+// Funktionen aus AdGlobals.cpp
+//------------------------------------
+extern void Ad7739CommonWrite(uint8_t b);
+extern void Ad7739OutWrite(uint8_t b, int Wandler);
+extern void Ad7739Start(uint8_t Chn, uint8_t Wandler, uint8_t Mode);
+extern void Ad7739CommonStart(uint8_t No, uint8_t Mode);
+extern void Ad7739Stop(void);
+
+
+// Funktionen aus AdMember.c
+//------------------------------------
+extern uint8_t ReadAdIoPortRegister(uint8_t Wandler);
+extern uint8_t ReadAdRevisionRegister(uint8_t Wandler);
+extern uint8_t ReadAdTestRegister(uint8_t Wandler);
+extern uint8_t ReadAdStatusRegister(uint8_t Wandler);
+extern uint8_t ReadAdCheckSumRegister(uint8_t Wandler);
+extern uint8_t ReadAdZeroScaleRegister(uint8_t Wandler);
+extern uint8_t ReadAdFullScaleRegister(uint8_t Wandler);
+extern uint8_t ReadAdChnZeroScaleRegister(uint8_t Wandler);
+extern uint8_t ReadAdChnFullScaleRegister(uint8_t Wandler);
+extern uint8_t ReadAdChnStatusRegister(uint8_t Chn, uint8_t Wandler);
+extern uint8_t ReadAdChnSetupRegister(uint8_t Wandler);
+extern uint8_t ReadAdConvTimeRegister(uint8_t Wandler);
+extern uint8_t ReadAdChnModeRegister(uint8_t Wandler);
+extern uint8_t ReadAd0Ad1In(int n);
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/AdInit.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,314 @@
+/*-------------------------------------------------------------------------------
+Programm Name: AdInit.cpp
+Version:       1.0
+Sprache:       C++
+Compiler:      mbed
+Autor:         PS
+Copyright:     PS
+         
+
+Funktion:      Init-Funktion für den A/D Wandlerzugriff
+
+30.06.2017: 
+
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+bool fChnValid[8];
+
+
+/*-------------------------------------------------------------------------------
+Analog-Digital Konverter initialisieren
+-------------------------------------------------------------------------------*/
+void InitAdValues()
+{
+    int i,j;
+    
+    AdVal = new (AD_VAL);    
+    for(i=0;i<ANZ_POT*4;i++)
+    {
+        g_fARead[i] = false;
+        MVars.dbAdSum[i] = 0.;
+        for(j=0;j<16;j++)
+        {
+            AdVal->AdResult[i][j] = 0.0;
+        }
+    }
+    for(i=0;i<ANZ_POT*4;i++)
+    {
+        for(j=0;j<64;j++)
+            AdVal->AdRingBuf[i][j] = 0L;
+    }
+    g_nAdSetPos = 0;
+    g_nAdGetPos = 0;
+    g_nAdCount = 0;
+
+    g_nAdResultCount = 0;
+   
+    AdVal->FKoeff[0] = -0.7128E-3;
+    AdVal->FKoeff[1] = 0.01879;
+    AdVal->FKoeff[2] = 0.06321;
+    AdVal->FKoeff[3] = 0.125;
+    AdVal->FKoeff[4] = 0.1806;
+    AdVal->FKoeff[5] = 0.20305;
+    AdVal->FKoeff[6] = 0.1806;
+    AdVal->FKoeff[7] = 0.125;
+    AdVal->FKoeff[8] = 0.06321;
+    AdVal->FKoeff[9] = 0.01879;
+    AdVal->FKoeff[10] = -0.7128E-3;
+   
+    AdVal->nStartFk = 11;
+    AdVal->nEndeFk = 5;
+   
+    AdVal->dbUNoiseGainFaktor = 0.1;
+    AdVal->dbINoiseGainFaktor = 1.0;
+   
+    MVars.AdConvTime = 0x7F; // Startwert, längste Wandlungszeit ohne  Chop Mode 0x80 ist Chopper
+}
+
+
+/*-------------------------------------------------------------------------------
+Interrupt für den A/D Wandler einrichten. InterruptIn AdcRdy(PTB10) liegt hier 
+auf PTB10, muss je nach Hardware angepasst werden 
+-------------------------------------------------------------------------------*/
+int InitSpiAd(void)
+{
+    Adc0Cs = true;
+    Adc1Cs = true;
+    
+    AdcRdy0.mode(PullUp);
+    AdcRdy1.mode(PullUp);
+
+    Ad0CsUp();
+    AdSckUp();
+    printf("Nach Set Irq's\n");
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+Interrupt für den A/D Wandler einrichten. InterruptIn AdcRdy(PTB10) liegt hier 
+auf PTB10, muss je nach Hardware angepasst werden 
+-------------------------------------------------------------------------------*/
+int ConnectIrq(void)
+{
+    AdcRdy0.fall(&Rdy0Fall);
+    AdcRdy1.fall(&Rdy1Fall);
+    return(true);
+}
+    
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+void AdReset()
+{
+// macht einen kompletten Reset auf den Wandler
+    DoAdReset();
+    printf("Nach AdReset CommonWrite Hex 00\n");
+
+    wait(2.0);
+   
+}
+/*-------------------------------------------------------------------------------
+Macht einen Reset des A/D Wandlers
+-------------------------------------------------------------------------------*/
+void DoAdReset()
+{
+  int i;
+  
+  AdSckUp();
+  AdMosiDown();
+  Ad0CsDown();
+  Ad1CsDown();
+  short_delay(2);
+  
+  for(i=0;i<8;i++)
+  {
+      AdSckDown();
+      short_delay(2);  // min. 50ns SCK low
+       AdSckUp();
+      short_delay(2);  // min. 50ns SCK high
+  }
+  AdMosiUp();
+  for(i=0;i<32;i++)
+  {
+      AdSckDown();
+      short_delay(2);  // min. 50ns SCK low
+       AdSckUp();
+      short_delay(2);  // min. 50ns SCK high
+  }
+  Ad0CsUp();
+  Ad1CsUp();
+}
+
+/*-------------------------------------------------------------------------------
+// Rdy ist der Interrupt von AD7734 
+#define Ad0IsRdyUp()    (GPIOB_PDIR & 0x000000400)
+-------------------------------------------------------------------------------*/
+int AdIsRdyUp(int Chn)
+{
+    if(Chn == 0)
+        return(Ad0IsRdyUp());
+    else
+        return(Ad1IsRdyUp());
+}
+
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+void Ad7739Init(int EcmWinCall)
+{
+  // Power on Reset
+    uint8_t i, j;
+    
+    for(i=0;i<8;i++)
+        fChnValid[i] = false;
+    
+
+
+
+// Conversiontime zuerst setzen, da dies auf die Kalibrierzeiten wirkt
+    SetAdConversionTime();
+
+// die ersten vier Kanäle sind aktiv
+    for(i=0;i<3;i++)
+    {
+        fChnValid[i] = true;
+        MVars.m_fChnValid[i] = true;
+    }
+    
+#ifdef SIO_DEBUG
+    STemp[0] = 0x00;
+    for(i=0;i<8;i++)
+    {
+        sprintf(SDebug, "Chn%d: %d", i, fChnValid[i]);
+        strcat(STemp, SDebug);
+    }
+    printf("%s \r\n",STemp);
+#endif            
+    
+    ReadAdRevisionRegister(0);
+    ReadAdRevisionRegister(1);
+
+// Self Calibration
+    for(i=0;i<2;i++)
+    {
+        Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_MODE, 0)),i);  //Mode Register 0x38
+        Ad7739OutWrite(0x82,i);  // ADC Zero-Scale  schreibt nur in das erste, das genuegt
+        nMyTimer = 0;
+        while( (AdIsRdyUp(i) && (nMyTimer < 2000))); // && Ad1IsRdyUp());
+        if(nMyTimer >=2000)
+            printf("Self Calibration finish on Timer \r\n");
+        
+    }
+/*
+#ifdef SIO_DEBUG
+    printf("Nach SelfCalibration %d\r\n", nMyTimer);
+#endif            
+        Status0 = ReadAdStatusRegister(0);
+        Status1 = ReadAdStatusRegister(1);
+#ifdef TFT_DEBUG    
+        printf("St0: %d   St1: %d \n", Status0, Status1);
+#endif    
+*/
+
+// Fullscale Calibration
+    for(i = 0; i < 2; i++)  //  muss nur für die erste Adresse geschrieben werden gilt für acht Kanäle 
+    {
+        Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_MODE, 0)),i);
+        Ad7739OutWrite(0xA2,i);  // ADC Full-Scale und 24 Bit
+        nMyTimer = 0;
+        while( (AdIsRdyUp(i) && (nMyTimer < 2000))); // && Ad1IsRdyUp());
+        if(nMyTimer >=2000)
+            printf("FullScale Calibration finish on Timer \r\n");
+    }
+/*    
+#ifdef SIO_DEBUG
+    printf("Nach FullScaleCalibration %d\r\n", nMyTimer);
+#endif            
+        Status0 = ReadAdStatusRegister(0);
+        Status1 = ReadAdStatusRegister(1);
+#ifdef TFT_DEBUG    
+        printf("St0: %d   St1: %d \n", Status0, Status1);
+#endif    
+*/    
+
+//
+// Channel Setup Register 0x28 bis 0x2F
+
+// Schreiben des Channel Setup Registers 0x28 bis 0x2F
+// Bit 2 setzt den +-2,5V Bereich, Bit 3 enabled den Kanal, Bit 5 und Bit 6 setzen den Differential Mode 
+// beide auf 0 heißt single ended
+
+
+
+    for(i=0;i<4;i++)   // Wandler 0
+    {
+        Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_C_SET, i)),0);  // Geht an Wandler Diff Mode AI0 
+        Ad7739OutWrite(0x08,0);  // 08 = +- 10V, 0A = +- 5V
+        nMyTimer = 0;
+        while( (AdIsRdyUp(0) && (nMyTimer < 2000))); // && Ad1IsRdyUp());
+        if(nMyTimer >=2000)
+            printf("ADC0 active and Range on Timer \r\n");
+        short_delay(10);
+    }        
+    for(i=0;i<4;i++)   // Wandler 1
+    {
+        Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_C_SET, i)),1);  // Geht an Wandler Diff Mode AI0 
+        Ad7739OutWrite(0x00,1);  // 08 = +- 10V, 0A = +- 5V, zweiter Wandler wird nicht gebraucht 
+        nMyTimer = 0;
+        while( (AdIsRdyUp(1) && (nMyTimer < 2000))); // && Ad1IsRdyUp());
+        short_delay(10);
+        if(nMyTimer >=2000)
+            printf("ADC1 active and Range on Timer \r\n");
+    }        
+
+    printf("Nach Setup AD 1 %d\r\n", nMyTimer);
+        
+
+    
+// IO Register        
+    for(j=0;j<2;j++)
+    {
+        Ad7739OutWrite(AD7739_WRITE_OP(AD7739_ADDR_IO),j);
+        Ad7739OutWrite(0x30,j);    // 0x08 sagt, daß der Ready Pin low geht, wenn alle Kanäle konvertiert sind
+    }
+    printf("Nach IO Register \r\n");
+
+    AdSckUp();
+    AdMosiDown();
+    
+    ReadAdIoPortRegister(0);
+    ReadAdIoPortRegister(1);
+    ReadAdRevisionRegister(0);
+    ReadAdRevisionRegister(1);
+    
+    ReadAdTestRegister(0);
+    
+    ReadAdChnZeroScaleRegister(0);
+    ReadAdChnZeroScaleRegister(1);
+    
+    
+/*    while(true)
+    {
+        AdReadChannels(0,0,0);  // Kanal, Wandler, ohne/mit Status
+        AdReadChannels(0,1,0);  // Kanal, Wandler, ohne/mit Status
+    }    
+*/
+}
+/*-------------------------------------------------------------------------------
+Setzt die Wandlungszeit für die A/D Wandler
+-------------------------------------------------------------------------------*/
+void SetAdConversionTime()
+{
+    int i;
+    uint8_t AdConversionTime;
+
+
+// Wandlungszeit FF bedeutet Chopper ist an und 7F ist dei max. Wandlungszeit
+// Die minimale Wandlungszeit ist 0x02, d.h. mit Chopper ist es 0x82, ohne 0x02
+//    AdConversionTime = MVars.AdConvTime;
+    AdConversionTime = 0x7F;
+    for(i = 0; i < 4; i++)
+    {
+      Ad7739CommonWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_C_CT, i)));  //0x30 conversion time
+      Ad7739CommonWrite(AdConversionTime);
+//      ReadAdConvTimeRegister();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/AdMember.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,179 @@
+/*-------------------------------------------------------------------------------
+Programm Name: AdMember.C
+Version:       1.0
+Sprache:       C
+Compiler:      CrossStudio Ver. 2.0
+Autor:         PS
+Copyright:     PS
+         
+
+Funktion:      Member-Funktion für den A/D Wandlerzugriff
+
+28.10.2012: 
+
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+// uint8_t Ch1[8], Ch2[8];
+
+extern uint8_t ReadAd0In(int n);
+extern uint8_t ReadAd1In(int n);
+
+
+/*-------------------------------------------------------------------------------
+Liest das IO Register beider AD's
+-------------------------------------------------------------------------------*/
+uint8_t ReadAdIoPortRegister(uint8_t Wandler)
+{
+    Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_IO), Wandler);  // 0x41 lesen des I/O Portregisters
+    {
+        AdInRead(Wandler);
+        return(g_AReadTemp);
+    }
+}
+uint8_t ReadAdRevisionRegister(uint8_t Wandler)
+{
+    Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_REV), Wandler);  // 0x42
+    {
+        AdInRead(Wandler);
+        return(g_AReadTemp);
+    }
+}
+uint8_t ReadAdTestRegister(uint8_t Wandler)
+{
+    Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_TEST), Wandler);  // 0x43
+    ReadAd0Ad1In(3);
+    return(true);
+}
+uint8_t ReadAdStatusRegister(uint8_t Wandler) // wird von Main aufgerufen
+{
+    Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_STATUS), Wandler);  // 0x44
+    {
+        AdInRead(Wandler);
+        return(g_AReadTemp);
+    }
+}    
+uint8_t ReadAdCheckSumRegister(uint8_t Wandler)
+{
+    Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_CHKSUM), Wandler);  // 0x45
+    ReadAd0Ad1In(2);
+    return(true);
+}
+uint8_t ReadAdZeroScaleRegister(uint8_t Wandler)
+{
+    Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_ZS_CAL), Wandler);  // 0x46
+    ReadAd0Ad1In(3);
+    return(true);
+}
+uint8_t ReadAdFullScaleRegister(uint8_t Wandler)
+{
+    Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_FS_CAL), Wandler);  // 0x47
+    ReadAd0Ad1In(3);
+    return(true);
+}
+uint8_t ReadAdChnZeroScaleRegister(uint8_t Wandler)
+{
+  int i;
+
+    for(i = 0; i < 4; i++)
+    {
+        Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_C_ZS | i), 0);  // 0x50-57
+        ReadAd0In(3);
+        Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_C_ZS | i), 1);  // 0x50-57
+        ReadAd1In(3);
+#ifdef SINGLE_DEBUG    
+    printf("Wandler 1: %02X %02X %02X\n",g_ReadReg[0], g_ReadReg[1], g_ReadReg[2]);  // Parameter ist egal, liest sowieso beide
+    printf("Wandler 2: %02X %02X %02X\n",g_ReadReg[4], g_ReadReg[5], g_ReadReg[6]);  // Parameter ist egal, liest sowieso beide
+#endif    
+    }
+    return(true);
+}
+uint8_t ReadAdChnFullScaleRegister(uint8_t Wandler)
+{
+  int i;
+
+    for(i = 0; i < 8; i++)
+    {
+        Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_C_FS | i), Wandler);  // 0x58 - 5F
+        ReadAd0Ad1In(3);
+    }
+    return(true);
+}
+
+uint8_t ReadAdChnStatusRegister(uint8_t Chn, uint8_t Wandler)
+{
+    Ad7739OutWrite(AD7739_READ_OP(AD7739_CHANNEL(AD7739_ADDR_C_STAT, Chn)), Wandler);  // 0x60 - 67
+    {
+        AdInRead(Wandler);
+        return(g_AReadTemp);
+    }
+}
+uint8_t ReadAdChnSetupRegister(uint8_t Wandler)
+{
+  int i;
+
+    for(i = 0; i < 8; i++)
+    {
+        Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_C_SET | i), Wandler);  // 0x68 - 6F
+        ReadAd0Ad1In(1);
+    }
+    return(true);
+}
+uint8_t ReadAdConvTimeRegister(uint8_t Wandler)
+{
+  int i;
+
+    for(i = 0; i < 8; i++)
+    {
+        Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_C_CT | i), Wandler);  // 0x70 - 77
+        ReadAd0Ad1In(1);
+    }
+    return(true);
+}
+uint8_t ReadAdChnModeRegister(uint8_t Wandler)
+{
+    Ad7739OutWrite(AD7739_READ_OP(AD7739_ADDR_MODE), Wandler);  // 0x70 - 77
+    ReadAd0Ad1In(1);
+    return(true);
+}
+
+uint8_t ReadAd0In(int n)
+{
+    int i;
+
+    for(i=0;i<n;i++)
+    {
+        AdInRead(0);  // 
+        g_ReadReg[i] = g_AReadTemp;
+    }
+    return(true);
+}
+uint8_t ReadAd1In(int n)
+{
+  int i;
+
+  for(i=0;i<n;i++)
+    {
+        AdInRead(1);  // 
+        g_ReadReg[i+4] = g_AReadTemp;
+    }
+    return(true);
+}
+
+
+uint8_t ReadAd0Ad1In(int n)
+{
+  int i;
+
+    for(i=0;i<n;i++)
+    {
+        AdInRead(0);  // 
+        g_ReadReg[i] = g_AReadTemp;
+    }
+    for(i=0;i<n;i++)
+    {
+        AdInRead(1);  // 
+        g_ReadReg[i+4] = g_AReadTemp;
+    }
+    return(true);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/AdRead.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,246 @@
+/*-------------------------------------------------------------------------------
+Programm Name: AdRead.cpp
+Version:       1.0
+Sprache:       C++
+Compiler:      mbed
+Autor:         PS
+Copyright:     PS
+         
+
+Funktion:      Lese-Funktion für den A/D Wandlerzugriff
+
+30.06.2017: 
+
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+
+// Membervariablen, die nur in dieser Datei verwendet werden
+uint8_t m_AiMask, m_Rdy0Mask, m_Rdy1Mask, m_RdyStatus[8];
+
+int g_nDelCount;
+uint8_t AdcA0V1, AdcA0V2, AdcA0V3;
+
+long g_nChn1Counter = 0;
+long g_nChn2Counter = 0;
+long g_nFinishCounter = 0;
+
+uint16_t nTempCounter = 0;
+
+int g_Temp1, g_Temp2, g_Temp3, g_Temp4, g_Temp5, g_Temp6;
+
+Converter0 Conv0[2];
+
+uint8_t g_nIRead;
+
+int nStatusCounter = 0;
+
+bool g_fDisableDataRead;
+
+/*----------------- INTERRUPT SERVICE ROUTINES --------------------------*/
+
+void Rdy0Fall() 
+{
+    __disable_irq();
+    g_fRdy0 = true;
+    Adc0ReadChn();
+    __enable_irq();
+}    
+    
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+void Rdy1Fall() 
+{
+    __disable_irq();
+    g_fRdy1 = true;
+    Adc1ReadChn();
+    __enable_irq();
+}    
+/*-------------------------------------------------------------------------------
+ReadConverter0: Lesen des ersten A/D Wandlers
+-------------------------------------------------------------------------------*/
+void ReadConverter0() 
+{
+    unsigned char ChnStatus;
+    
+    g_fRdy0 = false;
+    if(g_fDisableDataRead == true)
+        return;
+//    m_Rdy0Status = ReadAdStatusRegister(0); // liest Statusregister von Wandler 0 
+//    m_Rdy0Mask = 0x01;
+    ChnStatus = Conv0[0].AdPart[3] >> 5;
+    if(ChnStatus >= 4)  ChnStatus = 3;
+    
+    Conv0[0].AdPart[3] = 0x00;
+    MVars.dbAdSum[ChnStatus] += Conv0[0].AdComplete;
+    MVars.nChnAverage[(int)ChnStatus]++;
+    
+}    
+/*-------------------------------------------------------------------------------
+ReadConverter0: Lesen des ersten A/D Wandlers
+Der zweite Wandler wird mit den Idexen 4-7 verarbeitet
+-------------------------------------------------------------------------------*/
+void ReadConverter1() 
+{
+    unsigned char ChnStatus;
+    
+    g_fRdy1 = false;
+    if(g_fDisableDataRead == true)
+        return;
+//    m_Rdy0Status = ReadAdStatusRegister(0); // liest Statusregister von Wandler 0 
+//    m_Rdy0Mask = 0x01;
+    ChnStatus = Conv0[1].AdPart[3] >> 5;
+    if(ChnStatus >= 4)  ChnStatus = 3;
+    
+    Conv0[1].AdPart[3] = 0x00;
+    MVars.dbAdSum[ChnStatus *2 + 1] += Conv0[1].AdComplete;
+    MVars.nChnAverage[((int)ChnStatus + 4) + 1]++;
+    
+}    
+/*-------------------------------------------------------------------------------
+    CheckAnalogIn: Liest die Daten von den Wandlern
+-------------------------------------------------------------------------------*/
+int CheckAnalogIn()
+{
+    if(g_fRdy0 == true) 
+        ReadConverter0();
+    if(g_fRdy1 == true) 
+        ReadConverter1();
+    return(true);
+}
+
+/*-------------------------------------------------------------------------------
+    CheckDaAd: Schreibt zum AD und liest den AD
+-------------------------------------------------------------------------------*/
+int CheckDaAd()
+{
+    int i,Ret;
+    
+//     ReadAllChannels(); wird schon im Main aufgerufen
+// In Grundstellung ist nAktMittelAfter=500, d.h. es wird über eine halbe Sekunde gemittelt    
+// Im Messmode ist nAktMittelAfter auf einen Wert von z.B. 10 bei 100 Werten pro Sekunde
+    Ret = CalculateAdBaseValues();
+    if(Ret == false)  // nicht alle Felder waren mit Werten gefüllt
+    {
+        g_nChn1Counter++;
+        g_nChn2Counter++;
+        if(g_nChn1Counter > 10)
+        {
+            Ad7739Stop(); // Erst mal stoppen, damit noch ein weiterer Zugriff passiert
+            Ad7739Start(0, 0,1); // neu starten
+            g_nChn1Counter = 0;
+            if(g_nChn2Counter >= 100 ) // hat 10 Mal versucht neu anzustossen
+            {
+                sprintf(HostIf.strErrorBuf,"%c#ER#A/D-Converter did not answer. 10 times restart without access %c\r\n", STX, ETX); // 
+                HostIf.fSendError = true;
+            }
+                
+        }
+        return(false);
+    }
+    else
+    {
+        g_nChn1Counter = 0;
+        g_nChn2Counter = 0;
+    }
+    
+    g_nChn1Counter = 0;
+//    MVars.dbAdResult[g_nUChn[0]] = MVars.dbAdResult[g_nUChn[0]]; //  - IrComp.dbKorrVoltage;
+//    CheckLimitValues();
+
+    SendAnalogValues();
+    
+    MVars.nMwMittelCount = 0;
+    return(true);
+}
+
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+int AdReadChannels(uint8_t Chn, uint8_t Wandler, uint8_t MitStatus)
+{
+// ab hier ist der gewandelte Wert einzulesen
+// #define AD7739_READ_OP(addr)     (0x40 | addr)        #define AD7739_CHANNEL(0x08, 0...3) (addr | ch)   #define AD7739_ADDR_C_DATA 0x08
+//    Ad7739OutWrite(AD7739_READ_OP(AD7739_CHANNEL(AD7739_ADDR_C_DATA, Chn)),Wandler);  //0x48, die 0 legt die CS0 auf low
+
+//    for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++);
+    AdInRead(Wandler);
+    m_RdyStatus[Chn] = g_AReadTemp;
+    AdInRead(Wandler);
+    AdcA0V1 = g_AReadTemp;
+    AdInRead(Wandler);
+    AdcA0V2 = g_AReadTemp;
+    AdInRead(Wandler);
+    AdcA0V3 = g_AReadTemp;
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+Liest zuerst das Statusbyte und dann die Daten, welche in die Union Struktur gelesen werden
+-------------------------------------------------------------------------------*/
+int Adc0ReadChn()
+{
+    AdInRead(0);
+    Conv0[0].AdPart[3] = g_AReadTemp;
+    AdInRead(0);
+    Conv0[0].AdPart[2] = g_AReadTemp;
+    AdInRead(0);
+    Conv0[0].AdPart[1] = g_AReadTemp;
+    AdInRead(0);
+    Conv0[0].AdPart[0] = g_AReadTemp;
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+Liest zuerst das Statusbyte und dann die Daten, welche in die Union Struktur gelesen werden
+-------------------------------------------------------------------------------*/
+int Adc1ReadChn()
+{
+    AdInRead(1);
+    Conv0[1].AdPart[3] = g_AReadTemp;
+    AdInRead(1);
+    Conv0[1].AdPart[2] = g_AReadTemp;
+    AdInRead(1);
+    Conv0[1].AdPart[1] = g_AReadTemp;
+    AdInRead(1);
+    Conv0[1].AdPart[0] = g_AReadTemp;
+    return(true);
+}
+
+/*-------------------------------------------------------------------------------
+//Liest das vorher selektierte Register des ersten A/D Wandler
+-------------------------------------------------------------------------------*/
+void AdInRead(int Wandler)
+{
+//    core_util_critical_section_enter();
+    int i;
+    
+    m_AiMask = 0x80;
+    g_AReadTemp = 0x00;
+    
+    AdMosiDown(); // muss unten sein, da sonst der Continous Mode gestoppt werden kann
+    AdSckUp();
+    
+    if(Wandler == 0)
+    {
+        Ad1CsUp();
+        Ad0CsDown();
+    }
+    else
+    {
+        Ad0CsUp();
+        Ad1CsDown();
+    }
+    for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++);
+    for(i=0;i<8;i++)
+    {
+        AdSckDown();
+        for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++);
+        if(AdIsMisoUp()) 
+            g_AReadTemp |= m_AiMask;
+        AdSckUp();
+        for(g_TempDelay = 0;g_TempDelay < 2; g_TempDelay++);
+        m_AiMask = (m_AiMask>>1);
+    }
+    
+    Ad0CsUp();
+    Ad1CsUp();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/AdRead.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,42 @@
+/*-------------------------------------------------------------------------------
+Programm Name: AdRead.h
+Version:       1.0
+Sprache:       C++
+Compiler:      mbed
+Autor:         PS
+Copyright:     PS
+
+Funktion:      Lese-Funktion für den A/D Wandlerzugriff
+
+-------------------------------------------------------------------------------*/
+union Converter0
+{
+    unsigned long AdComplete;
+    unsigned char AdPart[4];
+};
+
+extern bool g_fDisableDataRead;
+
+
+extern long g_nChn1Counter;
+extern long g_nChn2Counter;
+extern long g_nFinishCounter;
+
+
+extern void AdReset();
+
+
+extern int Adc0ReadChn();
+extern int Adc1ReadChn();
+
+extern void ReadConverter0(); 
+extern void ReadConverter1(); 
+
+extern int CheckAnalogIn();
+
+// Methoden aus AdCalculations
+//------------------------------------------
+extern void InitBaseInputArray();
+extern int CheckLimitValues();
+extern int CalculateAdBaseValues();
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/CalcScan.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,97 @@
+/*
+-------------------------------------------------------------------------------
+Programm Name: CalcScan.c
+Version:       1.0                                                    
+Sprache:       C                                                      
+Compiler:      MBED
+Autor:         PS
+Copyright:     PS
+
+Funktion:      Steuerfunktionen für den Scanner (LPC1768)
+
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+/*-------------------------------------------------------------------------------
+Startwerte, die bei allen Startbefehlen gleich sind, auf Default setzten
+-------------------------------------------------------------------------------*/
+int SetStartBasics(int Nr)
+{
+    int i;
+    
+    MVars.m_fDisableStopTel = false;
+    MVars.m_fFinishMeasurement = false;
+    MVars.m_fDoFinishMeasurement = false;
+    for(i=0;i<4;i++)
+        MVars.dbAdSum[i] = 0L;
+    MVars.nMwMittelCount = 0;
+    MVars.m_nSendValues = 2;       // Messdaten kontinuierlich schicken
+    MVars.ZInfo[0] = 1;
+    MVars.ZInfo[1] = 1;
+    MVars.nAktMittelAfter = MVars.nMittelAfter; // nimmt jetzt das voreingstellte Intervall
+#ifdef SIO_DEBUG    
+    printf("in SetStartBasics nAktMittelAfter: %d \n",MVars.nAktMittelAfter);
+#endif    
+    if(MVars.nAktMittelAfter < 6)   // bei 1000/500 und 200 Werten
+        MVars.nSendAfter = 5;
+    else
+        MVars.nSendAfter = 50;
+    
+    if(MVars.nMittelAfter > 50) // wenn nur wenige Werte gesendet werden, genügt es alle 500ms
+        MVars.nSendAfter = 500;
+    MVars.m_nAnzValue = MVars.SendAnzWerte/2;
+    
+    
+    MVars.nTelLen = 0;    
+    
+    MVars.fTelStart = true;
+    MVars.nSecCounter[Nr] = 1000;
+    MVars.m_fSendStatus = true;
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+Diverse Startwerte auf Default setzten
+-------------------------------------------------------------------------------*/
+int SetStartDefault(int Nr)
+{
+    SetStartBasics(Nr);
+    
+
+// gilt für Scan und Pulsmessung gleichermaßen
+    MVars.m_fScan = true;
+
+//    MVars.nSecCounter[Nr] = 0;
+    
+
+//    printf("MVars.nAktMittelAfter:%d  MVars.nSendAfter: %d \n",MVars.nAktMittelAfter,MVars.nSendAfter);
+    return true;
+}
+/*-------------------------------------------------------------------------------
+Messung beenden. Wird von irgend einem globalen Ereignis wie Watchdog oder
+Pufferüberlauf aufgerufen. Alles wird zurückgesetzt
+-------------------------------------------------------------------------------*/
+int SetMessungEnde()
+{
+
+    MVars.m_fDisableStopTel = false;
+    MVars.nMessZustand[0] = 0;
+    MVars.m_fSendStatus = true;
+    MVars.m_fMeasurementFinished = false;
+//    MVars.m_fMeasurementFinished 
+    MVars.nMittelTimer = 0;
+    MVars.m_nSendAnz = 0;
+    MVars.m_nSendValues = 1;    // sendet Einzelwerte
+    MVars.m_fStartTel = 0x01;
+    IrComp.fSendInfo = false;
+    MVars.m_nAnzValue = 1;
+    MVars.nAktMittelAfter = 500;
+    MVars.nSendAfter = 500;
+    Mv[0].Circuit = 0;
+    Mv[1].Circuit = 0;
+    IrComp.dbIrAddVoltage = 0.;
+    IrComp.dbKorrVoltage = 0.;
+    IrComp.fIrInProcess = false;
+
+//    printf("SetMessungEnde\r\n");
+    return(true);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/Chip1768.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,48 @@
+/*
+-------------------------------------------------------------------------------
+Programm Name: Chip1768.H
+Version:       1.0
+Sprache:       C
+Compiler:      MBED
+Autor:         PS
+Copyright:     PS
+         
+
+Funktion:      Protoypen und Externdefinitionen fuers Projekt
+
+28.10.2012: 
+
+-------------------------------------------------------------------------------*/
+// Defines fuer AD7739
+#define AD7739_ADDR_COM    0x00
+#define AD7739_ADDR_IO     0x01
+#define AD7739_ADDR_REV    0x02
+#define AD7739_ADDR_TEST   0x03
+#define AD7739_ADDR_STATUS 0x04
+#define AD7739_ADDR_CHKSUM 0x05
+#define AD7739_ADDR_ZS_CAL 0x06
+#define AD7739_ADDR_FS_CAL 0x07
+#define AD7739_ADDR_C_DATA 0x08
+#define AD7739_ADDR_C_ZS   0x10
+#define AD7739_ADDR_C_FS   0x18
+#define AD7739_ADDR_C_STAT 0x20
+#define AD7739_ADDR_C_SET  0x28
+#define AD7739_ADDR_C_CT   0x30
+#define AD7739_ADDR_MODE   0x38
+
+#define AD7739_READ_OP(addr)     (0x40 | addr)
+#define AD7739_WRITE_OP(addr)    (addr)
+#define AD7739_CHANNEL(addr, ch) (addr | ch)
+
+
+
+
+
+
+
+
+
+
+// Funktionen aus NetIo.c
+extern int InitEthernet();
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/Dio.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,493 @@
+/*
+-------------------------------------------------------------------------------
+Programm Name: Dio.CPP
+Version:       1.0
+Sprache:       C
+Compiler:      MBED
+Autor:         PS
+Copyright:     PS
+                 
+
+Funktion:      Digital In/Out auf LPC1768
+
+Modified: 
+
+2016-06  UFa: Aenderungen aufgrund HW-Revision:
+               a) Anpassungen in Fkt "SetIRange"
+               b) Neue Funktionen (ersetzen z.T. entsp. Macros)
+                - SetWe()
+                - GeIstGe()
+                - ClearWeSchirm()
+                - SquareOffsetDown()
+                                    
+-------------------------------------------------------------------------------
+*/
+#include "Headers.h"
+
+//#define Spi0IsMisoUp()  (LPC_GPIOA->FIOPIN & 0x00020000)
+//#define Spi0IsMisoDown()  (LPC_GPIOA->FIOPIN & ~0x00020000)
+
+BYTE Port; 
+#ifdef PGU_EDUCATION
+DigitalOut SwPot(PTB20);
+DigitalOut SwGal(PTC10);
+DigitalOut SwGe(PTC11);
+#endif
+DigitalOut DoStatusLed(PTA1);
+
+
+/*-------------------------------------------------------------------------------
+Initialisieren der Schaltkontakte
+-------------------------------------------------------------------------------*/
+int InitDio(void)
+{
+    
+    
+#ifdef TOUCH_DISPLAY    
+    TftDisp.nTagVWriteCounter = 0; 
+    TftDisp.nTagVReadCounter = 0; 
+    g_fInCalibrationMode = false;
+#endif    
+
+#ifndef PGU_RPA
+    g_fCheckSpecial = false;
+    g_fSpzFktSwitchIRange = false;
+    g_fSpzFktSwitchNoiseGain = false;
+    
+    Setk(4,0);
+    Setk(5,0);
+    
+	printf("Now SwitchRanges.\n");
+
+	SwitchRangesOnStart();
+	printf("Now SetIRange.\n");
+	SetIRange(0,0);
+#endif
+#ifdef PGU_TOUCH
+    SetWe(0x00);    //PS 10.12.16  ClearWe entfällt, es wird einfach der Bereich 0 für die WE gesetzt, damit ist die WE1 aktiv
+    SetGe(0);
+    SetWeSchirm(1); // auf 1 damit die Leitung offen ist und keinen Fehler verursacht
+    
+    SetSinGainDefault();  // setzt die Verstärker auf Defaultwerte
+    SetNoiseGainDefault(); // damit werden auch die Cs Signale auf Default gesetzt
+
+    SetSquareOffset(0);  // Setzt den Offset für Sinuns und Dreieck
+    
+    SinGenOff();  // Setzt den AD9833 auf Reset und den Cs auf high
+#endif
+
+	printf("Now Return.\n");
+     return(true);
+}
+/****************************************************************
+ * SetNoiseGainDefault:
+ *
+ * Setzt die Rauschverstärker Defaultwert. Default ist hier der 
+   größte Wert, damit wird das Signal am Ausgang minimal. Je größer der 
+   Wert vom X9C103, desto kleiner die Amplitude vom Sinus. 
+   Die Position vom X9C103 ist 100, der Index von den Verstärkungsfaktoren
+   ist 0
+ ****************************************************************/
+int SetNoiseGainDefault()
+{
+    int i;
+    
+#ifdef ECN
+    SwHpZero = true;  // erst mal kurzschließen, damit der nicht so ausschlägt
+    CsUNoiseGain = false;
+    CsINoiseGain = false;
+    DpUpDown = true;
+    short_delay(50);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+    
+    for(i=0;i<=100;i++)
+    {
+        DpIncrement = false;
+        short_delay(20);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+        DpIncrement = true;
+        short_delay(20);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+    }
+    GCount.nUNoisePos = 100;
+    GCount.nINoisePos = 100;
+    GCount.nUnGainItem = 0;
+    GCount.nInGainItem = 0;
+    
+    CsUNoiseGain = true;
+    CsINoiseGain = true;
+#endif	
+    return(true);
+}
+/****************************************************************
+ * SetSinGainDefault:
+ *
+ * Setzt den Signalverstärker für Sinus auf Default. Default ist hier der 
+   kleinste Wert, damit wird das Signal am Ausgang minimal. Je kleiner der 
+   Wert vom X9C103, desto kleiner die Amplitude vom Sinus. 
+   Die Position vom X9C103 ist 1, der Index von den Verstärkungsfaktoren
+   ist 4
+ ****************************************************************/
+int SetSinGainDefault()
+{
+    int i;
+    
+#ifdef SINE_GEN
+    CsSinGain = false;
+    DpUpDown = false;
+    short_delay(50);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+    
+    for(i=0;i<=100;i++)
+    {
+        DpIncrement = false;
+        short_delay(20);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+        DpIncrement = true;
+        short_delay(20);        // !!! die short_delay auf keinem Fall entfernen. Es hat sich bei einer 
+    }
+    GCount.nSinGainPos = 1;
+    GCount.nSinGainItem = 4;
+    
+    CsSinGain = true;
+#endif	
+    return(true);
+}
+
+/****************************************************************
+ * ReadInput
+ *
+ * Liest das Inputbit des Tasters
+ ****************************************************************/
+int ReadInput()
+{
+/*     if(Spi0IsMisoUp())
+    if(ExtStart)
+        return true;  // 
+    else */
+        return false;
+}
+/****************************************************************
+ * SetBaVariablen:
+ * Wird von SetK aufgerufen und setzt die Variablen Mv[i].Circuit und Mv[i].BetriebsArt
+ * damit andeer Programmstellen wissen in welchem Mode die Kiste ist. 
+ ****************************************************************/
+int SetBaVariablen(int Nr, bool Level)
+{
+
+    if(Nr == MVars.SwitchChn[0])  // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
+    {
+        if(Level == HIGH)
+            Mv[0].Circuit = 1;
+        else
+            Mv[0].Circuit = 0;
+    }
+    if(Nr == MVars.SwitchChn[1])  // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
+    {
+        if(Level == HIGH)
+            Mv[0].BetriebsArt = 1;
+        else
+            Mv[0].BetriebsArt = 0;
+    }
+    return(true);
+}
+
+
+/****************************************************************
+ * Setk
+ *
+ * Setzten eines Kontaktes. Die Betriebsart und Circuit wird hier auch gesetzt
+ ****************************************************************/
+int Setk(int Nr, bool Level)
+{
+//    uint8_t mask = 0x80;
+
+#ifdef PGU_EDUCATION
+//    uint8_t mask = 0x80;
+    SetBaVariablen(Nr, Level);
+    if(Nr == 4) // I-Zelle
+        SwGe = Level;
+    else if(Nr == 5)
+    {
+        if(Level == false)
+        {
+            SwPot = true;
+            SwGal = false;
+        }
+        else // if(Level == false)
+        {
+            SwPot = false;
+            SwGal = true;
+        }
+    }
+#endif
+#ifdef PGU_POTI		// wenn ein Potentiostat angeschlossen ist
+    if(Nr == MVars.SwitchChn[0])  // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
+    {
+        if(Level == HIGH)
+        {
+            g_nSendDisableTimer = 1000;
+            SetSwitchHpZero(0);
+            Mv[0].Circuit = 1;
+            SkIzUp();
+            if(IRange.AutoRange[0] < 2) 
+            {
+                    IRange.m_fCheckRange = true;
+            }
+            nSwitchDownCount[0] = EcmIni.DelayAfterSwitchUp;  // beim Rauschen deutlich laenger
+        }
+        else
+        {
+            IRange.m_fCheckRange = false;
+            Mv[0].Circuit = 0;
+            SkIzDown();
+        }
+    }
+    if(Nr == MVars.SwitchChn[1])  // 0=1. IZelle, 1= 1. PotGal, 2=2. IZelle, 3=2. PotGal
+    {
+        
+        if(Level == HIGH)
+        {
+            Mv[0].BetriebsArt = 1;
+            PotGalUp();
+        }
+        else
+        {
+            Mv[0].BetriebsArt = 0;
+            PotGalDown();
+        }
+    }
+#endif	
+    return(true);
+
+}
+/****************************************************************
+SetSwHpZero
+
+Schaltet die Eingänge der Rauschverstärker auf Null, damit eine 
+Impuls durch das Umschalten eines Bereiches nicht den Hochpass 
+ausstuert
+****************************************************************/
+void SetSwitchHpZero(int nType)
+{
+#ifdef ECN
+    g_fCheckSpecial = true;
+    if(nType == 0)  // IRange Umschaltung
+    {
+        SwHpZero = true;    
+        g_nSpzFktSwitchIRange = 2;  // 2 steht für 500ms 
+        g_fSpzFktSwitchIRange = true;
+        g_nSpzFktSwitchNoiseGain = 10;  // 1/2Sekunde
+        g_fSpzFktSwitchNoiseGain = true;
+    }
+    else if(nType == 1)  // Noise Gain Umschaltung
+    {
+//        g_nSpzFktSwitchNoiseGain = 50;  // 1.5 Sekunde
+//        g_fSpzFktSwitchNoiseGain = true;
+    }
+#endif	
+}
+
+/****************************************************************
+ * WriteToRefPort
+ *
+ Schreibt SPI Daten an das Schieberegister über CsRef
+****************************************************************/
+void WriteToSpiPort(unsigned char Pt)
+{
+    uint8_t mask = 0x80;
+    uint8_t i;
+    Port = Pt;
+    
+    for(i=0;i<8;i++)
+    {
+        DaSckDown();
+        g_nDelayCounter = 1;
+        g_nDelayCounter = 2;
+        g_nDelayCounter = 3;
+        g_nDelayCounter = 4;
+        if((Port & mask) == mask)
+        	DaMosiUp();
+        else
+        	DaMosiDown();
+        g_nDelayCounter = 1;
+        g_nDelayCounter = 2;
+        g_nDelayCounter = 3;
+        g_nDelayCounter = 4;
+        DaSckUp();
+        g_nDelayCounter = 1;
+        g_nDelayCounter = 2;
+        g_nDelayCounter = 5;    
+        g_nDelayCounter = 6;
+        mask = (mask >> 1);
+    }
+}
+
+/*-------------------------------------------------------------------------------
+ChangeMittelValue: Ändert den Mittelwert und alles drumherum
+-------------------------------------------------------------------------------*/
+int ChangeMittelValue()
+{
+    m_fChangeMittelValue = false;
+    MVars.nMwMittelVal = MVars.m_nStoreMwIntervall; // nimmt jetzt das voreingstellte Intervall
+    MVars.nMwPerBlock = NsRate.nNewSendeRate / 2;
+//    printf("Neuer Mittelwert: %d Neuer Blockwert: %d\n",MVars.nMwMittelVal,MVars.nMwPerBlock);
+    m_fFallBack = NsRate.fFallBack;
+    nFallBackCounter = 0;
+#ifdef PGU_POTI    
+    if(NsRate.nNewAutoRange < 3)
+    {
+        if(NsRate.nNewAutoRange != IRange.AutoRange[0])
+        {
+            NsRate.nOldAutoRange = IRange.AutoRange[0];
+            IRange.AutoRange[0] = NsRate.nNewAutoRange;
+        }
+    }
+    if(NsRate.nNewRange != -1)
+    {
+        IRange.AktRange[0] = NsRate.nNewRange;
+        SetIRange(0,IRange.AktRange[0]);
+    }
+#endif    
+    return(true);
+}
+/****************************************************************
+ * SetWe
+ *
+ * Setzen verschied. WorkingElektroden
+ *
+ *   WeSelect wäre  & 0xE7 löscht die beiden Eingänge des Multiplexers und
+ setzt damit die WE 1  und | 0x18 setzt beide Eingänge auf high, das wäre die WE 4 
+***************************************************************/
+
+void SetWe(UINT8 WeRange)
+{
+#ifdef PGU_TOUCH
+    UINT8 Range;
+    Range = WeRange;
+
+    ReInitPtc16_17();
+    CsCurrentDown();  // low aktiv
+#if defined REV_1B || defined REV_1D
+    MVars.nCurrentPort &= 0xE7;
+#else
+    MVars.nCurrentPort &= 0xCF; // ist jetzt auf Bit 4 und Bit 5
+#endif
+    MVars.nCurrentPort |= Range;
+    WriteToSpiPort(MVars.nCurrentPort);
+    CsCurrentUp();  // low aktiv
+#endif
+}
+
+
+
+/****************************************************************
+ * GeIstGe
+ *
+ * 
+***************************************************************/
+
+void SetGe(UINT8 State)
+{
+    UINT8 Value;
+/*  Schaltet den Ausgang GE auf den Schirm der WE. Das Signal WeSchirm hat nun den 
+ Ausgang Gegenelektrode. Solange wie SwWeSchirm auf Low, hat das keinen Effekt
+ ist WeSchirm auf High, dann wird die Klemme, welche den WeSchirm nach aussen bringt, 
+ auf die Ge geschaltet. 
+ D.h. LPR mit CoulCount Sensor bedeutet: 
+ SetGe(1); (SwGeWeSchirm auf high)
+ SwWeSchirm(1)   (SwWeSchirm auf high)
+ Für CoulCount muss SwWeSchirm(0) gesetzt werden, sonst liegt der Schirm nicht auf GND
+ 
+ */
+#ifdef PGU_TOUCH
+     
+    ReInitPtc16_17();
+    CsCurrentDown();  // low aktiv
+	#if defined REV_1B || defined REV_1D
+		MVars.nCurrentPort &= 0xBF;
+	#else
+		MVars.nCurrentPort &= 0x7F;
+	#endif
+		if(State == 1)  
+		{
+	#if defined REV_1B || defined REV_1D
+			Value = 0x40;
+	#else
+			Value = 0x80;
+	#endif
+        MVars.nCurrentPort |= Value;
+    }    
+     WriteToSpiPort(MVars.nCurrentPort);
+    CsCurrentUp();  // low aktiv
+#endif	
+}
+
+/****************************************************************
+ * ClearWeSchirm
+ * Um den Ausgang des Summierverstärkers über IZelle auf die Gegenelektrode zu schalten, 
+ muss SwGeWeSchirm auf Low sein. 
+ Der Anschluss WeSchirm (Klemme K4 nach aussen) liegt auf GND, wenn SwWeSchirm auf Low ist. Damit 
+ wirkt der Anschluss entweder als zusätzlicher Schirm oder er kann für die zweite Elektrode zur Strommessung verwendet
+ werden. Soll eine außenstromlose Messung mit zwei WE durchgeführt werden, dann ist SwWeSchirm vor der Messung auf high zu halten.
+ Entsprechend ist SwGeWeSchirm auf low zu halten, da sonst der Anschluss auf die Gegenelektrode gehen könnte (aber nur, wenn 
+ SwIZelle = high, sonst hängt der Eingang in der Luft (soll er auch damit kein Strom fließt).
+ 
+ Ist SwWeSchirm auf High, dann ist der Eingang der WE-S zunächt offen, es sei denn, SwGeWeSchirm ist auch high. Dann ist die zweite 
+ WE als GE geschaltet. 
+ 1. Die Gegenelektrode ist ganz normal an dem Ausgang des Summierverstärkers: SwGeWeSchirm ist auf low, SwWeSchirm auch low. 
+    WeSchirm liegt auf GND. Ist eine Elektrode angeschlossen und eingetaucht, dann fließt sofort ein Kurzschlussstrom.
+2.  Die zweite WE ist offen (SwWeSchirm = high). Dann kann sie als Gegenelektrode genutzt werden, wenn SwGeWeSchirm auch auf high ist,
+    muss aber nicht. 
+Einstellungen für CoulCount: 
+- Vor Beginn der Messung muss SwWeSchirm auf high sein, damit der Anschluss offen ist. SwGeWeSchirm ist low, damit die Gegenelektrode da nicht
+  dran kann.
+  Wird die Messung gestartet, dann wird SwWeSchirm auf Low geschaltet. Damit wird der Strommesskreis kurzgeschlossen. 
+Einstellungen für LPR: 
+- Wird der gleiche Sensor wie für CoulCount auch für LPR genommen, dann ist SwWeSchirm und SwGeWeSchirm auf high zu schalten. 
+  Mit Beginn des Polarisierens wird IZelle auf high gesetzt, damit wird die zweite WE des Sensors als GE geschaltet. 
+  
+ * 
+***************************************************************/
+void SetWeSchirm(UINT8 State)
+{
+#ifdef PGU_TOUCH
+    UINT8 Value;
+//  if State == low     ZRA Messung, SwWeSchirm auf low    
+
+    ReInitPtc16_17();
+    CsCurrentDown();  // low aktiv
+	#if defined REV_1B || defined REV_1D
+    MVars.nCurrentPort &= 0xDF;
+	#else
+    MVars.nCurrentPort &= 0xBF;
+	#endif
+    if(State == 1)  // wird auf GE geschaltet, WE ist GE / 
+    {
+	#if defined REV_1B || defined REV_1D
+        Value = 0x20;
+	#else
+        Value = 0x40;
+	#endif
+        MVars.nCurrentPort |= Value;
+    }    
+
+    WriteToSpiPort(MVars.nCurrentPort);
+    CsCurrentUp();  // low aktiv
+#endif	
+}
+
+/****************************************************************
+ * SquareOffsetDown
+ * 0 setzt den Offset des Sinusgenerators auf Sinus und Dreieck. 
+ um den Generator auf Recheck zusetzen, ist SwitchWaveForm auf true 
+ zu setzen. Damit wird der Offset verschoben und an das Rechtecksignal 
+ angepasst. 
+ * 
+***************************************************************/
+void SetSquareOffset(int State)
+{
+#ifdef PGU_TOUCH
+    SwitchWaveForm = State;
+#endif	
+}
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/Dio.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,123 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  Dio.h
+Version:        1.0
+Sprache:        C
+Compiler:       mbed
+Autor:          PS
+Copyright:      PS
+
+Funktion:       I/O Signale für Messbereichszugriffe, U-Ruhe/IZelle, Pot/Gal usw.
+-------------------------------------------------------------------------------*/
+
+// D-I/O's
+//-----------------------------------------------------------------------------
+extern DigitalOut led1; // (LED1);
+extern DigitalOut led2; // (LED2);
+extern DigitalOut led3; //(LED3);
+extern DigitalOut led4; //(LED4);
+
+
+#ifdef CURRENT_5A_PIO
+extern DigitalOut CsCurrent;     // Enable
+extern DigitalOut CsTemp1;       // A0 
+extern DigitalOut CsTemp2;       // A1
+extern DigitalOut CsIrComp;       // A2 
+#else
+
+extern DigitalOut EnableOffset; //Offset freigeben
+
+#endif
+
+
+// Macros
+/*-----------------------------------------------------------------------------
+#define Spi0IsMisoUp()  (LPC_GPIO0->FIOPIN & 0x00020000)
+#define Spi0IsMisoDown()  (LPC_GPIO0->FIOPIN & ~0x00020000)
+
+#ifdef EXT_AB
+
+    #define SkIzUp()  (LPC_GPIO2->FIOSET |= 0x00000001)     // CsIrKomp
+    #define SkIzDown()  (LPC_GPIO2->FIOCLR |= 0x00000001)   // 
+
+    #define PotGalUp()  (LPC_GPIO2->FIOSET |= 0x00000002)   // CsCurrent
+    #define PotGalDown()  (LPC_GPIO2->FIOCLR |= 0x00000002)
+#else
+    #ifdef PGU_MOD_OLD
+
+    #define SkIzUp()  (LPC_GPIO0->FIOSET |= 0x00040000)
+    #define SkIzDown()  (LPC_GPIO0->FIOCLR |= 0x00040000)
+
+    #define PotGalUp()  (LPC_GPIO0->FIOSET |= 0x00008000)
+    #define PotGalDown()  (LPC_GPIO0->FIOCLR |= 0x00008000)
+    
+    #else
+
+    #define SkIzUp()  (LPC_GPIO2->FIOSET |= 0x00000001) // CsIrKomp
+    #define SkIzDown()  (LPC_GPIO2->FIOCLR |= 0x00000001)
+
+    #define PotGalUp()  (LPC_GPIO2->FIOSET |= 0x00000002)   // CsCurrent
+    #define PotGalDown()  (LPC_GPIO2->FIOCLR |= 0x00000002)
+
+    #endif
+#endif
+
+#ifdef IMP_INTERFACE
+
+#define SkIzUp()  (LPC_GPIO2->FIOSET |= 0x00000001)     // CsIrKomp
+#define SkIzDown()  (LPC_GPIO2->FIOCLR |= 0x00000001)   // 
+
+#define PotGalUp()  (LPC_GPIO2->FIOSET |= 0x00000002)   // CsCurrent
+#define PotGalDown()  (LPC_GPIO2->FIOCLR |= 0x00000002)
+
+#define IRangeEnable()  (LPC_GPIO2->FIOSET |= 0x00000004)   // CsSinGen
+#define IRangeDisable()  (LPC_GPIO2->FIOCLR |= 0x00000004)   // CsSinGen
+
+#endif
+
+// Für die wenigen externen Geräte die noch über eine Box angesteuert werden
+#define K0_Up()       (LPC_GPIO2->FIOSET |= 0x00000001)
+#define K0_Down()     (LPC_GPIO2->FIOCLR |= 0x00000001)
+#define K1_Up()       (LPC_GPIO2->FIOSET |= 0x00000002)  
+#define K1_Down()     (LPC_GPIO2->FIOCLR |= 0x00000002)
+#define K2_Up()       (LPC_GPIO2->FIOSET |= 0x00000004)  
+#define K2_Down()     (LPC_GPIO2->FIOCLR |= 0x00000004)
+#define K3_Up()       (LPC_GPIO2->FIOSET |= 0x00000008)  
+#define K3_Down()     (LPC_GPIO2->FIOCLR |= 0x00000008)
+
+#define K4_Up()       (LPC_GPIO2->FIOSET |= 0x00000020)  
+#define K4_Down()     (LPC_GPIO2->FIOCLR |= 0x00000020)
+#define K5_Up()       (LPC_GPIO2->FIOSET |= 0x00000010)  
+#define K5_Down()     (LPC_GPIO2->FIOCLR |= 0x00000010)
+#define K6_Up()       (LPC_GPIO1->FIOSET |= 0x40000000)  
+#define K6_Down()     (LPC_GPIO1->FIOCLR |= 0x40000000)
+#define K7_Up()       (LPC_GPIO1->FIOSET |= 0x80000000)  
+#define K7_Down()     (LPC_GPIO1->FIOCLR |= 0x80000000)
+
+*/
+
+// Funktionen aus Dio.cpp
+//------------------------------------
+extern int SetBaVariablen(int Nr, bool Level);
+extern int Setk(int Nr, bool Level);
+extern int SetkPio(int Nr, bool Level);
+extern int SetkPguMod(int Nr, bool Level);
+extern int SetkPguStack(int Nr, bool Level);
+extern void SetRefFilter(unsigned char Rng);
+extern void SetUGainMux(unsigned char Range);
+extern void SetIGainMux(unsigned char Range);
+extern void SetUOffset(unsigned char Range);
+extern void SetFrqGain(BYTE V1, BYTE V2, BYTE Mux);
+extern void SinOnOff(int State);
+extern int InitDio(void);
+extern void SetRefSpiRange();
+extern void SetCurSpiRange();
+// extern void WriteToSpiPort(unsigned char Port);
+extern void SetExtBnc(int State, int Nr);
+extern int ChangeMittelValue();
+extern int SwitchRangesOnStart();
+extern void SetCurBiRange();
+extern int SetIZelleBasis(int Nr, bool Level);
+extern void WriteToStackPort(unsigned int Port);
+extern void SetRefStackRange();
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/EcmTel.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,485 @@
+/*
+-------------------------------------------------------------------------------
+Programm Name: EcmTel.CPP
+Version:       1.0
+Sprache:       C
+Compiler:      MBED
+Autor:         PS
+Copyright:     PS
+                 
+Funktion:      Telegrammauswertung fuer EcmCom Programm auf LPC1768
+
+Letzte Änderung für neue EcmWin Version 2.1 war
+Ver.: 2.0.1.0
+
+
+-------------------------------------------------------------------------------
+*/
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+
+
+
+/*-------------------------------------------------------------------------------
+Interne Prototypen
+-------------------------------------------------------------------------------*/
+extern int ScanNext(char *Line, int &Start, int Len);
+
+
+/*-------------------------------------------------------------------------------
+Variablen, die nur in EcmTel verwendet werden
+-------------------------------------------------------------------------------*/
+char TelCode[8];
+
+int TelLen;
+
+char *TelPos;
+
+
+const char *CodeTab[11] = {"CN", "SK", "FR", "SW", "SC", "IC", "SI", "DI", "GD", "DY", "PA"
+};
+                               
+/* Die Codefunktionen sind:
+CN: Kanalnummern setzen     DecodeChannel()
+SK: Kontakt Setzen          DecodeContact()
+FR: Freigabe, keine Komm.   DecodeFreigabe()
+SW: Set Watchdog            DecodeSetWd()
+SC: Set Analogausgang       DecodeAnalogValue()
+IC: Setzt den Ini Code     DecodeIniCode(char *Line);
+SI: Sendet den Ini Code    SendIniCode(char *Line);
+
+DI: Sendet die DevID Datei, damit EcmWin das angeschlossene Gerät erkennen kann
+GD: Empfängt die DevID Datei, 
+DY: Dummy Telegramm damit die Leitung in beide Richtungen angesprochen wird
+PA: Schaltet die Pumpe ein.   SwitchPumpeOn
+
+*/
+
+
+
+int (*FktPtr[])(char *) = {DecodeChannel, DecodeContact, DecodeFreigabe, DecodeSetWd,DecodeAnalogValue, DecodeIniCode, \
+                            SendIniCode, SendDevFile, GetDevFile, RequestDummy, SwitchPumpeOn
+};
+
+/*-------------------------------------------------------------------------------
+    Funktion CheckSioTel prueft den gesamten String und fieselt die einzelenen
+    Telegramme auseinander. Für jedes Telegramm wird separat DecodeTel aufgerufen,
+    welches den Inhalt des Telegramms auswertet
+    Der Telegrammanfang ist mit ! , das Ende mit $ gekennzeichnet
+-------------------------------------------------------------------------------*/
+int CheckTel()
+{
+    int i, Len;
+    char OldSign;
+
+    i=0;
+
+    Len = HostIf.nAwTelLen;
+#ifdef SIO_DEBUG    
+//    printf("HostIf.strTelAwBuf: %s\r\n",HostIf.strTelAwBuf);
+#endif
+//    printf("%c#DG#HostIf.strTelAwBuf: %s%c\r\n",STX, HostIf.strTelAwBuf, ETX);
+
+    while(i < Len)
+    {
+        if(HostIf.strTelAwBuf[i] == STX) // hat Startzeichen erkannt. sollten Zeichen vor dem STX sein, dann werden diese verworfen
+        {
+            HostIf.ptrTelPos = &HostIf.strTelAwBuf[i+1];
+            HostIf.nTelLen = Len - i -1;  // das Existieren von ETX wurde verher schon geprueft
+			
+            OldSign = HostIf.strTelAwBuf[Len-1];
+            HostIf.strTelAwBuf[Len-1] = 0x00;
+            DecodeTel();
+            HostIf.strTelAwBuf[Len-1] = OldSign;
+            i = Len;
+        }
+        i++;
+    }
+    ChangeLedColor();
+    HostIf.fIsConnected = true;
+    return(0);
+}
+/*-------------------------------------------------------------------------------
+    CompareTelCode: vergleicht den Inhalt des Telegramms mit der Tabelle
+-------------------------------------------------------------------------------*/
+int CompareTelCode()
+{
+    int i;
+
+    for(i=0;i<ANZ_TEL_CODE;i++)
+    {
+        if( (HostIf.TelCode[0] == CodeTab[i][0]) && (HostIf.TelCode[1] == CodeTab[i][1]) )
+        {
+//            printf("%s\n", HostIf.strTelAwBuf);
+            return(i);
+        }
+    }
+    return(-1);
+}
+
+
+/*-------------------------------------------------------------------------------
+    Funktion DecodeTel prueft Telegramme auf Inhalt und Befehl. Wird nur aufgerufen,
+    wenn Telegramm vollständig.
+    TelPos zeigt auf Anfang de Telegramms, TelLen ist die Länge bis zum TelEnde
+------------------------------------------------------------------------------- */
+int DecodeTel()
+{
+    int i, Ret;
+
+    i =0;
+    while( (*(HostIf.ptrTelPos+i) == '#') && (i < HostIf.nAwTelLen) )
+        i++;
+
+    if( (*(HostIf.ptrTelPos+i) > 0x40) && (*(HostIf.ptrTelPos+i) < 0x5B)) // ist ein Zeichen aus den Grossbuchstaben
+    {
+        if( (*(HostIf.ptrTelPos+i+1) > 0x40) && (*(HostIf.ptrTelPos+i+1) < 0x5B)) // auch das zweite Zeichen ist ein Grossbuchstabe
+        {
+            if(*(HostIf.ptrTelPos+i+2) == '#')   // erst kommen zwei Großbuchstaben und dann ein #
+            {   // ist ein richtige Telegramm
+                HostIf.TelCode[0] = *(HostIf.ptrTelPos+i);
+                HostIf.TelCode[1] = *(HostIf.ptrTelPos+i+1);
+                HostIf.TelCode[2] = 0x00;
+                Ret = CompareTelCode();
+                if(Ret >= 0)    // gütiger Wert
+                {
+                    (*FktPtr[Ret])((char *)(HostIf.ptrTelPos+i+3));
+                }
+                else    // findet keinen passenden Code
+                {
+                    sprintf(HostIf.strErrorBuf,"%c#ER#Unbekanntes Telegramm", STX);
+					HostIf.fSendError = true;
+//                    printf("%s",IdSendBuf);
+                   
+                }
+            }
+        }
+    }
+    return(0);
+}
+/*-------------------------------------------------------------------------------
+RequestDummy: Nichts tun
+-------------------------------------------------------------------------------*/
+int RequestDummy(char *Line)
+{
+//   	MVars.m_fSendStatus = true;
+    return(1);
+}
+
+
+//--------------------------------------------------------------------------
+// Telegramm #IC#: Decode Ini File EcmWin sendet einen neuen IniFile
+//--------------------------------------------------------------------------
+int DecodeIniCode(char *Line)
+{
+    strcat(Line, "\r\n");
+    clSdCard.WriteFile(FileNames.IniFileName, Line);
+    OpenIni();
+    return(true);
+}
+//--------------------------------------------------------------------------
+// Telegramm #SI#: Send Ini File. EcmWin ruft den Inifile ab
+//--------------------------------------------------------------------------
+int SendIniCode(char *Line)
+{
+    int Ret, fEnde;
+    
+    Ret = clSdCard.OpenFile( (char *)FileNames.IniFileName, FileNames.FileReadMode);
+
+    if(Ret == false)
+    {
+		sprintf(HostIf.strTempBuf, "%c#DG#Fehler beim Oeffnen der IniDatei %s  %s",STX, FileNames.IniFileName, FileNames.FileReadMode);
+		SendTelToHost(false, false, 0);   // weitere Telegramme und kein EOF
+		return(false);                // Fehler beim Öffnen der Datei    
+    }
+	SetTimerInterrupt(0);
+    fEnde = false;
+    sprintf(HostIf.strTempBuf, "%c#SI#",STX);
+    SendTelToHost(true, false, 0);   // weitere Telegramme und kein EOF
+    do
+    {
+        Ret = clSdCard.ReadLine(HostIf.strTempBuf, 512); // HostIf.strCommonTmpBuf hat 512 Zeichen, mehr sind in einer Zeile nicht drin
+        if(Ret > 0)
+        {
+            SendTelToHost(true, false, 0);   // weitere Telegramme, kein EOF, LF durch # ersetzen
+        }
+        else    // wenn er mit Ret = 0 zurückkommt, dann sind die Fehler gecleart, Datei noch offen
+        {
+			HostIf.strTempBuf[0] = 0x00;  // ETX wird spaeter drangehaengt
+            SendTelToHost(false, false, 0);   // Gesamtdatei kleiner 16384 Bytes, daher ohne EOF
+            fEnde = true;
+        }
+    }
+    while(fEnde == false);
+    clSdCard.CloseFile();
+    if(MVars.m_fMessDlgOpened == true)
+		SetTimerInterrupt(1);
+    return(true);
+}
+//--------------------------------------------------------------------------
+// ScanNext: Such die nächste Stelle im Telegramm hinter dem #
+//--------------------------------------------------------------------------
+int ScanNext(char *Line, int &Start, int Len)
+{
+    while(*(Line+Start) != '#')
+    {
+        Start++;
+        if(Start >= Len)
+            return(false);
+    }
+    Start++;
+    if(Start >= Len)
+        return(false);
+    return(true);
+}
+//--------------------------------------------------------------------------
+// Telegramm #CN#: Kanalnummern, Anz. Messwerte und Gültige Kanäle werde uebertragen
+// Kanalnummern, die uebertragen werden sollen
+// Tel hat die Form: !#CN#0,1,2,3,4,5,6,7,4,5,6,7, 4,5,6,7,0,0|<CR><LF>
+// Die ersten 8 Zahlen sind die Kanalnumern der Messkanaele, die naechste vier sind die Schaltkanaele
+// die naechsten beiden sind Autorange
+//--------------------------------------------------------------------------
+int DecodeChannel(char *Line)
+{
+    int Start, Len,i;
+    
+//	printf("%c#DG#Decode Channel Line %s %c\n", STX, Line, ETX);
+    MVars.m_fMessDlgOpened = true;
+    MVars.fAdReInit = false;
+    MVars.fEnableAuto = true;   // damit EnableAutoRange gesetzt wird
+    MVars.nAktMittelAfter = 500;    // in Grundstellung alle 500ms
+
+    Start = 0;
+    Len = strlen(Line);
+//	printf("%c#DG#LineLen Decode Channel %d %c\n", STX,Len, ETX);
+    for(i=0;i<8;i++)
+    {
+        MVars.dbAdSum[i] = 0.;
+        MVars.MwChn[i] = atoi(Line+Start);
+        if(ScanNext(Line,Start, Len) == false)   return(false);
+    }
+//	printf("%c#DG#Decode Channel nach for i<8 %c\n", STX, ETX);
+    
+    MVars.m_nAnzChnSend = 3;
+
+    for(i=0;i<3;i++)
+        MVars.m_fChnValid[i] = true;
+
+//	printf("%c#DG#Decode Channel nach fValid%c\n", STX, ETX);
+
+    MVars.SendAnzWerte = 2;
+    CalcSendAnzWerte();
+    if(MVars.SendAnzWerte == 1000)
+    {
+        MVars.AdConvTime = 0x18; // Startwert, längste Wandlungszeit
+    }
+    else if(MVars.SendAnzWerte == 500)
+    {
+        MVars.AdConvTime = 0x28; // Startwert, längste Wandlungszeit
+    }    
+    else if(MVars.SendAnzWerte == 200)
+    {
+        MVars.AdConvTime = 0x58; // Startwert, längste Wandlungszeit
+    }    
+    else 
+    {
+        MVars.AdConvTime = 0x7F; // Startwert, längste Wandlungszeit
+    }    
+//	printf("%c#DG#Decode Channel nach CalcSendAnz%c\n", STX, ETX);
+    
+//    SetAdConversionTime();
+//    wait(2.0);
+    SetTimerInterrupt(1);  // wenn er schon laeuft, dann passiert nichts
+    
+    MVars.nAktMittelAfter = 500;    // in Grundstellung alle 500ms
+
+    MVars.nSendAfter = 500;
+    MVars.m_nAnzValue = 1;
+    
+    MVars.nDestCount = 0;
+    MVars.nMittelTimer =0;
+    MVars.nMessTimer = 0;
+    MVars.m_fStartTel = 0x01;
+    MVars.m_nSendValues = 1;
+    STemp[0] = 0x00;
+
+//    Ad7739Init();
+    Ad7739Start(0, 0,1);
+//    MVars.fAdReInit = true;
+//	printf("%c#DG#Ende Decode Channel%c\n", STX, ETX);
+
+    return(true);
+}
+//--------------------------------------------------------------------------
+void CalcSendAnzWerte()
+{
+    if(MVars.SendAnzWerte >= 1000)   // 1000 Werte Pro Sekunden
+        MVars.nMittelAfter = 1;
+    else if(MVars.SendAnzWerte == 500)   // 500 Werte Pro Sekunden
+        MVars.nMittelAfter = 2;
+    else if(MVars.SendAnzWerte == 200)   // 200 Werte Pro Sekunden
+        MVars.nMittelAfter = 5;
+    else if(MVars.SendAnzWerte == 100)   // 100 Werte Pro Sekunden
+        MVars.nMittelAfter = 10;
+    else if(MVars.SendAnzWerte == 50)   // 50 Werte Pro Sekunden
+        MVars.nMittelAfter = 20;
+    else if(MVars.SendAnzWerte == 20)   // 20 Werte Pro Sekunden
+        MVars.nMittelAfter = 50;
+    else if(MVars.SendAnzWerte == 10)   // 10 Werte Pro Sekunden
+        MVars.nMittelAfter = 100;
+    else if(MVars.SendAnzWerte == 4)   // 4 Werte Pro Sekunden
+        MVars.nMittelAfter = 250;
+    else // if(MVars.SendAnzWerte == 2)   // 2 Werte Pro Sekunden
+        MVars.nMittelAfter = 500;
+}
+//--------------------------------------------------------------------------
+// #SK#  // beliebigen Kanal schalten
+//--------------------------------------------------------------------------
+int DecodeContact(char *Line)
+{
+    int Start,Len, SkChn;
+    bool SkLevel;
+
+    Start = 0;
+    
+    Len = strlen(Line);
+    SkChn = atoi(Line);
+    while( (*(Line+Start) != '#') && (Start < Len) )
+        Start++;
+    Start += 1;
+    SkLevel = (bool)atoi(Line+Start);
+    
+    if(SkChn == 0) // Start Kommando, Motor laeuft los
+    {
+        if(SkLevel == 0)    
+        	SwR0 = false;
+        else
+        {                
+        	SwR0 = true;
+        	MVars.m_fSendStatus = true;
+        }
+    }
+    else if(SkChn == 1) // Direktion, wenn low, dann Gegenuhrzeigersinn
+    {
+        if(SkLevel == 0)    SwR1 = false;
+        else                SwR1 = true;
+    }
+    
+
+    return(true);
+}
+//--------------------------------------------------------------------------
+//  #FR#  Pot. freigeben
+//--------------------------------------------------------------------------
+int DecodeFreigabe(char *Line)
+{
+    int i;
+
+    MVars.nMessArt = 0;
+    MVars.fSequenzMessung = false;
+    IrComp.fMitIrValue = false;
+    MVars.m_fMessDlgOpened = false;
+    FrqValues.fImpedance = false;   // falls er auf Impedanzmessung war
+
+    Ad7739Stop();
+    for(i=0;i<ANZ_POT;i++)
+        MVars.nMessZustand[i] = 0;
+    IrComp.dbAOut[0] = 0.;
+    CalcDa(IrComp.dbAOut[0], 0);
+    MVars.m_nSendValues = 0;
+    
+    LedsOff();
+    MVars.fEnableAuto = false;   // damit EnableAutoRange gesetzt wird
+    nMyTimer = 0;
+    return(true);
+}
+//--------------------------------------------------------------------------
+//  #SW#   Set Watchdog
+//--------------------------------------------------------------------------
+int DecodeSetWd(char *Line)
+{
+    int Start,Len,i;
+
+    Start = 0;
+    Len = strlen(Line);
+    WDog.fEnabled = (bool)atoi(Line);
+
+    while( (*(Line+Start) != '#') && (Start < Len) )
+        Start++;
+    Start++;
+    WDog.nTimeOut = atoi(Line+Start);
+    WDog.nMsTimeOut = WDog.nTimeOut * 200;
+
+    while( (*(Line+Start) != '#') && (Start < Len) )
+        Start++;
+    Start++;
+    i=0;
+    while( (*(Line+Start) != '#') && (Start < Len) )
+    {
+        WDog.cSign[i] = *(Line+Start);
+        Start++;    i++;
+        if(i > 7)   break;
+    }
+    Start++;
+    WDog.fLogFile = (bool)atoi(Line+Start);
+//        printf("WatchDog: %d,  %d,  %s,  %d",WDog.fEnabled, WDog.nTimeOut, WDog.cSign, WDog.fLogFile);
+    return(true);
+}
+//--------------------------------------------------------------------------
+ // #SC#  Analogausgang setzen
+//--------------------------------------------------------------------------
+int DecodeAnalogValue(char *Line)
+{
+    int Start,Chn;
+
+    Start = 0;
+
+//    return(true);
+//    printf("Puffer:%s",Line);
+#ifdef SIO_DEBUG    
+        printf("MessZustand: %d Flag Sequenzmessung %d\n",MVars.nMessZustand[0], MVars.fSequenzMessung);
+#endif    
+    if(MVars.fSequenzMessung)   // nur wenn innerhalb der Sequenzmessung
+        MVars.m_fScan = false;
+    Chn = atoi(Line);
+    if(Chn > 0) Chn--;  // bekommt 1 und 2, muss aber mit 0 und 1 arbeiten
+    Start += 2;
+//  printf("Ch:%d Val:%f\n",Channel,AOut);
+    IrComp.dbAOut[Chn] = atof(Line+Start);
+#ifdef SIO_DEBUG    
+        printf("DaValue: %f \n",IrComp.dbAOut[Chn]);
+#endif    
+    CalcDa(IrComp.dbAOut[Chn], Chn);
+
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+// SendIdTel: Sendet das ID-Telegramm
+-------------------------------------------------------------------------------*/
+int SendIdTel()
+{
+//    TcpClient.send( TcpSendBuf, strlen(TcpSendBuf));
+    return(1);
+}
+//--------------------------------------------------------------------------
+// Telegramm #CN#: Kanalnummern, Anz. Messwerte und Gültige Kanäle werde uebertragen
+// Kanalnummern, die uebertragen werden sollen
+// Tel hat die Form: !#CN#0,1,2,3,4,5,6,7,4,5,6,7, 4,5,6,7,0,0|<CR><LF>
+// Die ersten 8 Zahlen sind die Kanalnumern der Messkanaele, die naechste vier sind die Schaltkanaele
+// die naechsten beiden sind Autorange
+//--------------------------------------------------------------------------
+int SwitchPumpeOn(char *Line)
+{
+    int Start, Len,i;
+    
+    Start = 0;
+    Len = strlen(Line);
+
+    IrComp.dbAOut[0] = atof(Line+Start);
+    CalcDa(IrComp.dbAOut[0], 0);
+   	SwR0 = true;
+   	MVars.m_fSendStatus = true;
+	return(true);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/EcmTel.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,36 @@
+/*
+-------------------------------------------------------------------------------
+Programm Name: EcmTel.h
+Version:       1.0
+Sprache:       C
+Compiler:      MBED
+Autor:         PS
+Copyright:     PS
+               
+
+Funktion:      Externdeklarationen f�r die EcmTel
+Aenderungen:
+2016-06-29     
+-------------------------------------------------------------------------------
+*/
+
+#define ANZ_TEL_CODE    11          // 2019-08-23: PS: auf 77, alle zusammengefasst
+
+
+extern void CalcSendAnzWerte();
+extern int CompareTelCode(char *Line);
+
+
+extern int DecodeChannel(char *Line);
+extern int DecodeContact(char *Line);
+extern int DecodeFreigabe(char *Line);  
+extern int DecodeSetWd(char *Line);
+extern int DecodeAnalogValue(char *Line);
+extern int DecodeIniCode(char *Line);
+extern int SendIniCode(char *Line);
+extern int SendDevFile(char *Line);
+extern int GetDevFile(char *Line);
+extern int RequestDummy(char *Line);
+extern int SwitchPumpeOn(char *Line);
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/FT_DataTypes.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,71 @@
+/* mbed Library for FTDI FT800  Enbedded Video Engine "EVE"
+ * based on Original Code Sample from FTDI 
+ * ported to mbed by Peter Drescher, DC2PD 2014
+ * Released under the MIT License: http://mbed.org/license/mit */
+
+#ifndef _FT_DATATYPES_H_
+#define _FT_DATATYPES_H_
+
+
+#define FT_FALSE           (0)
+#define FT_TRUE            (1)
+
+typedef char ft_char8_t;
+typedef signed char ft_schar8_t;
+typedef unsigned char ft_uchar8_t;
+typedef ft_uchar8_t ft_uint8_t;
+typedef short  ft_int16_t;
+typedef unsigned short ft_uint16_t;
+typedef unsigned int ft_uint32_t;
+typedef int ft_int32_t;
+typedef void ft_void_t;
+typedef long long ft_int64_t;
+typedef unsigned long long ft_uint64_t;
+typedef float ft_float_t;
+typedef double ft_double_t;
+typedef char ft_bool_t;
+
+#define FT_BYTE_SIZE (1)
+#define FT_SHORT_SIZE (2)
+#define FT_WORD_SIZE (4)
+#define FT_DWORD_SIZE (8)
+
+#define FT_NUMBITS_IN_BYTE (1*8)
+#define FT_NUMBITS_IN_SHORT (2*8)
+#define FT_NUMBITS_IN_WORD (4*8)
+#define FT_NUMBITS_IN_DWORD (8*8)
+
+#define ft_prog_uchar8_t  ft_uchar8_t
+#define ft_prog_char8_t   ft_char8_t
+#define ft_prog_uint16_t  ft_uint16_t
+
+#define ft_random(x)		(rand() % (x))
+
+#define ft_pgm_read_byte_near(x)   (*(x))
+#define ft_pgm_read_byte(x)        (*(x))
+
+#define ft_strcpy_P     strcpy
+#define ft_strlen_P     strlen
+
+#define FT_DBGPRINT(x)  printf(x)
+#define FT_PROGMEM  const
+
+#define ft_pgm_read_byte_near(x)   (*(x))
+#define ft_pgm_read_byte(x)        (*(x))
+
+#define ft_pgm_read_word(addr)   (*(ft_int16_t*)(addr))
+
+#endif /*_FT_DATATYPES_H_*/
+
+
+/* Nothing beyond this*/
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/Globals.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,298 @@
+/*-------------------------------------------------------------------------------
+Programm Name: Globals.C
+Version:       1.0
+Sprache:       C
+Compiler:      CrossStudio Ver. 2.0
+Autor:         PS
+Copyright:     PS
+
+Funktion:      Globale Variablen
+
+28.10.2012: 
+
+Memo der Registerzuordnung am Beispiel des PTD 
+----------------------------------------------
+#define GPIOD_PDOR                               GPIO_PDOR_REG(PTD)
+#define GPIOD_PSOR                               GPIO_PSOR_REG(PTD)
+#define GPIOD_PCOR                               GPIO_PCOR_REG(PTD)
+#define GPIOD_PTOR                               GPIO_PTOR_REG(PTD)
+#define GPIOD_PDIR                               GPIO_PDIR_REG(PTD)
+#define GPIOD_PDDR                               GPIO_PDDR_REG(PTD)
+
+** GPIO - Register Layout Typedef 
+typedef struct {
+  __IO uint32_t PDOR;                              **< Port Data Output Register, offset: 0x0 
+  __O  uint32_t PSOR;                              **< Port Set Output Register, offset: 0x4 
+  __O  uint32_t PCOR;                              **< Port Clear Output Register, offset: 0x8 
+  __O  uint32_t PTOR;                              **< Port Toggle Output Register, offset: 0xC 
+  __I  uint32_t PDIR;                              **< Port Data Input Register, offset: 0x10 
+  __IO uint32_t PDDR;                              **< Port Data Direction Register, offset: 0x14
+} GPIO_Type, *GPIO_MemMapPtr;
+
+*/
+
+/*-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+
+// LED's 
+DigitalOut LedRed(LED_RED);         // PTB22
+DigitalOut LedGreen(LED_GREEN);     // PTE26
+DigitalOut LedBlue(LED_BLUE);       // PTB21
+
+// I/O's für die Messbereichsumschaltung
+
+
+
+// I/O's für den D/A Wandler
+// Aenderungen fuer REV-D, PTC16 und PTC17 werden nicht mehr benutzt
+// Aenderungen treffen auf den D/A Wandler zu
+// I/O's fuer D/A Wandler 
+DigitalOut DacSck(PTB19);
+DigitalOut DacMosi(PTB18);
+DigitalOut DacCs(PTC1);
+
+// DIO Globals
+
+DigitalOut SwR1(PTD2);
+DigitalOut SwR2(PTD3);
+DigitalOut SwR3(PTE25);
+DigitalOut SwR0(PTE24);
+
+
+
+// Variablen, die in Interruptroutinen verwendet werden
+int g_fDoDioReInit;
+
+//------------------------------------------------------
+
+
+
+
+double m_dbKehrWert;
+
+
+uint8_t g_u8AdcStatus[2];
+uint8_t g_u8ChnStatus[2][8];
+
+int nCounter[2];
+int m_nId, m_nCounter;
+UINT8 fARead[8], fSendData;
+unsigned long AdTemp[8];
+long m_lMittelCount;
+int m_fIdSend;
+int MessTimer;
+int nSumCount;
+
+UINT8 g_ReadReg[8];
+
+bool m_fChangeMittelValue;
+bool m_fFallBack;
+int nFallBackCounter;
+
+bool g_fSequenzMessung;
+
+
+/*-------------------------------------------------------------------------------
+Variablen für zeitverzögerte Funktionen
+-------------------------------------------------------------------------------*/
+int g_nDelayCounter;
+int g_nCntSpzFktSwitchIRange;
+int g_nCntSpzFktSwitchNoiseGain;
+int g_nCntSpzClearDDS;
+int g_nCntSpzSwitchMosFet;
+
+
+bool g_fSpzFktSwitchNoiseGain;
+bool g_fSpzFktSetMosFet;
+bool g_fSpzFktClearDDS;
+
+bool g_fCheckSpecial;
+int g_nEntPrellCounter;
+
+
+
+/*-------------------------------------------------------------------------------
+Variablen für die IR-Kompensation
+-------------------------------------------------------------------------------*/
+IR_COMP IrComp;
+
+
+
+/*-------------------------------------------------------------------------------
+Variablen für die SPI Ausgabemasken
+-------------------------------------------------------------------------------*/
+
+
+
+
+
+/*-------------------------------------------------------------------------------
+Variablen für das Netzwerkhandling
+-------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------
+Variable für das Auslesen der SD Card und Versenden via TCP
+-------------------------------------------------------------------------------*/
+
+char FName[128];
+char DName[128];
+
+char IoLine[256];
+
+DIR *dir;
+FILE *ifs;
+
+char g_sTelEndeContinue[8];
+char g_sTelEndeFinish[8];
+bool g_fMwTransferOpen;
+char g_cFileEndCharacter[2];
+
+/*-------------------------------------------------------------------------------
+Strukturen und Pointer
+-------------------------------------------------------------------------------*/
+START_UP StartUp;
+WATCH_DOG WDog;
+MESS_VARIABLES  Mv[ANZ_POT];     // Alles für 2 mal
+MESS_VARS MVars;
+FRQ_VALUES FrqValues;
+NEW_SCAN_RATE NsRate;
+ECM_INI EcmIni;
+
+MESS_PARAMETER MPara;
+// I_RANGE IRange;
+
+//UINT32 nAnzPulsesUp[2];
+//UINT32 nAnzPulsesDown[2];
+
+//float flUpperPot;
+//float flLowerPot;
+
+
+UINT32 nScanCount[2];
+UINT16 nDispCount;
+UINT8 fSetHold;
+double LastVal[2];
+
+
+int nGenFktNr[2];  // ist local und wird nur für die Funktionsnummer verwendet
+
+uint8_t g_RCodeStartUp;        // RCode der einzelne RCodes beim Start beinhaltet 
+bool g_fTimerIsRunning;
+
+
+/*-------------------------------------------------------------------------------
+LED1 umschalten
+-------------------------------------------------------------------------------*/
+void SLed1()
+{
+    LedRed = !LedRed;
+}
+/*-------------------------------------------------------------------------------
+Alle vier LEDs ausschalten
+-------------------------------------------------------------------------------*/
+void LedsOff()
+{
+    LedRed = 0;
+    LedGreen = 0;
+    LedBlue = 0;
+}
+/*-------------------------------------------------------------------------------
+Globale Initialisierung
+-------------------------------------------------------------------------------*/
+
+int InitGlobals()
+{
+    
+//    InitCnf();
+    InitAll();  // ruft die MVars Inits auf 
+    InitAdValues();
+    
+    g_cFileEndCharacter[0] = 0x7D;
+    g_cFileEndCharacter[1] = 0x00;
+    sprintf(g_sTelEndeContinue,"%c\r\n", ETX);
+    sprintf(g_sTelEndeFinish,"}%c\r\n", ETX);
+    g_fMwTransferOpen = false;
+    
+    
+    g_nEntPrellCounter = 1000;
+
+    MVars.fSequenzMessung = false;
+    
+    MVars.nIpsDebug = false;
+
+    MVars.nCurrentPort = 0x00;
+    MVars.m_fScan = false;
+    HostIf.fStartTel = true;
+    
+    MVars.m_nSendValues = false;
+    MVars.nDestCount = 0;
+    MVars.nSendTimer = 0;    
+    MVars.nDaTimer = 0;    
+    MVars.nMittelTimer = 0;
+    MVars.m_fMeasurementFinished = false;
+    MVars.m_fFinishMeasurement = false;
+    MVars.m_fDoFinishMeasurement = false;
+    MVars.FrkValue[0] = 0.;
+    MVars.FrkValue[1] = 0.;
+    
+    g_fCheckSpecial = false;
+    g_nCntSpzSwitchMosFet = 0;
+    return(true);
+}
+
+/*-------------------------------------------------------------------------------
+Kurzer Delay
+-------------------------------------------------------------------------------*/
+void short_delay(int n)
+{
+   volatile int d;
+   for (d=0; d<n*10; d++){}
+}
+/*-------------------------------------------------------------------------------
+Funktion InitAll: Führt alle Initialisierungen durch
+-------------------------------------------------------------------------------*/
+int InitAll()
+{
+    InitMVars();
+//    InitSioVars();
+
+    return(0);
+}
+/*-------------------------------------------------------------------------------
+Funktion InitMVars: Initialisiert alle Variablen aus der MVars Strúktur
+-------------------------------------------------------------------------------*/
+int InitMVars()
+{
+    int i;
+
+    for(i=0;i<ANZ_POT;i++)
+        MVars.nMessZustand[i] = 0;
+
+    MVars.fAdReInit = false;
+    MVars.m_nSendValues = 0;
+    MVars.m_nAnzChnSend = 0;
+//    MVars.m_nStoreMwIntervall = 1;
+    MVars.SendAnzWerte = 200;
+    MVars.m_fCellSwitchOff = true;
+
+    // 1 = Messung laeuft, -1 = Messung wurde beendet,
+
+    for(i=0;i<16;i++)
+    {
+        MVars.MwChn[i] = i;
+        MVars.m_fChnValid[i] = false;
+    }
+
+    for(i=0;i<2;i++)
+        MVars.SwitchChn[i] = i+4;
+    for(i=2;i<4;i++)
+        MVars.SwitchChn[i] = i+10;
+
+    for(i=0;i<2;i++)
+    {
+        MVars.ZInfo[i] = 0;   // ist in Grundstellung
+        Mv[i].IAktInVolt = 0.;
+    }
+    return(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/Globals.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,295 @@
+/*-------------------------------------------------------------------------------
+Programm Name: Globals.H
+Version:       1.0
+Sprache:       C
+Compiler:      CrossStudio Ver. 2.0
+Autor:         PS
+Copyright:     PS
+Funktion:      Globale Variablen und externe Methoden
+
+28.10.2012: 
+
+-------------------------------------------------------------------------------*/
+/*
+Memo: Bei den ersten FRDM Modulen, die bei der Sika stehen, ist die Verdrahtung der Messkanäle so, daß die ersten vier auf dem ersten 
+Wandler sind: U=A0:0, I=A0:1, IF=A0:2, IA=A0:3, UR=A1:0 (4), IR=A1:1 (5)
+
+bei der Rev-B ist es wie bei dem LPC, d.h. die Verdrahtung ist alternieren
+U=A0:0, I=A1:0, IF=A0:1, IA=A1:1, UR=A0:2 , IR=A1:2 
+
+jetzt ist das Programm auf Rev. B eingestellt, bei Updates bei der Sika ist aufzupassen
+09.04.16
+*/
+
+
+
+// Defines
+//------------------------------------
+// #define DEBUG   1
+// #define IR_DEBUG   1  // speziell für die IR-Kompensation
+// #define SIO_DEBUG    1
+// #define SINGLE_DEBUG     1
+
+// #define TFT_DEBUG   1
+
+#define ANZ_KEY     34      // Schlüssel für die Inidatei
+
+// #define PGU_TOUCH   1
+// #define PGU_OEM_SPI   1
+
+// die beiden folgenden sind z.B. für die Hiltigeräte aber auch grundsätzlich für FRDM RevB und PguMod zusetzten
+#define FRDM_REV_D  1
+
+
+#define DEFAULT_STACK_SIZE 2048
+
+
+#define HIGH        1
+#define LOW         0
+
+#define READ_CHN    0
+#define WANDLER     0
+
+
+
+// Variable in TCPSocket.cpp im Ordner mbed-dev/features/netsocket
+// wird incrementiert, wenn ein Telegramm kommt
+
+extern double m_dbKehrWert;
+
+
+// Digital In-/ Outs
+//-----------------------------------
+// LED's 
+extern DigitalOut LedRed;         // PTB22
+extern DigitalOut LedGreen;     // PTE26
+extern DigitalOut LedBlue;       // PTB21
+
+// I/O's für die Messbereichsumschaltung
+
+
+
+// I/O's für den D/A Wandler
+extern DigitalOut DacSck;
+extern DigitalOut DacMosi;
+extern DigitalOut DacCs;
+
+// DIO Globals
+extern DigitalOut SwR1;
+extern DigitalOut SwR2;
+extern DigitalOut SwR3;
+extern DigitalOut SwR0;
+
+
+
+// Makros zum Schreiben des D/A Wandlers
+//-----------------------------------
+#define DaCsUp()        (GPIOC->PSOR |= 0x00000002)
+#define DaCsDown()      (GPIOC->PCOR |= 0x00000002)
+
+
+#define DaSckUp()       (GPIOB->PSOR |= 0x00080000)
+#define DaSckDown()     (GPIOB->PCOR |= 0x00080000)
+#define DaMosiUp()      (GPIOB->PSOR |= 0x00040000)
+#define DaMosiDown()    (GPIOB->PCOR |= 0x00040000)
+
+
+
+#define SW_REV  "1.0.02"
+
+extern int g_fDoDioReInit;
+
+
+
+//------------------------------------------------------
+
+
+
+
+
+/*-------------------------------------------------------------------------------
+Variablen für zeitverzögerte Funktionen
+-------------------------------------------------------------------------------*/
+extern int g_nDelayCounter;
+extern int g_nCntSpzFktSwitchIRange;
+extern int g_nCntSpzFktSwitchNoiseGain;
+extern int g_nCntSpzClearDDS;
+extern int g_nCntSpzSwitchMosFet;
+
+
+extern bool g_fSpzFktSwitchNoiseGain;
+extern bool g_fSpzFktSetMosFet;
+extern bool g_fSpzFktClearDDS;
+
+extern bool g_fCheckSpecial;
+extern int g_nEntPrellCounter;
+
+
+/*-------------------------------------------------------------------------------
+Variablen für die Ini-Datei
+-------------------------------------------------------------------------------*/
+extern string cfgArray[ANZ_KEY][2];
+
+
+
+/*-------------------------------------------------------------------------------
+Variablen für die IR-Kompensation
+-------------------------------------------------------------------------------*/
+extern IR_COMP IrComp;
+
+
+/*-------------------------------------------------------------------------------
+Variablen für Statustelegramm
+-------------------------------------------------------------------------------*/
+extern bool fSendStatus;
+
+
+
+/*-------------------------------------------------------------------------------
+Variablen für das Netzwerkhandling
+-------------------------------------------------------------------------------*/
+
+
+/*-------------------------------------------------------------------------------
+Variable für das Auslesen der SD Card und Versenden via TCP
+-------------------------------------------------------------------------------*/
+
+extern char FName[128];
+extern char DName[128];
+
+extern char IoLine[256];
+
+extern DIR *dir;
+extern FILE *ifs;
+
+extern char g_sTelEndeContinue[8];
+extern char g_sTelEndeFinish[8];
+extern bool g_fMwTransferOpen;
+extern char g_cFileEndCharacter[2];
+
+/*-------------------------------------------------------------------------------
+Strukturen und Pointer
+-------------------------------------------------------------------------------*/
+extern AD_VAL *AdVal;
+
+// Globale Strukturen
+extern WATCH_DOG WDog;
+extern MESS_VARIABLES  Mv[ANZ_POT];     // Alles für 2 mal
+extern MESS_VARS MVars;
+extern START_UP StartUp;
+extern FRQ_VALUES FrqValues;
+extern NEW_SCAN_RATE NsRate;
+extern ECM_INI EcmIni;
+
+extern MESS_PARAMETER MPara;
+
+// extern I_RANGE IRange;
+
+
+
+extern UINT32 nScanCount[2];
+extern UINT16 nDispCount;
+extern UINT8 fSetHold;
+extern double LastVal[2];
+
+
+extern bool m_fChangeMittelValue;
+extern bool m_fFallBack;
+extern int nFallBackCounter;
+
+
+// Globale Variablen
+extern uint8_t AdcA0V1, AdcA0V2, AdcA0V3;
+extern uint8_t AdcA1V1, AdcA1V2, AdcA1V3;
+extern uint8_t g_u8AdcStatus[2];
+extern uint8_t g_u8ChnStatus[2][8];
+
+
+
+extern int nCounter[2];
+extern int m_nId, m_nCounter;
+extern UINT8 fARead[8], fSendData;
+extern unsigned long AdTemp[8];
+extern long m_lMittelCount;
+extern int m_fIdSend;
+extern int MessTimer;
+extern int nSumCount;
+
+extern UINT8 g_ReadReg[8];
+
+extern int nGenFktNr[2];  // ist local und wird nur für die Funktionsnummer verwendet
+
+extern uint8_t g_RCodeStartUp;        // RCode der einzelne RCodes beim Start beinhaltet 
+extern bool g_fTimerIsRunning;
+
+
+// Prototypen
+// Globale Funktionen
+
+// Funktionen aus Main.c
+//------------------------------------
+extern int CheckDaAd();
+extern int CheckEthInput();
+extern int DoReInit();
+
+extern int CheckZustand();
+extern int SendIdTel();
+extern void LedsOff();
+extern int SendAnalogValues();
+extern int ReadAllAdChannels();
+extern void ChangeConversionTime();
+extern int CheckGrundZustand();
+extern int CheckRunZustand();
+extern void SendStatus(void); 
+
+extern int SendMessungStart();
+extern int SendMessungStop();
+extern void SendInfo(void); 
+extern void ReadAllChannels();
+
+
+
+
+// Funktionen aus Globals.c
+//------------------------------------
+extern int InitGlobals();
+extern void InitAdValues();
+extern void short_delay(int n);
+
+extern void SendDataDa();
+extern int InitAll();
+extern int InitMVars();
+
+// Funktionen aus EthInOut.c
+//------------------------------------
+extern int CheckForFirstConnection();
+extern int WaitForEcmWinRequest();
+extern int ReadEthTel();
+extern int CheckWait();
+extern int DisconnectClient();
+
+
+// Funktionen aus EcmTel.cpp
+//------------------------------------
+extern int CheckTel();
+extern int DecodeTel();
+extern int CloseUdFile();
+extern void CalcSendAnzWerte();
+
+// Funktionen aus Dio.cpp
+//------------------------------------
+extern int ChangeMittelValue();
+
+
+
+// Funktionen aus DaMethoden.cpp
+//------------------------------------
+extern void CalcDa(double SrcVal, UINT8 Chn);
+
+
+// Funktionen aus CalcScan.cpp
+//------------------------------------
+extern int SetStartDefault(int Nr);
+extern int SetMessungEnde();
+extern int SetStartBasics(int Nr);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/InitMain.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,163 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  InitMain.C
+Version:        1.0
+Sprache:        C++
+Compiler:       mbed
+Autor:          PS
+Copyright:      PS
+                 
+
+Funktion:       Macht alle notwendigen Initialisierungen
+04.08.2016:  Projekt: EcmComFrdm
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+
+// Globale Variablen fuer Main
+
+// int g_nMainCounter; 
+bool m_fAutoStart;
+
+// bool m_fDoCheckIRange;
+
+// PwmOut PwmTest(PTA0);
+bool m_fTimeAlternate;  // wird fuer die Anfrage der Zeit in Sekunden genommen
+bool g_fEnableTftIrq;   // wird zur Bearbeitung de TFT Irq's genommen
+bool g_fOnDuringInit;
+
+/*-------------------------------------------------------------------------------
+Main Init.  
+-------------------------------------------------------------------------------*/
+int InitMain() 
+{
+
+    m_fAutoStart = false;
+	g_fDoDioReInit = false;
+	m_fTimeAlternate = false;
+	g_fOnDuringInit = true;
+
+#ifdef TOUCH_DISPLAY
+//	g_fEnableTftIrq = false;
+    g_iMethCCActive = false;
+   	g_fTimerIsRunning = false;
+#endif	
+    EcmIni.nAnzChannel = 8;
+    MVars.nAnzPot = 1;      // nur 1 Pot. 
+	
+	InitInterface();
+	printf("Init Interface done.\n");
+	
+    SetTimerInterrupt(1);
+	printf("Timer started.\n");
+    if (InitGlobals() == true)	// noch kein Zugriff auf die A/D Wandler
+    {
+		printf("Global Values initialized.\n");
+      	g_RCodeStartUp |= 0x01;
+    }
+    else
+		printf("Error on init Global Values. \n");
+      	
+    if (InitSdFileSystem() == true)    
+    {
+		printf("SD-Filesystem initialized.\n");
+      	g_RCodeStartUp |= 0x02;
+    }
+    else
+		printf("Error on init SD-Filesystem. \n");
+    
+    if (OpenIni() == true)
+    {
+		printf("IniFile read sucessful.\n");
+       	g_RCodeStartUp |= 0x04;
+    }
+    else
+		printf("Error on open Ini-File. \n");
+	
+	OpenDevIni();
+	printf("DevIniFile read sucessful.\n");
+    
+    if (InitDio() == true)
+    {
+		printf("Digital I/O initialized.\n");
+    	g_RCodeStartUp |= 0x08;
+    }
+    else
+		printf("Error on init Digital I/O. \n");
+    
+#ifndef PGU_RPA    
+    if (InitMethGlobals() == true)	//  
+    {
+		printf("Global Method values initialized.\n");
+       	g_RCodeStartUp |= 0x10;
+    }
+    else
+		printf("Error on init Global Method values. \n");
+
+    InitAutoStart();   // Autostartdatei lesen 
+	printf("Auto-Start initialized.\n");
+#endif
+#ifdef TOUCH_DISPLAY
+    if (InitTftGlobals() == true)	//  2016-03-31  UFa; Initialisierung der TftGlobals Variablen
+       	g_RCodeStartUp |= 0x18;
+#endif
+#ifndef PGU_RPA    
+    if (InitFkt() == true)   
+    {
+		printf("Scanner initialized.\n");
+      	g_RCodeStartUp |= 0x20;
+    }
+    else
+		printf("Error on init Scanner. \n");
+#endif            
+    if (InitDac() == true)
+    {
+		printf("DAC initialized.\n");
+       	g_RCodeStartUp |= 0x40;
+    }
+    else
+		printf("Error on init DAC. \n");
+    
+#ifdef ADC_24BIT    
+    if (InitSpiAd() == true) // Setzt den Mode vom ADC Irq
+    {
+		printf("24 Bit ADC  initialized.\n");
+       	g_RCodeStartUp |= 0x80;
+    }
+    else
+		printf("Error on init 24 Bit ADC. \n");
+    
+#endif		
+//    SwitchRangesOnStart();  //UFa 2017-05-23 -- > IRange.RangeValue[0] wird uad 0 gesetzt;
+    
+#ifdef TOUCH_DISPLAY    
+	DefineTouchInt();		//  2016-03-07  UFa:  Touch Interrupts Definition
+	
+ 	DispInit2Screen();
+   
+
+	TftDecodeChannel(1);  	 //  Initialer Aufruf, da Para = 1 
+
+    TftDisp.fMeasureRunning	= false;	// initial, es l�uft keine aktive Messung 	
+    TftDisp.fPguTouchActive = true;		// initial, PguTouch ist via TFT bedienbar
+       
+    g_ToCallScreen = 0;
+ 	DispMainScreenStatic();  
+  	DispMainScreenDynamic();    
+#endif
+
+#ifdef ADC_24BIT    
+    AdReset();
+    InitSpiAd();  // definiert die Irq's, der CallBack ist aber noch nicht scharf
+    Ad7739Init(0);		// macht den kompletten Registerinit der ADC's
+    printf("Nach Ad7739 Init\n");
+
+	#ifdef PGU_STAND_ALONE
+	    SetAdIrq();		// macht den Interrupt scharf
+    	DoAdStart();
+	#endif    	
+#endif	
+
+	g_fOnDuringInit = false;
+    return(true);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/InitMain.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,31 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  InitMain.h
+Version:        1.0
+Sprache:        C++
+Compiler:       mbed
+Autor:          PS
+Copyright:      PS
+                 
+
+Funktion:       Macht alle notwendigen Initialisierungen
+04.08.2016:  Projekt: EcmComFrdm
+-------------------------------------------------------------------------------*/
+
+// Globale Variablen fuer Main
+
+// extern int g_nMainCounter; 
+extern bool m_fAutoStart;
+extern bool g_fEnableTftIrq; // wird zur Bearbeitung de TFT Irq's genommen
+extern bool m_fTimeAlternate;  // wird fuer die Anfrage der Zeit in Sekunden genommen
+extern bool g_fOnDuringInit;
+
+
+// Methoden fuer Main
+extern int InitMain();
+extern int CheckCommInterface();
+extern int CheckEcmWinConnect();
+extern int CheckAutoStart();
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/LoopTimer.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,128 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  LoopTimer.cpp
+Version:        1.0
+Sprache:        C++
+Compiler:       mbed
+Autor:          PS
+Copyright:      PS
+                 
+
+Funktion:       Main Funktionen
+04.08.2016:  Projekt: RpaAnalyse
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+
+
+Ticker flipper; // Timerinterrupt 
+// Variablen, die in Interruptroutinen verwendet werden
+volatile int nMyTimer;
+int ZustandsTimer;
+int g_nSendDisableTimer;
+int g_nTftTimer;  // wird vor allem fuer das Abfragen der Uhr genommen
+
+
+/*-------------------------------------------------------------------------------
+Interrupt Funktion. Wird auf 1ms gesetzt
+-------------------------------------------------------------------------------*/
+void flip() 
+{
+    nMyTimer++;
+}
+/*-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------*/
+void DetachMyTicker() 
+{
+    flipper.detach();
+    g_fTimerIsRunning = false;
+}
+/*-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------*/
+void AttachMyTicker() 
+{
+#ifdef SEND_DEBUG_TO_HOST    
+    sprintf(HostIf.strTempBuf, "%c#DG#Attach Ticker%c",STX, ETX);
+    SendTelToHost(false, false, false);
+#endif
+    
+    flipper.attach_us(&flip, 1000); // setup flipper to call flip after 1000 us
+    nMyTimer = 0;
+    MVars.nMittelTimer = 0;
+    MVars.nSendTimer = 0;
+    g_fTimerIsRunning = true;
+    g_nSendDisableTimer = 0;
+}
+/*-------------------------------------------------------------------------------
+SetTimerInterrupt:
+-------------------------------------------------------------------------------*/
+void SetTimerInterrupt(int Flag)
+{
+    if(Flag == 0)   // ausschalten
+    {
+        if(g_fTimerIsRunning == true)
+        {
+            DetachMyTicker();
+        }
+    }
+    else
+    {
+        if(g_fTimerIsRunning == false)
+        {
+            AttachMyTicker();
+        }
+    }
+}
+/*-------------------------------------------------------------------------------
+    Funktion CheckTimerHandlingAndScanner: prüft ob Messdaten reinkommen
+-------------------------------------------------------------------------------*/
+int CheckTimerHandlingAndScanner()
+{
+    MVars.nMittelTimer++;
+    MVars.nSendTimer++;
+//     nScreenSaverTimer++;    //  2017-02-02  UFa: Timer ScreenSaver
+    ZustandsTimer++;
+    nMyTimer--;
+    g_nTftTimer++;
+    if(g_nSendDisableTimer > 0)     g_nSendDisableTimer--;
+
+    if(MVars.nSendTimer >=500)
+    { 
+//        g_fDoCheckIRange = true;
+        MVars.nSendTimer = 0;
+    }
+         
+// Der SAetGenValues wäre für RPA nicht notwendig, wenn m_fScan aber auf false 
+// bleibt, dann sollte das kein Problem sein  
+#ifndef PGU_RPA           
+    if(MVars.m_fScan == true) // wenn true, dann wird gescannt
+        SetGenValues();
+#endif    
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+    Funktion RequestDateTime
+-------------------------------------------------------------------------------*/
+int RequestDateTime()
+{
+#ifdef USE_RTC
+// Uhrzeit    //UFa Timer
+    if(m_fTimeAlternate == true)
+    {
+        if(g_fDisableTimeRead == false)
+        {
+            seconds = time(NULL);
+            MyTm = localtime(&seconds);         // seconds = time(NULL); vorher
+            sprintf(DtTime.cTimeBuffer,"%02d:%02d:%02d", MyTm->tm_hour, MyTm->tm_min,MyTm->tm_sec);
+            sprintf(DtTime.cDateBuffer,"%04d:%02d:%02d", MyTm->tm_year + 1900, MyTm->tm_mon +1 , MyTm->tm_mday);
+            m_fTimeAlternate = false;
+        }
+    }
+    else
+        m_fTimeAlternate = true;
+#endif        
+    return(true);
+}
+ 
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/LoopTimer.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,24 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  LoopTimer.h
+Version:        1.0
+Sprache:        C++
+Compiler:       mbed
+Autor:          PS
+Copyright:      PS
+                 
+
+Funktion:       Main Funktionen
+04.08.2016:  Projekt: RpaAnalyse
+-------------------------------------------------------------------------------*/
+// Variablen, die in Interruptroutinen verwendet werden
+extern volatile int nMyTimer;
+extern int ZustandsTimer;
+extern int g_nSendDisableTimer;
+extern int g_nTftTimer;
+
+extern void DetachMyTicker();
+extern void AttachMyTicker();
+extern void SetTimerInterrupt(int Flag);
+
+extern int CheckTimerHandlingAndScanner();
+extern int RequestDateTime();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/OpenDevId.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,519 @@
+/*
+-------------------------------------------------------------------------------
+Programm Name: OpenDevId.CPP
+Version:       1.0
+Sprache:       C
+Compiler:      MBED
+Autor:         PS
+Copyright:     PS
+               
+
+Funktion:      Liest die ID-Datei und überträft diese an EcmWin. Damit kann 
+                EcmWin den Gerätetyp eintragen. Wenn nicht vorhanden, dann kommt
+                ein NAK
+-------------------------------------------------------------------------------
+*/
+/*
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+*/
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+const char *DevIdKey[] = {"DEV_INDEX",    "POT_REV",      "POT_VAR",      "SCAN_VAR",     "POT_CHN",      "CURR_CHN",     "AMP_CHN",      "AMP_ACTIVE", "SW_IZ",      "SW_PG", \
+                    "POT_INVERTED", "O_POT_INV",    "O_GAL_INV",    "GAL_VAR_VAL",  "U_N_CHN",      "I_N_CHN",      "I_N_ACTIVE",   "LPC_CAL_C0", "LPC_CAL_C1", "LPC_CAL_C2",\
+                    "LPC_CAL_C3",   "LPC_CAL_C4",   "LPC_CAL_C5",   "LPC_CAL_C6",   "LPC_CAL_C7",   "INST_BOARD",   "S_RATE_ID",    "AV_VALUE" };
+
+
+DEV_INI DevIni;
+
+int (*DevKeyPtr[])(char *) =  {DecDevIndex, DecPotRev, DecPotVar, DecScanVar,DecPotChn, DecCurrChn, DecAmpChn, DecAmpActive, DecSwIz, DecSwPg, \
+                            DecPotInverted, DecOPotInv, DecOGalInv,DecGalVarVal, DecUnChn, DecInChn, DecInActive, DecLpcCalC0, DecLpcCalC1, \
+                            DecLpcCalC2, DecLpcCalC3, DecLpcCalC4,DecLpcCalC5, DecLpcCalC6, DecLpcCalC7, DecInstBoard, DecSRateId, DecAvValue };
+
+
+
+/*-------------------------------------------------------------------------------
+SetIniKey: Beschreiben der Felder mit den INiKeys
+-------------------------------------------------------------------------------*/
+void SetDevIdKey()
+{
+    int i;
+    
+    i = 0;
+
+}
+
+/*-------------------------------------------------------------------------------
+Datei öffnen
+-------------------------------------------------------------------------------*/
+int OpenDevIni()
+{
+    int i,j, Ret;
+    char strKeyCode[64];
+    char strValue[64];
+
+    InitDevIni();        
+        
+//    return;
+
+    if(g_SdInitSuccess == false)    // wenn SD Karte nicht vorhanden, retour
+    {
+        sprintf(HostIf.strErrorBuf,"%c#ER#SD-Card is not acessable. %c\r\n", STX, ETX); // 
+        HostIf.fSendError = true;
+        if(g_fOnDuringInit)
+            printf("%s",HostIf.strErrorBuf); 
+
+        return(false);
+    }
+    
+    Ret = clSdCard.OpenFile(FileNames.DevIdFileName, FileNames.FileReadMode);
+    
+    if(Ret == false)
+    {
+        WriteDevFile(); // Defaultdatei erzeugen
+        sprintf(HostIf.strErrorBuf,"%c#ER#Error on open IniFile. Default created. %c\r\n", STX, ETX); // 
+        HostIf.fSendError = true;
+        if(g_fOnDuringInit)
+            printf("%s",HostIf.strErrorBuf); 
+        return(false);  // öffnen der Inidatei hat nicht geklappt
+    }
+        
+    do
+    {
+        Ret = clSdCard.ReadLine(strFileRwBuf, FILE_RW_BUF_LEN);
+        if(Ret > 0) // es sind Zeichen im Puffer
+        {
+            for(i=0;i<Ret;i++)
+            {
+                if( (strFileRwBuf[i] == 0x0A) || (strFileRwBuf[i] == 0x0D))
+                {
+                    strFileRwBuf[i] = 0x00;
+                    i = Ret;
+                }
+                else if(strFileRwBuf[i] == 0x2C)    // Komma
+                    strFileRwBuf[i] = 0x2E; // in Punkt 
+            }
+            i = 0;
+            while( (i < 64) && (strFileRwBuf[i] != '=') )
+            {
+                strKeyCode[i] = strFileRwBuf[i];
+                i++;
+            }
+            strKeyCode[i] = 0x00;
+            i++;
+            while( (strFileRwBuf[i] == ' ') && (i < 100) )
+                i++;
+            strcpy(strValue,&strFileRwBuf[i]);
+            
+            //printf("KeyCode: %s   Value: %s\n", strKeyCode, strValue);
+            for(j = 0;j< ANZ_DEV_KEY;j++)
+            {
+                if(strcmp(strKeyCode, DevIdKey[j]) == 0) // die Strings stimmen überein
+                {
+                     (*DevKeyPtr[j])((char *)(strValue));  
+                     j = ANZ_DEV_KEY;  
+                }    
+            }
+        } 
+    }        
+    while(Ret > 0);
+    clSdCard.CloseFile();
+    EcmIni.fCfgExists = true;
+//    EcmIni.fCalRange = true;
+
+    return(true);
+}
+
+//--------------------------------------------------------------------------
+// DecDevIndex: Decodieren 
+//--------------------------------------------------------------------------
+int DecDevIndex(char *Line)
+{   DevIni.nDevIndex = atoi(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// DecPotRev: Decodieren 
+//--------------------------------------------------------------------------
+int DecPotRev(char *Line)
+{   DevIni.nPotRev = atoi(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// DecPotVar: Decodieren 
+//--------------------------------------------------------------------------
+int DecPotVar(char *Line)
+{   DevIni.dbPotVar = atof(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// DecScanVar: Decodieren 
+//--------------------------------------------------------------------------
+int DecScanVar(char *Line)
+{   DevIni.dbScanVar = atof(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// DecPotChn: Decodieren 
+//--------------------------------------------------------------------------
+int DecPotChn(char *Line)
+{   DevIni.nPotChn = atoi(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// DecCurrChn: Decodieren 
+//--------------------------------------------------------------------------
+int DecCurrChn(char *Line)
+{   DevIni.nCurrChn = atoi(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// DecAmpChn: Decodieren 
+//--------------------------------------------------------------------------
+int DecAmpChn(char *Line)
+{   DevIni.nAmpChn = atoi(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// DecAmpActive: Decodieren 
+//--------------------------------------------------------------------------
+int DecAmpActive(char *Line)
+{   DevIni.nAmpActive = atoi(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// DecSwIz: Decodieren 
+//--------------------------------------------------------------------------
+int DecSwIz(char *Line)
+{   DevIni.nSwIz = atoi(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// DecSwPg: Decodieren 
+//--------------------------------------------------------------------------
+int DecSwPg(char *Line)
+{   DevIni.nSwPotGal = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecPotInverted: Decodieren 
+//--------------------------------------------------------------------------
+int DecPotInverted(char *Line)
+{   DevIni.nPotInverted = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecOPotInv: Decodieren 
+//--------------------------------------------------------------------------
+int DecOPotInv(char *Line)
+{   DevIni.nOPotInv = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecOGalInv: Decodieren 
+//--------------------------------------------------------------------------
+int DecOGalInv(char *Line)
+{   DevIni.nOGalInv = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecGalVarVal: Decodieren 
+//--------------------------------------------------------------------------
+int DecGalVarVal(char *Line)
+{   DevIni.dbGalVar = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecUnChn: Decodieren 
+//--------------------------------------------------------------------------
+int DecUnChn(char *Line)
+{   DevIni.nUnChn = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecInChn: Decodieren 
+//--------------------------------------------------------------------------
+int DecInChn(char *Line)
+{   DevIni.nInChn  = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecInActive: Decodieren 
+//--------------------------------------------------------------------------
+int DecInActive(char *Line)
+{   DevIni.nNoiseActive = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecLpcCalC0: Decodieren 
+//--------------------------------------------------------------------------
+int DecLpcCalC0(char *Line)
+{   DevIni.dbLpcCal0 = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecLpcCalC1: Decodieren 
+//--------------------------------------------------------------------------
+int DecLpcCalC1(char *Line)
+{   DevIni.dbLpcCal1 = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecLpcCalC2: Decodieren 
+//--------------------------------------------------------------------------
+int DecLpcCalC2(char *Line)
+{   DevIni.dbLpcCal2 = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecLpcCalC3: Decodieren 
+//--------------------------------------------------------------------------
+int DecLpcCalC3(char *Line)
+{   DevIni.dbLpcCal3 = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecLpcCalC4: Decodieren 
+//--------------------------------------------------------------------------
+int DecLpcCalC4(char *Line)
+{   DevIni.dbLpcCal4 = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecLpcCalC5: Decodieren 
+//--------------------------------------------------------------------------
+int DecLpcCalC5(char *Line)
+{   DevIni.dbLpcCal5 = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecLpcCalC6: Decodieren 
+//--------------------------------------------------------------------------
+int DecLpcCalC6(char *Line)
+{   DevIni.dbLpcCal6 = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecLpcCalC7: Decodieren 
+//--------------------------------------------------------------------------
+int DecLpcCalC7(char *Line)
+{   DevIni.dbLpcCal7 = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecInstBoard: Decodieren 
+//--------------------------------------------------------------------------
+int DecInstBoard(char *Line)
+{   DevIni.nInstBoard = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecSRateId: Decodieren 
+//--------------------------------------------------------------------------
+int DecSRateId(char *Line)
+{   DevIni.nSRateIndex = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// DecAvValue: Decodieren 
+//--------------------------------------------------------------------------
+int DecAvValue(char *Line)
+{   DevIni.nAvValue = atoi(Line);   return(true);   }
+
+/*-------------------------------------------------------------------------------
+Struktur Initialisieren
+-------------------------------------------------------------------------------*/
+void InitDevIni()
+{
+    
+    DevIni.nDevIndex = 50;        // Geräteindex
+    DevIni.nPotRev = 1;           // Hardware Rev
+    DevIni.dbPotVar = 1.0;        // Variabler Faktor für das Anzeigepotential
+    DevIni.dbScanVar = 1.0;       // Variabler Faktor für das Scannerpotential
+    DevIni.nPotChn = 0;           // Messkanal Potential
+    DevIni.nCurrChn = 1;          // Messkanal Strom
+    DevIni.nAmpChn = 3;           // Messkanal Verstärker
+    DevIni.nAmpActive = 0;        // Stromverstärker aktiv
+    DevIni.nSwIz = 4;             // Schalter OCP/Izelle
+    DevIni.nSwPotGal = 5;         // Schalter Pot/Gal
+    DevIni.nPotInverted = 1;      // Potentialanzeige invertiert
+    DevIni.nOPotInv = 1;          // Scanner Potential invertiert
+    DevIni.nOGalInv = 1;          // Scanner Galvanostat invertiert
+    DevIni.dbGalVar = 1.0;        // Variabler Faktor für Galvanostat
+    DevIni.nUnChn = 4;            // Messkanal UNoise
+    DevIni.nInChn = 5;            // Messkanal INoise
+    DevIni.nNoiseActive = 0;      // Noisemessung aktiv
+    DevIni.dbLpcCal0 = 1.0;       // 1. Faktor für LpcKalibrierung
+    DevIni.dbLpcCal1 = 1.0;       // 2. Faktor für LpcKalibrierung
+    DevIni.dbLpcCal2 = 1.0;       // 3. Faktor für LpcKalibrierung
+    DevIni.dbLpcCal3 = 1.0;       // 4. Faktor für LpcKalibrierung
+    DevIni.dbLpcCal4 = 1.0;       // 5. Faktor für LpcKalibrierung
+    DevIni.dbLpcCal5 = 1.0;       // 6. Faktor für LpcKalibrierung
+    DevIni.dbLpcCal6 = 1.0;       // 7. Faktor für LpcKalibrierung
+    DevIni.dbLpcCal7 = 1.0;       // 8. Faktor für LpcKalibrierung
+    DevIni.nInstBoard = 4;        // Installierte Messkarte
+    DevIni.nSRateIndex = 3;       // Index Samplerate
+    DevIni.nAvValue = 5;          // Average Value    
+    
+}
+
+//--------------------------------------------------------------------------
+//  #DI#  DevID-Request, Host fragt die Geräteeinstellungen ab
+//--------------------------------------------------------------------------
+int SendDevFile(char *Line)
+{
+
+    OpenDevIni();                  
+   
+    
+    sprintf(HostIf.strTempBuf, "%c#DI#%s=%d#",STX, DevIdKey[0],DevIni.nDevIndex);
+    sprintf(STemp, "%s=%d#", DevIdKey[1],DevIni.nPotRev);
+    strcat(HostIf.strTempBuf, STemp);
+    
+    sprintf(STemp, "%s=%f#", DevIdKey[2],DevIni.dbPotVar);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%f#", DevIdKey[3],DevIni.dbScanVar);
+    strcat(HostIf.strTempBuf, STemp);
+    
+    sprintf(STemp, "%s=%d#", DevIdKey[4],DevIni.nPotChn);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[5],DevIni.nCurrChn);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[6],DevIni.nAmpChn);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[7],DevIni.nAmpActive);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[8],DevIni.nSwIz);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[9],DevIni.nSwPotGal);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[10],DevIni.nPotInverted);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[11],DevIni.nOPotInv);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[12],DevIni.nOGalInv);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%f#", DevIdKey[13],DevIni.dbGalVar);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[14],DevIni.nUnChn);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[15],DevIni.nInChn);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[16],DevIni.nNoiseActive);
+    strcat(HostIf.strTempBuf, STemp);
+
+    sprintf(STemp, "%s=%f#", DevIdKey[17],DevIni.dbLpcCal0);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%f#", DevIdKey[18],DevIni.dbLpcCal1);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%f#", DevIdKey[19],DevIni.dbLpcCal2);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%f#", DevIdKey[20],DevIni.dbLpcCal3);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%f#", DevIdKey[21],DevIni.dbLpcCal4);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%f#", DevIdKey[22],DevIni.dbLpcCal5);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%f#", DevIdKey[23],DevIni.dbLpcCal6);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%f#", DevIdKey[24],DevIni.dbLpcCal7);
+    strcat(HostIf.strTempBuf, STemp);
+
+    sprintf(STemp, "%s=%d#", DevIdKey[25],DevIni.nInstBoard);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#", DevIdKey[26],DevIni.nSRateIndex);
+    strcat(HostIf.strTempBuf, STemp);
+    sprintf(STemp, "%s=%d#%c\r\n", DevIdKey[27],DevIni.nAvValue, ETX);
+    strcat(HostIf.strTempBuf, STemp);
+
+    SendIdTel();
+
+    return(true);
+}
+
+//--------------------------------------------------------------------------
+//  #GD#  DevID-Request, Host sendet die Geräteeinstellungen 
+//--------------------------------------------------------------------------
+int GetDevFile(char *Line)
+{
+
+    clSdCard.WriteFile(FileNames.DevIdFileName, Line);
+    OpenDevIni();
+    return(true);
+
+}
+/*-------------------------------------------------------------------------------
+Parameter Schreiben
+-------------------------------------------------------------------------------*/
+int WriteDevFile()
+{
+    int Ret,i;
+
+    if(g_SdInitSuccess == false)    // wenn SD Karte nicht vorhanden, retour
+    {
+        return(false);
+    }
+    
+    Ret = clSdCard.OpenFile(FileNames.DevIdFileName, FileNames.FileWriteMode);
+    
+    if(Ret == false)
+        return(false);  // öffnen der Datei hat nicht geklappt
+
+
+    i = 0;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nDevIndex);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nPotRev);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbPotVar);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbScanVar);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nPotChn);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nCurrChn);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nAmpChn);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nAmpActive);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nSwIz);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nSwPotGal);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nPotInverted);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nOPotInv);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nOGalInv);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbGalVar);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nUnChn);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nInChn);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nNoiseActive);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbLpcCal0);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbLpcCal1);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbLpcCal2);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbLpcCal3);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbLpcCal4);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbLpcCal5);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbLpcCal6);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n",DevIdKey[i],DevIni.dbLpcCal7);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nInstBoard);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nSRateIndex);
+    clSdCard.WriteLine();
+    i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n",DevIdKey[i],DevIni.nAvValue);
+    clSdCard.WriteLine();
+    i++;
+
+    clSdCard.CloseFile();
+    return(true);
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/OpenDevId.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,94 @@
+/*-------------------------------------------------------------------------------
+Programm Name: OpenDevId.h
+Version:       1.0
+Sprache:       C
+Compiler:      MBED
+Autor:         PS
+Copyright:     PS
+               
+
+Funktion:      Liest die ID-Datei und überträft diese an EcmWin. Damit kann 
+                EcmWin den Gerätetyp eintragen. Wenn nicht vorhanden, dann kommt
+                ein NAK
+-------------------------------------------------------------------------------
+*/
+
+#define ANZ_DEV_KEY     28
+
+
+/*===========================================================================
+Die nachfolgende Struktur dient zur Speicherung der Dev-Daten, die von EcmWin 
+gelesen werden
+===========================================================================*/
+struct strDevIni
+{
+    int     nDevIndex;          // Geräteindex
+    int     nPotRev;            // Hardware Rev
+    double  dbPotVar;           // Variabler Faktor für das Anzeigepotential
+    double  dbScanVar;          // Variabler Faktor für das Scannerpotential
+    int     nPotChn;            // Messkanal Potential
+    int     nCurrChn;           // Messkanal Strom
+    int     nAmpChn;            // Messkanal Verstärker
+    int     nAmpActive;         // Stromverstärker aktiv
+    int     nSwIz;              // Schalter OCP/Izelle
+    int     nSwPotGal;          // Schalter Pot/Gal
+    int     nPotInverted;       // Potentialanzeige invertiert
+    int     nOPotInv;           // Scanner Potential invertiert
+    int     nOGalInv;           // Scanner Galvanostat invertiert
+    double  dbGalVar;           // Variabler Faktor für Galvanostat
+    int     nUnChn;             // Messkanal UNoise
+    int     nInChn;             // Messkanal INoise
+    int     nNoiseActive;       // Noisemessung aktiv
+    double  dbLpcCal0;          // 1. Faktor für LpcKalibrierung
+    double  dbLpcCal1;          // 2. Faktor für LpcKalibrierung
+    double  dbLpcCal2;          // 3. Faktor für LpcKalibrierung
+    double  dbLpcCal3;          // 4. Faktor für LpcKalibrierung
+    double  dbLpcCal4;          // 5. Faktor für LpcKalibrierung
+    double  dbLpcCal5;          // 6. Faktor für LpcKalibrierung
+    double  dbLpcCal6;          // 7. Faktor für LpcKalibrierung
+    double  dbLpcCal7;          // 8. Faktor für LpcKalibrierung
+    int     nInstBoard;        // Installierte Messkarte
+    int     nSRateIndex;       // Index Samplerate
+    int     nAvValue;           // Average Value    
+    
+};
+typedef struct strDevIni DEV_INI;
+
+
+extern DEV_INI DevIni;
+
+
+// Funktionen aus OpenDevId.cpp
+//------------------------------------
+extern int OpenDevIni();
+extern void InitDevIni();
+extern int WriteDevFile();
+
+extern int DecDevIndex(char *Line);
+extern int DecPotRev(char *Line);
+extern int DecPotVar(char *Line);
+extern int DecScanVar(char *Line);
+extern int DecPotChn(char *Line);
+extern int DecCurrChn(char *Line);
+extern int DecAmpChn(char *Line);
+extern int DecAmpActive(char *Line);
+extern int DecSwIz(char *Line);
+extern int DecSwPg(char *Line);
+extern int DecPotInverted(char *Line);
+extern int DecOPotInv(char *Line);
+extern int DecOGalInv(char *Line);
+extern int DecGalVarVal(char *Line);
+extern int DecUnChn(char *Line);
+extern int DecInChn(char *Line);
+extern int DecInActive(char *Line);
+extern int DecLpcCalC0(char *Line);
+extern int DecLpcCalC1(char *Line);
+extern int DecLpcCalC2(char *Line);
+extern int DecLpcCalC3(char *Line);
+extern int DecLpcCalC4(char *Line);
+extern int DecLpcCalC5(char *Line);
+extern int DecLpcCalC6(char *Line);
+extern int DecLpcCalC7(char *Line);
+extern int DecInstBoard(char *Line);
+extern int DecSRateId(char *Line);
+extern int DecAvValue(char *Line);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/OpenIni.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,493 @@
+/*
+-------------------------------------------------------------------------------
+Programm Name: OpenIni.CPP
+Version:       1.0
+Sprache:       C
+Compiler:      MBED
+Autor:         PS
+Copyright:     PS
+               
+
+Funktion:      Oeffnen die zusätzliche Ini-Datei. Falls nicht vorhanden,
+               Basisinitialisierung.
+-------------------------------------------------------------------------------
+*/
+/*
+-------------------------------------------------------------------------------
+Zuordnung der Konfigurationsvariablen. Folgende Informationen sollten verarbeitet
+werden: 08.01.2008
+Diese Ini-Datei soll so gestaltet sein, daß Zeilen angehängt werden können.
+Zunächst sollen folgende Inhalte aufgenommen werden:
+1. Seriennummer des Potentiostaten
+2. Lizenznummer der Software
+3. Revisionsnummer der Software
+4. Offsetkorrekturwert für die Analogausgabe
+5. Netzwerkadresse  z.B. 192.168.2.99
+
+
+-------------------------------------------------------------------------------
+*/
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+/*-------------------------------------------------------------------------------
+Variablen für die Ini-Datei
+-------------------------------------------------------------------------------*/
+
+                // 0         1           2       3       4           5           6           7           8           9               10          11
+/*char *Key[34] = {"DEV_TYP", "POT_CODE", "SER_NR", "LZ_NR", "REV_NR", "IP_ADR",  "SUB_NET", "GATEWAY", "HOST_IP", "PORT_NO", \
+"EXT_START", "SEXT_CHN_NR", "RPM_OFFSET", "RPM_SCALE", "AO_SCALE", "AO_OFFSET", "RE_INIT", "NR_OFF",
+"A0_OFFSET", "A1_OFFSET", "A2_OFFSET", "A3_OFFSET", "A4_OFFSET", "A5_OFFSET", "A6_OFFSET", "A7_OFFSET",
+"A0_SCALE", "A1_SCALE", "A2_SCALE", "A3_SCALE", "A4_SCALE", "A5_SCALE", "A6_SCALE", "A7_SCALE"
+};    // bis hier 93
+*/
+// Zeile = 50, Spalte = 16
+char IniKey[50][16];
+
+
+int posKey, posEqual, posValueEnd;
+
+int (*KeyPtr[])(char *) =  {DecDevTyp, DecPotCode, DecSerNr, DecLzNr,DecRevNr, DecIpAddr, DecSubNet, DecGateway, DecHostIp, DecPortNo, \
+                            DecExtStart, DecSextChnNr, DecRpmOffset, DecRpmScale, DecAoScale, DecAoOffset,DecReInit, DecNrOff,
+                            DecU0Offset, DecU1Offset, DecU2Offset, DecU3Offset, DecU4Offset, DecU5Offset, DecU6Offset, DecU7Offset, 
+                            DecU0Scale, DecU1Scale, DecU2Scale, DecU3Scale, DecU4Scale, DecU5Scale, DecU6Scale, DecU7Scale 
+                             };
+
+
+/*-------------------------------------------------------------------------------
+SetIniKey: Beschreiben der Felder mit den INiKeys
+-------------------------------------------------------------------------------*/
+void SetIniKey()
+{
+	int i;
+	
+	i = 0;
+	strcpy(IniKey[i++], "DEV_TYP");
+	strcpy(IniKey[i++], "POT_CODE");
+	strcpy(IniKey[i++], "SER_NR");
+	strcpy(IniKey[i++], "LZ_NR");
+	strcpy(IniKey[i++], "REV_NR");
+	strcpy(IniKey[i++], "IP_ADR");
+	strcpy(IniKey[i++],  "SUB_NET");
+	strcpy(IniKey[i++], "GATEWAY");
+	strcpy(IniKey[i++], "HOST_IP");
+	strcpy(IniKey[i++], "PORT_NO");
+	
+	strcpy(IniKey[i++], "EXT_START");
+	strcpy(IniKey[i++], "SEXT_CHN_NR");
+	strcpy(IniKey[i++], "RPM_OFFSET");
+	strcpy(IniKey[i++], "RPM_SCALE");
+	strcpy(IniKey[i++], "AO_SCALE");
+	strcpy(IniKey[i++], "AO_OFFSET");
+	strcpy(IniKey[i++], "RE_INIT");
+	strcpy(IniKey[i++], "NR_OFF");
+	strcpy(IniKey[i++], "A0_OFFSET");
+	strcpy(IniKey[i++], "A1_OFFSET");
+	strcpy(IniKey[i++], "A2_OFFSET");
+	strcpy(IniKey[i++], "A3_OFFSET");
+	strcpy(IniKey[i++], "A4_OFFSET");
+	strcpy(IniKey[i++], "A5_OFFSET");
+	strcpy(IniKey[i++], "A6_OFFSET");
+	strcpy(IniKey[i++], "A7_OFFSET");
+	strcpy(IniKey[i++], "A0_SCALE");
+	strcpy(IniKey[i++], "A1_SCALE");
+	strcpy(IniKey[i++], "A2_SCALE");
+	strcpy(IniKey[i++], "A3_SCALE");
+	strcpy(IniKey[i++], "A4_SCALE");
+	strcpy(IniKey[i++], "A5_SCALE");
+	strcpy(IniKey[i++], "A6_SCALE");
+	strcpy(IniKey[i++], "A7_SCALE");
+}
+
+/*-------------------------------------------------------------------------------
+Datei öffnen
+-------------------------------------------------------------------------------*/
+int OpenIni()
+{
+    int i,j,Ret;
+    char strKeyCode[64];
+    char strValue[128];
+    
+    
+    InitDefault();      // vor den Lesen defautl initialisieren
+#ifdef SINGLE_DEBUG        
+        printf("Nach InitDfault\n");
+#endif        
+        
+    if(g_SdInitSuccess == false)    // wenn SD Karte nicht vorhanden, retour
+    {
+#ifdef SINGLE_DEBUG        
+        printf("SD Card not present\n");
+#endif        
+    }
+    
+    Ret = clSdCard.OpenFile(FileNames.IniFileName, FileNames.FileReadMode);
+    
+    if(Ret == false)
+    {
+        WriteIni();     // Default erzeugen
+        return(false);  // öffnen der Inidatei hat nicht geklappt
+    }
+        
+    do
+    {
+        Ret = clSdCard.ReadLine(strFileRwBuf, FILE_RW_BUF_LEN);
+        if(Ret > 0) // es sind Zeichen im Puffer
+        {
+#ifdef SINGLE_DEBUG        
+//             printf("Buf:  %s\n",strFileRwBuf);
+#endif        
+            for(i=0;i<Ret;i++)
+            {
+                if( (strFileRwBuf[i] == 0x0A) || (strFileRwBuf[i] == 0x0D))
+                {
+                    strFileRwBuf[i] = 0x00;
+                    i = Ret;
+                }
+                else if(strFileRwBuf[i] == 0x2C)    // Komma
+                    strFileRwBuf[i] = 0x2E; // in Punkt 
+            }
+            i = 0;
+            while( (i < 64) && (strFileRwBuf[i] != '=') )
+            {
+                strKeyCode[i] = strFileRwBuf[i];
+                i++;
+            }
+            strKeyCode[i] = 0x00;
+            i++;
+            while( (strFileRwBuf[i] == ' ') && (i < 100) )
+                i++;
+            strcpy(strValue,&strFileRwBuf[i]);
+            
+            //printf("KeyCode: %s   Value: %s\n", strKeyCode, strValue);
+            for(j = 0;j< ANZ_KEY;j++)
+            {
+                if(strcmp(strKeyCode, IniKey[j]) == 0) // die Strings stimmen überein
+                {
+                     (*KeyPtr[j])((char *)(strValue));  
+                     j = ANZ_KEY;  
+                }    
+            }
+        } 
+    }        
+    while(Ret > 0);
+    clSdCard.CloseFile();
+    EcmIni.fCfgExists = true;
+    if(EcmIni.nReInit == 1)
+    {
+        EcmIni.nReInit = 0;
+        InitDefault();
+        WriteIni();     // Default erzeugen
+    }
+    
+    
+    return(true);
+}
+    
+/*-------------------------------------------------------------------------------
+Defaultwerte für die Inivariablen setzten
+-------------------------------------------------------------------------------*/
+int InitDefault()
+{
+    int i;
+    
+    strcpy(EcmIni.DevTyp,"RPA-Device");    // Gerätetyp des Gerätes
+    strcpy(EcmIni.DevSio,"200_xxx");    // Seriennummer des Gerätes
+    strcpy(EcmIni.SwLizenz,"20000_xxx");  // Lizenznummer der Software
+    strcpy(EcmIni.SwRev,SW_REV);     // Revisionsnummer der Software
+    strcpy(EcmIni.IpAddress,"192.168.2.1"); // meine IP-Adresse für Netzwerkbetrieb
+    strcpy(EcmIni.SubNet,"255.255.255.0"); // IP-Adresse für Netzwerkbetrieb
+    strcpy(EcmIni.Gateway,"0.0.0.0"); // IP-Adresse für Netzwerkbetrieb
+    strcpy(EcmIni.HostIp,"192.168.2.8"); // IP-Adresse für Netzwerkbetrieb
+    
+    EcmIni.nPotCode = 1;       // default PGU, Jaissle ist 0x00, 71 ist PGU-Stack
+    EcmIni.nExtStart = 0;      // default kein externen Start
+    EcmIni.nSExtChnNr = 0x00;  // default Kanalnummer 0 für externen Start
+    EcmIni.nPortNr = 4000;  // Default 4000
+    EcmIni.dbRpmOffset = 0.0;        // Offsetkorrektur für die Anzeige Drehzahl
+    EcmIni.dbRpmScale = 1.0;        // Skalierungswert fuer die Anzeige Drehzahl
+    EcmIni.dbAoScale = 13.107;      // Skalierungswert fuer den Analogausgang
+    EcmIni.dbAoOffset = 0.0;       // Offset fuer den Analogausgang
+    EcmIni.nReInit = 0;         // Flag für Reinitialisierung
+    EcmIni.nNrOff = 0;          // Ausschalten der Drehzahlnachführung
+    for(i=0;i<8;i++)
+    {
+        EcmIni.dbUOffset[i] = 0.0;
+        EcmIni.dbUScale[i] = 1.0;
+    }
+    return(true);
+}
+
+/*-------------------------------------------------------------------------------
+Datei speichern
+-------------------------------------------------------------------------------*/
+int WriteIni()
+{
+    int Ret,i, j;
+
+    
+    if(g_SdInitSuccess == false)    // wenn SD Karte nicht vorhanden, retour
+    {
+#ifdef TFT_DEBUG            
+//        printf("SD Card not present\n");
+#endif        
+        return(false);
+    }
+    
+    Ret = clSdCard.OpenFile(FileNames.IniFileName, FileNames.FileWriteMode);
+    
+    if(Ret == false)
+        return(false);  // öffnen der Datei hat nicht geklappt
+
+    i= 0;    
+    // Methode CI
+    
+    
+    
+    sprintf(clSdCard.cSdLine, "%s=%s\r\n", IniKey[i],EcmIni.DevTyp);       clSdCard.WriteLine();   i++;        // DEV_TYP
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n", IniKey[i],EcmIni.nPotCode);     clSdCard.WriteLine();   i++;      // POT_CODE
+    sprintf(clSdCard.cSdLine, "%s=%s\r\n", IniKey[i],EcmIni.DevSio);       clSdCard.WriteLine();   i++;        // SER_NR
+    sprintf(clSdCard.cSdLine, "%s=%s\r\n", IniKey[i],EcmIni.SwLizenz);     clSdCard.WriteLine();   i++;      // LZ_NR
+    sprintf(clSdCard.cSdLine, "%s=%s\r\n", IniKey[i],EcmIni.SwRev);        clSdCard.WriteLine();   i++;         // REV_NR
+    sprintf(clSdCard.cSdLine, "%s=%s\r\n", IniKey[i],EcmIni.IpAddress);    clSdCard.WriteLine();   i++;     // IP_ADR
+    sprintf(clSdCard.cSdLine, "%s=%s\r\n", IniKey[i],EcmIni.SubNet);       clSdCard.WriteLine();   i++;        // SUB_NET
+    sprintf(clSdCard.cSdLine, "%s=%s\r\n", IniKey[i],EcmIni.Gateway);      clSdCard.WriteLine();   i++;       // GATEWAY
+    sprintf(clSdCard.cSdLine, "%s=%s\r\n", IniKey[i],EcmIni.HostIp);       clSdCard.WriteLine();   i++;        // HOST_IP
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n", IniKey[i],EcmIni.nPortNr);      clSdCard.WriteLine();   i++;       // PORT_NO
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n", IniKey[i],EcmIni.nExtStart);    clSdCard.WriteLine();   i++;     // "EXT_START 
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n", IniKey[i],EcmIni.nSExtChnNr);   clSdCard.WriteLine();   i++;    // "SEXT_CHN_NR
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n", IniKey[i],EcmIni.dbRpmOffset);  clSdCard.WriteLine();   i++;    // 
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n", IniKey[i],EcmIni.dbRpmScale);   clSdCard.WriteLine();   i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n", IniKey[i],EcmIni.dbAoScale);    clSdCard.WriteLine();   i++;
+    sprintf(clSdCard.cSdLine, "%s=%f\r\n", IniKey[i],EcmIni.dbAoOffset);   clSdCard.WriteLine();   i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n", IniKey[i],EcmIni.nReInit);      clSdCard.WriteLine();   i++;
+    sprintf(clSdCard.cSdLine, "%s=%d\r\n", IniKey[i],EcmIni.nNrOff);       clSdCard.WriteLine();   i++;
+
+    for(i=0, j=18;i<8;i++, j++)
+        sprintf(clSdCard.cSdLine, "%s=%f\r\n", IniKey[j],EcmIni.dbUOffset[i]);    clSdCard.WriteLine();   i++;
+    for(i=0, j=26;i<8;i++, j++)
+        sprintf(clSdCard.cSdLine, "%s=%f\r\n", IniKey[j],EcmIni.dbUScale[i]);    clSdCard.WriteLine();   i++;
+
+    clSdCard.CloseFile();
+    return(true);
+
+}
+
+
+//--------------------------------------------------------------------------
+// DecDevTyp: Decodieren des Gerätetyps
+//--------------------------------------------------------------------------
+int DecDevTyp(char *Line)
+{   
+    strcpy(EcmIni.DevTyp,Line);     
+#ifdef TFT_DEBUG        
+        printf("DevTyp: %s\n", EcmIni.DevTyp);
+#endif        
+    return(true);   
+}
+//--------------------------------------------------------------------------
+// DecPotCode: Decodieren 
+//--------------------------------------------------------------------------
+int DecPotCode(char *Line)
+{   EcmIni.nPotCode = atoi(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecSerNr(char *Line)
+{   strcpy(EcmIni.DevSio,Line); return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecLzNr(char *Line)
+{   strcpy(EcmIni.SwLizenz,Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecRevNr(char *Line)
+{   strcpy(EcmIni.SwRev,Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecIpAddr(char *Line)
+{   strcpy(EcmIni.IpAddress,Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecSubNet(char *Line)
+{   strcpy(EcmIni.SubNet,Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecGateway(char *Line)
+{   strcpy(EcmIni.Gateway,Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecHostIp(char *Line)
+{   strcpy(EcmIni.HostIp,Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecPortNo(char *Line)
+{   EcmIni.nPortNr = atoi(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecExtStart(char *Line)
+{   EcmIni.nExtStart = atoi(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecSextChnNr(char *Line)
+{   EcmIni.nSExtChnNr = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecRpmOffset(char *Line)
+{   EcmIni.dbRpmOffset = atof(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecRpmScale(char *Line)
+{   EcmIni.dbRpmScale = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecAoScale(char *Line)
+{   EcmIni.dbAoScale = atof(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecReInit(char *Line)
+{   EcmIni.nReInit = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecNrOff(char *Line)
+{   EcmIni.nNrOff = atoi(Line);   return(true);   }
+
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecAoOffset(char *Line)
+{   EcmIni.dbAoOffset = atof(Line);   
+    return(true);   
+}
+
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU0Offset(char *Line)
+{   EcmIni.dbUOffset[0] = atof(Line);   
+    EcmIni.dbUOffset[0] *= 838860.;
+    return(true);   
+}
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU1Offset(char *Line)
+{   EcmIni.dbUOffset[1] = atof(Line);   
+    EcmIni.dbUOffset[1] *= 838860.;
+    return(true);   
+}
+ 
+ 
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU2Offset(char *Line)
+{   EcmIni.dbUOffset[2] = atof(Line);   
+    EcmIni.dbUOffset[2] *= 838860.;
+    return(true);   
+}
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU3Offset(char *Line)
+{   EcmIni.dbUOffset[3] = atof(Line);   
+    EcmIni.dbUOffset[3] *= 838860.;
+    return(true);   
+}
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU4Offset(char *Line)
+{   EcmIni.dbUOffset[4] = atof(Line);   
+    EcmIni.dbUOffset[4] *= 838860.;
+    return(true);   
+}
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU5Offset(char *Line)
+{   EcmIni.dbUOffset[5] = atof(Line);   
+    EcmIni.dbUOffset[5] *= 838860.;
+    return(true);   
+}
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU6Offset(char *Line)
+{   EcmIni.dbUOffset[6] = atof(Line);   
+    EcmIni.dbUOffset[6] *= 838860.;
+    return(true);   
+}
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU7Offset(char *Line)
+{   EcmIni.dbUOffset[7] = atof(Line);   
+    EcmIni.dbUOffset[7] *= 838860.;
+    return(true);  
+}
+
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU0Scale(char *Line)
+{   EcmIni.dbUScale[0] = atof(Line);   return(true);   }
+ 
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU1Scale(char *Line)
+{   EcmIni.dbUScale[1] = atof(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU2Scale(char *Line)
+{   EcmIni.dbUScale[2] = atof(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU3Scale(char *Line)
+{   EcmIni.dbUScale[3] = atof(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU4Scale(char *Line)
+{   EcmIni.dbUScale[4] = atof(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU5Scale(char *Line)
+{   EcmIni.dbUScale[5] = atof(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU6Scale(char *Line)
+{   EcmIni.dbUScale[6] = atof(Line);   return(true);   }
+//--------------------------------------------------------------------------
+// Dec
+//--------------------------------------------------------------------------
+int DecU7Scale(char *Line)
+{   EcmIni.dbUScale[7] = atof(Line);   return(true);   }
+ 
+ 
+ 
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/OpenIni.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,93 @@
+/*
+-------------------------------------------------------------------------------
+Programm Name: OpenIni.h
+Version:       1.0
+Sprache:       C
+Compiler:      MBED
+Autor:         PS
+Copyright:     PS
+               
+
+Funktion:      Externdeklarationen für die IniDatei
+-------------------------------------------------------------------------------
+*/
+
+/*===========================================================================
+Die nachfolgende Struktur dient zur Speicherung der Ini-Daten
+===========================================================================*/
+struct EcmIni
+{
+    char    DevTyp[32];    // Gerätetyp
+    int     nPotCode;    // Codierung, welche Hardware angeschlossen ist
+    char    DevSio[16];    // Seriennummer des Gerätes
+    char    SwLizenz[16];  // Lizenznummer der Software
+    char    SwRev[16];     // Revisionsnummer der Software
+    char    IpAddress[32]; // eigene IP-Adresse für Netzwerkbetrieb
+    char    SubNet[32];    // Sub-Net Mask für Netzwerkbetrieb
+    char    Gateway[32]; // IP-Adresse für Gateway
+    int     nOnlyTcp;
+    char    HostIp[32];    // IP-Adresse für Host
+    int     nPortNr;        // Portnummer für Ethernet 
+    int     nExtStart;      // wenn true, dann kann ein externer Start über einen Eingangskontakt erfolgten
+    int     nSExtChnNr;     // Kanalnummer zum Einlesen für externen Start
+    int     nAnzChannel;
+    double  dbRpmOffset;
+    double  dbRpmScale;
+    bool    fCfgExists;
+    double  dbAoScale;
+    double  dbAoOffset;
+    int     nReInit;
+    int     nNrOff;
+    double  dbUOffset[8];
+    double  dbUScale[8];
+};
+typedef struct EcmIni ECM_INI;
+
+
+extern char IniKey[50][16];
+
+extern int OpenIni();
+extern int DecodeIniValues(char *Src);
+
+
+extern int InitDefault();
+extern int WriteIni();
+
+
+extern int DecDevTyp(char *Line);
+extern int DecPotCode(char *Line);
+extern int DecSerNr(char *Line);
+extern int DecLzNr(char *Line);
+extern int DecRevNr(char *Line);
+extern int DecIpAddr(char *Line);
+extern int DecSubNet(char *Line);
+extern int DecGateway(char *Line);
+extern int DecHostIp(char *Line);
+extern int DecPortNo(char *Line);
+extern int DecExtStart(char *Line);
+extern int DecSextChnNr(char *Line);
+extern int DecRpmOffset(char *Line);
+extern int DecRpmScale(char *Line);
+extern int DecAoScale(char *Line);
+extern int DecAoOffset(char *Line);
+extern int DecReInit(char *Line);
+extern int DecNrOff(char *Line);
+
+extern int DecU0Offset(char *Line);
+extern int DecU1Offset(char *Line);
+extern int DecU2Offset(char *Line);
+extern int DecU3Offset(char *Line);
+extern int DecU4Offset(char *Line);
+extern int DecU5Offset(char *Line);
+extern int DecU6Offset(char *Line);
+extern int DecU7Offset(char *Line);
+
+extern int DecU0Scale(char *Line);
+extern int DecU1Scale(char *Line);
+extern int DecU2Scale(char *Line);
+extern int DecU3Scale(char *Line);
+extern int DecU4Scale(char *Line);
+extern int DecU5Scale(char *Line);
+extern int DecU6Scale(char *Line);
+extern int DecU7Scale(char *Line);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySources/Struct.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,444 @@
+/*-------------------------------------------------------------------------------
+Programm Name: Struct.H
+Version:       1.0
+Sprache:       C
+Compiler:      CrossStudio Ver. 2.0
+Autor:         PS
+Copyright:     PS
+         
+
+Funktion:      Strukturen fuer EcmCom
+
+28.10.2012: 
+
+-------------------------------------------------------------------------------*/
+#define UINT8 unsigned char 
+#define uint8_t UINT8
+#define UINT16 unsigned int
+#define uint16_t UINT16
+#define uint UINT16
+#define BYTE unsigned char
+#define UINT32 unsigned long
+#define uint32_t unsigned long
+#define INT16 int
+
+#define FALSE false
+#define TRUE true
+
+#define LOW     0
+#define HIGH    1
+
+#define ANZ_POT     2
+#define ANZ_POLY    101
+
+#define GEN_TYP_QST         1
+#define GEN_TYP_FKT         0
+
+
+/*===========================================================================
+Die nachfolgende Struktur dient zur Speicherung der Startup Konfiguration
+===========================================================================*/
+struct StartUp
+{
+    int     HwConfig;   // KOnfiguration der Hardware
+    int     StpConfig;  // ohne oder mit seriell to parallel
+
+    int     PotAnz;     //  0 = 1 Pot. 1 = 2 Pot.
+    int     AoInvert[ANZ_POT];
+    float   Offset[ANZ_POT];
+    int     PotTyp[ANZ_POT];     // 0=Alter, 1=PGU
+    bool    fPotActive[ANZ_POT];
+    bool    fStartConnection;
+    bool    fNoiseMeasurement;
+
+};
+typedef struct StartUp START_UP;
+
+/*===========================================================================
+Die nachfolgende Struktur dient zur Verwaltung der Watchdogfunktion
+===========================================================================*/
+struct strWatchDog
+{
+    int     fEnabled;      // 0=kein Watchdog, 1=Watchdog aktiv
+    int     nTimeOut;      // Timeout-Zeit für Watchdog
+    char    cSign[8];      // Watchdog Zeichen was vom Host gesendet wird
+    int     nCounter;
+    int     nMsTimeOut;
+    int     fLogFile;
+    int     fHandShake;
+};
+typedef struct strWatchDog WATCH_DOG;
+
+/*===========================================================================
+Die nachfolgende Struktur dient zur Speicherung der Messkanaele
+===========================================================================*/
+struct MChn1
+{
+    float VarGalvFaktor;    // Variabler Faktor für die Ansteuerung Galvanostat
+
+};
+typedef struct MChn1 M_KANAL;
+
+/*===========================================================================
+ Die nachfolgende Struktur ist für die Meßparameter
+===========================================================================*/
+struct StrMPara
+{
+    int     RpDauer[ANZ_POT];           // Dauer der Ruhepotentialmessung
+    int     RpDauerVor[ANZ_POT];        // Dauer der Ruhepotentialmessung
+    int     RpDauerNach[ANZ_POT];       // Dauer der Ruhepotentialmessung
+    int     IBereichPos[ANZ_POT];       // Position im Array
+    float   IKritPos[ANZ_POT];          // Positiver Endwert des Kritischen Stromdichtebereiches
+    float   IKritNeg[ANZ_POT];          // Negativer Endwert des Kritischen Stromdichtebereiches
+    int     UKritPos[ANZ_POT];          // Positiver Endwert des Potential bei Galvanostat
+    int     UKritNeg[ANZ_POT];          // Negativer Endwert des Potential bei Galvanostat
+    int     GrenzVerhalten[ANZ_POT];    // Verhalten bei Grenzwertüberschreitung
+    float   ProbenGroesse[ANZ_POT];     // Größe der Probe
+    float   dUdTRpEnde[ANZ_POT];        // dU/dt für Rp-Ende
+    double  SMax[ANZ_POT];              // für Galvanostat
+    int     PolarisationsStart[ANZ_POT];// Start der Polarisation absolut oder relativ
+};
+typedef struct StrMPara MESS_PARAMETER;
+
+/*===========================================================================
+Struktur Deklaration für die Quasistationäre Funktion
+===========================================================================*/
+struct strQst1 {
+                int     StartPotential;
+                int     EndPotential;
+                float   StufenHoehe;
+                float   StufenDauer;
+                int     AufAb;
+                int     StartWertRelativ;
+                int     AnzZyklen;
+                float   flW_StartPotential; // Variable zum arbeiten
+                float   flW_EndPotential; // Variable zum arbeiten
+                float   flW_StufenHoehe[2]; // Variable zum arbeiten
+                long    nW_StufenDauer;
+                int     nW_Richtung;
+                int     nW_StepCounter;
+               };
+typedef struct strQst1 QST_DATEN;
+
+/*===========================================================================
+ Struktur Definition für die Frequenzwerte and den DDS
+===========================================================================*/
+struct strFrqValues
+{
+    BYTE OutH0, OutH1;
+    BYTE OutL0, OutL1;
+    BYTE Clock;
+    int nFilterAuto;
+    BYTE AdControlLow;      // 0x00=Sinus, 0x02 = Dreieck
+    bool fImpedance;
+    BYTE V1, V2, Mux;
+    bool fSendEnable;
+    uint16_t nAktAmplitude;
+    uint16_t nLastAmplitude;
+};
+typedef struct strFrqValues FRQ_VALUES;
+
+/*===========================================================================
+ Struktur zum Speichern der Generatorwerte
+===========================================================================*/
+struct FktStr2
+{
+    int     AnzPoly;   // Anzahl der Polygone einer Fuktion
+    long    nAnzZyklus; // Anzahl der Zyklen
+    long    ZyklusStartPunkt; // Einstiegspunkt für den Zyklus
+    int     PolyNummer[ANZ_POLY+1]; // Satznummer
+    double   ZeitWert[ANZ_POLY+1];// Abs. Zeitwerte der Polygone
+    float   SpngWert[ANZ_POLY+1];   // Programmierter Spannungsw. der Polygone
+    double  ScanRate[ANZ_POLY+1];   // Scanrate in mV/s
+    int     ScanRichtung[ANZ_POLY+1]; // Richtung auf/ab/Sprung/Haltepot.
+    float   RealSpngWert[ANZ_POLY+1];   // Tatsächlicher Spannungsw. der Polygone
+
+    double  Schritt[ANZ_POLY+2];
+    unsigned long    Count[ANZ_POLY+2];
+    int     GenActive;
+    long     ZCount;         // Zähler für Zyklus während der Messung
+    double  GenVal;
+    int     SetVal;         // Der aktuell zu setztende Integer-Wert
+    int     LastSetVal;     // Der zuletzt gesetzte Integer-Wert
+    float   MaxUS, MinUS;
+    float   MaxTime;
+    int     StartWertRelativ;
+    int     FolgeWerteRelativ;
+    float   flZyklusOffset;
+    int     nZlOffsetMode;
+    float   flScanOffset;
+    int     VpStatus;   // wird vorpolarisiert, dann muá das eingearbeitet werden
+    UINT16  nAktZyklus;
+};
+typedef struct FktStr2 FKT_WERTE;
+
+/*===========================================================================
+Struktur Deklaration für die Scanner Variablen
+===========================================================================*/
+struct strScanVal
+{
+    unsigned long GenCount;
+    int GenPos;
+    int Skiped;
+    int Vz;
+    bool SetStop;
+    bool fNewCycle;
+    float MaxUValue;
+    float MinUValue;
+    int AoMinWert, AoMaxWert;
+};
+typedef struct strScanVal SCAN_VAL;
+/*===========================================================================
+Struktur Deklaration für die Puls Variablen. Übernimmt die Pulswerte aus dem
+Datentelegramm und hält die Werte ohne das sie vom Programm verändert werden
+===========================================================================*/
+struct strPulsValue
+{
+    int nPulsCounter;
+    int nPulsPauseCounter;
+    float flPulsStartPot;
+    float flUpperPulsValue;
+    float flLowerPulsValue;
+    long   nAnzPulsUp;
+    long   nAnzPulsDown;
+    float flPulsOffset;
+};
+typedef struct strPulsValue PULS_VALUE;
+
+/*===========================================================================
+Struktur Deklaration für Puls Variablen. Diese Strukturvariablen dienen zum 
+Arbeiten, können verändert werden und müssen im Bedarfsfalls aus den Basisdaten
+neu geladen werden
+===========================================================================*/
+struct strPulsWorkValue
+{
+    int     nPulsCounter;
+    int     nPulsPauseCounter;
+    float   flUpperPulsValue;
+    float   flLowerPulsValue;
+    float   flPulsStartPot;
+    long    nAnzPulsUp;
+    long    nAnzPulsDown;
+    float   flPulsOffset;
+    bool    nPulsState;
+};
+typedef struct strPulsWorkValue PULS_WORK_VALUES;
+
+
+/*===========================================================================
+ Die nachfolgende Struktur ist für Variablen, die während der Messung
+ von allen Messmodulen benötigt werden. Eine solche Struktur sollte für
+ jeden zu messenden Potentiostaten separat angelegt werden. So läßt sich
+ das Messen besser für Parallel-Messungen erweitern.
+===========================================================================*/
+struct StrMVariables
+{
+    int     BetriebsArt;        // Potentiostat=0, Galvanostat=1
+    int     Circuit;            // OLP=0, I-Zelle = 1, Messung Ende = 2
+    float   flAktIRange;        // Aktueller Max-Strom in mA
+    float   RangeFaktor;
+    float   IAktInVolt;
+    int     GenDateiTyp;            // normal oder QST
+    int     m_nReversePotential;
+    int     m_nLastPotential;
+    int     nMessArt;
+    int     nReversed;
+
+};
+typedef struct StrMVariables MESS_VARIABLES;
+
+/*===========================================================================
+ Die nachfolgende Struktur ist für Variablen, die der I-Bereichsprüfung und
+ Umschaltung dienen.
+===========================================================================
+struct StrIRange
+{
+    int     RangeAnz[ANZ_POT];
+    int     AktRange[ANZ_POT];
+    int     nIRangeMax[ANZ_POT];
+    int     nIRangeMin[ANZ_POT];
+    UINT32  lIMax[ANZ_POT];
+    UINT32  lIMin[ANZ_POT];
+    UINT32  lIMaxCompare[ANZ_POT];
+    UINT32  lIMinCompare[ANZ_POT];
+   
+    int     TempRange;
+    int     AutoRange[ANZ_POT];   // 0=aktiv, 1=nicht aktiv
+    int     IDownCount[ANZ_POT];
+    bool    m_fIRangeSwitchedUp[ANZ_POT];
+    BYTE    RangeValue[ANZ_POT];
+    int     Iz1, Iz2;
+    float   I1, I2;
+    float   IInVolt[ANZ_POT];
+    bool    m_fCheckRange;
+    bool    m_fAussenStromLos;
+};
+typedef struct StrIRange I_RANGE;
+*/
+/*===========================================================================
+ Struktur Definition der Werte für die Änderung der Senderate während der Messung
+===========================================================================*/
+struct NewScanRate
+{
+    int nNewSendeRate;
+    bool fFallBack; // nach einer bestimmten Anzahl zurücksetzen
+    int nFallBackTime; // zurück zur alten Einstellung nach n Sekunden
+    int nNewAutoRange;
+    int nNewRange;  // neuer Bereich, wenn nicht -1 dann setzen
+    int nOldSendAnzWerte;
+    int nOldAutoRange;
+    int nOldIntervall;
+    int nExtSigOnOff;
+    int n2ndExtSigOnOff;
+};
+typedef struct NewScanRate NEW_SCAN_RATE;
+
+
+/*===========================================================================
+ Struktur Definition von MessVariables
+===========================================================================*/
+struct MessVariables
+{
+
+    int     MwChn[16];
+    int     SwitchChn[4];
+    bool    m_fChnValid[16];    // Sagt, welcher Kanal übertragen wird, es werden 16 übertragen
+    int     ZInfo[2];           // liefert dem Hauptrechner die Info, wo der Messablauf ist
+
+    int     nAnzahlSchritte;    // Anzahl der Schritte pro Sekunde
+    float   FrkValue[ANZ_POT];
+
+    int     SendAnzWerte;   // Anzahl Werte, die pro Sekunden gesendet werden
+    int     SendAnzSave;   // Zwischenspeicher fuer das Sendintervall
+//    int     m_nStoreMwIntervall;    // Zeitabstand, in dem die Messwerte gespeichert werden
+    int     m_nAnzChnSend;  // Zählt die Kanäle die gesendet werden
+    int     m_nSendValues;  // das Senden von Single-Messdaten wird mit 1, Cont.Messdaten mit 2 freigegeben
+    int     nMessZustand[ANZ_POT];
+    int     nOldZustand[ANZ_POT];
+
+//------------------------------------------------------------------------------
+
+    long double  dbAdSum[ANZ_POT*4];
+    double  dbAdResult[ANZ_POT*4];
+    int     nChnAverage[ANZ_POT*4];
+    
+    long     nMwMittelCount; // wird nach jedem erfolgreichen Lesen des A/D Wandlers incrementiert
+    int     nMittelTimer;   // zählt die Zeit, über die bisher gemittelt wurde
+    int     nMittelAfter;   // ist die Zeit in ms, nach der gemäß der Anzahl der Werte eine Mittelung durchgeführt wird
+    int     nAktMittelAfter; // ist der aktuelle Wert nach dem gemittelt wird
+    int     nSendTimer;   // zählt die Zeit zwischen dem senden der Werte
+    int     nDaTimer;   // zählt die Zeit zwischen der DA Wandlung
+    int     nSendAfter;     // ist die Zeit in ms, nach der die Daten gesendet werden
+    int     nDestCount;     // zählt die Werte im Zielpuffer der versendet wird
+    bool    m_fStartTel;    // sagt, daß ein STX mit MW gesendet werden muss
+    int     m_nAnzValue;
+    int     nTelLen;
+    bool    m_fSendStatus;
+    bool    m_fPotGal;
+    bool    m_fDoFinishMeasurement;
+    bool    m_fFinishMeasurement;
+    bool    m_fMeasurementFinished;  
+    bool    m_fDisableStopTel;
+    
+//    int     nMwMittelVal;   // ist der Endwert, nachdem gesendet wird
+    int     nSecCounter[2];
+    bool    m_fScan;   // Flag zum aktivieren des Scanners
+    bool    m_fScanPuls;
+    bool    m_fPulsMessung;
+    bool    m_fQstMessung;
+    bool    m_fCellSwitchOff;
+    bool    m_fChangeMittelValue;
+    bool    fAdReInit;
+    int     m_nSendAnz;
+    int     nSwapNr;     // Nummer des Puffers in den die aktuellen Messdaten geschrieben werden
+
+    int     Frk1, Frk2;
+    float   Fr1, Fr2;
+    int     m_nSendStart;
+    int     m_nSendEnd;     // beginnt wieder von vorne
+    int     nMwPerBlock;
+    int     fTelStart;
+    int     nBlockCount;
+    int     nIpsDebug;
+    uint8_t CsSpiMask;
+// Ports für den I/O Zugriff
+    uint16_t nRefPort;
+    uint8_t nCurrentPort;
+    uint8_t nRingPort;
+    uint8_t nExtPort;
+    uint8_t nGenPort;
+    uint8_t nNoisePort;
+
+    uint8_t nUGain;
+    uint8_t nIGain;
+    uint8_t CsOff;
+    uint8_t IrKompPort;
+    int     m_fMessDlgOpened;
+    uint8_t AdConvTime;
+    bool    fChangeCt; 
+    int     nKurveForm;
+    
+    int     nMwMittelVal;
+    int     m_nStoreMwIntervall;   
+
+
+    int     nMessArt;
+    int     nMessTimer;
+    bool    fSequenzMessung;
+    uint8_t fEnableAuto;  // wenn true, dann wir Enable Autorange gesetzt 
+    int     nAnzPot;
+    
+};
+typedef struct MessVariables MESS_VARS;
+
+/*===========================================================================
+ Struktur Speichern der der A/D Daten
+===========================================================================*/
+struct AnalogDigital
+{
+    double      AdResult[8][16]; // wird auch fuer den digitalen Filter verwendet
+    UINT32      AdRingBuf[8][1024];
+    long        AdTempU, AdTempU1, AdTempI, AdDiff;
+    double      FKoeff[11];
+    uint8_t     nStartFk, nEndeFk;
+    double      dbUFkResult, dbIFkResult;
+    double      dbUNoiseGainFaktor, dbINoiseGainFaktor;
+};
+typedef struct AnalogDigital AD_VAL;
+
+
+/*===========================================================================
+ Struktur für das IR-Handling
+===========================================================================*/
+struct IrCompensation
+{
+    double  dbRArray[8];
+    uint8_t nRIndex;
+    bool    fMitIrValue;
+    bool    fMosFetState;
+    bool    fMosFetOpen;
+    bool    fWaitForIrVoltage;
+    bool    fSendInfo;
+    bool    fIrInProcess;
+    bool    fCalculate;
+    
+    double  dbIrValue[16], dbRValue, dbOldRValue;
+    double  dbIrAddVoltage, dbKorrVoltage;
+    
+    double  dbUDiffValue, dbLastIValue, dbUScale;
+    uint8_t nIChn, nUChn;
+    double  dbAOut[2];
+    double  dbDiv, dbUDisplay;     // zum Berechnen der Spannung
+    uint16_t nMosFetCounter;
+    uint8_t n100msCounter;  // wird alle 100ms incrementiert, Zeitfenster für die IR-Unterbrechung
+    uint8_t nOffCount;
+    uint8_t nOffSollCount;
+    uint16_t nSollCounter;
+    uint8_t nStartupCounter;
+    uint8_t nDistanceCounter;
+    uint8_t nSkipCounter;
+   
+};
+typedef struct IrCompensation IR_COMP;
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RawSerial/IfGlobals.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,19 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  SioGlobals.cpp
+Version:        1.0
+Sprache:        C++
+Compiler:       mbed
+Autor:          PS
+Copyright:      PS
+                 
+
+Funktion:       Globale Kommunikations-Variablen und Methoden
+ 
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+
+HOST_INTERFACE HostIf; // Struktur mit Variablen zur Kommunikation mit EcmWin
+
+char STemp[128];
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RawSerial/IfGlobals.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,72 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  SioGlobals.h
+Version:        1.0
+Sprache:        C++
+Compiler:       mbed
+Autor:          PS
+Copyright:      PS
+                 
+
+Funktion:       Globale Kommunikations-Variablen und Methoden
+ 
+-------------------------------------------------------------------------------*/
+
+#define STX     0x21
+#define ETX     0x7C
+
+#define MCU_EOF    0x7D  // } MyEndOfFile
+#define REPLACE_LF     0x24	// $
+#define REPLACE_LATTEN_ZAUN		'#'
+#define SEND_BUF_LEN 	4096
+#define TEMP_BUF_LEN 	1024
+#define MSG_BUF_LEN		256
+
+/*===========================================================================
+ Struktur f�r das Kommunikationshandling zwischen EcmWin und der Firmware
+ Es kann sich dabei um eine RS232, Ethernet oder in Zukunft ev. auch um ein 
+ USB Interface handeln
+===========================================================================*/
+struct HostInterface
+{
+	char 	strRecBuf[SEND_BUF_LEN]; // Empfangspuffer fuer die eingehenden Zeichen
+	int 	nRecStartPos;
+	int 	nRecEndPos;
+	int 	nEtxPos;
+    int    	nInTel;
+	char 	strTelAwBuf[SEND_BUF_LEN]; // Puffer zum Auswerten des gesendeten Telegrammes
+	
+	char 	TelCode[8];
+	int 	nTelLen;
+	char 	*ptrTelPos;
+	
+	char 	strTempBuf[TEMP_BUF_LEN];
+	char 	strFinalSendBuf[SEND_BUF_LEN];
+	char 	strCommonTmpBuf[SEND_BUF_LEN];
+	char 	strMessageBuf[MSG_BUF_LEN];
+	char 	strErrorBuf[MSG_BUF_LEN];
+	int 	nAwTelLen;
+	
+    int     nRecInPos; 
+	bool 	fStartTel;
+//    bool    fConnect, fEthInitDone, fEthConnect,fAfterBind, fAfterCheckWait, fEcmWinIsConnected, fEcmWinStartClose, fEcmWaitForRequest;
+    int     fSendStatus;
+    int     nDisconnectCounter;
+    bool 	fIsConnected;
+	bool 	fAfterCheckWait;
+	bool 	fEcmWinIsConnected;
+	bool 	fEcmWinStartClose;
+	bool 	fAfterBind;
+	bool 	fAfterOpen;
+	bool 	fEcmWaitForRequest;
+	bool 	fSendMessage, fSendError;
+};
+typedef struct HostInterface HOST_INTERFACE;
+
+// ETH_IN_OUT;
+
+
+extern HOST_INTERFACE HostIf;
+
+extern char STemp[128];
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RawSerial/RpaSerial.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,122 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  RpaSerial.cpp
+Version:        1.0
+Sprache:        C++
+Compiler:       mbed
+Autor:          PS
+Copyright:      PS
+                 
+
+Funktion:       Serial Funktions fuer Comm
+04.08.2016:  Projekt: 
+-------------------------------------------------------------------------------*/
+#include "Headers.h"
+
+
+RawSerial RpaDev(USBTX, USBRX);
+int RawChar;
+unsigned char Rc;
+static int m_nLedCount;
+
+/*-------------------------------------------------------------------------------
+Folgendes ist zu beachten:
+Die meisten Telegramme, die von EcmWin kommen, sind kurz, sie passen in einen 
+typischen Empfangspuffer mit 2048 Byte. 
+Werden jedoch Konfigurationsdaten oder Sequenzdateien uebertragen, dann koennen die 
+Telegramme auch laenger sein. Hier muss vorgesorgt werden, sonst kommt es zu einem Chrash. 
+Von EcmWin aus muessen die Daten in Bloecken geschickt werden, jeder Block muss eine 
+STX und ein ETX haben. Die Firmware wiederum muss wissen, ob es sich um ein laengeres 
+Telegramm handelt. Dies kann durch mitsenden eine zweiten Zeichens geschehen, 
+trotzdem muss sich die Firmware merken, ob es sich um ein Starttelegramm oder um ein 
+Folgetelegramm handelt. Z.B. wird bei der Uebertragun einer Ini-Datei mit dem ersten 
+Telegramm die Datei geoeffnet, die Folgetegramme muessen einfach nur geschrieben und
+mit dem letzten Telegramm muss die Ini-Datei geschlossen werden. 
+-------------------------------------------------------------------------------*/
+void SioCallback() 
+{
+    // Note: you need to actually read from the serial to clear the RX interrupt
+    RawChar = RpaDev.getc();
+    Rc = (unsigned char)RawChar & 0x00FF;
+    HostIf.strRecBuf[HostIf.nRecEndPos] = Rc;
+    if(Rc == ETX)    // Telegramm ist vollständig
+    {
+        HostIf.nInTel++;    // 
+        HostIf.nEtxPos = HostIf.nRecEndPos;  // merken, falls waehrend der Verarbeitung ein weiterer IRQ kommt
+		HostIf.nEtxPos &= 0x7FF; // steht jetzt auf der Pos. hinter dem letzten Zeichen
+    }
+	HostIf.nRecEndPos++; 
+	HostIf.nRecEndPos &= 0x7FF; // steht jetzt auf der Pos. hinter dem letzten Zeichen
+	
+}
+/*-------------------------------------------------------------------------------
+InitInterface: Ist eine zentrale Methode. Fuer RS232 wird die serielle Schnittstelle 
+initialisiert, fuer das Ethernet Interface wird Ethernet und Thread initialisiert
+-------------------------------------------------------------------------------*/
+int InitInterface()
+{
+    InitRawSio();   // ganz nach vorne, damit die Debug Ausgabe auch funktioniert
+	return(true);
+}
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+int InitRawSio() 
+{
+    RpaDev.baud(115200);  
+    HostIf.nRecStartPos = 0; // Zeigt auf den Telegrammanfang 
+    HostIf.nRecEndPos = 0;  // zu Beginn ist der Anfang gleich dem Ende
+	HostIf.nEtxPos = 0; 
+ 	HostIf.fIsConnected = false;
+    HostIf.nInTel = 0;
+    HostIf.fSendMessage = false;
+    HostIf.fSendError = false;
+    RpaDev.attach(&SioCallback);
+    return(true);
+}
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+int TransferSioTel() 
+{
+    int i, j;
+    
+    for(i=HostIf.nRecStartPos, j=0;i != HostIf.nEtxPos;i++, j++)
+	{
+		i &= 0x7FF;
+        HostIf.strTelAwBuf[j] = HostIf.strRecBuf[i];
+	}
+		
+    HostIf.strTelAwBuf[j] = ETX;  
+    HostIf.strTelAwBuf[j+1] = 0x00;  
+	HostIf.nAwTelLen = j+1;
+	i &= 0x7FF;
+	HostIf.nRecStartPos = i;
+	
+	if(HostIf.nInTel > 0)
+    	HostIf.nInTel--;
+    return(true);
+}
+
+/*-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------*/
+int ChangeLedColor() 
+{
+    LedGreen = false;
+    LedBlue = false;
+    LedRed = false;         // PTB22
+    if(m_nLedCount == 0)
+    {
+        LedGreen = true;
+        m_nLedCount++;
+    }
+    else if(m_nLedCount == 1)
+    {
+        LedBlue = true;
+        m_nLedCount++;
+    }
+    else // if(LedCount == 2)
+    {
+        LedRed = true;
+        m_nLedCount = 0;
+    }
+    return(true);    
+    
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RawSerial/RpaSerial.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,21 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  RpaSerial.h
+Version:        1.0
+Sprache:        C++
+Compiler:       mbed
+Autor:          PS
+Copyright:      PS
+                 
+
+Funktion:       Serial Funktions fuer Comm
+04.08.2016:  Projekt: 
+-------------------------------------------------------------------------------*/
+
+extern RawSerial RpaDev;
+
+extern int InitInterface();
+
+extern int InitRawSio();
+extern int TransferSioTel();
+extern int ChangeLedColor();
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RawSerial/SendTelToHost.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,381 @@
+/*-------------------------------------------------------------------------------
+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          
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RawSerial/SendTelToHost.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,21 @@
+/*-------------------------------------------------------------------------------
+Programm Name:  SendTelToHost.h
+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: 
+-------------------------------------------------------------------------------*/
+
+
+extern int SendAnalogValues();
+extern int SendAnalogFromTouch();
+extern int SendAnalogFromEdu();
+extern void SendStatus(void);
+extern void SendRpaStatus(void);
+extern void SendInfo(void);
+extern void SendTelToHost(bool fMoreThanOne, bool fEof, int nReplace);
+extern int SendRpaAnalogValues();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SdCard/SdCard.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,437 @@
+/*-------------------------------------------------------------------------------------------------------------
+Program Name:   SDCard.cpp
+Version:        1.x
+Sprache:        C++
+Compiler:       mbed
+Autors:         UFa/PS
+
+Funktion:       Lesen und Schreiben der SD-Card
+
+History: 
+30.09.2019: 
+Vorsicht, es gibt zwei Dateien zum Autospeichern. Die Datei autostart.CFG, welche die Konfigurationsdaten
+zum Handling der Autostart Messfunktion aufnimmt und die Datei(en) MW_AUTO%d, welche die Messwerte aufnimmt und 
+durchnummeriert wird. Folgende Variablen und Methoden liegen dem zugrunde:
+autostart.cnf: 
+FileNames.AutoFileName,"/SDCard/autostart.CFG"
+clSdCard.OpenAutoFile(FileNames.AutoFileName, FileNames.FileReadMode);
+clSdCard.ReadAutoLine(strFileRwBuf, FILE_RW_BUF_LEN);
+clSdCard.WriteAutoLine(); schreibt den Puffer clSdCard.cSdLine
+clSdCard.CloseAutoFile();
+
+
+Messdateien:
+AutoStart.MwFileName, "/SDCard/data/MW_AUTO_%d.ASC"
+clSdCard.OpenMwAutoFile(AutoStart.MwFileName, FileNames.FileWriteMode);
+clSdCard.WriteMwAutoLine();  schreibt den Puffer strFileRwBuf
+
+
+ --------------------------------------------------------------------------------------------------------------*/
+
+#include "Headers.h"
+
+
+
+
+/*-----------------------------------------------------------------------------------------------
+Init: Initialisieren der Startwerte
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::Init() 
+{
+   m_fFileIsOpen = false;
+   m_fHeaderIsOpen = false;
+   m_Fp = NULL;
+   m_FpHeader = NULL;
+   m_FpAutoFile = NULL;
+   m_fAutoFileIsOpen = false;
+   m_FpMwAutoFile = NULL;
+   m_fMwAutoFileIsOpen = false;
+   return(true);   
+}
+/*-----------------------------------------------------------------------------------------------
+OpenFile: Öffnet eine Datei über den Namen der im Aufrufparameter enthalten ist
+Returnwert ist true bei erfolgreichem Öffnen
+Returnwert ist false bei fehlerhaftem Öffnen
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::OpenFile(char *FName, char *OpenMode) 
+{
+    if(m_fFileIsOpen == true)       // eine andere Datei ist geöffnet. Sollte eigentlich nicht vorkommen, 
+    {
+		sprintf(HostIf.strErrorBuf,"%c#ER#Error open file %s, another file is opened.  %c\r\n", STX, FName, ETX); // 
+		if(g_fOnDuringInit)
+			printf("%s",HostIf.strErrorBuf); 
+		else
+			HostIf.fSendError = true;
+	    return(false);              // ist nur zur Sicherheit
+    }        
+   	m_Fp = fopen(FName, OpenMode);   //  Datei im OpenMode öffnen
+   	if(m_Fp == NULL)    // Fehler beim Öffnen der Datei, der wesentliche Grund ist, das die Datei nicht vorhanden ist. 
+                        // Die Konsequenz ist, daß die Quelldaten initialisiert werden müssen, eine Fehlermeldung muss nicht ausgegeben werden,
+                        // es dürfen jedoch keine weiteren Daten aus der Datei gelesen werden. 
+   {
+		sprintf(HostIf.strErrorBuf,"%c#ER#File could not opened: %s %c\r\n", STX, FName, ETX); // 
+		if(g_fOnDuringInit)
+			printf("%s",HostIf.strErrorBuf); 
+		else
+			HostIf.fSendError = true;
+        return(false);
+   }
+   m_fFileIsOpen = true;
+   
+   rewind(m_Fp);
+   return(true);    
+    
+}
+/*-----------------------------------------------------------------------------------------------
+OpenFile: Öffnet eine Header-Datei über den Namen der im Aufrufparameter enthalten ist
+Returnwert ist true bei erfolgreichem Öffnen
+Returnwert ist false bei fehlerhaftem Öffnen
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::OpenHeaderFile(char *FName, char *OpenMode) 
+{
+   if(m_fHeaderIsOpen == true)       // eine andere Datei ist geöffnet. Sollte eigentlich nicht vorkommen, 
+    {
+		sprintf(HostIf.strErrorBuf,"%c#ER#Error open file %s, another file is opened.  %c\r\n", STX, FName, ETX); // 
+		if(g_fOnDuringInit)
+			printf("%s",HostIf.strErrorBuf); 
+		else
+			HostIf.fSendError = true;
+	    return(false);              // ist nur zur Sicherheit
+    }        
+        
+   m_FpHeader = fopen(FName, OpenMode);   //  Datei im OpenMode öffnen
+   if(m_FpHeader == NULL)    // Fehler beim Öffnen der Datei, der wesentliche Grund ist, das die Datei nicht vorhanden ist. 
+                        // Die Konsequenz ist, daß die Quelldaten initialisiert werden müssen, eine Fehlermeldung muss nicht ausgegeben werden,
+                        // es dürfen jedoch keine weiteren Daten aus der Datei gelesen werden. 
+   {
+		sprintf(HostIf.strErrorBuf,"%c#ER#Error open Header-File %s.  %c\r\n", STX, FName, ETX); // 
+		HostIf.fSendError = true;
+        return(false);
+   }
+   m_fHeaderIsOpen = true;
+   
+   rewind(m_FpHeader);
+   return(true);    
+}
+
+/*-----------------------------------------------------------------------------------------------
+CloseFile: Schließt eine geöffnete Datei
+Returnwert ist true bei erfolgreichem Schliessen
+Returnwert ist false bei fehlerhaftem Schliessen
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::CloseHeaderFile() 
+{
+    if(m_fHeaderIsOpen == true)
+    {
+        clearerr(m_FpHeader);        
+        fflush(m_FpHeader); 
+        fclose(m_FpHeader);   //  Datei zu
+        m_fHeaderIsOpen = false;
+        m_FpHeader = NULL;
+        return(true);  
+    }
+    return(false);  
+}
+
+/*-----------------------------------------------------------------------------------------------
+ReadLine: Liest eine Zeile aus der geöffneten Datei 
+Wenn der Pointer von fgets nach dem Leseversuch NULL ist, dann wurde nichts mehr gelesen 
+und die Datei wird automatisch geschlossen, d.h. die lesende Funktion muss nur so lange lesen
+bis false zurückkommt.  
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::ReadLine(char *Dest, int MaxLen) 
+{
+   if(m_fFileIsOpen == true)
+    {
+        if(fgets(Dest , MaxLen , m_Fp) != NULL )
+            return(strlen(Dest));
+        clearerr(m_Fp);        
+    }
+   return(false);
+}
+/*-----------------------------------------------------------------------------------------------
+WriteLine: Schreibt eine Zeile in die geöffneten Datei 
+Wenn beim Schreiben ein Fehler auftrifft, dann wird false zurückgegeben, ansonsten true.
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::WriteLine() 
+{   
+   if(m_fFileIsOpen == true)
+   {
+        fputs(cSdLine, m_Fp);
+        if (ferror (m_Fp))
+        {
+            clearerr(m_Fp);        
+            fclose(m_Fp);        
+            m_fFileIsOpen = false;
+            return(false);
+        }
+        fflush(m_Fp);
+        return(true);
+   }
+  
+   return(false);
+}
+/*-----------------------------------------------------------------------------------------------
+WriteHeaderLine: Schreibt eine Zeile in die geöffneten Datei 
+Wenn beim Schreiben ein Fehler auftrifft, dann wird false zurückgegeben, ansonsten true.
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::WriteHeaderLine() 
+{   
+   if(m_fHeaderIsOpen == true)
+   {
+        fputs(strFileRwBuf, m_FpHeader);
+        if (ferror (m_FpHeader))
+        {
+            clearerr(m_FpHeader);        
+            fclose(m_FpHeader);        
+            m_fHeaderIsOpen = false;
+            return(false);
+        }
+        return(true);
+   }
+   return(false);
+}
+
+/*-----------------------------------------------------------------------------------------------
+CloseFile: Schließt eine geöffnete Datei
+Returnwert ist true bei erfolgreichem Schliessen
+Returnwert ist false bei fehlerhaftem Schliessen
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::CloseFile() 
+{
+    if(m_fFileIsOpen == true)
+    {
+        clearerr(m_Fp);        
+        fflush(m_Fp); 
+        fclose(m_Fp);   //  Datei zu
+        m_fFileIsOpen = false;
+        m_Fp = NULL;
+#ifdef TFT_DEBUG
+    printf("In CloseFile of SdCard \n");
+#endif
+        return(true);  
+    }
+    return(false);  
+}
+/*-----------------------------------------------------------------------------------------------
+ReadFile: Lesen einer kompletten Datei über Klassenmethoden
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::ReadFile(char *fName, char *DestBuf, int MaxLen)
+{
+    int Ret, Len;
+    
+    if(OpenFile(fName, FileNames.FileReadMode) == false)
+        return(false);    
+        
+    Len = 0;
+    do
+    {
+        Ret = ReadLine(strFileRwBuf, FILE_RW_BUF_LEN);
+        if(Ret > 0) // es wurden Zeichen gelesen
+        {
+            Len += Ret;
+            if(Len < MaxLen)
+                strcat(DestBuf, strFileRwBuf);
+        }
+    }
+    while(Ret > 0);
+   
+    CloseFile();
+    return true;
+   
+}
+
+/*-----------------------------------------------------------------------------------------------
+WriteFile: Schreiben einer kompletten Datei über Klassenmethoden
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::WriteFile(char *fName, char *SrcBuf)
+{
+    int Ret;
+    
+    if(OpenFile(fName, FileNames.FileWriteMode) == false)
+        return(false);    
+
+    Ret = fputs(SrcBuf,m_Fp);
+         
+    CloseFile();
+    if(Ret == EOF)
+        return(false);
+    return true;
+}
+/*-----------------------------------------------------------------------------------------------
+RemoveFile: Löschen einer Datei auf der SD Card
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::RemoveFile(char *fName)
+{
+    return(remove(fName));
+}
+/*-----------------------------------------------------------------------------------------------
+AppendSdValueToLine: Löschen einer Datei auf der SD Card
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::AppendSdValueToLine()
+{
+    strcat (cSdLine, cSdValue);
+    return(true);
+}
+// Methoden speziell fuer die KonfigurationsDatei mit den Autostartvariablen
+/*-----------------------------------------------------------------------------------------------
+OpenAutoFile: Öffnet eine Datei fuer den AutoStart
+Returnwert ist true bei erfolgreichem Öffnen
+Returnwert ist false bei fehlerhaftem Öffnen
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::OpenAutoFile(char *FName, char *OpenMode) 
+{
+    if(m_fAutoFileIsOpen == true)       // ist bereits geoeffnet oder wurde nicht geschlossen 
+    {
+		printf("AutoFileIsOpened\n");
+		return(false);              // ist nur zur Sicherheit
+    }
+/*    else
+    {
+		sprintf(HostIf.strErrorBuf,"%c#ER#Error open Autofile %s.  %c\r\n", STX, FName, ETX); // 
+		HostIf.fSendError = true;
+	    return(false);              // ist nur zur Sicherheit
+    }        
+*/            
+	m_FpAutoFile = fopen(FName, OpenMode);   //  Datei im OpenMode öffnen
+   if(m_FpAutoFile == NULL)    // Fehler beim Öffnen der Datei, der wesentliche Grund ist, das die Datei nicht vorhanden ist. 
+                        // Die Konsequenz ist, daß die Quelldaten initialisiert werden müssen, eine Fehlermeldung muss nicht ausgegeben werden,
+                        // es dürfen jedoch keine weiteren Daten aus der Datei gelesen werden. 
+   {
+		printf("AutoFilePointer is zero, no File with Autostart configurations\n");
+        return(false);
+   }
+   m_fAutoFileIsOpen = true;
+   
+   rewind(m_FpAutoFile);
+   return(true);    
+}
+/*-----------------------------------------------------------------------------------------------
+ReadAutoLine: Liest eine Zeile aus der geöffneten AutoDatei 
+Wenn der Pointer von fgets nach dem Leseversuch NULL ist, dann wurde nichts mehr gelesen 
+und die Datei wird automatisch geschlossen, d.h. die lesende Funktion muss nur so lange lesen
+bis false zurückkommt.  
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::ReadAutoLine(char *Dest, int MaxLen) 
+{
+   if(m_fAutoFileIsOpen == true)
+    {
+        if(fgets(Dest, MaxLen , m_FpAutoFile) != NULL )
+            return(strlen(Dest));
+        clearerr(m_FpAutoFile);        
+    }
+   return(false);
+}
+
+/*-----------------------------------------------------------------------------------------------
+WriteAutoLine: Schreibt eine Zeile in die geöffneten Datei 
+Wenn beim Schreiben ein Fehler auftrifft, dann wird false zurückgegeben, ansonsten true.
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::WriteAutoLine() 
+{   
+   if(m_fAutoFileIsOpen == true)
+   {
+        fputs(cSdLine, m_FpAutoFile);
+        if (ferror (m_FpAutoFile))
+        {
+            clearerr(m_FpAutoFile);        
+            fclose(m_FpAutoFile);        
+            m_fAutoFileIsOpen = false;
+            return(false);
+        }
+        fflush(m_FpAutoFile);
+#ifdef RWFILE_DEBUG 
+     printf ("%s",cSdLine);
+#endif
+        return(true);
+   }
+  
+   return(false);
+}
+
+/*-----------------------------------------------------------------------------------------------
+CloseAutoFile: Schließt eine geöffnete Datei
+Returnwert ist true bei erfolgreichem Schliessen
+Returnwert ist false bei fehlerhaftem Schliessen
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::CloseAutoFile() 
+{
+    if(m_fAutoFileIsOpen == true)
+    {
+        clearerr(m_FpAutoFile);        
+        fflush(m_FpAutoFile); 
+        fclose(m_FpAutoFile);   //  Datei zu
+        m_fAutoFileIsOpen = false;
+        m_FpAutoFile = NULL;
+        return(true);  
+    }
+    return(false);  
+}
+
+
+// Methoden fuer das Schreiben von Automessdaten
+/*-----------------------------------------------------------------------------------------------
+OpenAutoFile: Öffnet eine Datei fuer den AutoStart
+Returnwert ist true bei erfolgreichem Öffnen
+Returnwert ist false bei fehlerhaftem Öffnen
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::OpenMwAutoFile(char *FName, char *OpenMode) 
+{
+    if(m_fMwAutoFileIsOpen == true)       // ist bereits geoeffnet oder wurde nicht geschlossen 
+    {
+#ifdef SEND_DEBUG_TO_HOST    
+		printf("MwAutoFileIsOpened\n");
+#endif
+		return(false);              // ist nur zur Sicherheit
+    }        
+	m_FpMwAutoFile = fopen(FName, OpenMode);   //  Datei im OpenMode öffnen
+   if(m_FpMwAutoFile == NULL)    // Fehler beim Öffnen der Datei, der wesentliche Grund ist, das die Datei nicht vorhanden ist. 
+                        // Die Konsequenz ist, daß die Quelldaten initialisiert werden müssen, eine Fehlermeldung muss nicht ausgegeben werden,
+                        // es dürfen jedoch keine weiteren Daten aus der Datei gelesen werden. 
+   {
+        return(false);
+   }
+   m_fMwAutoFileIsOpen = true;
+   
+   rewind(m_FpMwAutoFile);
+   return(true);    
+    
+}
+/*-----------------------------------------------------------------------------------------------
+WriteAutoLine: Schreibt eine Zeile in die geöffneten Auto Datei 
+Wenn beim Schreiben ein Fehler auftrifft, dann wird false zurückgegeben, ansonsten true.
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::WriteMwAutoLine() 
+{   
+   if(m_fMwAutoFileIsOpen == true)
+   {
+        fputs(strFileRwBuf, m_FpMwAutoFile);
+        if (ferror (m_FpMwAutoFile))
+        {
+            clearerr(m_FpMwAutoFile);        
+            fclose(m_FpMwAutoFile);        
+            m_fMwAutoFileIsOpen = false;
+            return(false);
+        }
+        return(true);
+   }
+   return(false);
+}
+/*-----------------------------------------------------------------------------------------------
+CloseAutoFile: Schließt die Auto Datei
+Returnwert ist true bei erfolgreichem Schliessen
+Returnwert ist false bei fehlerhaftem Schliessen
+-----------------------------------------------------------------------------------------------*/
+int StorageCard::CloseMwAutoFile() 
+{
+    if(m_fMwAutoFileIsOpen == true)
+    {
+        clearerr(m_FpMwAutoFile);        
+        fflush(m_FpMwAutoFile); 
+        fclose(m_FpMwAutoFile);   //  Datei zu
+        m_fMwAutoFileIsOpen = false;
+        m_FpMwAutoFile = NULL;
+        return(true);  
+    }
+    return(false);  
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SdCard/SdCard.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,71 @@
+/*-------------------------------------------------------------------------------------------------------------
+Program Name:   SDCard.h
+Version:        1.0
+Sprache:        C++
+Compiler:       mbed
+Autors:         UFa/PS
+
+Funktion:       Lesen und Schreiben der SD-Card
+
+History: 
+2018-02-02 UFa: Erstellung
+ 
+ --------------------------------------------------------------------------------------------------------------*/
+#ifndef SDCARD_H_
+#define SDCARD_H_
+
+class StorageCard 
+{
+    private:
+
+    public:
+
+    int Init(); 
+    int OpenFile(char *FName, char *OpenMode);
+    int OpenHeaderFile(char *FName, char *OpenMode);
+    int ReadLine(char *Dest, int MaxLen);
+    int WriteLine();
+    int WriteHeaderLine();
+    int CloseFile(); 
+    int CloseHeaderFile(); 
+    int RemoveFile(char *FileName);   // Datei löschen
+ 
+    int ReadFile(char *fName, char *DestBuf, int MaxLen);
+    int WriteFile(char *fName, char *SrcBuf);
+    int AppendSdValueToLine();
+
+	int OpenAutoFile(char *FName, char *OpenMode);
+    int ReadAutoLine(char *Dest, int MaxLen);
+    int WriteAutoLine();
+    int CloseAutoFile();
+
+	int OpenMwAutoFile(char *FName, char *OpenMode);
+    int ReadMwAutoLine(char *Dest, int MaxLen);
+    int WriteMwAutoLine();
+    int CloseMwAutoFile();
+
+//    STR_SD_CARD StrSdCard;   // Struktur zum Speichern der Daten  
+    
+    FILE    *m_Fp;
+    bool    m_fFileIsOpen;
+    FILE    *m_FpHeader;
+    bool    m_fHeaderIsOpen;
+	
+    FILE    *m_FpAutoFile;
+    bool    m_fAutoFileIsOpen;
+    
+    FILE    *m_FpMwAutoFile;
+    bool    m_fMwAutoFileIsOpen;
+
+    char cSdValue[128];
+    char cSdLine[512];
+    char MessFileName[128];
+    
+};
+
+
+#endif /* SDHCARD_H_ */
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SdCard/SdGlobals.cpp	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,110 @@
+/*-------------------------------------------------------------------------------------------------------------
+Program Name:   SDGlobals.cpp
+Version:        1.x
+Sprache:        C++
+Compiler:       mbed
+Autors:         UFa/PS
+
+Funktion:       Globale Variablen für die SD-Card Zugriffe
+
+Modified: 
+17.04.16 PS: entfernen der Stringklassen
+ 
+ --------------------------------------------------------------------------------------------------------------*/
+ 
+#include "mbed.h"
+
+#include <stdio.h>
+#include <algorithm>
+
+#include "SdGlobals.h"
+#include "SdCard.h"
+
+#include "SDBlockDevice.h"
+#include "FATFileSystem.h"
+
+// Globale Variablen und Klassen
+
+//SDFileSystem sd_x(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
+SDBlockDevice bd(
+        MBED_CONF_SD_SPI_MOSI,
+        MBED_CONF_SD_SPI_MISO,
+        MBED_CONF_SD_SPI_CLK,
+        MBED_CONF_SD_SPI_CS);
+        
+FATFileSystem fs("SDCard");        
+
+STR_FILE_NAMES FileNames;
+
+StorageCard clSdCard;
+STR_SD_CARD SdCard;  // Variablen Struktur fuer die SdCard
+
+char strFileRwBuf[512];
+
+
+bool g_SdInitSuccess;
+
+
+// Funktionen
+    
+/*-------------------------------------------------------------------------------------------------------*/
+/*--------------------------------------------------------------------------------------------------------
+Initialisieren der SD-FileSystem Klasse. 
+---------------------------------------------------------------------------------------------------------*/
+int InitSdFileSystem()
+{
+    int FReturn;
+    
+    FReturn = false;
+	InitFileNames();
+    
+    //   OLD  MySd = new SDFileSystem(PTE3, PTE1, PTE2, PTE4, "SDCard"); // MOSI, MISO, SCK, CS
+    //   OLD  MySd->disk_initialize();
+
+    g_SdInitSuccess = true;
+    if(g_SdInitSuccess == true)
+    {
+        // OLD Ret = CheckDiscStatus();
+        FReturn = true;
+    }
+    
+    InitclSdCard();
+    bd.init();
+    fs.mount(&bd);
+    return(FReturn);
+}
+/*--------------------------------------------------------------------------------------------------------
+InitFileNames: Zeichenfelder mit Dateinamen und Pfaden vorbelegen
+---------------------------------------------------------------------------------------------------------*/
+void InitFileNames()
+{
+	strcpy(FileNames.IniFileName,  "/SDCard/ecmini.CFG");
+	strcpy(FileNames.DevIdFileName,"/SDCard/DevIni.cfg");
+	strcpy(FileNames.ParaFileName, "/SDCard/cfg/parameters.CFG");
+	strcpy(FileNames.ConfigFileName,"/SDCard/cfg/config.CFG");
+	strcpy(FileNames.DataPathName,"/SDCard/data/");
+	strcpy(FileNames.SeqPathName,"/SDCard/scandat/");
+	strcpy(FileNames.FileReadMode,"r+");
+	strcpy(FileNames.FileWriteMode,"w+");
+	strcpy(FileNames.FileAppendMode,"a");
+	
+	strcpy(FileNames.AutoFileName,"/SDCard/autostart.CFG"); 
+}
+/*--------------------------------------------------------------------------------------------------------
+Initialisieren der SD-Card. Das Anlegen der 
+---------------------------------------------------------------------------------------------------------*/
+int CheckDiscStatus()
+{
+    // OLD return(MySd->disk_status());
+    return(true);
+}
+
+/*--------------------------------------------------------------------------------------------------------
+Initialisieren der eigenen SD-Card Klasse. 
+---------------------------------------------------------------------------------------------------------*/
+void InitclSdCard()
+{
+    clSdCard.Init();
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SdCard/SdGlobals.h	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,77 @@
+/*-------------------------------------------------------------------------------------------------------------
+Program Name:   SDGlobals.h
+Version:        1.x
+Sprache:        C++
+Compiler:       mbed
+Autors:         UFa/PS
+
+Funktion:       Globale Variablen für die SD-Card Zugriffe
+
+Modified: 
+2018-02-02 UFa: Initiale Erstellung
+ 
+ --------------------------------------------------------------------------------------------------------------*/
+
+// #define UF_EQUAL            "="
+#define BLANK               " "
+
+#define FILE_RW_BUF_LEN     512
+
+
+
+// Strukturen -------------------------------------
+/*===========================================================================
+Die nachfolgende Struktur dient zur Bearbeitung der SD-Card
+===========================================================================*/
+struct strSdCard
+{
+    int  MWString;
+//     char MethInfo[4];
+
+    char SeqFileName[128];   
+    char GenFile[128];  // wird für Sequenzmessung genommen
+
+};
+typedef struct strSdCard STR_SD_CARD;
+
+
+/*===========================================================================
+Die nachfolgende Struktur dient zur Speicherung der Dateinamen
+===========================================================================*/
+struct strFileNames
+{
+	char IniFileName[32];
+	char DevIdFileName[32];
+	char ParaFileName[32];
+	char ConfigFileName[32];
+	char DataPathName[32];
+	char SeqPathName[32];
+    char AutoFileName[32];  // Datei mit den Variablen fuer den Autostart
+	char FileReadMode[4];
+	char FileWriteMode[4];
+	char FileAppendMode[4];
+
+};
+typedef struct strFileNames STR_FILE_NAMES;
+
+
+
+
+
+// Variablen-------------------------------------
+
+extern class StorageCard clSdCard;
+extern STR_SD_CARD SdCard;  // Variablen Struktur fuer die SdCard
+extern STR_FILE_NAMES FileNames;
+
+extern bool g_SdInitSuccess;  // Fehler bei der Initialisierung der SD Karte, möglicherweise nicht gesteckt. 
+extern char strFileRwBuf[512]; // Lese und Schreibpuffer für Dateizugriffe
+
+
+
+// Funktionen -------------------------------------
+extern int InitSdFileSystem();
+extern int CheckDiscStatus();
+extern void InitclSdCard();
+extern void InitFileNames();
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-dev-OS5_10_4.lib	Fri Aug 07 07:24:21 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/kevman/code/mbed-dev-OS5_10_4/#7aab896b1a3b