Test CBS-GPIO-CAN
Dependencies: mbed
Fork of Amplificatore_bomboni_rev2 by
Diff: CBS-GPIO_CAN.cpp
- Revision:
- 8:3c919f5d6036
diff -r cc303710b1bc -r 3c919f5d6036 CBS-GPIO_CAN.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CBS-GPIO_CAN.cpp Fri Jul 27 14:27:58 2018 +0000 @@ -0,0 +1,405 @@ +// Tested : NUCLEO-F401RE NUCLEO-L476LG +#include "mbed.h" +#include<stdlib.h> + +// dimensione del pacchetto di comunicazione tra PC e uC +#define PACKETDIM 64 + +// Definizione periferiche +Serial pc(USBTX, USBRX); + +// User Button, LED +DigitalIn myButton(USER_BUTTON); + +// Output di servizio sul LED2 della scheda NUCLEO +DigitalOut myLed1(LED1); +DigitalOut myLed2(LED2); +DigitalOut myLed3(LED3); + +// 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); + +DigitalOut myTest(PG_2); + +// 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); +DigitalIn myIn2(PB_10); +DigitalIn myIn3(PB_4); +DigitalIn myIn4(PB_5); +DigitalIn myIn5(PB_3); + +// Output di pilotaggio Relè per test CANBUS +DigitalOut myRelayH1(PB_6); +DigitalOut myRelayL1(PC_7); +DigitalOut myNotRelayH2(PA_9); // A questo Output è collegato un OptoRelay normalmente chiuso e quindi lavora in logica negata +DigitalOut myNotRelayL2(PA_10); // A questo Output è collegato un OptoRelay normalmente chiuso e quindi lavora in logica negata +DigitalOut myNotRelayH3(PB_8); // A questo Output è collegato un OptoRelay normalmente chiuso e quindi lavora in logica negata +DigitalOut myRelayL3(PB_9); + + +// 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); + + // COMANDO DI LETTURA INPUT: comando di lettura dei GPIO è "ReadGPIO" + // confronta il comando ricevuto con quello di Read GPIO. + // Restituisce le seguenti stringhe: + // "USER-BUTTON: x"; x = 0/1 + // "In1: 0/1"; x = 0/1 + // "In2: 0/1"; x = 0/1 + // "In3: 0/1"; x = 0/1 + // "In4: 0/1"; x = 0/1 + // "In5: 0/1"; x = 0/1 + 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"); + } + } // if comando ricevuto == ReadGPIO + else + { + // COMANDO PILOTAGGIO OUTPUT: il comando di pilotaggio output è composto da WriteGPIO-abcd + // a=1/0: accende/spegne il LED di diagnostica LED2 + // b=1/0: Out1 = 1/0 + // c=1/0: Out1 = 1/0 + // d=1/0: Out1 = 1/0 + // 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"); + myLed2 = 1; + } + else + { + // spegni LED e comunica al PC + pc.printf("Led2: OFF\n\r"); + myLed2 = 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; + } + } // if (comando ricevuto contiene "WriteGPIO") + + + // COMANDO DI PILOTAGGIO CANBUS: Il comando ricevuto per il pilotaggio CANBUS è "CAN-abcd" + // a=1/0: accende/spegne il LED di diagnostica LED2 + // b=1/0: chiude/apre i relay del connettore 1: Relay11 e Relay12 + // c=1/0: chiude/apre i relay del connettore 2: Relay21 e Relay22 + // d=1/0: chiude/apre i relay del connettore 3: Relay31 e Relay32 + // verifica se nel comando ricevuto è presente la strinca CAN; + cCmdPosition=strstr(caRxPacket, "CAN"); + if(cCmdPosition != NULL) // se il comando ricevuto contiene CAN, 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("CAN-Data: %s\n\r", cCmdPosition); + + // Resetta: per commutare, apre tutti i relay di commutazione del CANBUS. Negli if() successivi aprirà i canali indirizzati + myRelayH1 = 0; + myRelayL1 = 0; + myNotRelayH2 = 1; + myNotRelayL2 = 1; + myNotRelayH3 = 1; + myRelayL3 = 0; + + // 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"); + myLed2 = 1; + } + else + { + // spegni LED e comunica al PC + pc.printf("Led2: OFF\n\r"); + myLed2 = 0; + } + // CAN1: attiva il CAN sul connettore 1 + if(cCmdPosition[1]=='1') + { + // Chiudi relay del connettore identificato e comunica al PC + pc.printf("RelayH1: ON\n\r"); + pc.printf("RelayL1: ON\n\r"); + myRelayH1 = 1; + myRelayL1 = 1; + //myTest = 1; // solo per scopi di debug + } + else + { + // Apri relay del connettore identificato e comunica al PC + pc.printf("RelayH1: OFF\n\r"); + pc.printf("RelayL1: OFF\n\r"); + myRelayH1 = 0; + myRelayL1 = 0; + //myTest = 0; // solo per scopi di debug + } + // CAN2: attiva il CAN sul connettore 2 + if(cCmdPosition[2]=='1') + { + // Chiudi relay del connettore identificato e comunica al PC + pc.printf("RelayH2: ON\n\r"); + pc.printf("RelayL2: ON\n\r"); + myNotRelayH2 = 0; + myNotRelayL2 = 0; + } + else + { + // Apri relay del connettore identificato e comunica al PC + pc.printf("RelayH2: OFF\n\r"); + pc.printf("RelayL2: OFF\n\r"); + myNotRelayH2 = 1; + myNotRelayL2 = 1; + } + // CAN2: attiva il CAN sul connettore 3 + if(cCmdPosition[3]=='1') + { + // Chiudi relay del connettore identificato e comunica al PC + pc.printf("RelayH3: ON\n\r"); + pc.printf("RelayL3: ON\n\r"); + myNotRelayH3 = 0; + myRelayL3 = 1; + } + else + { + // Apri relay del connettore identificato e comunica al PC + pc.printf("RelayH3: OFF\n\r"); + pc.printf("RelayL3: OFF\n\r"); + myNotRelayH3 = 1; + myRelayL3 = 0; + } + }// if (comando ricevuto contiene "CAN") + } +} + +//********************************************** +// IRQ per la Rx su seriale +//********************************************** +int main() +{ + // array per la ricezione dei messaggi da seriale + //char caRxPacket[PACKETDIM]; + //int nRxPacketSize; + + // puntatore 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 + myLed1 = 1; + myLed2 = 1; + myLed3 = 1; + wait(1); + myLed1 = 0; + myLed2 = 0; + myLed3 = 0; + + // configura il Button come input PullUp. Non premuto = 1, Premuto = 0; + //+++ myButton.mode(PullUp); //Questo funziona con la F401 + myButton.mode(PullDown); //Questo funziona con la F207 + + // configura gli input come PullUp. Aperto = 1; + myIn1.mode(PullUp); + myIn2.mode(PullUp); + myIn3.mode(PullUp); + myIn4.mode(PullUp); + myIn5.mode(PullUp); + + /********** START Ciclo di test ******* + while(true) + { + //if(myButton == 0) + { + myLed1 = 1; + myLed2 = 1; + myLed3 = 1; + + myTest = 0; + myRelayH1 = 0; + myRelayL1 = 0; + myRelayH2 = 0; + myRelayL2 = 0; + myRelayH3 = 0; + myRelayL3 = 0; + + + } + //else + wait (1); + { + myLed1 = 0; + myLed2 = 0; + myLed3 = 0; + + myTest =1; + myRelayH1 = 1; + myRelayL1 = 1; + myRelayH2 = 1; + myRelayL2 = 1; + myRelayH3 = 1; + myRelayL3 = 1; + } + wait(1); + } + ********* END Ciclo di test ********/ + + // Attiva la IRQ per la RX su seriale + pc.attach(&RxInterrupt,Serial::RxIrq); + + // ciclo in cui attende interrupt + while(true) + { + } +} \ No newline at end of file