Console Serial IO con display OLED e seriale asincrona

Dependencies:   mbed BufferedSerial AserialIOFuncLib SSD1306 TerminalPlusV2

Fork of SerialIO by Max Scordamaglia

Console Serial IO con display OLED e seriale asincrona

Revision:
40:48422add4537
Parent:
39:0d7165083e7a
Child:
41:fb612a3936fb
--- a/choiceFunctions.h	Sun Dec 27 23:15:53 2015 +0000
+++ b/choiceFunctions.h	Sun Jan 03 14:32:39 2016 +0000
@@ -1,35 +1,32 @@
 // istanze di funzioni per metterle poi dove si vuole
 bool funcfromMenu(int);
+int contaMenuFunc();
 //-------------------------------------------------
 
 void choiceVideoSettings()
 {
     string prefix;
+    bool bbold;
     //stampo menu
-    menuidx=3;
     for (int i =  0; i<10 ; i++) {
         if (i==menuidx) {
-            term.bold();
+            bbold=1;
             prefix="*";
         } else {
-             term.resetattrib();
-            //term.forgcol(7);
+            bbold=0;
             prefix=" ";
         }
-        term.formatPrintf(fnzAdd.string2char(prefix+menu_main[i]),1,4+i,19);
+        term.formatPrintf(fnzAdd.string2char(prefix+menu_main[i]),1,4+i,19,bbold);
     }
     //info terminale
     term.formatPrintf("Menu Add \n",61,p52,19,1); //p52
-    //setto asterisco
-   // term.formatPrintf("*",1,4+menuidx,1);
-    //setto funzioni e scelta
+
     funcfromMenu(menuidx);
 }
 
 void writeLogInput(string strIn)
 {
     // stampa i splitta i parametri in ingesso
-    //write param
     string func;
     string funcnum;
     string param;
@@ -44,26 +41,24 @@
 //---------------------------------------------------------------------------------------------
 }
 
-
-bool funcOut(string func, string funcnum, string param, string sstr)
+void writeFunctionVal(string strIn)
 {
-    //fare
-    bool errp=1;
-    char funcc;
-    int tempcc=0;
-    funcc=*fnzAdd.string2char(fnzAdd.addEOS(funcnum));
+    int idx=0;
+    bool trovato=false;
+    //cerca valore. Per ora facciamo cosi, poi si vede se indicizzarlo
+    while ((trovato==false) && (idx<50)) {
+        if ((strIn.substr(0,1)==fnzAdd.i2s(function_val[idx][0])) && (strIn.substr(2,1)==fnzAdd.i2s(function_val[idx][1]))) trovato=true;
+        else idx++;
+    }
+    //stampo
+    if (trovato==true) { //non dovrebbe servire
+        term.formatPrintf(fnzAdd.string2char(fnzAdd.i2s(function_val[idx][2])),50,16,10); //min
+        term.formatPrintf(fnzAdd.string2char(fnzAdd.i2s(function_val[idx][5])),60,16,10); //start
+        term.formatPrintf(fnzAdd.string2char(fnzAdd.i2s(function_val[idx][3])),70,16,10); //max
+        term.formatPrintf(fnzAdd.string2char(fnzAdd.i2s(function_val[idx][6])),70,4+funcidx,10); //valore attuale di fianco alla riga
+    }
+}
 
-    if ((funcnum>="0") && (funcnum<="9")) {
-        while (menu_funcChoice[tempcc]!="z") {
-            tempcc++;
-        }
-        if (menu_funcChoice[tempcc]=="z") tempcc--;
-        funcidx=tempcc;
-
-        errp=0;
-    }
-    return errp;
-}
 
 //********************* Led
 bool Lfunc(string func, string funcnum, string param)
@@ -91,7 +86,6 @@
 
 
 //********************** cambio menu
-
 bool funcfromMenu(int funcnum)
 {
 // funzione di load funzioni da menu scelto
@@ -99,7 +93,11 @@
     int tempm;
     int ccmenu=0; //indice vettore funzioni selezionate
     int ccfun=0; //indice vettore funzione principale
+    int contoldfun, contonewfun; //conta le voci di menu prima di sostituirlo
     string funzionen;
+    string prefix; //prefisso asterisco per voci selezionate
+    bool bbold=0; //postfisso bold per righe selezionate
+    contoldfun=contaMenuFunc();
     //filtro vettore funzioni in base la menu
     funzionen=menu_function[ccmenu];
     while ((funzionen.substr(0,1)!="Z") && (ccmenu<=99)) {
@@ -114,37 +112,80 @@
         funzionen=menu_function[ccmenu];  //assegna la stringa del menu
     }
     menu_funcChoice[ccfun]="Z.Z"; //setto lo stop
+    contonewfun=contaMenuFunc();
+    // menu fatti, ora funzioni
     if (ccfun>0) { //non dovrebbe avvenire diversamente perche' 1 ci deve esere ma e' da trappare
         //azzero da dove sono in giu'
-        for (int i =  funcidx+1; i <ccfun ; i++) {
-            term.formatPrintf("*",42,4+i,38);
+        for (int i =  contonewfun+1; i <=contoldfun ; i++) {
+            term.formatPrintf(fnzAdd.string2char(fnzAdd.padstr(" ",38,' ')),41,4+i);
         }
-        //scrico dalla prima allo scelto
+        //scrivo dalla prima allo scelto
+        funcidx=0;
         for (int i =  0; i <ccfun ; i++) {
-            term.formatPrintf(fnzAdd.string2char(menu_funcChoice[i]),42,4+i,38);
+            if (i==funcidx) {
+                bbold=1;
+                prefix="*";
+            } else {
+                bbold=0;
+                prefix=" ";
+            }
+            term.formatPrintf(fnzAdd.string2char(prefix+menu_funcChoice[i]),41,4+i,38,bbold);
         }
     }
-    funcidx=0;
-    errp=0; //per ora non fa nulla, vedere se tenere a uso futuro
+
+   // errp=0; //per ora non fa nulla, vedere se tenere a uso futuro
     return errp;
 }
 
-
-bool menuOut(string func, string funcnum, string param, string sstr)
+bool funcOut(string func, string sstr)
 {
+    //setta la funzione in uso
     bool errp=1;
-    char funcc;
-    funcc=*fnzAdd.string2char(fnzAdd.addEOS(funcnum));
-    if ((funcnum>="0") && (funcnum<="9")) {
+    string funcc;
+    int contoldfun=0; //conta le voci di menu prima di sostituirlo
+    contoldfun=contaMenuFunc();
+    funcc=sstr.substr(1,1);
+    if ((funcc>="0") && (funcc<="9")) {
+        contoldfun=fnzAdd.min(contoldfun,atoi(fnzAdd.string2char(funcc))); //assegno il minimo
         //azzero
-        term.formatPrintf(" \n",2,4+menuidx,1);
+        term.resetattrib();
+        term.formatPrintf(fnzAdd.string2char(" "+menu_funcChoice[funcidx]),41,4+funcidx,38);
+        // scrivo in console
+        term.bold();
+        funcidx=contoldfun;
+        term.formatPrintf(fnzAdd.string2char("*"+menu_funcChoice[funcidx]),41,4+funcidx,38);
+        term.resetattrib();
+        // scrivo valori della funzione a video
+        writeFunctionVal(menu_funcChoice[funcidx].substr(0,3));
+        //display
+        term.formatPrintf(fnzAdd.string2char(fnzAdd.addEOS("Set Funzione "+funcc+"\n")),61,p52,99,1); //p52
+        printDisp(dispType,fnzAdd.string2char(fnzAdd.addEOS("Set Funzione "+funcc+"\r")));
+        //errp=0;
+    } else errp=0; //stampo solo all'ultimo
+    return errp;
+}
+
+bool menuOut(string func, string sstr)
+{
+    //setta il menu in uso
+    bool errp=1;
+    string funcc;
+    funcc=sstr.substr(1,1);
+    if ((funcc>="0") && (funcc<="9")) {
+        //azzero
+        term.resetattrib();
+        term.formatPrintf(fnzAdd.string2char(" "+menu_main[menuidx]),1,4+menuidx,19);
         // scrivo
-        menuidx= fnzAdd.c2i(funcc);
-        term.formatPrintf("*\n",2,4+menuidx,1);
-        printDisp(dispType,fnzAdd.string2char(fnzAdd.addEOS("Menu "+funcnum+"\r")));
-        //chiama la cernita delle funzioni
-        errp=funcfromMenu(menuidx); //ritorna sempre 0 (e va bene cosi)
-    }
+        term.bold();
+        menuidx=atoi(fnzAdd.string2char(funcc));
+        term.formatPrintf(fnzAdd.string2char("*"+menu_main[menuidx]),1,4+menuidx,19);
+        term.resetattrib();
+        //setto funzioni
+        funcfromMenu(menuidx);
+        //display
+        term.formatPrintf(fnzAdd.string2char(fnzAdd.addEOS("Set Menu "+funcc+"\n")),61,p52,99,1); //p52
+        printDisp(dispType,fnzAdd.string2char(fnzAdd.addEOS("Set Menu "+funcc+"\r")));
+    } else errp=0; //stampo solo all'ultimo
     return errp;
 }
 
@@ -172,8 +213,6 @@
     return errp;
 }
 
-
-
 //********************* Start
 bool StartfuncOut()
 {
@@ -222,9 +261,10 @@
         //display
         printDisp(dispType,"Menu Add \n\r");
         printDisp(dispType,fnzAdd.string2char(fnzAdd.addEOS("  "+sstr.substr(0,3)+"\r")));
-        errp=0;
+
     }
     if (funcc=="9") {
+        errp=0;
         // writeLogInput( sstr); //solo al 9 stampo il log. Ha poi senso?
     }
     return errp;
@@ -239,21 +279,19 @@
     if (funcc!="Z") {
         //assegno menu al vettore
         menu_function[funccontidx]=fnzAdd.addEOS(sstr.substr(1,20));
-        //stampo in posizione
-        //term.formatPrintf(fnzAdd.string2char( menu_function[funccontidx]),42,4+(funccontidx%20),38);
         //info terminale
         term.formatPrintf("Function In \n",61,p52,99,1); //p52
         //display
         printDisp(dispType,"Function In \n\r");
         printDisp(dispType,fnzAdd.string2char(fnzAdd.addEOS("  "+sstr.substr(0,3)+"\r")));
         funccontidx++; //incremento il contatore generale delle funzioni
-        errp=0;
     } else {
         menu_function[funccontidx]="Z.Z"; //carico lo stop
         funccontidx=0; //azzero il contatore generale delle funzioni
-        writeLogInput( sstr); //solo allo z stampo il log. Ha poi senso?
+        writeLogInput(sstr); //solo allo z stampo il log. Ha poi senso?
         //set default video
         choiceVideoSettings();
+        errp=0;
     }
     return errp;
 }
@@ -276,16 +314,38 @@
     return 1;
 }
 
+//********************* Value Functions In
+bool valueIn(string sstr)
+{
+    /* valore funzioni in ingresso
+    Formato: viimftxxxx
+    v-prefisso sempre v
+    ii-indice
+    m-menu
+    f-funzione
+    t-tipo n:min, x:max, s:step, v:valstart, a:valore attuale
+    xxxx-valore
+    */
+    bool errp=1;
+    int idx=atoi(fnzAdd.string2char(sstr.substr(1,2)));
+    int vval=atoi(fnzAdd.string2char(sstr.substr(6,4)));
+    // term.formatPrintf(fnzAdd.string2char("*"+fnzAdd.i2s(idx)),50,16,10);
+    if (sstr.substr(0,1)=="v") {
+        function_val[idx][0]=atoi(fnzAdd.string2char(sstr.substr(3,1))); //MENU
+        function_val[idx][1]=atoi(fnzAdd.string2char(sstr.substr(4,1))); //FUNZIONE
+        function_val[idx][2+atoi(fnzAdd.string2char(sstr.substr(5,1)))] =vval; //tipo
+        //errp=0;
+    }
+    return errp;
+}
 
 //********************* ?????????????????????????????
 bool NfuncIn(string func, string funcnum, string param, char* arr)
 {
     bool errp=1;
-    int funcn;
     if ((funcnum>="0") && (funcnum<="9")) {
         term.formatPrintf(fnzAdd.string2char(fnzAdd.addEOS(param)),21,p51,8,1); //p51
         // vale la pena creare una funzione di parametri da formalizzare
-        funcn=fnzAdd.c2i(arr[2]+arr[3]);
         for (int i = 0; i < 6; i++) term.formatPrintf(" ",23+(i*4),12,1,1);
         term.formatPrintf(fnzAdd.string2char(param.substr(0,2)+"*"),21+(fnzAdd.c2i(arr[1])*4),12,1,1); //p11 //p12 //p21
         printDisp(dispType,"NFuncIn\n\r");
@@ -305,4 +365,16 @@
     term.formatPrintf("Arduino Boot\n",61,p52,99,1);   //p52
     ardser.printf("rl\r");
     return 1;
+}
+
+int contaMenuFunc()
+{
+    //funzione che conta le voci di menu in essere
+    int ret=0;
+    //conta gli elemnti del vecchio menu per la cancellazione. Si potrebbe usare una variabile globale ricordando il conteggio precedente ma cosi' non dovrebbe perdere troppo tempo
+    while (menu_funcChoice[ret].substr(0,1)!="Z") {
+        ret++;
+    }
+    if (ret>0) ret--; //per rirportare indietro il contatore
+    return ret;
 }
\ No newline at end of file