@Vuott: si è un chip per la decodifica SPI
Riassumendo
ci sono due librerie
1) wiringPi
2) wiringPiDev
Gordon, Il creatore delle librerie mi ha confermato che
per inizializzare la PiFace bisogna chiamare prima la funzione
contenuta nella 1
poi la funzione
contenuta nella 2
naturalmente ho dichiarato
public extern wiringPiSetup() as integer in "libwiringPi"
public extern piFaceSetup(PIN as integer) as integer in "libwiringPiDev"
le funzioni vengono trovate
ora però ecco l'inghippo
piFaceSetup() (lib 2) richiama una routine mcp23s17Setup() che è contenuta nella (lib 1)
infatti l'errore che ottengo è
GPIO: symbol lookup error: /usr/local/lib/libwiringPiDev.so: undefined symbol: mcp23s17Setup
gli esempi che sono allegati alla libreria invece funzionano, si lanciano da terminale.
usano le due funzioni di cui sopra come inizializzazione
A questo punto posso pensare che il problema sia il modo in cui vengono dichiarate le funzioni EXTERN
I sorgenti di wiringPi sono disponibili e se li ho quasi capiti io...........
allegate le librerie
il codice Gambas
public extern wiringPiSetup() as integer in "libwiringPi"
public extern piPifaceSetup(pin as integer) as integer in "libwiringPiDev"
public extern mcp23s17Setup(a as integer , b as integer , c as integer) in "libwiringPi" ' aggiunta per test
Form_Open()
wiringPiSetup()
piFaceSetup(200)
ne ho provato uno
blink
si trovano nella cartella examples
vanno compilati e po si lanciano
sudo ./blink
ho dato anche io una occhiata a blink.c
inizializza con
wiringPiSetup();
piFaceSetup(200);
dimenticavo
anche gambas va avviato con sudo
in alternativa va usata
wiringPisetupSys()
public extern wiringPiSetup() as integer in "libwiringPi"
public extern piPifaceSetup(pin as integer) as integer in "libwiringPiDev"
public extern mcp23s17Setup(a as integer , b as integer , c as integer) in "libwiringPi" ' aggiunta per test
Form_Open()
wiringPiSetup()
piFaceSetup(200)
Vedi che hai commesso un errore nella dichiarazione della seconda funzione:
public extern piPifaceSetup(pin as integer) as integer in "libwiringPiDev"
che invece è:
int piFaceSetup (const int pinBase)
(come correttamente hai invece scritto poi nella routine)
Quindi va dichiarata:
public extern piFaceSetup(pin as integer) as integer in "libwiringPiDev"
Una prova potresti farla con il mio suggerimento estremo.
Dovresti creare il sorgente in C dell'apposita libreria, che ad esempio chiameremo libadhoc.c, nella cartella Dati del tuo progetto.
Il codice sorgente in C della libreria condivisa da te realizzata potrebbe essere:
#include <stdint.h>
#include <wiringPi.h>
#include <mcp23s17.h>
#include "piFace.h"
int raspberry(int pinBase) {
int rit;
/* Invoca la funzione del Raspberry: */
rit = piFaceSetup(pinBase);
return rit;
}
Il tuo codice Gambas sarebbe:
Private Extern wiringPiSetup() As Integer In "libwiringPi"
Private Extern raspberry(pin As Integer) As Integer In "/tmp/libadhoc"
Public Sub Form_Open()
' Genera l'apposita libreria esterna per la gestione della funzione "piFaceSetup()":
Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared -fPIC" Wait
wiringPiSetup()
' Invoca l'unica funzione dell'apposita libreria esterna:
raspberry(200)
etc...
etc....
End