Hardwaresimulation auf dem PC

Dependents:   Flaschenband

Revision:
0:9e2e2be03c7a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/VH.cpp	Mon Feb 28 12:14:02 2022 +0000
@@ -0,0 +1,141 @@
+#include "VH.h"
+
+char VH::gibZeichen(void)
+{
+    char c;
+    while (serial_port->readable()==false); 
+    serial_port->read(&c, 1); 
+    return c;
+}
+
+void VH::setZeichen(char c)
+{
+    while (serial_port->writable()==false);
+    serial_port->write(&c, 1);
+}
+void VH::eingabe(void)
+    { int i=0, pudr;
+        while(1)
+        {   
+            i=0;
+            if (serial_port->readable()) { // Chars received?
+                serial_port->read(buffer+i, 1); 
+                switch (buffer[0])
+                {
+                    case 14: 
+                        i++;
+                        buffer[i]=gibZeichen();
+                        i++;
+                        buffer[i]=gibZeichen();
+                        break;
+                    //9, 1, 2, 3 Input in PUDR
+                    case 9: //Setze Port P0 => PortA Low
+                        i++;
+                        buffer[i]=gibZeichen();  
+                        pudr=0;
+                        for (int j=0;j<8;j++)
+                        {
+                            pudr=pudr<<2;
+                            if ((buffer[i]&(1<<(7-j)))!=0) pudr|=0b01; else pudr|=0b10;   
+                        }
+                        pudr&=~0b11110011;
+                        GPIOA->PUPDR=(GPIOA->PUPDR&0xFFFF00F3)|pudr;                     
+                        break;
+                    case 1: //Setze Port P1  => PortC Low
+                        i++; 
+                        buffer[i]=gibZeichen();  
+                        pudr=0;
+                        for (int j=0;j<8;j++)
+                        {
+                            pudr=pudr<<2;
+                            if ((buffer[i]&(1<<(7-j)))!=0) pudr|=0b01; else pudr|=0b10;   
+                        }
+                        GPIOC->PUPDR=(GPIOC->PUPDR&0xFFFF0000)|pudr;                                         
+                        break;
+                    case 2: //Setze Port P2  => PortB Low
+                        i++; 
+                        buffer[i]=gibZeichen();
+                        pudr=0;
+                        for (int j=0;j<8;j++)
+                        {
+                            pudr=pudr<<2;
+                            if ((buffer[i]&(1<<(7-j)))!=0) pudr|=0b01; else pudr|=0b10;   
+                        }
+                        GPIOB->PUPDR=(GPIOB->PUPDR&0xFFFF0000)|pudr;               
+                        break;
+                    case 3: //Setze Port P3 => PortA High
+                        i++;
+                        buffer[i]=gibZeichen();
+                        pudr=0;
+                        for (int j=0;j<8;j++)
+                        {
+                            pudr=pudr<<2;
+                            if ((buffer[i]&(1<<(7-j)))!=0) pudr|=0b01; else pudr|=0b10;   
+                        }
+                        pudr&=~0b0000111100000000;
+                        GPIOA->PUPDR=(GPIOA->PUPDR&0x0F00FFFF)|pudr<<16;                         
+                        break;
+                    case 8: //lese P0
+                        break;
+                    case 5: //lese P1 (PortC)
+                        break;
+                    case 6: //lese P2
+                        break;
+                    case 7: //lese P3
+                        break;
+                }
+                
+                ausgabe(buffer[0]);
+            }
+        }
+    }
+    void VH::ausgabe(char nr)
+    {
+
+        a=buffer[0];
+        b=buffer[1];
+        c=buffer[2];
+        switch(nr)
+        {
+            case 14:
+
+                outbuffer[0]=14;
+                outbuffer[1]=1;
+                outbuffer[3]=0;
+                for (int i=0; i<3;i++) setZeichen(outbuffer[i]);
+                break;
+            case 9: //Setze Port P0 => PortA Low
+            case 1: //Setze Port P1  => PortC Low
+            case 2: //Setze Port P2  => PortB Low
+            case 3: //Setze Port P3 => PortA High
+                for (int i=0; i<2;i++) setZeichen(buffer[i]);
+                break;
+            case 8: //lese P0 = PortA Low
+                outbuffer[0]=buffer[0];
+                outbuffer[1]=GPIOA->IDR&0xFF;
+                for (int i=0; i<2;i++) setZeichen(outbuffer[i]);
+                break;
+            case 5: //lese P1 = PortC Low
+                outbuffer[0]=buffer[0];
+                outbuffer[1]=GPIOC->ODR&0xFF;
+                for (int i=0; i<2;i++) setZeichen(outbuffer[i]);
+                break;
+            case 6: //lese P2 = PortB Low
+                outbuffer[0]=buffer[0];
+                outbuffer[1]=GPIOB->IDR&0xFF;
+                for (int i=0; i<2;i++) setZeichen(outbuffer[i]);
+                break;
+            case 7: //lese P3 = PortA High
+                outbuffer[0]=buffer[0];
+                outbuffer[1]=(GPIOA->IDR>>8)&0xFF;
+                for (int i=0; i<2;i++) setZeichen(outbuffer[i]);
+                break;
+            
+        }
+    }
+    VH::VH(void)
+    {
+        serial_port=new BufferedSerial(USBTX, USBRX);
+        warteAufEingabe=new Thread();
+        warteAufEingabe->start(callback(this,&VH::eingabe));
+    }
\ No newline at end of file