Un modo semplice ed universale per interagire con l'hardware

L'idea sulla quale si sono mossi tutti i software disponibili per l'OpenMoko segue alcune brillanti intuizioni quale ad esempio quella di basarsi su un framework comune, il <strong>FSO</strong> (freesmartphone.org).

L'idea semplifica tutto: si crea una interfaccia comune tra l'hardware e le applicazioni utilizzando un sistema DBus, così ogni singola applicazione non dovrà più preoccuparsi della configurazione a basso livello. In questo modo i programmi possono essere sviluppati più velocemente nonché essere trasferiti da hardware ad hardware più facilmente.
Ad esempio proviamo a sniffare le chiamate del sistema DBus:

# mdbus -s -l
listening for signals on SystemBus from service 'all', object 'all'...
 [SIGNAL]    org.freesmartphone.GSM.Network.SignalStrength    from :1.9 /org/freesmartphone/GSM/Device
(94,)
 [SIGNAL]    org.freesmartphone.GSM.Network.SignalStrength    from :1.9 /org/freesmartphone/GSM/Device
(97,)
 [SIGNAL]    org.freesmartphone.Device.IdleNotifier.State    from :1.2 /org/freesmartphone/Device/IdleNotifier/0
('busy',)
 [SIGNAL]    org.freesmartphone.Device.IdleNotifier.State    from :1.2 /org/freesmartphone/Device/IdleNotifier/0
('idle',)
 [SIGNAL]    org.freesmartphone.Device.IdleNotifier.State    from :1.2 /org/freesmartphone/Device/IdleNotifier/0
('busy',)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'pressed', 0)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'released', 0)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'pressed', 0)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'held', 1)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'held', 2)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'held', 3)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'held', 4)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'released', 4)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('POWER', 'pressed', 0)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('POWER', 'released', 0)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'pressed', 0)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'held', 1)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'held', 2)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'held', 3)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('AUX', 'released', 3)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('POWER', 'pressed', 0)
 [SIGNAL]    org.freesmartphone.Device.Input.Event    from :1.2 /org/freesmartphone/Device/Input
('POWER', 'released', 0)

In questo caso c'è qualche messaggio dal GSM (potenza segnale) e poi la pressione consecutiva per tempi diversi del tasto AUX (quello in alto a sx).

Se volete avere un esempio di un programma già abbastanza avanzato in python che utilizza il dbus, allora guardate l'<a href="http://pkg-fso.nomeata.de/sid/openmoko-panel-plugin">openmoko-panel-plugin</a>.

Strumenti utili per il DBus

<h2>Come interagire con il DBus</h2> <p>Per collegare una applicazione python al DBus è necessario avviare in loop la libreria DBus:</p>

from dbus.mainloop.glib import DBusGMainLoop

DBusGMainLoop(set_as_default=True)

E quindi con pygobject possiamo avviare il loop principale:

import gobject

loop = gobject.MainLoop()
loop.run()

Un esempio pratico

Ecco come è possibile creare in python una semplice applicazione che colleghi alla pressione dei tasti dell'OpenMoko alcune funzioni a scelta (nell'esempio il blocco dello schermo):

import os
import dbus
from dbus.mainloop.glib import DBusGMainLoop

DBusGMainLoop(set_as_default=True)

sys_bus = dbus.SystemBus()

input = sys_bus.get_object('org.freesmartphone.odeviced', '/org/freesmartphone/Device/Input')
#input.connect_to_signal("Event")
#------------------------------------------------#
class Buttons:
#------------------------------------------------#
    def __init__(self):
        self.notLock = True                                  
        self.input = sys_bus.get_object('org.freesmartphone.odeviced', '/org/freesmartphone/Device/Input')
        self.connect = input.connect_to_signal("Event", self.var)       
    def handler(self, name = "", action = "", seconds = 0):  
        print "name: %r" % name                              
    def var(self, name='', action = "", seconds = 0):        
        if (name == 'AUX' and action == 'released'):
            if self.notLock:                                 
#                print 'lockme'
                os.system('om touchscreen lock &')
                self.notLock = False                         
            else:                                            
#                print 'freeme'
                os.system('killall om')
                self.notLock = True                          
#            pint 'Hi'                                       
#        print name, action, seconds                         
##################################################

#def handler(name = "", action = "", seconds = 0):
#    print "name: %r; action: %r; seconds: %r" % (name, action, seconds)

#input.connect_to_signal("Event", handler)

#print input
prova = Buttons()

import gobject
loop = gobject.MainLoop()
loop.run()

Sitografia

MyWiki: GTA/Dbus e freesmartphone.org (last edited 2015-03-13 19:18:01 by risca)