Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed-dev-OS5_10_4
Revision 0:014fad4dfb9d, committed 2020-08-07
- Comitter:
- kevman
- Date:
- Fri Aug 07 07:24:21 2020 +0000
- Commit message:
- Test
Changed in this revision
--- /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