Skibbie":231bf3rz schrieb:
Wie sieht das überhaupt aus, zahlst du dafür etwas oder ist das zu wenig? Ich hab immer Angst dass ich da hin rennen muss, und zusätzlich blechen. Deshalb hab ich bis jetzt immer versucht unter 20 euro zu bleiben...
Wenn ich glück habe Zahle ich keinen, wenn Pech dann schon... Bei den Mengen die Ich im Moment einkaufe rechne Ich immer nen kleinen %-Satz mit drauf für wenn Ich Pech habe. So Zahlt also eigentlich der dessen Bestellung durch geht ein bisschen zuviel, der wo ne Bestellung beim Zoll hängen bleibt nen bisschen weniger. In der Summe gesehen, nur von den Protoypen sieht es momentan so aus als ob nur Ich Minus mache. :-/ Insgesammt aber kommt es mich immer noch billiger als wenn Ich nur 2 Platinen für mich bestellt hätte...
Skibbie":231bf3rz schrieb:
solange man eingestellte Werte sehen kann, wäre es mir vorerst egal.
Kannste leider noch nicht
feifen: es ist schwer nen Display zu testen wenn Ich keinen Prototypen da habe. Aber versprochen: Spätestens eine Woche nachdem Ich die erste Platine fertig habe werde Ich auch die Steuerung fertig haben. Ich kann im moment halt selber nur blind programmieren da ich kein passendes Display und Sensoren verbaut habe...
So und dann wieder zum alltag zurück:
Ic hhab mal nen bisschen mit dem Menü experimentiert um zu sehen ob es so klappen könnte wie Ich denke. Problem ist das es zwar fertige libarys gibt, die aber entweder für ein so großes Menü zuviel speicher fressen oder so kompley sind das ein "normaler" user es nie anpassen könnte ohne sich Tage rein zu lesen.
Also bin Ich hingegangen und habe mal bisschen pseudocode selber geschrieben, nur um euch zu fragen ob nicht programmierer diesen verstehen und ihn anpassen könnten:
Code:
void showMenu(int *menudeep, int *menulevel[4], int *key){
String mDisplay[4];
switch (*menulevel[0]){
// Level 0, oberste Zeile
case 1:
mDisplay[0] = showString(PSTR("Menu 1"));
sub_Menu1_1(&menudeep, &menulevel, mDisplay, &key);
break;
case 2:
mDisplay[0] = showString(PSTR("Menu 2"));
break;
}
lcd1.clearLine(*menudeep);
lcd1.print(mDisplay[*menudeep]);
}
void sub_Menu1_1(int **menudeep, int **menulevel[4],String mDisplay[4], int **key){
switch (**menulevel[1]){
// Level 1, 2te Zeile
case 0:
break;
case 1:
mDisplay[1] = showString(PSTR("Menu 1.1"));
sub_Menu1_1_1(&menudeep, &menulevel, mDisplay, &key);
break;
case 2:
mDisplay[1] = showString(PSTR("Menu 1.2"));
setLightC1(**key);
break;
}
}
void sub_Menu1_1_1(int ***menudeep, int ***menulevel[4],String mDisplay[4], int ***key){
switch (***menulevel[2]){
// Level 2, 3te Zeile
case 0:
break;
case 1:
mDisplay[2] = showString(PSTR("Menu 1.1.1"));
break;
}
}
showMenu ist der Aufruf des Menüs selbst. Dieser kommt wenn man den Menü button drückt. Jetzt kann man mit hoch/runter durchs menü und mit rechts eine ebene tiefer. Links geht eine ebene höher. enter hat keine funktion hier.
Alle Menü einträge folgen dem gleichen schema:
- Nummer des Eintrags
- Text der auf das display kommt
- Aktion hinter dem menü
Für untermenü ist das z.b. sub_Menu1_1(&menudeep, &menulevel, mDisplay, &key);, wobei der Name egal ist, ich hab jetzt auf die schnelle nur sub_Menu genommen und ne nummerrierung 1_1 -> submenu von 1, erster punkt oder 1_2 -> submenu von 1, 2ter punkt.
jetzt kommt wieder das gleiche eigentlich. nummer, text, aktion... das kann man so auf 4 ebenen machen, wobei die aktion immer nen weiteres menü sein kann oder ne einstellung.
setLightC1(**key); wäre dann z.B. die funktion um das Licht vom ersten kanal ein zu stellen. hier kann man dann mit (rechts,links, das nur z.b. bei uhrzeiten) hoch,runter den wert ändern und mit enter speichert man und ist wieder auf der ebene zuvor im menü.
wer das menü erweitern möchte muss nur
Code:
void sub_Menu1_2_1(int ***menudeep, int ***menulevel[4],String mDisplay[4], int ***key){
switch (***menulevel[2]){
case 0:
break;
case 1:
mDisplay[2] = showString(PSTR("Menu 2.1.1"));
break;
}
}
kopieren, umbenennen und für sich anpassen. An der stelle wo das aufgerufen wird ersetzt man dann einfach den eintrag mit seinem oder fügt ihn hinzu:
Code:
void sub_Menu1_1(int **menudeep, int **menulevel[4],String mDisplay[4], int **key){
switch (**menulevel[1]){
// Level 1, 2te Zeile
case 0:
break;
case 1:
mDisplay[1] = showString(PSTR("Menu 1.1")); // das ist von mir programmiert
sub_Menu1_1_1(&menudeep, &menulevel, mDisplay, &key);
break;
case 2:
mDisplay[1] = showString(PSTR("mein_eigenes_Menu"));
mein_eigenes_Menu(&menudeep, &menulevel, mDisplay, &key);
break;
case 3:
mDisplay[1] = showString(PSTR("Noch eine neue einstellung"));
say_hello(**key);
break;
}
}
void mein_eigenes_Menu(int ***menudeep, int ***menulevel[4],String mDisplay[4], int ***key){
switch (***menulevel[2]){
case 0:
break;
case 1:
mDisplay[3] = showString(PSTR("Ich bin ein neues Menü"));
break;
}
}
Macht das Sinn für euch und ist das verständlich?
Falls nicht komm ich wohl nicht drum herrum das ganze in ne eigene Libary zu schreiben damit alles automatisiert wird... Ist zwar eh der Plan für später, aber sowas kostet mehr zeit als mal schnell nen Menü fest einzuprogrammieren... :roll: