Hardwaresimulation auf dem PC

Dependents:   Flaschenband

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers VH.cpp Source File

VH.cpp

00001 #include "VH.h"
00002 
00003 char VH::gibZeichen(void)
00004 {
00005     char c;
00006     while (serial_port->readable()==false); 
00007     serial_port->read(&c, 1); 
00008     return c;
00009 }
00010 
00011 void VH::setZeichen(char c)
00012 {
00013     while (serial_port->writable()==false);
00014     serial_port->write(&c, 1);
00015 }
00016 void VH::eingabe(void)
00017     { int i=0, pudr;
00018         while(1)
00019         {   
00020             i=0;
00021             if (serial_port->readable()) { // Chars received?
00022                 serial_port->read(buffer+i, 1); 
00023                 switch (buffer[0])
00024                 {
00025                     case 14: 
00026                         i++;
00027                         buffer[i]=gibZeichen();
00028                         i++;
00029                         buffer[i]=gibZeichen();
00030                         break;
00031                     //9, 1, 2, 3 Input in PUDR
00032                     case 9: //Setze Port P0 => PortA Low
00033                         i++;
00034                         buffer[i]=gibZeichen();  
00035                         pudr=0;
00036                         for (int j=0;j<8;j++)
00037                         {
00038                             pudr=pudr<<2;
00039                             if ((buffer[i]&(1<<(7-j)))!=0) pudr|=0b01; else pudr|=0b10;   
00040                         }
00041                         pudr&=~0b11110011;
00042                         GPIOA->PUPDR=(GPIOA->PUPDR&0xFFFF00F3)|pudr;                     
00043                         break;
00044                     case 1: //Setze Port P1  => PortC Low
00045                         i++; 
00046                         buffer[i]=gibZeichen();  
00047                         pudr=0;
00048                         for (int j=0;j<8;j++)
00049                         {
00050                             pudr=pudr<<2;
00051                             if ((buffer[i]&(1<<(7-j)))!=0) pudr|=0b01; else pudr|=0b10;   
00052                         }
00053                         GPIOC->PUPDR=(GPIOC->PUPDR&0xFFFF0000)|pudr;                                         
00054                         break;
00055                     case 2: //Setze Port P2  => PortB Low
00056                         i++; 
00057                         buffer[i]=gibZeichen();
00058                         pudr=0;
00059                         for (int j=0;j<8;j++)
00060                         {
00061                             pudr=pudr<<2;
00062                             if ((buffer[i]&(1<<(7-j)))!=0) pudr|=0b01; else pudr|=0b10;   
00063                         }
00064                         GPIOB->PUPDR=(GPIOB->PUPDR&0xFFFF0000)|pudr;               
00065                         break;
00066                     case 3: //Setze Port P3 => PortA High
00067                         i++;
00068                         buffer[i]=gibZeichen();
00069                         pudr=0;
00070                         for (int j=0;j<8;j++)
00071                         {
00072                             pudr=pudr<<2;
00073                             if ((buffer[i]&(1<<(7-j)))!=0) pudr|=0b01; else pudr|=0b10;   
00074                         }
00075                         pudr&=~0b0000111100000000;
00076                         GPIOA->PUPDR=(GPIOA->PUPDR&0x0F00FFFF)|pudr<<16;                         
00077                         break;
00078                     case 8: //lese P0
00079                         break;
00080                     case 5: //lese P1 (PortC)
00081                         break;
00082                     case 6: //lese P2
00083                         break;
00084                     case 7: //lese P3
00085                         break;
00086                 }
00087                 
00088                 ausgabe(buffer[0]);
00089             }
00090         }
00091     }
00092     void VH::ausgabe(char nr)
00093     {
00094 
00095         a=buffer[0];
00096         b=buffer[1];
00097         c=buffer[2];
00098         switch(nr)
00099         {
00100             case 14:
00101 
00102                 outbuffer[0]=14;
00103                 outbuffer[1]=1;
00104                 outbuffer[3]=0;
00105                 for (int i=0; i<3;i++) setZeichen(outbuffer[i]);
00106                 break;
00107             case 9: //Setze Port P0 => PortA Low
00108             case 1: //Setze Port P1  => PortC Low
00109             case 2: //Setze Port P2  => PortB Low
00110             case 3: //Setze Port P3 => PortA High
00111                 for (int i=0; i<2;i++) setZeichen(buffer[i]);
00112                 break;
00113             case 8: //lese P0 = PortA Low
00114                 outbuffer[0]=buffer[0];
00115                 outbuffer[1]=GPIOA->IDR&0xFF;
00116                 for (int i=0; i<2;i++) setZeichen(outbuffer[i]);
00117                 break;
00118             case 5: //lese P1 = PortC Low
00119                 outbuffer[0]=buffer[0];
00120                 outbuffer[1]=GPIOC->ODR&0xFF;
00121                 for (int i=0; i<2;i++) setZeichen(outbuffer[i]);
00122                 break;
00123             case 6: //lese P2 = PortB Low
00124                 outbuffer[0]=buffer[0];
00125                 outbuffer[1]=GPIOB->IDR&0xFF;
00126                 for (int i=0; i<2;i++) setZeichen(outbuffer[i]);
00127                 break;
00128             case 7: //lese P3 = PortA High
00129                 outbuffer[0]=buffer[0];
00130                 outbuffer[1]=(GPIOA->IDR>>8)&0xFF;
00131                 for (int i=0; i<2;i++) setZeichen(outbuffer[i]);
00132                 break;
00133             
00134         }
00135     }
00136     VH::VH(void)
00137     {
00138         serial_port=new BufferedSerial(USBTX, USBRX);
00139         warteAufEingabe=new Thread();
00140         warteAufEingabe->start(callback(this,&VH::eingabe));
00141     }