[Info] Erweiterungen im CHDK-C-Quellcode einbinden?

CHDK-Skripte, CHDK-Entwicklung, PC-Zusatzprogramme, Informationen für Tüftler

Erweiterungen im CHDK-C-Quellcode einbinden?

Beitragvon user116 » 09.12.2009, 22:22

Hallo CHDK'ler

Ich würde gerne etwas für CHDK programmieren und habe mir deswegen mal den Quellcode angeschaut. Da ich noch fast keine Erfahrung im programmieren habe, fällt es mir noch recht schwer, den Quellcode zu verstehen. Die groessten Schwierigkeiten habe ich mit dem Menü und der Stringtabelle.
Allgemein erkenne ich noch nicht den Zusammenhang zwischen den einzelnen Funktionen und Quellcodedateien.
Bei der Stringtabelle weiss ich z.B. nicht, wie ich einen Text auf den Bildschirm bringe.
Bei dem Menue wuerde ich gerne wissen:
1.:Wie fuegt man einen neuen Eintrag hinzu?
2.:Wie fragt man Werte ab (Wie laesst man Werte durch Benutzer eingeben)?
3.:Wo muss man was im Quellcode veraendern, wenn man vom Menue in ein "Programm" wechseln will?

vielen Dank schon im Vorraus fuer eure Hilfe

user 116
Zuletzt geändert von user116 am 14.12.2009, 21:21, insgesamt 1-mal geändert.
A540, SX10IS
user116
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 14
Registriert: 10.02.2009, 18:23

Re: Problem mit C Quellcode

Beitragvon gehtnix » 11.12.2009, 23:45

user116 hat geschrieben:Da ich noch fast keine Erfahrung im programmieren habe, fällt es mir noch recht schwer, den Quellcode zu verstehen.
Den Quellcode verstehe ich auch nicht.
Aber bei Deinem Kentnissstand, wäre es da nicht einfacher Du formulierst was Du haben willst. Vielleicht findet sich ja dann ein williger C-Codler der das umsetzt.

gruß gehtnix
Bild
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 13:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS50 101b

Beitragvon CHDKLover » 13.12.2009, 12:23

Hallo user116,
um eine eigenes Modul in das CHDK zu integrieren musst du folgende Schritte beachten:

Die Folgende Anleitung gibt nur einen groben Überblick, es können darüber hinaus noch weitere Veränderungen nötig sein.

Legende:
Alle Angeben in eckigen Klammern müssen ersetzt werden. Sind alle Buchstaben in den Klammern klein geschrieben sollte das eingesetzte Wort auch klein geschrieben werden. Ist das erste Zeichen groß Geschrieben sollte auch das erste Zeichen des eingesetzten Wortes groß geschrieben werden. Usw.

