Pages: 1 ... 4 5 [6] 7 8 ... 15   Go Down
Author Topic: MENWIZ: una libreria per creare menu su LCD  (Read 24602 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve, inanzi tutto complimenti per questa libreria, però volevo fare un menù un popiù complesso degli esempi base e non riesco, non so se sbaglio io oppure e la libreria che ha questo limite, cerco di spiegarmi al meglio.

Ho la necesità di avere vari sub menu all'interno di altri menu, allego la porzione di codice che ho realizzato fin ora cercando di risolvere l'enigma, quello che mi succede e che non sempre tutte le voci vengono visualizzate, oppure le voci dei menu anche se appartenenti a sub menu diversi mi vengono unite e non riesco a capire per quale motivo.

Code:
r=tree.addMenu(MW_ROOT,NULL,F("Main Menu"));               
    s1=tree.addMenu(MW_SUBMENU,r, F("Operatore"));           
      s2=tree.addMenu(MW_VAR,s1, F("Sense"));         
        s2->addVar(MW_LIST,&list);
        s2->addItem(MW_LIST, F("Automatico"));
        s2->addItem(MW_LIST, F("Manuale"));
      s2=tree.addMenu(MW_VAR,s1, F("Luminosita' schermo"));   
        s2->addVar(MW_AUTO_BYTE,&sp,0,100,1);
    s1=tree.addMenu(MW_SUBMENU,r, F("Tecnico"));             
      s2=tree.addMenu(MW_VAR,s1, F("Emu Mode"));               
        s2->addVar(MW_LIST,&cpmode);
        s2->addItem(MW_LIST, F("A"));
        s2->addItem(MW_LIST, F("B"));
        s2->addItem(MW_LIST, F("C"));
        s2->addItem(MW_LIST, F("D"));
        s2->addItem(MW_LIST, F("E"));
        s2->addItem(MW_LIST, F("F"));   
    s2=tree.addMenu(MW_SUBMENU,s1, F("Ethernet"));
        s3=tree.addMenu(MW_SUBMENU,s2, F("IP"));
          s3=tree.addMenu(MW_VAR,s2, F("Blocco A"));
          s3->addVar(MW_AUTO_BYTE,&sp,0,100,1);
          s3=tree.addMenu(MW_VAR,s2, F("Blocco B"));
          s3->addVar(MW_AUTO_BYTE,&sp,0,100,1);
          s3=tree.addMenu(MW_VAR,s2, F("Blocco C"));
          s3->addVar(MW_AUTO_BYTE,&sp,0,100,1);
          s3=tree.addMenu(MW_VAR,s2, F("Blocco D"));
          s3->addVar(MW_AUTO_BYTE,&sp,0,100,1);
        s3=tree.addMenu(MW_VAR,s2, F("Mask"));
          s3->addVar(MW_LIST,&mask);
          s3->addItem(MW_LIST, F("255.255.255.240"));
          s3->addItem(MW_LIST, F("255.255.255.224"));
          s3->addItem(MW_LIST, F("255.255.255.192"));
          s3->addItem(MW_LIST, F("255.255.255.128"));
          s3->addItem(MW_LIST, F("255.255.255.0"));
          s3->addItem(MW_LIST, F("255.255.0.0"));         
    s2=tree.addMenu(MW_VAR,s1, F("Salva e riavvia"));
      s2->addVar(MW_ACTION,SaveRestart);
       tree.navButtons(UP_BOTTON_PIN,DOWN_BOTTON_PIN,LEFT_BOTTON_PIN,RIGHT_BOTTON_PIN,ESCAPE_BOTTON_PIN,CONFIRM_BOTTON_PIN);

Spero si capisca la logica del menu che voglio realizzare. Preciso che ho anche aumentato i valori massimi di menu nel file .h della libreria, grazie
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vi aggiorno, ho risolto così..

Code:
_menu *r,*s1,*s2,*s3,*s4,*s5,*s6,*s7,*s8,*s9,*s10,*s11;

r=tree.addMenu(MW_ROOT,NULL,F("Main Menu"));
 
    s1=tree.addMenu(MW_SUBMENU,r, F("Operatore"));
      s2=tree.addMenu(MW_VAR,s1, F("Opt"));
        s2->addVar(MW_LIST,&LcRm);
          s2->addItem(MW_LIST, F("Auto"));
          s2->addItem(MW_LIST, F("Manual"));

      s2=tree.addMenu(MW_VAR,s1, F("Luminosita'")); s2->addVar(MW_AUTO_INT,&DispLum,5,100,5); 

    s3=tree.addMenu(MW_SUBMENU,r, F("Tecnico"));

      s6=tree.addMenu(MW_VAR,s3, F("MODE"));
        s6->addVar(MW_LIST,&EmuMode);
          s6->addItem(MW_LIST, F("A"));
          s6->addItem(MW_LIST, F("B"));
          s6->addItem(MW_LIST, F("C"));
          s6->addItem(MW_LIST, F("D"));
          s6->addItem(MW_LIST, F("E"));
          s6->addItem(MW_LIST, F("F"));
          s6->addItem(MW_LIST, F("G"));     

    s4=tree.addMenu(MW_SUBMENU,s3, F("Ethernet"));
      s7=tree.addMenu(MW_SUBMENU,s4, F("IP"));
        s8=tree.addMenu(MW_VAR,s7, F("Blocco A")); s8->addVar(MW_AUTO_BYTE,&IP_a,0,254,1);
        s8=tree.addMenu(MW_VAR,s7, F("Blocco B")); s8->addVar(MW_AUTO_BYTE,&IP_b,0,254,1);
        s8=tree.addMenu(MW_VAR,s7, F("Blocco C")); s8->addVar(MW_AUTO_BYTE,&IP_c,0,254,1);
        s8=tree.addMenu(MW_VAR,s7, F("Blocco D")); s8->addVar(MW_AUTO_BYTE,&IP_d,0,254,1);
     
      s9=tree.addMenu(MW_SUBMENU,s4, F("Gateway"));
        s10=tree.addMenu(MW_VAR,s9, F("Blocco A")); s10->addVar(MW_AUTO_BYTE,&GW_a,0,254,1);
        s10=tree.addMenu(MW_VAR,s9, F("Blocco B")); s10->addVar(MW_AUTO_BYTE,&GW_b,0,254,1);
        s10=tree.addMenu(MW_VAR,s9, F("Blocco C")); s10->addVar(MW_AUTO_BYTE,&GW_c,0,254,1);
        s10=tree.addMenu(MW_VAR,s9, F("Blocco D")); s10->addVar(MW_AUTO_BYTE,&GW_d,0,254,1);

      s11=tree.addMenu(MW_VAR,s4, F("Mask"));
        s11->addVar(MW_LIST,&maskselection);
          s11->addItem(MW_LIST, F("255.255.255.240"));
          s11->addItem(MW_LIST, F("255.255.255.224"));
          s11->addItem(MW_LIST, F("255.255.255.192"));
          s11->addItem(MW_LIST, F("255.255.255.128"));
          s11->addItem(MW_LIST, F("255.255.255.0"));
          s11->addItem(MW_LIST, F("255.255.0.0"));

    s5=tree.addMenu(MW_SUBMENU,s3, F("POT"));
// al momento vuoto andrà un MW_LIST come sopra

       tree.navButtons(UP_BOTTON_PIN,DOWN_BOTTON_PIN,LEFT_BOTTON_PIN,RIGHT_BOTTON_PIN,ESCAPE_BOTTON_PIN,CONFIRM_BOTTON_PIN);


Spero che sia cosa gradita il codice da me scritto e qui postato, visto che ora questo è un chiaro esempio di nodi gerarchici con varie cose implementate, mi chiedevo comunque se questo fosse o meno il giusto approccio, e davvero necessario dover dichiarare tutti questi menù per realizzare la medesima struttura di menù? grazie e a buon rendere smiley-grin
Logged

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 483
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ad occhio il tuo menu non è dei più complessi per MENWIZ.
devo verificare in pratica asap!
Logged

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 483
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mi hai battuto sul tempo. la mia risposta era per il tuo post precedente....
Non so se ho capito la tua domanda. Se ti riferisci alle variabili s1...s10, tipo _menu * , ne bastano solo quanti sono i livelli massimi di nesting dei menu, Le variabili di tipo pointer servono infatti per chiamare i metodi (addVar, addItem) sullo specifico oggetto di tipo menu, ma possono essere riutilizzati, non essendo poi necessari al codice utente. I nodi del menu non sono creati alla dichiarazione di un tipo _menu*, ma sono o preallocati o sono creati dinamicamente dai metodi invocati di tipo addXxx.
Quindi nel tuo caso basterebbero s1,s2,s3,se il massimo livello di nesting è 3.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per la risposta, però come vedi ho provato limitandomi a s1,s2,s3, ma non sono riuscito a fare la stessa cosa e quindi ho ripiegato in questo modo, perchè quello che succedeva e che mi si mischiavano le voci dei menù, quando uscivo da un menu mi ritrovavo dentro un'altro e così via.

Sapresti darmi una base di codice pulita per fare cio che vorrei fare io?(intendiamoci non voglio scritto il codice ma un aiutino)

Perchè effettivamante, per come ne sono venuto a capo, penso che mangi davvero tanta ram dal chip, al momento sto testando su un'arduino uno, a breve faro le prove su un mega2560, ma mi preoccupa molto il problema ram, inquanto nella parte di programma qui non esposta è presente un'intera emulazione di protocolle ethernet di un macchinario più diverse altre funzioni di controllo e uso intensivo di ingressi e uscite, e senza l'implementazione del menù ho avuto diversi problemi per colpa della ram, che sudando non poco sono riuscito a risolvere. Mi chiedo quando avrò tra le mani il mega e unirò questa prova di menu al codice gia scritto cosa succederà.

Ti faccio poi un'altra domanda, come vedi mi trovo a dover gestire 4 byte di un'IP, ancora la libreria non gestisce array di byte vero? Ritieni che il mio approccio sia giusto nella gestione dei 4 byte?

grazie ancora
Logged

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 483
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@zoster81
scusa la mia latitanza. ma sono veramente un po incasinato e quasi sempre fuori.
Si menwiz consuma ram. in parte alloca staticamente in parte dinamicamente le strutture dati. il modello ibrido non è astrattamente il migliore, ma data l'architettura dell'atmel è un onesto compromesso (io allocherei tutto dinamicamente ... :-) )
Si può fare meglio ? Forse si, ma qualunque soluzione è relativa: se diminuisco lo spazio preallocato delle opzioni, se ho molti oggetti di tipo mw_list devasto la ram. se lo aumento consumo troppa flash. Aspettiamo un po più di ram (non ne serve tantissima di più...)

Vorrei implementare dati complessi (testi ed array) editabili, anzi li ho implementati, ma la libreria così è cresciuta troppo. So come riscrivere la libreria per salvare un po di spazio (un po, non troppo) in sram. Ma sono pigro ed al momento non troverei il tempo per farlo. Ho anche altre librerie sfiziose, ma ugualmente non trovo  tempo per pulirle e documentarle ...
Detto questo, qualcosa devo pur fare, di abbastanza generale. Sicuramente un campo editabile, se non cresce troppo la dimensione del codice. E un po di pulizia del codice.  

Come suggerimento verifica se usi sprintf. Consuma un bel po di memoria.
« Last Edit: June 01, 2013, 07:22:59 am by brunialti » Logged

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 483
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In allegato c'è la nuova versione di menwiz con alcune funzioni che credo interessanti:
- un nuovo tipo variabile: testo editabile. funziona solo con 6 bottoni, sino a quando non mi viene in mente una modalità di interazione usabile anche con 4 bottoni..
- è possibile definire sino a tre "utenti" differenti e abilitare/disabilitare i menu per ciascuno di essi

La libreria non è aumentata come footprint e dovrebbe risparmiare qualche decina di byte di sram.
E' solo in beta e potrebbe avere dei bug...
ciao

* MENWIZ_1_3_beta.zip (79.36 KB - downloaded 28 times.)
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Bruno,
la puoi allegare al primo tuo post?
Così si evita di doverla cercare in giro nel caso il topic diventasse sempre più grande. (te lo auguro)
Grazie.  smiley-mr-green
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 483
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

fatto
Logged

Trentino
Offline Offline
Full Member
***
Karma: 0
Posts: 125
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao a tutti
ho un display 20x4 con SPI ma non riesco a vedere gli esempi, come posso fare?
sono agli inizi e quindi so che la soluzione è sotto il mio naso e non la vedo!
grazie in anticipo!
Logged

_________________________________________
     ...veramente ai primi passi!        
       portate pazienza,GRAZIE!    

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 329
Posts: 22782
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

non riesco a vedere gli esempi
Significa che non ti funzionano o che non li vedi elencati nel menu a tendina dell'IDE?
Logged


Trentino
Offline Offline
Full Member
***
Karma: 0
Posts: 125
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

proprio l'LCD non visualizza
Logged

_________________________________________
     ...veramente ai primi passi!        
       portate pazienza,GRAZIE!    

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 329
Posts: 22782
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sei sicuro dei collegamenti?
Logged


Trentino
Offline Offline
Full Member
***
Karma: 0
Posts: 125
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho collegato come da sito
http://learn.adafruit.com/i2c-spi-lcd-backpack/connect-to-spi
ed era ok poi ho installato le lib di MENWIZ ma niente, non so dove mettere le mani vista la mia scarsa pratica
Logged

_________________________________________
     ...veramente ai primi passi!        
       portate pazienza,GRAZIE!    

0
Offline Offline
Faraday Member
**
Karma: 46
Posts: 5881
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma eliminando la menwiz ed usandolo normalmente funziona ?
Il fatto che stai usandi il bus SPI può forse dar fastidio alla lib ? Non credo, ma prova anche con displai in parallelo o in i2c
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Pages: 1 ... 4 5 [6] 7 8 ... 15   Go Up
Jump to: