Hardwaresimulation auf dem PC

Dependents:   Flaschenband

VH.cpp

Committer:
jack1930
Date:
2022-02-28
Revision:
0:9e2e2be03c7a

File content as of revision 0:9e2e2be03c7a:

#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));
    }