Für "Vollbildanwendungen":
  • gui_<name>.h
    Anlegen deiner Headerdatei (gui_<name>.h), könnte zum beispiel so aussehen:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    #ifndef GUI_<NAME>_H
    #define GUI_<NAME>_H

    extern int gui_<name>_init();
    extern void gui_<name>_kbd_process();
    extern void gui_<name>_draw();
    #endif
     
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9
  • gui_<name>.c
    Anlegen deines C-Files (gui_<name>.c), mit folgendem Grundaufbau:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    #include "stdlib.h"
    #include "keyboard.h"
    #include "platform.h"
    #include "core.h"
    #include "lang.h"
    #include "conf.h"
    #include "gui.h"
    #include "gui_osd.h"
    #include "gui_draw.h"
    #include "gui_lang.h"
    #include "gui_batt.h"
    #include "gui_mbox.h"
    #include "gui_<name>.h"

    int gui_<name>_init() {
      //Zeichnen aller Elemente, die nach dem Start auf dem OSD erscheinen sollen
      return 1;
    }

    void gui_<name>_kbd_process() {
      //Reagieren auf Benutzereingaben
      switch (kbd_get_autoclicked_key()) {
        case KEY_SET:
          break;
        case KEY_LEFT:
          break;
        case KEY_RIGHT:
          break;
        ...
      }
    }

    void gui_<name>_draw() {
      //Funktion wird in regelmäßigen Abständen aufgerufen. Zum anzeigen von Zustandsänderungen (zum Beispiel Batteriestand)
    }
     
    Erstellt in 0.004 Sekunden, mit GeSHi 1.0.8.9

  • core/gui.c
    Deine Headerdatei einbinden:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    #include "gui_<name>.h"
    Erstellt in 0.001 Sekunden, mit GeSHi 1.0.8.9

    Unter "Menu procs" eine Funktion deklarieren, die später beim Klick auf den Menüeitrag angesprungen werden soll:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    static void gui_draw_<name>(int arg);
    Erstellt in 0.001 Sekunden, mit GeSHi 1.0.8.9

    Menüeintrag anlegen:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
        {<Symbolnummer>, LANG_MENU_<LANG_NAME>,             MENUITEM_PROC,  (int*)gui_draw_<name> },
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9

    In der Funktion "void gui_redraw()" Orientierungssensor beachten. Bedingung nach "#if CAM_USES_ASPECT_CORRECTION" erweitern:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
        if (gui_mode == GUI_MODE_REVERSI || gui_mode == GUI_MODE_SOKOBAN || gui_mode == GUI_MODE_4WINS || gui_mode == GUI_MODE_MASTERMIND ||  gui_mode == GUI_MODE_<NAME>) {
     
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9

    Die Funktion "void gui_redraw()" um die zyklische Zeichenfunktion (gui_<name>_draw()) erweitern:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
            case GUI_MODE_<NAME>:
                gui_<name>_draw();
                break;
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9

    "draw_restore();" für "Vollbildanwendungen abschalten. Am Ende der Funktion "void gui_redraw()" die Bedingung erweitern:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
            if (gui_mode != GUI_MODE_REVERSI && gui_mode != GUI_MODE_SOKOBAN && gui_mode != GUI_MODE_4WINS && gui_mode != GUI_MODE_MASTERMIND && gui_mode != GUI_MODE_<NAME>)
                draw_restore();
        }
    }
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9

    In der Funktion "void gui_kbd_process()", erstes switch erweitern um beim Klick auf Menü aus das Programm zu beenden (vor "case GUI_MODE_BENCH:" folgendes einfügen):
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
                case GUI_MODE_<NAME>:
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9

    Das zweite switch erweitern, damit das Programm auf die restlichen Tasten reagieren kann:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
            case GUI_MODE_<NAME>:
                gui_<name>_kbd_process();
                break;
     
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9

    Funktion "void gui_draw_<name>(int arg)" erstellen, die bei Klick auf den Menüeintrag angesprungen wird:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    void gui_draw_<name>(int arg) {
        //mögliche Bedingungen die zum auslassen des Programmstarts führen
        #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
          draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
        #endif
        if ( gui_<name>_init() )
            gui_mode = GUI_MODE_<NAME>;
    }
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9
  • core/gui_lang.c
    Standardtexte für das Programm ergänzen.
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    "<fortlaufende Zahl1> \"<Text>\"\n"
    ...
    "<fortlaufende Zahln> \"<Text>\"\n"
     
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9
  • core/gui_lang.h
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    #define LANG_MENU_<LANG_NAME1>    <fortlaufende Zahl1>
    ...
    #define LANG_<LANG_NAMEN>              <fortlaufende Zahln>
     
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9

    Maximale Items aktualisieren
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    #define GUI_LANG_ITEMS                  <fortlaufende Zahln>
    Erstellt in 0.001 Sekunden, mit GeSHi 1.0.8.9
  • core/Makefile
    Makefile erweitern
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    OPT_OBJS+=gui_<name>.o
    Erstellt in 0.001 Sekunden, mit GeSHi 1.0.8.9
  • include/gui.h
    Modus des Programmes für die "gui.c" bekannt machen
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    GUI_MODE_<NAME>
    Erstellt in 0.001 Sekunden, mit GeSHi 1.0.8.9



