HAPO WS22 / Mbed 2 deprecated HAPO_WS22_Labor3_final

Dependencies:   mbed

Revision:
14:88379565eac6
Parent:
13:b1d6b2285b13
Child:
15:bbcf8c3f91c5
--- a/main.cpp	Sun Dec 04 16:29:52 2022 +0000
+++ b/main.cpp	Sun Dec 04 21:44:45 2022 +0000
@@ -100,6 +100,10 @@
 * Description : Timer für Taste S3
 */
 
+byte bSCounter; /*
+* Description : Zähler UART-Auslese für Tasterersatz
+*/
+
 byte bDisplayState; /*
 * Description : 
 */
@@ -173,17 +177,23 @@
 */
 
 word wVorgabeWert; /*
-* Description : engestellter Vorgabewert
+* Description : eingestellter Vorgabewert
 */
 
 int nDiffWert; /*
 * Description : Differenz zwischen Vorgabe und Eingang
 */
 
+word wSizeData; /*
+* Description : Größe der empfangenen Daten
+*/
+
+int zaeler;
+
 /* Bitmuster */
 const byte abZiffer[] = {nZiffer0, nZiffer1, nZiffer2, nZiffer3, nZiffer4, nZiffer5, nZiffer6, nZiffer7, nZiffer8, nZiffer9, nZifferA, nZifferB, nZifferC, nZifferD, nZifferE, nZifferF, nZifferOff};
 //const byte abBargraph[] = {~Bit0, ~(Bit0|Bit1), ~(Bit0|Bit1|Bit2), ~(Bit0|Bit1|Bit2|Bit3), 0x0f};
-byte abString[12];
+byte abTxBuffer[256];
 
 
 
@@ -244,56 +254,20 @@
     pinBeep = 1;
     wVorgabeWert = 0;
 }
