Hallo,
schöne Erklärungen, CHDKLover.
Wie ein Menü-Eintrag erfolgt, hat CHDKLover schon erklärt. Jetzt kommt noch der Fall, dass wir bestimmte Werte oder Angaben im Menü bestimmen wollen. Dazu brauchen wir denn ein Ergänzung. Als Beispiel nehme ich die Temperaturanzeige, da ich das nicht so gut wie CHDKLover erklären kann:
in
core/gui.c der Menüeintrag
{0x5f,LANG_MENU_OSD_SHOW_TEMP
, MENUITEM_ENUM
, (int*)gui_temp_mode_enum
},Erstellt in 0.001 Sekunden, mit
GeSHi 1.0.8.9
in
core/gui.c die Auswahlmöglichkeit für den Menüeintrag
const char* gui_temp_mode_enum
(int change
, int arg
) {
static const char* modes
[]={ "Off", "Optical","CCD","Battery","all" };
conf.
show_temp+=change
;
if (conf.
show_temp<0)
conf.
show_temp=(sizeof(modes
)/sizeof(modes
[0]))-1;
else if (conf.
show_temp>=(sizeof(modes
)/sizeof(modes
[0])))
conf.
show_temp=0;
return modes
[conf.
show_temp];
}Erstellt in 0.003 Sekunden, mit
GeSHi 1.0.8.9
Damit CHDK sich den Eintrag merken kann erfolgt noch ein Eintrag in der Konfiguration
core/conf.c.
CONF_INFO
(203, conf.
show_temp, CONF_DEF_VALUE
, i
:1, NULL
),Erstellt in 0.001 Sekunden, mit
GeSHi 1.0.8.9
Wenn man einen neuen Konfigurationseintrag macht, muss dieser am Ende der fortlaufenden Nummern(hier 203) erfolgen. Als Vorgabe wurde hier "Optical" (Wert 1) gewählt. Außerdem gehört noch ein Eintrag in die Header-Datei
include/conf.h
typedef struct {
...
int show_temp
;
...
}Erstellt in 0.001 Sekunden, mit
GeSHi 1.0.8.9
Und nun die eigentliche Anzeigefunktion der Temperatur in
core/gui_osd.c
void gui_osd_draw_temp
() {
if (conf.
show_temp == 1)
{
if (conf.
temperature_unit == 0)
{
sprintf
(osd_buf
," opt: %i°",get_optical_temp
());
}
else
{
sprintf
(osd_buf
,"opt: %i°",(get_optical_temp
()*18+320)/10);
}
draw_string
(conf.
temp_pos.
x, conf.
temp_pos.
y, osd_buf
, conf.
osd_color);
}
if (conf.
show_temp==2)
{
if (conf.
temperature_unit == 0)
{
sprintf
(osd_buf
," ccd: %i°",get_ccd_temp
());
}
else
{
sprintf
(osd_buf
,"ccd: %i°",(get_ccd_temp
()*18+320)/10);
}
draw_string
(conf.
temp_pos.
x, conf.
temp_pos.
y, osd_buf
, conf.
osd_color);
}
if (conf.
show_temp==3)
{
if (conf.
temperature_unit == 0)
{
sprintf
(osd_buf
," batt:%i°",get_battery_temp
());
}
else
{
sprintf
(osd_buf
,"batt:%i°",(get_battery_temp
()*18+320)/10);
}
draw_string
(conf.
temp_pos.
x, conf.
temp_pos.
y, osd_buf
, conf.
osd_color);
}
if (conf.
show_temp==4)
{
if (conf.
temperature_unit == 0)
{
sprintf
(osd_buf
," opt: %i°",get_optical_temp
());
draw_string
(conf.
temp_pos.
x, conf.
temp_pos.
y, osd_buf
, conf.
osd_color);
sprintf
(osd_buf
," ccd: %i°",get_ccd_temp
());
draw_string
(conf.
temp_pos.
x, conf.
temp_pos.
y+FONT_HEIGHT
, osd_buf
, conf.
osd_color);
sprintf
(osd_buf
," batt:%i°",get_battery_temp
());
draw_string
(conf.
temp_pos.
x, conf.
temp_pos.
y+2*FONT_HEIGHT
, osd_buf
, conf.
osd_color);
}
else
{
sprintf
(osd_buf
,"opt: %i°",(get_optical_temp
()*18+320)/10);
draw_string
(conf.
temp_pos.
x, conf.
temp_pos.
y, osd_buf
, conf.
osd_color);
sprintf
(osd_buf
,"ccd: %i°",(get_ccd_temp
()*18+320)/10);
draw_string
(conf.
temp_pos.
x, conf.
temp_pos.
y+FONT_HEIGHT
, osd_buf
, conf.
osd_color);
sprintf
(osd_buf
,"batt:%i°",(get_battery_temp
()*18+320)/10);
draw_string
(conf.
temp_pos.
x, conf.
temp_pos.
y+2*FONT_HEIGHT
, osd_buf
, conf.
osd_color);
}
}
}Erstellt in 0.007 Sekunden, mit
GeSHi 1.0.8.9
Diese Funktion braucht noch einen weiteren Menü- und Konfigurationseintrag für die Anzeige der Temperatureinheit. Das erfolgt genau so wie schon oben für die Anzeigeart beschrieben.
Dann wird sie in die OSD-Anzeige in
core/gui.c eingebunden.
void gui_draw_osd
() {
...
if ((conf.
show_temp>0) && (recreview_hold
==0) && ((!kbd_is_key_pressed
(KEY_SHOOT_HALF
) && ( ((m
&MODE_MASK
) == MODE_REC
) || (!((m
&MODE_MASK
) == MODE_REC
) && !((conf.
hide_osd == 1) || (conf.
hide_osd == 3)) )) && !(((conf.
hide_osd == 2) || (conf.
hide_osd == 3))&& (shooting_get_prop
(PROPCASE_DISPLAY_MODE
) == 1)) )|| (conf.
clock_halfpress==0) )) {
gui_osd_draw_temp
();
}
...
}Erstellt in 0.002 Sekunden, mit
GeSHi 1.0.8.9
Hier wird auch festgelegt, wann und unter welchen Bedingungen die Anzeige erfolgen soll.
Die Funktion wird dann in
core/gui_osd.c aufgerufen
void gui_osd_draw
() {
if (osd_to_draw
) {
int i
;
...
gui_osd_draw_temp();
...
}
}Erstellt in 0.001 Sekunden, mit
GeSHi 1.0.8.9
Außerdem kann die Position der Temperaturanzeige im Layout-Editor verändert werden. Dazu wird ein entsprechender Eintrag in
core/gui_osd.c benötigt.
static OSD_elem osd
[]={
...
{LANG_OSD_LAYOUT_EDITOR_TEMP
, &conf.
temp_pos, {9*FONT_WIDTH
, FONT_HEIGHT
} },
...
{0}
};Erstellt in 0.001 Sekunden, mit
GeSHi 1.0.8.9
Die Konfigurationseinträge für die Position erfolgen wieder wie schon beschrieben.
Wenn man generell etwas auf den Bildschirm zeichnen will, stehen diverse Zeichenfunktion in core/draw.c zur Verfügung. In unserem Beispiel wurde
draw_string() verwendet, um eine Zeichenkette zu zeichnen. Man kann auch Punkte, Linien, Rechtecke, Kreise und Ellipsen zeichnen. Dabei müssen Koordinaten und Farbe als Argumente eingegeben werden.
Gruß msl