2 years, 3 months ago.  This question has been closed. Reason: Duplicate question

Receive the string from c++ and analyzes the string

The purpose of this program is to receive a string from c ++. Analyze the string by finding matching language phonemes: Italian. The phonemes match the indexes of the associated images. These images will be displayed on the dispaly (they are images that imitate the lips of the man and move in different ways according to the string we receive). It is also possible to choose a time t based on which two, one or zero intermediate images can be placed between two phonemes.

The problem is that it only receives the first 16 characters of the string, why? After the first run I have to reset mbed, why?

#include "mbed.h"
#include "uLCD_4D_Picaso.h"
 
 
// three pins are: TX   RX  RESET
uLCD_4D_Picaso Display(p13, p14, p15);
 
Serial pc(USBTX, USBRX); // tx, rx
 
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
 
int disk;
uint16_t hndl0; //contiene l'indirizzo dei file con le immagini per le espressioni fisse
uint16_t hndl;  //a seconda del caso in cui ci troveremo assegnerò a questa variabile il valore di hndl1 o hndl2
uint16_t hndl1; //contiene l'indirizzo dei file con le 2 immagini intermedie
uint16_t hndl2; //contiene l'indirizzo dei file con 1 immagine intermedia
int iImage1_1 = 0, iImage2_1 = 1, iImage3_1 = 2, iImage4_1 = 3, iImage5_1 = 4, iImage6_1 = 5, //indici delle immagini per le
iImage7_1 = 6, iImage8_1 = 7, iImage9_1 = 8;          
 
char stringa[200];
int seq_ph[200];  
struct  phoneme{               
        char poss_ph[25][4];
        int lips;
    };
phoneme vect_ph[20];  
 
struct trsz2{           //struct in cui si possono salvare gli indici di 2 immagini
        int indx [2];   
    };
    
trsz2 mat_trsz2[7][7];  //matrice in cui salvo gli indici delle immagini che uso per realizzare l'algoritmo con 2 immagini intermedie
 
    
int mat_trsz1[7][7];   //matrice in cui salvo gli indici delle immagini che uso per realizzare l'algoritmo con 1 immagine intermedia
 
int image_index; //indice che uso per scorrere le immagini nella visualizzazione
 
int vett_fin[600];  //vettore finale in cui salvo tutti gli indici delle immagini, anche quelle intermedie
 
Ticker show_image; //interrupt temporizzata che uso per la visualizzazione delle immagini
 
float t=0.08;  //intervallo tra la visualizzazione dell'immagine di un fonema e l'immagine del fonema successivo
float durata=0.08; //durata della visualizzazione della singola immagine
 
void italian_ph()
{   
    for (int i=0; i<20; i++)   
   {
       for (int j=0; j<25; j++)
            for (int k=0; k<4; k++)
            {
                vect_ph[i].poss_ph[j][k]='\0';    
            }
        vect_ph[i].lips=0;  
    }                        
    vect_ph[0].poss_ph[0][0]='a';    
    vect_ph[0].lips=1;
       
    vect_ph[1].poss_ph[0][0]='o';
    vect_ph[1].poss_ph[1][0]='u';
    vect_ph[1].poss_ph[2][0]='h';
    vect_ph[1].poss_ph[3][0]='q';
    vect_ph[1].poss_ph[3][1]='u';   
    vect_ph[1].lips=2;
       
    vect_ph[2].poss_ph[0][0]='e';
    vect_ph[2].poss_ph[1][0]='i';
    vect_ph[2].lips=3;
        
    vect_ph[3].poss_ph[0][0]='c';
    vect_ph[3].poss_ph[1][0]='d';
    vect_ph[3].poss_ph[2][0]='g';
    vect_ph[3].poss_ph[3][0]='n';
    vect_ph[3].poss_ph[4][0]='s';
    vect_ph[3].poss_ph[5][0]='t';
    vect_ph[3].poss_ph[6][0]='z';
    vect_ph[3].poss_ph[7][0]='g';
    vect_ph[3].poss_ph[7][1]='n';
    vect_ph[3].poss_ph[8][0]='f';
    vect_ph[3].poss_ph[9][0]='v';
    vect_ph[3].poss_ph[10][0]='s';
    vect_ph[3].poss_ph[10][1]='c';
    vect_ph[3].poss_ph[11][0]='c';
    vect_ph[3].poss_ph[11][1]='h';
    vect_ph[3].poss_ph[12][0]='s';
    vect_ph[3].poss_ph[12][1]='t';
 
    vect_ph[3].lips=4;
        
    vect_ph[4].poss_ph[0][0]='l';
    vect_ph[4].poss_ph[1][0]='r';
    vect_ph[4].lips=5;
        
    vect_ph[5].poss_ph[0][0]='m';
    vect_ph[5].poss_ph[1][0]='b';
    vect_ph[5].poss_ph[2][0]='p';
    vect_ph[5].lips=6;
        
    vect_ph[6].poss_ph[0][0]='-';
    vect_ph[6].poss_ph[1][0]='.';
    vect_ph[6].lips=7;
    
    return;
}
 
//Questa funzione riempie le matrici in cui salvo gli indici delle immagini intermedie
void riemp_mat()
{   
    for (int i=0; i<7; i++)
        for (int j=0; j<7; j++){
            mat_trsz1[i][j]=0;      //inizializzo la matrice con gli indici per l'algoritmo con 1 immagine intermedia
            for (int z=0; z<2; z++)
                mat_trsz2[i][j].indx[z]=0;   //inizializzo la matrice con gli indici per l'algoritmo con 2 immagini intermedie
            }   
    
    
    int increm1=0, increm2=0;
    int start_riga=0,start_col=1;       
    for (int i=start_riga; i<6; i++)    //riempio solo la parte delle matrici sopra la diagonale, tanto sono simmetriche
    {                                   
        for (int j=start_col; j<7; j++){
            mat_trsz1[i][j]=8+increm1;  //parto dall'indice 8 perchè le immagini da 1 a 7 corrispondono alle 7 immagini associate ai 7 gruppi di fonemi      
            increm1++;                  
            for (int z=0; z<2; z++)
            {
                mat_trsz2[i][j].indx[z]=8+increm2;
                increm2++;
            }
        }
        start_col++;
    }
    
    return;
}
 
 
void control ()
{
    int z=0;
    bool ok3=false, ok2=false, ok1=false;
    char temp[4];
    for (int q=0; q<4; q++)
         temp[q]='\0';
    int index_seq=0;
    
    while (stringa[z]!=0) 
    {   
        if (ok3==false && z<197)
        {
            for (int j=0; j<3; j++)
            {
                temp[j]=stringa[z+j];
            }
            for (int k=0; k<20 && ok3==false; k++)
            {
                for (int h=0; h<25 && ok3==false; h++)
                {
                    if (temp[0]==vect_ph[k].poss_ph[h][0])
                        if (temp[1]==vect_ph[k].poss_ph[h][1])
                            if (temp[2]==vect_ph[k].poss_ph[h][2])
                            {
                                ok3=true;                              
                                seq_ph[index_seq]=vect_ph[k].lips;     
                                //pc.printf("%d",(seq_ph[index_seq]));
                                index_seq++;                           
                                z=z+3;                                
                              
                            }
                }
            }
        }
        if (ok3==false && ok2==false && z<198) 
        {
            for (int j=0; j<2; j++)
            {
                temp[j]=stringa[z+j];
            }
            for (int k=0; k<20 && ok2==false; k++)
            {
                for (int h=0; h<25 && ok2==false; h++)
                {
                    if (temp[0]==vect_ph[k].poss_ph[h][0])
                        if (temp[1]==vect_ph[k].poss_ph[h][1])
                        {
                            ok2=true;                               
                            seq_ph[index_seq]=vect_ph[k].lips;      
                            //pc.printf("%d",(seq_ph[index_seq]));
                            index_seq++;                           
                            z=z+2;   
                                                         
                        }
                }
            }
        }     
        if (ok3==false && ok2==false && ok1==false && z<199) 
        {   
            temp[0]=stringa[z];
            for (int k=0; k<20 && ok1==false; k++)
            {
                for (int h=0; h<25 && ok1==false; h++)
                {
                    if (temp[0]==vect_ph[k].poss_ph[h][0])
                    {
                        ok1=true;                                       
                        seq_ph[index_seq]=vect_ph[k].lips;             
                        //pc.printf("%d",(seq_ph[index_seq]));
                        index_seq++;                                    
                        z=z+1;  
                                                              
                    }
                }
            }
            
        }
        
        if (ok3==false && ok2==false && ok1==false)  // new
        z++;                                            // new
        
        ok3=false;
        ok2=false;
        ok1=false;      
    }
    
    return;
}
 
void insert() {
       int i=0;
        char ch=0;
do
{ 
   if (pc.readable())      // if there is an character to read from the device
   {
       ch = pc.getc();   // read it
      if (i<200)               // just to avoid buffer overflow
         stringa[i++]=ch;  // put it into the value array and increment the index
  
         
  }
  
} while (ch!='\n');    // loop until the '\n' character
 
stringa[i]=0; 
 
pc.printf(stringa);
 
   }
   
//Questa funzione mi permette di inserire l'intervallo di tempo che deve intercorrere tra la visualizzazione delle immagini associate a due fonemi consecutivi
void insert_t()
{   
    pc.printf("Inserisci valore dell'intervallo temporale t: ");
    pc.scanf("%f",&t);
    pc.printf("\nRicevuto: %f \n",t);
    
    return;  
}   
 
//Questa funzione crea un vettore in cui sono presenti anche gli indici delle immagini intermedie, a partire dal vettore degli indici delle immagini fondamentali
void control_vett_fin()
{   
    
    for (int i=0; i<600; i++)  //inizializzo il vettore
        vett_fin[i]=0;
     
    int position=0;
    int pos_fin=0;
    
    //a secondo dell'intervallo t, uso due, una o nessuna immagine intermedia
    if (t>=0.36)   //in questo caso ne uso 2
    {
        while (seq_ph[position]!=0 && position<198) //fino a che il vettore degli indici dei fonemi non termina oppure sforo la sua dimensione
        {   
            vett_fin[pos_fin]=seq_ph[position];   //inizialmente carico il primo indice trovato nel nuovo vettore
            pc.printf("%d",(vett_fin[pos_fin]));
            pos_fin++;                            //e mi sposto di una posizione in questo vettore
            int precedente=seq_ph[position];      //salvo l'indice del primo fonema
            position++;                           //e mi sposto di una posizione nel vettore degli indici fondamentali
            int successivo=seq_ph[position];      //salvo l'indice del secondo fonema
        
            if (successivo==0)                    //se non c'è un fonema successivo allora carico la sequenza di immagini per chiudere la bocca
                for (int i=0; i<2; i++) {
                
                    vett_fin[pos_fin+i]=mat_trsz2[precedente-1][6].indx[i];  //la sequenza di immagini per chiudere la bocca è sempre all'ultima colonna delle matrice
                    pc.printf("%d",(vett_fin[pos_fin+i]));
                }
            else                                                             //N.B. C'è "precedente-1" perchè gli indici delle immagini salvate nella SD parte da 0 e non da 1 come stiamo suppponendo in questo programma 
            {
                if (precedente==successivo)
                {
                    for (int i=0; i<2; i++) {
                    
                        vett_fin[pos_fin+i]=precedente;  //in questo caso ricopio due volte lo stesso indice
                        pc.printf("%d",(vett_fin[pos_fin+i]));
           }
                }
                else if (precedente<successivo)
                {
                    for (int i=0; i<2; i++) {
                    
                        vett_fin[pos_fin+i]=mat_trsz2[precedente-1][successivo-1].indx[i];   //sto sopra la diagonale e quindi prendo gli indici che trovo nella locazione indicata da precedente e successivo
                pc.printf("%d",(vett_fin[pos_fin+i]));
            }
                }
                else if (precedente>successivo)
                {
                    for (int i=0; i<2; i++) {
                    
                        vett_fin[pos_fin+i]=mat_trsz2[successivo-1][precedente-1].indx[1-i];  //starei sotto la diagonale, quindi basta invertire indici di riga e colonna per spostarsi sopra la diagonale e poi prendo gli indici in ordine inverso
                        pc.printf("%d",(vett_fin[pos_fin+i]));      
                   }
                }
                pos_fin=pos_fin+2;    //mi sposto di 2 posizioni nel vettore finale
            }  
        }
        durata=t/3;    //in questo caso ho il tempo per visualizzare 3 immagini
        hndl=hndl2;    //carico l'indirizzo della lista di immagini con 2 immagini intermedie
    }
    else if (t>=0.24 && t<0.36)
    {
        while (seq_ph[position]!=0 && position<198)
        {   
            vett_fin[pos_fin]=seq_ph[position];
            pc.printf("%d",(vett_fin[pos_fin]));
            pos_fin++;
            int precedente=seq_ph[position];
            position++;
            
            int successivo=seq_ph[position];
            if (successivo==0) {
            
                    vett_fin[pos_fin]=mat_trsz1[precedente-1][6];
                   pc.printf("%d",(vett_fin[pos_fin]));
                }
            else
            {
                if (precedente==successivo)
                {
                    vett_fin[pos_fin]=precedente;
                    pc.printf("%d",(vett_fin[pos_fin]));
                }
                else if (precedente<successivo)
                {
                    vett_fin[pos_fin]=mat_trsz1[precedente-1][successivo-1];
                     pc.printf("%d",(vett_fin[pos_fin]));
                }
                else if (precedente>successivo)
                {
                    vett_fin[pos_fin]=mat_trsz1[successivo-1][precedente-1]; 
                    pc.printf("%d",(vett_fin[pos_fin]));
                }
                pos_fin=pos_fin++;
            }  
        }
        durata=t/2;
        hndl=hndl1;
    }
    else if (t<0.24)
    {
        while (seq_ph[position]!=0 && position<198)
        {
            vett_fin[pos_fin]=seq_ph[position];
            pc.printf("%d",(vett_fin[pos_fin]));           
            pos_fin++;
            position++;
           
        }
        
         durata=t;
         hndl=hndl1;
    }
    return;
}
 
//Questa fuzione è chiamata periodicamente dal ticker per mostrare a video le immagini
void show()
{   
    led4 = !led4;
    if (image_index>=600 || vett_fin[image_index]==0)
    {
        show_image.detach();     //se non ci sono più immagini da mostrare allora scollego il ticker
        led1 = !led1;
        Display.img_Show(hndl,6); //torno a mostare l'immagine di default
        image_index=0;   //pongo uguale a 0 l'indice per lo scorrimento delle immagini perchè così posso rivedere il movimento della bocca senza rinserire la stringa
    }
    else
    {
       Display.img_Show(hndl,vett_fin[image_index]-1);  //fa mostrare all'lcd l'immagine. N.B. cè il -1 perchè nella SD gli indici partono da 0
       image_index++;
    }
  return;
}
 
 
int main() {
 
  pc.baud(115200); 
  
  Display.gfx_ScreenMode(Picaso::LANDSCAPE);
  
 
  //uSD card mount routine
  Display.putStr("Mounting...\n");  //print a string
  
  disk = Display.file_Mount();
  if(disk==0)
  {
    while(disk==0)
    {
      Display.putStr("Drive not mounted... %i" );
      wait(0.200);
      Display.gfx_Cls();
      wait(0.200);
      disk = Display.file_Mount();
    }
  }
 
  Display.gfx_BGcolour(Picaso::WHITE ) ; //change background color to white
  Display.gfx_Cls();            //clear the screen
  
  //load the graphics files
  hndl0 = Display.file_LoadImageControl("NoName2.dat", "NoName2.gci", 1);
  hndl2 = Display.file_LoadImageControl("WORKSH~1.dat", "WORKSH~1.gci", 1);
  hndl1 = Display.file_LoadImageControl("1frame.dat", "1frame.gci", 1);        
  
  Display.img_Show(hndl1,6);      //mentre aspetto i comandi viene mostrata un'espressione sorridente
  
  italian_ph();
  riemp_mat(); 
  
  
  while(1){
     
    insert();
    control();
    insert_t();
    control_vett_fin();
    show_image.attach(&show,durata);
}
}

How are you entering the string? The serial port recieve buffer is 16 bytes, if you only see 16 characters it could be that you're sending the text before the program is ready for it and so the buffer overflows.

Also the show function will probably crash if hndl has not been defined which is possible depending on the string entered. You should set it to a default value on startup.

posted by Andy A 25 Aug 2017

1 Answer

2 years, 3 months ago.

Hi Thomas,

Because your question is too broad, it is difficult to assist you with such a large code snippet. Please visit the following resources to help debug your code:

Please let me know if you have any further questions!

- Jenny, team Mbed