Pagine

8 luglio 2011

Usare libreria RXTX su Snow Leopard

Non so per quale motivo, ma è un periodo che devo continuamente penare per far funzionare su OS X quello che mi serve per i miei progetti e siccome so cosa significhi passare ore alla ricerca di qualche blogger di buon cuore che abbia condiviso con il mondo la soluzione, non posso fare a meno di scrivere un post per ogni nuova esperienza acquisita. Questa volta parliamo della libreria Java RXTX per la comunicazione con porte seriali.

Volendo passare a qualcosa di più della semplice accensione temporizzata di LED tramite Arduino, ci si imbatte subito nella comunicazione tramite porta seriale che, lato microcontrollore, è gestita egreggiamente dalle librerie standard della piattaforma mentre, lato computer, è più o meno banale a seconda del linguaggio scelto.
Prevedendo una possibile integrazione con alcune funzionalità offerte dalla libreria WiiRemoteJ ho pensato bene di utilizzare Java e quindi la libreria RXTX che dovrebbe sostituisce le funzionalità delle Java Communication API. Ovviamente essendo su OS X 10.6 non poteva di certo andare tutto liscio e di fatti mi ritrovavo con il seguente errore, non appena cercavo di invocare la libreria:
java.lang.UnsatisfiedLinkError: /Library/Java/Extensions/librxtxSerial.jnilib: no suitable image found. Did find: /Library/Java/Extensions/librxtxSerial.jnilib: no matching architecture in universal wrapper thrown while loading gnu.io.RXTXCommDriver
Se avete scaricato dal sito ufficiale della libreria l'ultima versione, sapete che una volta estratta la cartella, vi ritroverete con due file: librxtxSerial.jnilib e RXTXcomm.jar. Il primo (.jnilib) va inserito in /Library/Java/Extensions/ mentre il secondo va inserito nel build path del vostro progetto Java.
Il problema però è proprio il file .jnilib che è stato compilato per 32bit ma non per 64bit (e ti pareva -_-). Per risolvere la questione potete scaricare dal sito ufficiale i sorgenti e compilarli per la vostra macchina oppure, se siete pigri, potete trovare il file già compilato sul sito di Robert Harder che ha gentilmente pensato di mettere a disposizione la versione per 64bit, qui.
A questo punto basta sostituire il file originale con quello scaricato dal blog precedentemente menzionato e voilà, il vostro codice funzionerà come per magia.

Spero che anche questa volta vi possa risultare utile questa piccola guida in italiano. Se vi è piaciuta (o se non vi è piaciuta), fatemelo sapere nei commenti. ^_-

P.s. piccola nota personale: mi chiedo come sia possibile che nonostante Snow Leopard sia in giro da qualche anno ormai, molte librerie Java non siano state aggiornate per 64bit. Con l'arrivo di Lion, cosa succederà?

7 luglio 2011

Wiimote e Bluecove: errore PSM

Come promesso ecco il secondo post sul tema Wiimote e bluecove.
Se avete già tentato di sperimentare con i due, vi sarete accorti che tentando di connettere il Wiimote al computer si riceve il seguente errore:
java.lang.IllegalArgumentException: PCM 11, PCM values restricted by JSR-82 to minimum 4097, see BlueCoveConfigProperties.PROPERTY_JSR_82_PSM_MINIMUM_OFF
Il problema è legato alla gestione del PSM da parte del Wiimote. Infatti il controller ha un PSM inferiore a 0x1001, limite inferiore posto dalle specifiche JSR-82 alle quali bluecove si attiene. Per risolvere è quindi necessario settare bluecove in modo tale da permettergli di ignorare tale restrizione, e questo è possibile inserendo nel codice, prima del tentativo di connessione, la seguente istruzione Java:
System.setProperty(BlueCoveConfigProperties.PROPERTY_JSR_82_PSM_MINIMUM_OFF, "true");
A questo punto il codice non dovrebbe più generare errori e il vostro Wiimote dovrebbe connettersi senza alcun problema.

6 luglio 2011

WiiRemoteJ sotto Snow Leopard

Come promesso torno con qualcosa di inerente alla programmazione, questa volta Java.
Ormai avrete capito che le mie attenzioni si rivolgono soprattutto verso l'interazione uomo-macchina e una delle cose, a mio parere, più divertenti in questo campo è il riutilizzo di un Wiimote come interfaccia.

Avevo già sperimentato un anno fa con il controller Nintendo e con la libreria Java WiiRemoteJ, realizzata da Michael Diamond (aka Cha0s) e scaricabile gratuitamente dal suo sito, ma poi avevo dovuto abbandonare il tutto a causa di mancanza di tempo e di problemi con la libreria. Dopo aver aggiornato a Mac OS X 10.6 infatti, continuavo a ricevere questo errore connesso al bluetooth:
java.lang.IllegalStateException: Bluetooth failed to initialize. There is probably a problem with your local Bluetooth stack or API.
che non sono riuscita a risolvere fino a ieri.

Avevo scelto WiiRemoteJ poiché tale libreria è compatibile con Windows, Linux e Mac OS X grazie al fatto che si appoggia su un altro componente, bluecove (implementazione delle specifiche JSR-82), che si occupa di interfacciarsi con i driver bluetooth della macchina su cui risiede.
Il problema era che da Snow Leopard in poi, lo stack bluetooth è diventato 64bit e la libreria bluecove veniva compilata solo per il 32bit (potete leggere la storia del bug qui). Il bug è stato risolto, ma non è ancora disponibile una versione stabile della libreria che contenga la soluzione.
Se volete far funzionare WiiRemoteJ su OS X 10.5 con Java 1.6 o su OS X 10.6 dovete utilizzare uno degli snapshot di bluecove a questo indirizzo, dal numero 61 in avanti.

Esiste ancora un piccolo problema da risolvere nell'utilizzo di bluecove e Wiimote prima di potersi mettere in pista con gli esperimenti, ma rimando ad un altro post.

Stay tuned ;)