Test CBS-GPIO
Dependencies: mbed
Fork of Amplificatore_bomboni_rev2 by
Diff: CBS-GPIO.cpp
- Revision:
- 8:a7257fd80953
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CBS-GPIO.cpp Fri Jul 27 12:43:16 2018 +0000 @@ -0,0 +1,414 @@ +// Tested : NUCLEO-F401RE NUCLEO-L476LG +#include "mbed.h" +#include<stdlib.h> + +// dimensione del pacchetto di comunicazione tra PC e uC +#define PACKETDIM 64 + +// comando di Read GPIO +#define READGPIO "Read-GPIO" +// Definizione periferiche +Serial pc(USBTX, USBRX); + +// User Button, LED +DigitalIn myButton(USER_BUTTON); +// Output di servizio sul LED2 della scheda NUCLEO +DigitalOut myLed(LED2); + +// Output della NUCLEO e Input del DUT. Saranno inviati dal PC alla NUCLEO, nell'ordine in cui si trovano dichiarati di seguito +DigitalOut myOut1(PA_13); +DigitalOut myOut2(PA_14); +DigitalOut myOut3(PA_15); + +// Input della NUCLEO e Output del DUT. Saranno inviati dalla NUCLEO al PC, nell'ordine in cui si trovano dichiarati di seguito +DigitalIn myIn1(PA_8); //PA_8 PC_14 +DigitalIn myIn2(PB_10); //PB_10 PC_15 +DigitalIn myIn3(PB_4); //PB_4 PH_0 +DigitalIn myIn4(PB_5); //PB_5 PH_1 +DigitalIn myIn5(PB_3); //PB_3 PD_2 +//DigitalIn myService(PB_3); + + +// indice per i cicli +int nIndex; + + +// comando ricevuto dal PC attraverso la routine di gestione interrupt Rx +// 1: read all GPIO +// 2: write all GPIO +volatile int nReadCmd=0; + +// stato degli input +volatile int myIn1Status; +volatile int myIn2Status; +volatile int myIn3Status; +volatile int myIn4Status; +volatile int myIn5Status; + + + +//********************************************** +// IRQ per la Rx su seriale +//********************************************** +void RxInterrupt(void) +{ + // array per la ricezione dei messaggi da seriale + char caRxPacket[PACKETDIM]; + int nRxPacketSize; + + + + // pntatore al comando, nella stringa ricevuta sulla seriale + char* cCmdPosition; + + // reset array contenente pacchetto ricevuto + nIndex=0; + for(nIndex=0;nIndex<PACKETDIM;nIndex++) + { + caRxPacket[nIndex]='\0'; + } + + // ricevi caratteri su seriale, se disponibili + nRxPacketSize =0; + while((pc.readable())) + { + // acquisice stringa in input e relativa dimensione + pc.scanf("%s", &caRxPacket); + nRxPacketSize = strlen(caRxPacket); + } + // restituisce il comando ricevuto e la dimensione + pc.printf("Command: %s\n\r",caRxPacket); + pc.printf("PacketSize: %d\n\r",nRxPacketSize); + + // confronta il comando ricevuto con quello di Read GPIO + nReadCmd = strcmp(caRxPacket, "ReadGPIO"); + if(nReadCmd==0) + { + // rileva lo stato degli input e trasmettili al PC-HOST + pc.printf("USER-BUTTON: %d\n\r",myButton.read()); // il primo input è lo User-Button per scopi di diagnostica + // myIn1: se legge 0/1, trasmette lo stato al PC + if(myIn1==1) + { + pc.printf("In1: 1\n\r"); + } + else + { + pc.printf("In1: 0\n\r"); + } + + // myIn2: se legge 0/1, trasmette lo stato al PC + if(myIn2==1) + { + pc.printf("In2: 1\n\r"); + } + else + { + pc.printf("In2: 0\n\r"); + } + // myIn3: se legge 0/1, trasmette lo stato al PC + if(myIn3==1) + { + pc.printf("In3: 1\n\r"); + } + else + { + pc.printf("In3: 0\n\r"); + } + // myIn4: se legge 0/1, trasmette lo stato al PC + if(myIn4==1) + { + pc.printf("In4: 1\n\r"); + } + else + { + pc.printf("In4: 0\n\r"); + } + + // myIn5: se legge 0/1, trasmette lo stato al PC + if(myIn5==1) + { + pc.printf("In5: 1\n\r"); + } + else + { + pc.printf("In5: 0\n\r"); + } + } + else + { + // verifica se nel comando ricevuto si trova la stringa WriteGPIO + cCmdPosition=strstr(caRxPacket, "WriteGPIO"); + if(cCmdPosition != NULL) // se il comando ricevuto contiene WriteGPIO, procedi con l'analisi dei dati + { + // si posiziona sul delimitatore '-' , tra il comando e i dati ed estrae la stringa contenente lo stato da inviare sugli Output + cCmdPosition = strtok(caRxPacket,"-"); + cCmdPosition = strtok(NULL,"-"); + pc.printf("Data: %s\n\r", cCmdPosition); + + // USER_LED LED2 se il dato ricevto è '0/1' spegni/accendi il LED + if(cCmdPosition[0]=='1') + { + // accendi LED e comunica al PC + pc.printf("Led2: ON\n\r"); + myLed = 1; + } + else + { + // spegni LED e comunica al PC + pc.printf("Led2: OFF\n\r"); + myLed = 0; + } + + // Out1: se il dato ricevto è '0/1' spegni/accendi l'output + if(cCmdPosition[1]=='1') + { + // accendi Out1 e comunica al PC + pc.printf("Out1: ON\n\r"); + myOut1 = 1; + } + else + { + // spegni Out1 e comunica al PC + pc.printf("Out1: OFF\n\r"); + myOut1 = 0; + } + + // Out2: se il dato ricevto è '0/1' spegni/accendi l'output + if(cCmdPosition[2]=='1') + { + // accendi Out2 e comunica al PC + pc.printf("Out2: ON\n\r"); + myOut2 = 1; + } + else + { + // spegni Out2 e comunica al PC + pc.printf("Out2: OFF\n\r"); + myOut2 = 0; + } + + // Out3: se il dato ricevto è '0/1' spegni/accendi l'output + if(cCmdPosition[3]=='1') + { + // accendi Out3 e comunica al PC + pc.printf("Out3: ON\n\r"); + myOut3 = 1; + } + else + { + // spegni Out3 e comunica al PC + pc.printf("Out3: OFF\n\r"); + myOut3 = 0; + } + } + } +} + +//********************************************** +// IRQ per la Rx su seriale +//********************************************** +int main() +{ + // array per la ricezione dei messaggi da seriale + char caRxPacket[PACKETDIM]; + int nRxPacketSize; + + + + // pntatore al comando, nella stringa ricevuta sulla seriale + char* cCmdPosition; + + + // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto + //pc.baud(56000); // 57600 bps + pc.baud(9600); // 9600 bps + //pc.baud(19200); // 19200 bps + //pc.baud(57600); // a questa velocità CVI sulla USB del PC perde dei dati + //pc.baud(921600); // a questa velocità CVI sulla USB del PC perde dei dati + + // inizializza il LED + myLed = 1; + wait(1); + myLed = 0; + + // configura il Button come input PullUp. Non premuto = 1, Premuto = 0; + myButton.mode(PullUp); + + // configura gli input come PullUp. Aperto = 1; + + myIn1.mode(PullUp); + myIn2.mode(PullUp); + myIn3.mode(PullUp); + myIn4.mode(PullUp); + myIn5.mode(PullUp); + + //myService.mode(PullUp); + + // Attiva la IRQ per la RX su seriale + pc.attach(&RxInterrupt,Serial::RxIrq); + /* + while (true) + { + if( (myIn1 == 1) && (myIn2 == 1) && (myIn3 == 1) && (myIn4 == 1) && (myIn5 == 1) ) + { + myLed = 1; + } + else + { + myLed = 0; + } + pc.printf("Status: %d %d %d %d %d\n\r",myIn1.read(), myIn2.read(), myIn3.read(), myIn4.read(), myIn5.read()); + } + */ + + // ciclo in cui attende interrupt + while(true) + { + /* + if(pc.readable()) + { + // reset array contenente pacchetto ricevuto + nIndex=0; + for(nIndex=0;nIndex<PACKETDIM;nIndex++) + { + caRxPacket[nIndex]='\0'; + } + + // ricevi caratteri su seriale, se disponibili + nRxPacketSize =0; + while((pc.readable())) + { + // acquisice stringa in input e relativa dimensione + pc.scanf("%s", &caRxPacket); + nRxPacketSize = strlen(caRxPacket); + } + // restituisce il comando ricevuto e la dimensione + pc.printf("Command: %s\n\r",caRxPacket); + pc.printf("PacketSize: %d\n\r",nRxPacketSize); + + // confronta il comando ricevuto con quello di Read GPIO + nReadCmd = strcmp(caRxPacket, "ReadGPIO"); + if(nReadCmd==0) + { + // rileva lo stato degli input e trasmettili al PC-HOST + pc.printf("USER-BUTTON: %d\n\r",myButton.read()); // il primo input è lo User-Button per scopi di diagnostica + // myIn1: se legge 0/1, trasmette lo stato al PC + if(myIn1.read()== 0x01) + { + pc.printf("In1: 1\n\r"); + } + else + { + pc.printf("In1: 0\n\r"); + } + + // myIn2: se legge 0/1, trasmette lo stato al PC + if(myIn2.read()== 0x01) + { + pc.printf("In2: 1\n\r"); + } + else + { + pc.printf("In2: 0\n\r"); + } + // myIn3: se legge 0/1, trasmette lo stato al PC + if(myIn3.read()== 0x01) + { + pc.printf("In3: 1\n\r"); + } + else + { + pc.printf("In3: 0\n\r"); + } + // myIn4: se legge 0/1, trasmette lo stato al PC + if(myIn4.read()== 0x01) + { + pc.printf("In4: 1\n\r"); + } + else + { + pc.printf("In4: 0\n\r"); + } + + // myIn5: se legge 0/1, trasmette lo stato al PC + if(myIn5.read()== 0x01) + { + pc.printf("In5: 1\n\r"); + } + else + { + pc.printf("In5: 0\n\r"); + } + } + else + { + // verifica se nel comando ricevuto si trova la stringa WriteGPIO + cCmdPosition=strstr(caRxPacket, "WriteGPIO"); + if(cCmdPosition != NULL) // se il comando ricevuto contiene WriteGPIO, procedi con l'analisi dei dati + { + // si posiziona sul delimitatore '-' , tra il comando e i dati ed estrae la stringa contenente lo stato da inviare sugli Output + cCmdPosition = strtok(caRxPacket,"-"); + cCmdPosition = strtok(NULL,"-"); + pc.printf("Data: %s\n\r", cCmdPosition); + + // USER_LED LED2 se il dato ricevto è '0/1' spegni/accendi il LED + if(cCmdPosition[0]=='1') + { + // accendi LED e comunica al PC + pc.printf("Led2: ON\n\r"); + myLed = 1; + } + else + { + // spegni LED e comunica al PC + pc.printf("Led2: OFF\n\r"); + myLed = 0; + } + + // Out1: se il dato ricevto è '0/1' spegni/accendi l'output + if(cCmdPosition[1]=='1') + { + // accendi Out1 e comunica al PC + pc.printf("Out1: ON\n\r"); + myOut1 = 1; + } + else + { + // spegni Out1 e comunica al PC + pc.printf("Out1: OFF\n\r"); + myOut1 = 0; + } + + // Out2: se il dato ricevto è '0/1' spegni/accendi l'output + if(cCmdPosition[2]=='1') + { + // accendi Out2 e comunica al PC + pc.printf("Out2: ON\n\r"); + myOut2 = 1; + } + else + { + // spegni Out2 e comunica al PC + pc.printf("Out2: OFF\n\r"); + myOut2 = 0; + } + + // Out3: se il dato ricevto è '0/1' spegni/accendi l'output + if(cCmdPosition[3]=='1') + { + // accendi Out3 e comunica al PC + pc.printf("Out3: ON\n\r"); + myOut3 = 1; + } + else + { + // spegni Out3 e comunica al PC + pc.printf("Out3: OFF\n\r"); + myOut3 = 0; + } + } + } + } + */ + } +} \ No newline at end of file