-/*
-void vSetRunClock( void )
-{
-    wClockTime = 0;
-    bDigit = 0;
-    abDisplayMemory[0] = 16; 7-Segment-Display ausschalten 
-    abDisplayMemory[1] = 0;
-    abDisplayMemory[2] = 0;
-    abDisplayMemory[3] = 0;
-    bDisplayState = enRunClock;
-}
-*/
-/*
-byte bCheckTasten( byte bState )
-{
-    if((pinS1 == 0) || (pinS2 == 0) || (pinS3 == 0)) {  Tastendruck erkannt 
-        wClockShow = 1200;
-        if((pinS1 == 0) && (bHotKey == 0)) {
-            wDelayGame = 0;
-            bState = enShowResult;
-            bDisplayState = enShowResult;
-        } else if((pinS2 == 0) && (bHotKey == 1)) {
-            wDelayGame = 0;
-            bState = enShowResult;
-            bDisplayState = enShowResult;
-        } else if((pinS3 == 0) && (bHotKey == 2)) {
-            wDelayGame = 0;
-            bState = enShowResult;
-            bDisplayState = enShowResult;
-        } else {
-            wDelayGame = 200;
-            abDisplayMemory[1] = 15;
-            abDisplayMemory[2] = 15;
-            abDisplayMemory[3] = 15;
-            bState = enShowError;
-            bDisplayState = enShowResult;
-            pinBeep = 0;
-        }
-    }
-    return bState;
-}
-*/
+
 /* Tastenabfrage */
 void vTasteS1( void ){
-    if(pinS1 == 0){                             /* User-Taste gedrückt */
-        if(bS1Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
+    if(pinS1 == 0 || abTxBuffer[0] == 'a'){                             /* User-Taste gedrückt */
+        
+        for(zaeler=0; zaeler<=250; zaeler++){                                      /*Zaehlen der Tastatur-Eingabe*/
+            if(abTxBuffer[zaeler] == 'a') bSCounter++;
+        }
+        
+        if(bS1Timer < nTastLong+1 || bSCounter < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
             if(bS1Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
                 //...
                 }
-            if(bS1Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
+            if(bS1Timer == nTastLong || bSCounter == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
                 if(bDisplayState == enSchwellenwert || bDisplayState == enPotiAnzeige){
                     bDisplayState = enVergleich;
                     bMainState = enVergleich;
@@ -307,7 +281,7 @@
             }
         }
     else{                                       /* Taste nicht gedrückt */ 
-        if((bS1Timer >= nTastShort) && (bS1Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
+        if(((bS1Timer >= nTastShort) && (bS1Timer <= nTastLong)) || ((bSCounter >= nTastShort) && (bSCounter <= nTastLong))){             /* Taste wurde bereits erkannt */
             if(bDisplayState == enSchwellenwert){
                     bDisplayState = enPotiAnzeige; 
                     bMainState = enPotiAnzeige;
@@ -318,16 +292,22 @@
                     }
             }
         bS1Timer = 0;
+        bSCounter = 0;
         }
     } 
 
 void vTasteS2( void ){
-    if(pinS2 == 0 && bMainState == enSchwellenwert){                             /* User-Taste gedrückt */
-        if(bS2Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
+    if((pinS2 == 0 || abTxBuffer[0] == '+') && bMainState == enSchwellenwert){                             /* User-Taste gedrückt */
+    
+        for(zaeler=0; zaeler<=250; zaeler++){                                      /*Zählen der Tastatur-Eingabe*/
+            if(abTxBuffer[zaeler] == '+') bSCounter++;
+        }
+    
+        if(bS2Timer < nTastLong+1 || bSCounter < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
             if(bS2Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
                 //...
                 }
-            if(bS2Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
+            if(bS2Timer == nTastLong || bSCounter == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
                 bTimeLong = 1;
                 if(wVorgabeWert >=3200) wVorgabeWert = 3300;
                 else wVorgabeWert = wVorgabeWert + 100;
@@ -337,24 +317,30 @@
             }
         }
     else{                                       /* Taste nicht gedrückt */ 
-        if((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
+        if(((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)) || ((bSCounter >= nTastShort) && (bSCounter <= nTastLong))){             /* Taste wurde bereits erkannt */
             if(bTimeLong==0){
                 if(wVorgabeWert >=3290) wVorgabeWert = 3300;
                 else wVorgabeWert = wVorgabeWert + 10;
             }
             }
         bS2Timer = 0;
-        bTimeLong= 0;
+        bTimeLong = 0;
+        bSCounter = 0;
         }
     } 
 
 void vTasteS3( void ){
-    if(pinS3 == 0 && bMainState == enSchwellenwert){                             /* User-Taste gedrückt */
-        if(bS3Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
+    if((pinS3 == 0 || abTxBuffer[0] == '-') && bMainState == enSchwellenwert){                             /* User-Taste gedrückt */
+    
+        for(zaeler=0; zaeler<=250; zaeler++){                                      /*Zählen der Tastatur-Eingabe*/
+            if(abTxBuffer[zaeler] == '-') bSCounter++;
+        }
+    
+        if(bS3Timer < nTastLong+1 || bSCounter < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
             if(bS3Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
                 //...
                 }
-            if(bS3Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
+            if(bS3Timer == nTastLong || bSCounter == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
                 bTimeLong = 1;
                 if(wVorgabeWert <=100) wVorgabeWert = 0;
                 else wVorgabeWert = wVorgabeWert - 100;
@@ -364,14 +350,15 @@
             }
         }
     else{                                       /* Taste nicht gedrückt */ 
-        if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
+        if(((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)) || ((bSCounter >= nTastShort) && (bSCounter <= nTastLong))){             /* Taste wurde bereits erkannt */
             if(bTimeLong==0){
                 if(wVorgabeWert <=10) wVorgabeWert = 0;
                 else wVorgabeWert = wVorgabeWert - 10;
             }
             }
         bS3Timer = 0;
-        bTimeLong= 0;
+        bTimeLong = 0;
+        bSCounter = 0;
         }
     } 
 
@@ -422,11 +409,49 @@
 
 
 
-
 Serial stComX(D1,D0); /* UART-Kommunikation (Txd(D1)/Rxd(D0)) mit dem PC */
  
+ 
+byte SYS_vStartComX( word wSize, byte *pData ){ /* Start einer Übertragung */
+byte i;
+if(wSizeData) i = False;
+else{
+wSizeData = wSize; /* Anzahl der Sendedaten */
+pUartData = pData; /* Zeiger auf diese Daten */
+stComX.putc(*pUartData); /* erstes Zeichen senden */
+pUartData++;
+wSizeData--;
+USART2->CR1 |= USART_CR1_TXEIE; /* TXE-Interrupt freigeben */
+i = True;
+}
+return i;
+}
 
 
+/* Senderoutine zum COM-Port am PC */
+void vIsrTxComX( void ){ /* Senderoutine */
+if(stComX.writeable()){ /* Sende-ISR */
+if(bSizeData){ /* sind Daten vorhanden ? */
+stComX.putc(*pUartData); /* daten senden */
+pUartData++;
+bSizeData--;
+}
+else{
+USART2->CR1 &= ~USART_CR1_TXEIE; /* Interrupt sperren */
+}
+}
+}
+
+
+/* Empfangsroutine vom COM-Port des PC */
+void vIsrRxComX( void ){ /* Empfangsroutine */
+if(stComX.readable()){ /* Empfangs-ISR */
+abTxBuffer[0] = stComX.getc();
+abTxBuffer[0] = abTxBuffer[0] + 1;
+SYS_vStartComX(1, &abTxBuffer[0]);
+}
+}
+
 
 
 
@@ -441,18 +466,21 @@
 int main() {
     /* Variablen initialisieren */    
     vSetForStart();
-    Seriel.begin(9600);
-    
-    
-    stComX.attach(&vIsrRxComX, Serial::RxIrq); /* ISR zum Datemempfang vom PC */
-    stComX.attach(&vIsrTxComX, Serial::TxIrq); /* Sende-ISR */
 
 
+    //Seriel.begin(9600);
     
+   
     while(1) {    
         wPotiWert = pinPoti*3300;  
         vCheckTasten();
         nDiffWert = wVorgabeWert - wPotiWert;
+        
+        
+        stComX.attach(&vIsrRxComX, Serial::RxIrq); /* ISR zum Datemempfang vom PC */
+        stComX.attach(&vIsrTxComX, Serial::TxIrq); /* Sende-ISR */
+    
+    
         switch(bMainState) {
             case enSchwellenwert:
                 pinBeep = 1;