2012-08-27 13 views
7

Sto iniziando a scrivere una piccola applicazione per Linux sotto il framework Mono, l'applicazione sarà essenzialmente un piccolo front-end kiosk con un'interazione utente minima. Questo è per sostituire una versione precedente della stessa applicazione che era basata su testo/console al 100%.Come accedere a un Framebuffer Linux in Mono (Mono.Cairo/GTK #)?

Poiché verrà eseguito su un Raspberry Pi, voglio evitare di eseguire X e la mia applicazione parla direttamente al Framebuffer. Sono impostato sull'utilizzo di Mono framework e C# come mio linguaggio di sviluppo poiché conosco molto bene C#. La portabilità non è un problema in questo caso.

Sto riscontrando qualche problema nel trovare librerie e associazioni appropriate per consentire l'accesso al Framebuffer da Mono. Le librerie GTK# si collegano in modo esplicito all'interfaccia X11 e, in ogni caso, non sembrano esserci librerie GtkFB preinstallate in Debian Wheezy per l'architettura ARM Soft-Float (armel).

La biblioteca Mono.Cairo espone un tipo DirectFBSurface, tuttavia il costruttore di quella superficie prende due IntPtr argomenti e non è documentato in modo da non so cosa dovrebbe essere passato al costruttore per inizializzare correttamente il framebuffer come superficie del Cairo.

Qualcuno ha collaborato con Mono e C# per parlare con il Linux Framebuffer e, in tal caso, è possibile fornire esempi di base per l'inizializzazione e l'avvio del disegno sull'FB oppure fare riferimento alla documentazione in linea per fornire assistenza?

Update 1

ho pensato di provare istanziare la DirectFBSurface con null per entrambi i parametri del costruttore, con il seguente codice:

public static void Main(string[] args) 
{ 
    // ... 
    DirectFBSurface surface = new DirectFBSurface(((IntPtr)null), ((IntPtr)null)); 
    // ... 
} 

Mi aspettavo questo per generare un'eccezione che indica che null i valori dei parametri non erano consentiti, tuttavia sembra che DirectFBSurface non sia implementato in Mono.Cairo o non sia compilato nella libreria fornita con Debian Wheezy (armel):

Unhandled Exception: System.EntryPointNotFoundException: cairo_directfb_surface_create 
    at (wrapper managed-to-native) Cairo.NativeMethods:cairo_directfb_surface_create (intptr,intptr) 
    at Cairo.DirectFBSurface..ctor (IntPtr dfb, IntPtr dfb_surface) [0x00000] in <filename unknown>:0 
    at Info.Insch.SandBox.TestCairo.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0 

così sembra che l'approccio Mono.Cairo probabilmente non funzionerà per le mie esigenze, e come notato sopra, GTK# libreria framebuffer non sembra far parte di Debian Wheezy per armel. C'è un altro set di librerie che potrei usare per accedere al Linux Framebuffer di Mono?

+0

sei tu? http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15788&p=160933 – IanNorton

+0

In tal caso, è possibile disegnare su una superficie software al Cairo e mescolarlo alla superficie SDL ogni tanto. – IanNorton

+2

Sembra che sia necessario passare un puntatore a un IDirectFB nativo e una IDirectFBSurface. Ecco la fonte per Mono.Cairo: https://github.com/mono/mono/blob/master/mcs/class/Mono.Cairo/Mono.Cairo/DirectFBSurface.cs E qui è la fonte di cairo per quel costruttore: http : //cgit.freedesktop.org/cairo/tree/src/cairo-directfb-surface.c#n499 – joncham

risposta

2

Il EntryPointNotFoundException si ottiene, significa che il simbolo cairo_directfb_surface_create con (IntPtr, IntPtr) come argomenti non è stato trovato nella libreria libcairo.so.2 da debian. Questo può essere il caso, se directfb non è stato abilitato in fase di compilazione a cairo. È possibile verificare la presenza di supporto directfb al Cairo da fare:

readelf -Ws /usr/lib/libcairo.so.2 | grep directfb 

Se il risultato (output) è vuoto, voi manca il supporto directfb. In questo caso è necessario ricompilare cairo con l'argomento --enable-directfb passato allo script configure.

Ho testato su un openSUSE 12.1 e Fedora 17 box, ed entrambi non sembrano spedire il cairo con Directfb per impostazione predefinita. Però non so debian, dovrai metterti alla prova.

Problemi correlati