app nuova

Dependencies:   mbed

Revision:
17:e74856e7a232
Parent:
16:2581bc608372
--- a/MicRobot-Rev084.cpp	Mon Mar 02 12:47:34 2020 +0000
+++ b/MicRobot-Rev084.cpp	Wed Jul 08 10:14:02 2020 +0000
@@ -4,7 +4,6 @@
 #include "mbed.h"
 #include<stdlib.h>
 
-
 // attivare questa #define quando si vuole simulare l'arrivo di un segnale di encoder dai motori in movimento
 //#define ENCODERSIMULATE 
 
@@ -225,146 +224,108 @@
         cReadChar = myBLE.getc(); // Read character
         caRxPacket[nCharCount]=cReadChar;
         nCharCount++;
-        //pc.printf("%c", cReadChar); // diagnostica
+        pc.printf("%c", cReadChar); // diagnostica
         
         // inizializza flag di incongruenza
         bIncongruenza = false;
-        
-        if(cReadChar==')')
+        if(caRxPacket[0]=='(')
         {
-            //pc.printf("\r\n"); // diagnostica
+            cReadChar = myBLE.getc(); // Read character
+            caRxPacket[nCharCount]=cReadChar;
+            nCharCount++;
+            pc.printf("%c", cReadChar); // diagnostica
             
             // +++++++++++++++++ INIZIO gestione Comando da Button +++++++++++++++++
             // Ho ricevuto il comando da un Button se il carattere numero 1, è una lettera maiuscola
-            if((caRxPacket[1] > 0x40) && (caRxPacket[1] < 0x5B)) // caratteri alfabetici
+            if((caRxPacket[1] > 0x40) && (caRxPacket[1] < 0x4E)) // caratteri alfabetici
             {
                 cCommandBLE = caRxPacket[1]; // legge e memorizza il primo carattere
                 nParamBLE = caRxPacket[2]-0x30;
                 // visualizza comando e parametro inviato da BLE
-                //pc.printf("> %c%d \r\n\r",cCommandBLE, nParamBLE); // diagnostica
+                pc.printf("> %c%d \r\n\r",cCommandBLE, nParamBLE); // diagnostica
             }
             // +++++++++++++++++ FINE gestione Comando da Button +++++++++++++++++
             
-            // ++++++++++++++++++ INIZIO Estrai coordinate polari del joystick +++++++++++++++++++++
-            
-            // protezione da potenziali errori di comunicazione. Se il numero di caratteri è maggiore di 0 non modificare i vecchi nRo e nTeta
-            if(nCharCount <= 7) // un comando corretto può essere '(' '^'/'~' '-' , n, n, n ')'
+            if(cReadChar=='X')
             {
-                // esponente della base 10, per cui bisognerà moltiplicare i caratteri per trasformarli in numeri
-                fEsponente = 1.0;
-                if(caRxPacket[1] == '~')   // ricevuta 0x7E = '~', cioè ricevuto fase dal joystick 
+                nIndex = 0;
+                fX=0;
+                do
                 {
-                    // stampa carattere ricevuto
-                    //pc.printf("Fase: '~' \n\r"); // diagnostica
-                    // trasforma in numero i caratteri della fase
-                    nTeta=0; 
-                    for(nCharIndex = (nCharCount-2); nCharIndex > 1; nCharIndex--) // I primi due caratteri sono  i delimitatori " (~ " e l'ultimo è un delimitatore ')'
-                    {
-                        nAux = caRxPacket[nCharIndex]-0x30;
-                        if(( nAux > 9) || (nAux < 0))
-                        {
-                            // c'è un errore. esce dal for e attiva il flag di incongruenza
-                            //pc.printf(">---------------------- ERRORE nAux - nTeta !!! ------------------- \r\n\r"); // diagnostica
-                            //nTeta=0; // imposta Teta a 0
-                            bIncongruenza = true; // attiva flag di incongruenza a causa di un errore di comunicazione
-                            break; //esce dal for
-                        }
-                        nTeta = nTeta + nAux*fEsponente;
-                        fEsponente*=10.0;
-                        //pc.printf("cReadCharacter: %c\n\r", caRxPacket[nCharIndex]); // diagnostica
-                    }
-                    // protezione da errori di trasmissione
-                    if ((nTeta > 360 ) || (nTeta < 0))
-                    {
-                        // c'è un errore. esce dal for e imposta nTeta =0
-                        //pc.printf(">---------------------- ERRORE nTeta [0 .. 365] !!! ------------------- \r\n\r"); // diagnostica
-                        //nTeta=0; // imposta Teta a 0
-                        bIncongruenza = true; // attiva flag di incongruenza a causa di un errore di comunicazione
-                    }
-                    // visualizza valore di angolo ricevuto da BLE
-                    //pc.printf("> nTeta = %d \n\r",nTeta); // diagnostica
-                    // visualizza gli ultimi valori di modulo e fase ricevuti da BLE
-                    //pc.printf("> (nRo,nTeta) = (%d,%d) \n\r\n\r",nRo, nTeta); // diagnostica
+                    cReadChar = myBLE.getc(); // Read character
+                    caRxPacket[nCharCount]=cReadChar;
+                    nCharCount++;
+                    pc.printf("%c", cReadChar); // diagnostica
+                   
+                    fX = fX+ double(cReadChar - 0x30), nIndex;
+                    nIndex++;
                 }
-                // esponente della base 10, per cui bisognerà moltiplicare i caratteri per trasformarli in numeri
-                fEsponente = 1.0;
-                if (caRxPacket[1] == '^')   // ricevuta 0x7E = '^', cioè ricevuto modulo dal josystick
+                while((cReadChar >= 0x30) && (cReadChar <= 0x39));
+                
+                
+                if(cReadChar=='Y')
                 {
-                    // stampa carattere ricevuto
-                    //pc.printf("Modulo: '^' \n\r"); // diagnostica
-                    // trasforma in numero i caratteri del modulo
-                    nRo=0;
-                    for(nCharIndex = (nCharCount-2); nCharIndex > 1; nCharIndex--) // I primi due caratteri sono  i delimitatori " (^ " e l'ultimo è un delimitatore ')'
+                    nIndex = 0;
+                    fX=0;
+                    do
                     {
-                        nAux = caRxPacket[nCharIndex]-0x30;
-                        if((nAux > 9) || (nAux < 0))
-                        {
-                            // c'è un errore. esce dal for e imposta nTeta =0
-                            //pc.printf(">---------------------- ERRORE nRo [-100 .. 100] !!! ------------------- \r\n\r"); // diagnostica
-                            //nRo=0; // imposta Ro a 0
-                            bIncongruenza = true; // attiva flag di incongruenza a causa di un errore di comunicazione
-                            break; //esce dal for
-                        }
-                        nRo = nRo + (caRxPacket[nCharIndex]-0x30)*fEsponente; // l'ultimo carattere ricevuto è un delimitatore  
-                        fEsponente*=10.0;    
-                        //pc.printf("nRo provvisorio: %d\n\r", nRo); // diagnostica
-                        //pc.printf("cReadCharacter: %c\n\r", caRxPacket[nCharIndex]); // diagnostica
-                    }
-                    // protezione da errori di trasmissione
-                    if ((nRo > 100 ) || (nRo < -100))
-                    {
-                        // c'è un errore. esce dal for e imposta nRo =0
-                        //pc.printf(">---------------------- ERRORE nAux - nRo !!! ------------------- \r\n\r"); // diagnostica
-                        //nRo=0; // imposta Ro a 0
-                        bIncongruenza = true; // attiva flag di incongruenza a causa di un errore di comunicazione
-                    }
-                    // visualizza il valore di modulo ricevuto da BLE
-                    //pc.printf("> nRo = %d \n\r",nRo); // diagnostica
-                    // visualizza gli ultimi valori di modulo e fase ricevuti da BLE
-                    //pc.printf("> (nRo,nTeta) = (%d,%d) \n\r\n\r",nRo, nTeta); // diagnostica
+                        cReadChar = myBLE.getc(); // Read character
+                        caRxPacket[nCharCount]=cReadChar;
+                        nCharCount++;
+                        pc.printf("%c", cReadChar); // diagnostica
+                        fY = fY+ double(cReadChar - 0x30), nIndex;
+                        nIndex++;
+                    } 
+                    while((cReadChar >= 0x30) && (cReadChar <= 0x39));  
                 }
-            } // if(nCharCount < 7)
-            else
-            {
-                //pc.printf(">---------------------- ERRORE n > 7 !!! ------------------- \r\n\r"); // diagnostica
+                else
+                {
+                    pc.printf("%c", cReadChar); // diagnostica
+                }    
             }
