Programmare in C sull’N900

pb_ss01

pb_ss01In questo articolo vedremo come sia semplice programmare in C sull’N900. In particolare vedremo come realizzare una semplice applicazione basata sulle librerie GTK.

Quello che rende la cosa molto interessante non è tanto la programmazione in se, ma il supporto ad essa che il sistema Maemo (e l’SDK relativo) ci dà.

Vedremo il come realizzare la nostra applicazione sia semplice come se la scrivessimo per un normale PC e vedremo anche come i tool di test/debug di Maemo ci permettono di provare la nostra applicazione su di un sistema virtualizzato.

Per chi mi leggesse per la prima volta e non avesse ancora l’SDK di Maemo installato sul proprio PC può leggere questo articolo dove descrivo come installarlo.

Il programma

Come dicevo il programma di esempio che useremo è molto semplice, ma ovviamente il discorso si applica pari pari anche ad applicazioni più complesse. Girando un po’ su internet ho trovato questa semplice applicazione che riporto di seguito e leggermente modificata da me per adattarla agli scopi del presente articolo:

#include <gtk/gtk.h>

static int ptimer = 0;
int pstat = TRUE;

gint progress(gpointer data)
{
        gfloat pvalue;

        pvalue = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR (data));
        pvalue += 0.01;
        if ((pvalue >= 1.0) || (pstat == FALSE)) {
                 pvalue = 0.0;
                 pstat = TRUE;
        }

        gtk_progress_bar_update(GTK_PROGRESS_BAR (data), pvalue);

        return TRUE;
}

void restart(void)
{  
        pstat = FALSE;  
}

void destroy(GtkWidget *widget, gpointer data)
{
        gtk_main_quit();
}

int main (int argc, char *argv[])
{
        GtkWidget *window, *button, *label, *table, *pbar;

        gtk_init (&argc, &argv);

        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_signal_connect(GTK_OBJECT(window), “delete_event”,
        GTK_SIGNAL_FUNC(destroy), NULL);

        gtk_container_border_width(GTK_CONTAINER (window), 10);

        table = gtk_table_new(3, 2, TRUE);
        gtk_container_add (GTK_CONTAINER(window), table);

        label = gtk_label_new(“Progress Bar”);
        gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 2, 0, 1);
        gtk_widget_show(label);

        pbar = gtk_progress_bar_new ();
        gtk_table_attach_defaults(GTK_TABLE(table), pbar, 0, 2, 1, 2);
        gtk_widget_show(pbar);

        ptimer = gtk_timeout_add(100, progress, pbar);

        button = gtk_button_new_with_label (“Reset”);
        gtk_signal_connect (GTK_OBJECT (button), “clicked”,
        GTK_SIGNAL_FUNC(restart), NULL);
        gtk_table_attach_defaults(GTK_TABLE(table), button, 0, 1, 2, 3);
        gtk_widget_show(button);

        button = gtk_button_new_with_label (“Cancel”);
        gtk_signal_connect(GTK_OBJECT (button), “clicked”,
        GTK_SIGNAL_FUNC(destroy), NULL);
        gtk_table_attach_defaults(GTK_TABLE(table), button, 1, 2, 2, 3);
        gtk_widget_show (button);

        gtk_widget_show(table);
        gtk_widget_show(window);

        gtk_main ();

        return 0;
}

Essa non fa altro che creare una barra che aumenta nel tempo e che è possibile resettare con il pulsante Reset. Con il pulsante Cancel, invece, si esce semplicemente dall’applicazione.

Se volete ripetere i miei passi salvate il programma nel file progress_bar.c. Quindi, per compilarlo, dovrete usare anche il seguente Makefile:

TARGET = progress_bar

CFLAGS := $(shell pkg-config –cflags gtk+-2.0)
LDLIBS := $(shell pkg-config –libs gtk+-2.0)

all : $(TARGET)

clean:
        rm -rf *~
        rm -rf $(TARGET)

Su di un normale PC, una volta compilato il tutto (potreste avere bisogno di installare i file di sviluppo per le GTK – sulla mia Ubuntu questi stanno nel pacchetto libgtk2.0-dev), si otterrebbe quanto riportato in figura.

pb_ss01

Usare l’SDK di Maemo

Ora però vediamo come si può testare il tutto con l’SDK di Maemo (e quindi andhe del nostro N900). Prima di tutto facciamo login dentro scratchbox (Ripeto: vedete questo articolo se non lo avete già installato):

$ /scratchbox/login

Welcome to Scratchbox, the cross-compilation toolkit!

Use ‘sb-menu’ to change your compilation target.
See /scratchbox/doc/ for documentation.

[sbox-FREMANTLE_X86: ~] >

Se il prompt che ottenete non vi dice che state usando la piattaforma X86, selezionatela con il comando:

> sb-conf se FREMANTLE_X86

A questo punto se prendete i file progress_bar.c e Makefile creati prima e li compilate otterrete:

> make
cc -DMAEMO_CHANGES -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12      progress_bar.c  -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0   -o progress_bar

Verifichiamo il file eseguibile ottenuto:

> file progress_bar
progress_bar: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped

Perfetto! Ora per eseguirlo possiamo usare l’X server del nostro PC oppure (meglio) possiamo usare l’ambiente grafico che l’SDK ci mette a disposizione e che simula il desktop dell’N900! Per fare questo basta aprire un’altro terminale e lanciare il comando:

$ Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac

Questo comando lancia uno speciale Xserver chiamato, appunto, Xephyr; poi, dentro scratchbox, date i due comandi:

> export DISPLAY=:2
> af-sb-init.sh start

Se è tutto configurato bene dovreste ottenere quanto segue nella finestra di Xephyr.

pb_ss02

Ora lanciamo la nostra applicazione:

> ./progress_bar

e il risultato è qui sotto.

pb_ss03

Proprio come se lo lanciassimo sull’N900!

La prova finale su N900

Ora proviamo il nostro programma sull’N900 per verificare che funzioni anche lì. Basterà cambiare piattaforma dentro scratchbox:

> sb-conf se FREMANTLE_ARMEL

quindi ricompilare per ARM:

> make clean
rm -rf *~
rm -rf progress_bar
> make
cc -DMAEMO_CHANGES -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12      progress_bar.c  -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0   -o progress_bar
> file progress_bar
progress_bar: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, dynamically linked (uses shared libs), not stripped

e, alla fine, trasferire l’eseguibile sull’N900 per la prova:

> scp progress_bar root@192.168.32.93:
root@192.168.32.93’s password:
progress_bar                                  100% 9599     9.4KB/s   00:00

Poi entriamo dentro l’N900 con SSH e lanciamo il programma:

Nokia-N900:~# ./progress_bar

Come evidenziato dalla figura qui sotto il risultato finale è esattamente quello che ci aspettavamo!

pb_ss04

Su Rodolfo Giometti

Ingegnere informatico libero professionista ed esperto GNU/Linux offre supporto per: - device drivers; - sistemi embedded; - sviluppo applicazioni industriali per controllo automatico e monitoraggio remoto; - corsi di formazione dedicati. Manutentore del progetto LinuxPPS (il sottosistema Pulse Per Second di Linux) contribuisce attivamente allo sviluppo del kernel Linux con diverse patch riguardanti varie applicazioni del kernel e dispositivi (switch, fisici di rete, RTC, USB, I2C, network, ecc.). Nei 15+ anni di esperienza su Linux ha lavorato con le piattaforme x86, ARM, MIPS & PowerPC.

Lascia un commento

Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi