Test CBS-GPIO

Dependencies:   mbed

Fork of Amplificatore_bomboni_rev2 by Giuseppe Falagario

Files at this revision

API Documentation at this revision

Comitter:
pinofal
Date:
Fri Jul 27 12:43:16 2018 +0000
Parent:
7:cc303710b1bc
Commit message:
Test CBS-GPIO

Changed in this revision

Amplificatore.cpp Show diff for this revision Revisions of this file
CBS-GPIO.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r cc303710b1bc -r a7257fd80953 Amplificatore.cpp
--- a/Amplificatore.cpp	Mon Jun 18 07:36:08 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,561 +0,0 @@
-// Tested : NUCLEO F207ZG
-#include "mbed.h"
-#include<stdlib.h>
-// Definizione periferiche
-Serial pc(USBTX, USBRX);
-AnalogOut OutWave(PA_5);
-//DigitalOut DigitalWave(PA_5);
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-DigitalOut led3(LED3);
-
-
-// definizione durata note
-#define SEMIBREVE 2000000 // durata della semibreve in microsecondi = 4sec
-#define MINIMA SEMIBREVE/2  
-#define SEMIMINIMA SEMIBREVE/4 
-#define CROMA SEMIBREVE/8  
-#define SEMICROMA CROMA/16  
-#define BISCROMA SEMIBREVE/32 
-#define SEMIBISCROMA SEMIBREVE/64 
-
-
-// definizione della frequenza delle note ottava centrale del pianoforte
-#define p 0 
-#define C1 261.63
-#define C1d 277.18
-#define D1b 277.18
-#define D1 293.66
-#define D1d 311.13
-#define E1b 311.13
-#define E1 329.63
-#define F1 349.23
-#define F1d 369.99
-#define G1b 369.99
-#define G1 392.9
-#define G1d 415.3
-#define A1b 415.3
-#define A1 440.0
-#define A1d 466.16
-#define B1b 466.16
-#define B1 493.18
-
-
-
-
-
-
-// numero di campioni che compongono un periodo della sinusoide in Output sull'ADC
-#define SAMPLESINENUM   45// consigliabile avere  multipli di 45
-
-// parametri dell'onda coseno da generare
-#define PI        (3.141592653589793238462)
-#define AMPLITUDE 32767 //(1.0)    // x * 3.3V
-#define PHASE     (PI/2) // 2*pi è un periodo
-#define OFFSET    32767 //(0x7FFF)
-
-// numero di note componenti la scala diatonica
-#define NUMTONE 120
-
-// Output LED di diagnostica
-DigitalOut led(LED1);
-
-// ticker per la generazione dell'onda con DAC
-Ticker SampleOutTicker;
-
-// Buffer contenente la sinusoide da porre in output.
-unsigned short usaSine[SAMPLESINENUM];
-
-// prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
-void CalculateSinewave(void);
-
-// carattere in arrivo dal PC
-volatile char cReadChar;
-volatile char CReadMusic; 
-// indice, nell'array, del campione da porre in output
-volatile int nSampleOutIndex;
-// contatore dei campioni in output sul DAC
-volatile int nSampleOutCount;
-// Periodo di generazione campioni in output DeltaT = T/NumSample
-double fDeltaT;
-// amplificazione per il dato da spedire sull'ADC
-volatile double fAmp;
-//volatile double fAmpNew;
-// flag per bloccare la generazione del segnale
-volatile int bGenerate = false;
-// frequenza segnale da generare
-volatile double fFreq;
-// periodo della sinusoide da generare
-double fPeriod;
-double dDiatonic[NUMTONE];
-
-// tipo di suono da generare: 0=Sine, 1= Square
-char cSoundWave;
-// tipo di spartito selezionato
-char cScore;
-
-//****************************
-// Create the sinewave buffer
-// // ATTENZIONE ----- SAREBBE MEGLIO CAMBIARE IL NOME DELLA FUNZIONE in CalculateWave[] !!!!! ----
-//****************************
-void CalculateSinewave(int nOffset, int nAmplitude, double fPhase)
-{
-    // variabile contenente l'angolo in radianti
-    double fRads;
-    // indici per i cicli
-    int nIndex;
-    // passo in frequenza fissato dal numero di campioni in cui voglio dividere un periodo di sinusoide: DeltaF = 360°/NUMSAMPLE
-    double fDeltaF;
-    // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF
-    double fAngle;
-    
-    // a seconda della selezione, genera una diversa forma d'onda
-    // ATTENZIONE ----- SAREBBE MEGLIO CAMBIARE IL NOME DELL'ARRAY in usaWave[] !!!!! ----
-    if(cSoundWave=='0')
-    {
-        // genera forma d'onda sinusoidale
-        fDeltaF = 360.0/SAMPLESINENUM;
-        for (nIndex = 0; nIndex < SAMPLESINENUM; nIndex++) 
-        {
-            fAngle = nIndex*fDeltaF; // angolo per il quale bisogna calcolare il campione di sinusoide
-            fRads = (PI * fAngle)/180.0; // Convert degree in radian
-            //usaSine[nIndex] = AMPLITUDE * cos(fRads + PHASE) + OFFSET;
-            usaSine[nIndex] = nAmplitude * cos(fRads + fPhase) + nOffset;
-        }
-     }
-     else
-     {
-        // genera forma d'onda quadra. 
-        for (nIndex = 0; nIndex < SAMPLESINENUM/2; nIndex++) 
-        {
-            usaSine[nIndex] = nAmplitude*(1.0)+ nOffset;
-        }
-        for (nIndex = SAMPLESINENUM/2; nIndex < SAMPLESINENUM; nIndex++) 
-        {
-            usaSine[nIndex] = nAmplitude*(-1.0)+ nOffset;
-        }
-     }   
-}
-
-//***************************
-// generazione sample da DAC
-//***************************
-void SampleOut() 
-{
-    // se è stato inviato il comando Stop, non fare niente fino a nuovo comando
-    if(bGenerate==0)
-    {
-    }
-    else // se non è stato inviato il comando di bStop continua
-    {
-        // output del campione della forma d'onda
-        OutWave.write_u16(usaSine[nSampleOutIndex]);
-        
-        // incrementa l'indice del campione in output, modulo NUMSAMPLE: se NUMSAMPLE è 360, nSampleOutIndex va da 0 a 359
-        nSampleOutIndex++;
-        if(nSampleOutIndex >= SAMPLESINENUM) 
-        {
-            nSampleOutIndex=0; 
-        }
-        
-    }
-}
-
-
-
-
-//*******************
-// Loop Principale
-//*******************  
-int main()
-{
-    // numero di note che compongono il brano
-    #define SYMPHONYN5DURATION 10 // numero di note che compongono il brano
-    // note del brano
-    float fNoteSymphonyN5 [SYMPHONYN5DURATION] = {p,        G1,     G1,     G1,     E1b,     p,     F1,     F1,     F1,     D1};
-    // durata delle note del brano
-    float fLengthSymphonyN5[SYMPHONYN5DURATION] ={CROMA,    CROMA,  CROMA,  CROMA,  MINIMA, CROMA,  CROMA,  CROMA,  CROMA,  MINIMA};
-   
-    // numero di note che compongono il brano
-    #define MINUETTODURATION 20 // numero di note che compongono il brano
-    // note del brano
-    float fNoteMinuetto [SYMPHONYN5DURATION] = {p,        G1,     G1,     G1,     E1b,     p,     F1,     F1,     F1,     D1};
-    // durata delle note del brano
-    float fLengthMinuetto[SYMPHONYN5DURATION] ={CROMA,    CROMA,  CROMA,  CROMA,  MINIMA, CROMA,  CROMA,  CROMA,  CROMA,  MINIMA};
-  
-    // indice per i cicli
-    int nIndex;
-    
-    //inizializza variabili
-    bGenerate=false;
-    cReadChar = 0;
-    nSampleOutIndex=0;
-    nSampleOutCount=0;
-    
-    
-    // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
-    pc.baud(921600); //921600 bps
-    
-    // messaggio di benvenuto
-    pc.printf("\r\nHallo Amaldi Students - Exercise 9 \r\n");
-    pc.printf("\r\n*** Amaldi Vs Beethoven ***\r\n");
-    
-    
-    
-    // test dei LED
-    led1=1; //Verde
-    wait_ms(500);
-    led1=0;
-    led2=1; // Blu
-    wait_ms(500);
-    led2=0;
-    led3=1; //Rosso
-    wait_ms(500);
-    led3=0;
-    
-    pc.printf("\r\n*** Select SoundWave ***\r\n");
-    pc.printf("\r\n> 0: Sine ***\r\n");
-    pc.printf("\r\n> 1: Square ***\r\n");
-    
-    // acquisisce il tipo di suono da generare
-    while(!pc.readable())
-    {
-    }   
-    cSoundWave = pc.getc();   
-        
-     
-    pc.printf("\r\n*** Select Score ***\r\n");
-    pc.printf("\r\n> 0: Lalala land ***\r\n");
-    pc.printf("\r\n> 1: Minuetto  ***\r\n");
-    pc.printf("\r\n> 2: Prima invenzione ***\r\n");
-    pc.printf("\r\n> 3: Nona sinfonia  ***\r\n");
-    pc.printf("\r\n> 4: When the saint go marching in  ***\r\n");
-    pc.printf("\r\n> 5: Preludio  ***\r\n");
-    pc.printf("\r\n> 6: Quinta Sinfonia  ***\r\n");
-    pc.printf("\r\n> 7: Minuetto  ***\r\n");
-    pc.printf("\r\n> 8: Minuetto  ***\r\n");
-    pc.printf("\r\n> 9: Me Composer  ***\r\n");
-    
-    // acquisisce lo spartito da generare
-    while(!pc.readable())
-    {
-    }   
-    cScore = pc.getc();   
-        
-    
-    // suona lo spartito selezionato   
-    if(cScore =='6')
-    {
-        // abilita la generazione di suoni
-        bGenerate=true;
-        
-        fAmp = 1.0; // coefficiente per il quale viene moltiplicato l'ampiezza massima
-        
-        // genera la frequenza relativa alla nota selezionata, da nIndex, nello spartito
-        bGenerate=fNoteSymphonyN5[0];
-        fFreq=fNoteSymphonyN5[0];
-        if(bGenerate !=0) 
-        {
-            fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
-            CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
-            SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
-        }
-              
-        //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
-        wait_us(fLengthSymphonyN5[1]);
-        
-        // accento sulla nota
-        bGenerate=false;
-        wait_us(fLengthSymphonyN5[1]/5);
-        bGenerate=true;
-        
-        bGenerate=fNoteSymphonyN5[1];
-        fFreq=fNoteSymphonyN5[1];
-        if(bGenerate !=0)
-        {
-            fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
-            CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
-            SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
-        }
-                
-        //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
-        wait_us(fLengthSymphonyN5[1]);
-        
-        // accento sulla nota
-        bGenerate=false;
-        wait_us(fLengthSymphonyN5[1]/5);
-        bGenerate=true;
-        
-        bGenerate=fNoteSymphonyN5[2];
-        fFreq=fNoteSymphonyN5[2];
-        if(bGenerate !=0) 
-        {
-            fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
-            CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
-            SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
-        }
-        //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
-        wait_us(fLengthSymphonyN5[2]);
-        
-        // accento sulla nota
-        bGenerate=false;
-        wait_us(fLengthSymphonyN5[2]/5);
-        bGenerate=true;
-        
-        bGenerate=fNoteSymphonyN5[3];
-        fFreq=fNoteSymphonyN5[3];
-        if(bGenerate !=0)
-        {
-            fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
-            CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
-            SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
-        }
-        //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
-        wait_us(fLengthSymphonyN5[3]);
-        
-        // accento sulla nota
-        bGenerate=false;
-        wait_us(fLengthSymphonyN5[3]/5);
-        bGenerate=true;
-        
-        bGenerate=fNoteSymphonyN5[4];
-        fFreq=fNoteSymphonyN5[4];
-        if(bGenerate !=0)
-        {
-            fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
-            CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
-            SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
-        }
-        //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
-        wait_us(fLengthSymphonyN5[4]);
-        
-        // accento sulla nota
-        bGenerate=false;
-        wait_us(fLengthSymphonyN5[4]/5);
-        //bGenerate=true;
-        
-        pc.printf("\r\n premi tasto");    
-        while(!pc.readable())
-        {
-        }
-        
-        
-        // coefficiente per il quale viene moltiplicato l'ampiezza massima
-        fAmp = 1.0; 
-                
-        // genera le note indicate nell'array spartito con la durata indicata nell'array length 
-        for(nIndex=0; nIndex<SYMPHONYN5DURATION; nIndex++)
-        {
-            bGenerate=fNoteSymphonyN5[nIndex];
-            fFreq=fNoteSymphonyN5[nIndex];
-            if(bGenerate !=0)
-            {
-                fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
-                CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
-                SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
-            }
-            //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
-            wait_us(fLengthSymphonyN5[nIndex]);
-            
-            // accento sulla nota
-            bGenerate=false;
-            wait_us(fLengthSymphonyN5[nIndex]/5);
-            bGenerate=true;
-        }
-        // dopo la lettura dello spartito disattiva suoni
-        bGenerate = false;
-    }
-    else
-    {
-        if(cScore=='9')
-        {
-            while(true)
-            {   
-                // verifica se è arrivato un carattere dalla seriale del pc
-                if(pc.readable())
-                {
-                    cReadChar = pc.getc(); // Read hyperterminal
-                                   
-                    // genera la nota corrispondente al carattere ricevuto
-                    switch(cReadChar)
-                    {
-                        //La#
-                        case 'u':
-                        case 'U':
-                        {
-                            fFreq=466.16;// frequenza della sinusoide La#
-                            pc.printf("\n\r--- Generazione La#_SIb= %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        //sol#
-                        case 'y':
-                        case 'Y':
-                        {
-                            fFreq=415.3;// frequenza della sinusoide Sol#
-                            pc.printf("\n\r--- Generazione Sol#_LAb = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        //Sol_b
-                        case 't':
-                        case 'T':
-                        {
-                            fFreq=369.99;// frequenza della sinusoide Sol_b
-                            pc.printf("\n\r--- Generazione Solb_Fa# = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                       //DO#
-                        case 'e':
-                        case 'E':
-                        {
-                            fFreq=277.18;// frequenza della sinusoide DO diesis
-                            pc.printf("\n\r--- Generazione DO# = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;   
-                        //DO
-                        case 'd':
-                        case 'D':
-                        {
-                            fFreq=261.63;// frequenza della sinusoide DO da generare
-                            pc.printf("\n\r--- Generazione DO = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        // RE
-                        case 'f':
-                        case 'F':
-                        {
-                            fFreq=293.66;// frequenza della sinusoide RE da generare
-                            pc.printf("\n\r--- Generazione RE = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        // RE#/MIb
-                        case 'r':
-                        case 'R':
-                        {
-                            fFreq=311.13;
-                            pc.printf("\n\r--- Generazione Mib = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        case 'g':
-                        case 'G':
-                        {
-                            fFreq=329.63; // frequenza della sinusoide MI da generare
-                            pc.printf("\n\r--- Generazione MI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        case 'h':
-                        case 'H':
-                        {
-                            fFreq=349.23;// frequenza della sinusoide FA da generare
-                            pc.printf("\n\r--- Generazione FA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        
-                        // SOL
-                        case 'j':
-                        case 'J':
-                        {
-                            fFreq=392.0;
-                            pc.printf("\n\r--- Generazione SOL = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        // LA
-                        case 'k':
-                        case 'K':
-                        {
-                            fFreq=440.0; // frequenza della sinusoide LA da generare
-                            pc.printf("\n\r--- Generazione LA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        //SI
-                        case 'l':
-                        case 'L':
-                        {
-                            fFreq=493.88;// frequenza della sinusoide SI da generare
-                            pc.printf("\n\r--- Generazione SI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        //DO 5°
-                        case 'z':
-                        case 'Z':
-                        {
-                            fFreq=523.00;// frequenza della sinusoide SI da generare
-                            pc.printf("\n\r--- Generazione DO5 = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        //RE 5°
-                        case 'x':
-                        case 'X':
-                        {
-                            fFreq=587.00;// frequenza della sinusoide SI da generare
-                            pc.printf("\n\r--- Generazione RE5 = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                            bGenerate = true;
-                        } break;
-                        
-                        // pausa
-                        case ' ':
-                        {
-                            bGenerate = false;
-                            pc.printf("\n\r--- Generazione pausa = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                           
-                        } break;
-                        //prova
-                        case 'o':
-                        {
-                             fFreq=587.00;
-                             wait_ms(600);
-                             fFreq=392.00;
-                             wait_ms(300);
-                             fFreq=440.00;
-                             wait_ms(300);
-                             fFreq=493.88;
-                             wait_ms(300);
-                             fFreq=523.16;
-                             wait_ms(300);
-                        } break;
-                        //Stop
-                        case 'b':
-                        case 'B':
-                        {
-                           
-                           fFreq=0;// stop
-                            pc.printf("\n\r--- Generazione Stop = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                           bGenerate = false;
-                        } break;
-                        
-                        default:
-                        {
-                           bGenerate = false; // se la nota non è riconosciuta blocca la generazione
-                            pc.printf("\n\r--- Wrong Tone ---\n\r");
-                        } break;  
-                    } // switch (cReadChar)
-                    
-                    // genera la frequenza relativa alla nota che è stata selezionata
-                    fAmp = 0.1; // coefficiente per il quale viene moltiplicato l'ampiezza massima
-                    fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
-                    CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
-                    SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
-                 
-                    
-                }
-                else // se non è stato premuto nessun tasto
-                {
-                   
-                } 
-            } // while   
-        } // cScore = '9'
-    }
-    /******* START ONDA DIGITALE FUNZIONA *****
-    led1=1;
-    led2=1;
-    led3=1;
-    while(true)
-    {
-        DigitalWave=0;
-        //wait_us(2024); //SI
-        //wait_us(2551); //SOL
-        wait_us(1515); //MI
-        DigitalWave=1;
-        wait_us(1515);   
-    }
-    ****** END ONDA DIGITALE FUNZIONA ******/
-}
\ No newline at end of file
diff -r cc303710b1bc -r a7257fd80953 CBS-GPIO.cpp
--- /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