-            // posizione di comodo: il joystick mantiene Teta diverso da 0 anche quando il Ro = 0. Fisicamente quest non ha senso.
-            if(nRo==0)
+        }
+        else
+        {
+            pc.printf("%c", cReadChar); // diagnostica
+        }
+        if(cReadChar==')')
+        {
+            pc.printf("tutto bene. ricevuto > %c%d \r\n\r"); // diagnostica
+        }
+            
+            
+                      
+            
+            
+        //+++++++++++++++++++ INIZIO  converte le coordinate polari del joystick in coordinate cartesiane ++++++++++++++++
+        // se il sw è resettato, restituisci sempre posizioni fX=0, fY=0.
+        if(!bReset)
+        {
+            // Solo in caso di congruenza cambia i valori di fX e fY. In caso di incongruenza, mantieni i valori precedenti
+            if(!bIncongruenza)
             {
-                nTeta = 0; // se Ro = 0, Teta deve essere =0
+                //fX = double(nRo)*cos((double)nTeta*((double)PI/180.0));
+                fX = fX-100;
+                //fY = double(nRo)*sin((double)nTeta*((double)PI/180.0));
+                fY = -fY;
+                fY = fY+100;
             }
-             
-            // ++++++++++++++++++ FINE Estrai coordinate polari del joystick +++++++++++++++++++++
+            //pc.printf("> (fX,fY) = (%.2f,%.2f) \n\r\n\r",fX, fY); // diagnostica    
+        }
+        else
+        {
+            // in caso di reset mantieni fermi i motori anche se sulla APP il joystick si sta muovendo
+            fX = 0.0;
+            fY = 0.0;
+        }
+        //+++++++++++++++++++ FINE   converte le coordinate polari del joystick in coordinate cartesiane ++++++++++++++++
+        
+        // reinizializza contatore di caratteri ricevuti 
+        nCharCount = 0;
             
-            // visualizza gli ultimi valori di modulo e fase ricevuti da BLE
-            //pc.printf("> (nRo,nTeta) = (%d,%d) \n\r\n\r",nRo, nTeta); // diagnostica
-           
-            //+++++++++++++++++++ INIZIO  converte le coordinate polari del joystick in coordinate cartesiane ++++++++++++++++
-            // se il sw è resettato, restituisci sempre posizioni fX=0, fY=0.
-            if(!bReset)
-            {
-                // Solo in caso di congruenza cambia i valori di fX e fY. In caso di incongruenza, mantieni i valori precedenti
-                if(!bIncongruenza)
-                {
-                    fX = double(nRo)*cos((double)nTeta*((double)PI/180.0));
-                    fY = double(nRo)*sin((double)nTeta*((double)PI/180.0));
-                }
-                //pc.printf("> (fX,fY) = (%.2f,%.2f) \n\r\n\r",fX, fY); // diagnostica    
-            }
-            else
-            {
-                // in caso di reset mantieni fermi i motori anche se sulla APP il joystick si sta muovendo
-                fX = 0.0;
-                fY = 0.0;
-            }
-            //+++++++++++++++++++ FINE   converte le coordinate polari del joystick in coordinate cartesiane ++++++++++++++++
-            
-            // reinizializza contatore di caratteri ricevuti 
-            nCharCount = 0;
-            
-            // comunica al cellulare vleocità e spostamento mentre si sta spostando
-            //myBLE.printf(" Speed= %d [m/s]; Trip= d [m]\n\r",nRo, nTeta ); 
-        } // if(cReadChar == ')')
+        // comunica al cellulare vleocità e spostamento mentre si sta spostando
+        //myBLE.printf(" Speed= %d [m/s]; Trip= d [m]\n\r",nRo, nTeta ); 
+        
     }
 }