Für "OSD-Elemente":
  • gui_<name>.h
    Anlegen deiner Headerdatei (gui_<name>.h), könnte zum beispiel so aussehen:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    #ifndef GUI_<NAME>_H
    #define GUI_<NAME>_H

    extern void gui_<name>_draw_osd();
    #endif
     
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9
  • gui_<name>.c
    Anlegen deines C-Files (gui_<name>.c), mit folgendem Grundaufbau:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    #include "stdlib.h"
    #include "keyboard.h"
    #include "platform.h"
    #include "core.h"
    #include "lang.h"
    #include "conf.h"
    #include "gui.h"
    #include "gui_osd.h"
    #include "gui_draw.h"
    #include "gui_lang.h"
    #include "gui_batt.h"
    #include "gui_mbox.h"
    #include "gui_<name>.h"

    void gui_space_draw_osd() {
      //Zeichenoperationen für das OSD-Element
    }
     
    Erstellt in 0.003 Sekunden, mit GeSHi 1.0.8.9

  • core/gui.c
    Deine Headerdatei einbinden:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    #include "gui_<name>.h"
    Erstellt in 0.001 Sekunden, mit GeSHi 1.0.8.9

    In der Funktion "void gui_draw_osd() {" die redraw Funktion aufrufen:
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    gui_<name>_draw_osd();
    Erstellt in 0.001 Sekunden, mit GeSHi 1.0.8.9
  • core/gui_lang.c
    Standardtexte für das Programm ergänzen.
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    "<fortlaufende Zahl1> \"<Text>\"\n"
    ...
    "<fortlaufende Zahln> \"<Text>\"\n"
     
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9
  • core/gui_lang.h
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    #define LANG_MENU_<LANG_NAME1>    <fortlaufende Zahl1>
    ...
    #define LANG_<LANG_NAMEN>              <fortlaufende Zahln>
     
    Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9

    Maximale Items aktualisieren
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    #define GUI_LANG_ITEMS                  <fortlaufende Zahln>
    Erstellt in 0.001 Sekunden, mit GeSHi 1.0.8.9
  • core/Makefile
    Makefile erweitern
    Syntax: [ Download ] [ Verstecken ]
    Benutze C Syntax Highlighting
    OPT_OBJS+=gui_<name>.o
    Erstellt in 0.001 Sekunden, mit GeSHi 1.0.8.9


Ich hoffe ich hab nichts vergessen, wenn es nicht geht einfach nochmal nachfragen.

CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 19:25
Wohnort: Dresden
Kamera(s): a610 100e

Beitragvon rudi » 13.12.2009, 18:08

Hallo CHDKLover,

das ist ja total interessant und sehr übersichtlich aufgearbeitet. Danke.

Gruß rudi.
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 500
Registriert: 11.09.2009, 12:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon msl » 13.12.2009, 19:19

Hallo,

schöne Erklärungen, CHDKLover. =D>

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
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
{0x5f,LANG_MENU_OSD_SHOW_TEMP,         MENUITEM_ENUM,      (int*)gui_temp_mode_enum },
Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9


in core/gui.c die Auswahlmöglichkeit für den Menüeintrag
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
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.
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
CONF_INFO(203, conf.show_temp,                  CONF_DEF_VALUE, i:1, NULL),
Erstellt in 0.002 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
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
typedef struct {
 
...

int show_temp;

...

}
Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9


Und nun die eigentliche Anzeigefunktion der Temperatur in core/gui_osd.c
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
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.008 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.
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
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.003 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
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
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.
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
static OSD_elem osd[]={

...

   {LANG_OSD_LAYOUT_EDITOR_TEMP,      &conf.temp_pos,        {9*FONT_WIDTH, FONT_HEIGHT}     },

...

    {0}
};
Erstellt in 0.002 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
■ "Hey you, don't tell me there's no hope at all. Together we stand, divided we fall."CHDK inside FAQCHDK-Neuigkeiten auf Twitter
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4512
Bilder: 271
Registriert: 22.02.2008, 12:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a


Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste