Gambas-it

Gambas3 => Programmazione => Topic aperto da: El Berto - 24 Aprile 2013, 16:08:27

Titolo: Scambiare dati con uno script in C?
Inserito da: El Berto - 24 Aprile 2013, 16:08:27
Mi stavo chiedendo se fosse possibile l'interscambio di dati con uno script in C:

Script in C:
Codice: [Seleziona]
integer x,y,z;

Solitamente provvedevo a scrivere un file, poi con Gambas facevo un polling che andava a leggere il file, ma la scrittura del file veniva fatta ogni tanto.
Ora avrei la necessità di scambiare dei dati (per esempio un array) con una frequenza di refresh di 4000 Hz.

C'è un metodo più "appropriato" usando solo la memoria anzichè la scrittura su file?
Sarebbe possibile anche realizzare una sorta di interrupt anzichè andare a fare un polling?
Grazie.
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: allegfede - 24 Aprile 2013, 19:47:41
cioe' hai un processo esterno (scritto in C) ... un eseguibile ... che io sappia il C non e' interpretato .... a cui devi passare dati da un altro processo (eseguibile) scritto in gambas?

hai il codice di entrambi?

sotto linux esiste il "pipe" [ nella shell il carattere | ] che serve proprio a collegare due processi ....

oppure la redirezione dello standard output  [ >> sempre sotto linux shell ]

Titolo: Re: Scambiare dati con uno script in C?
Inserito da: vuott - 25 Aprile 2013, 01:39:00
sotto linux esiste il "pipe" [ nella shell il carattere | ] che serve proprio a collegare due processi ....

oppure la redirezione dello standard output  [ >> sempre sotto linux shell ]

...e volendo usare soltanto funzioni e risorse Gambas ?   :devil:
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: El Berto - 25 Aprile 2013, 11:24:21
Allora: intanto mi serve inviare i dati dal programma in C a Gambas, poi penserò al contrario.
Il problema deriva dal fatto che io ho le librerie in C (per un hardware custom specifico, e sono proprietarie).

Cosa intendete con la pipe "|"?
Io ho provato con questo in Gambas:

Codice: [Seleziona]
Shell (mioscript) wait to OutputText

inserito in un timer, ma i risultati sono terrificanti (lentissimo).
Pensavo che si potesse andare a leggere direttamente in memoria in qualche modo....
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: vuott - 25 Aprile 2013, 13:18:54
Allora: intanto mi serve inviare i dati dal programma in C a Gambas, poi penserò al contrario.
Il problema deriva dal fatto che io ho le librerie in C (per un hardware custom specifico, e sono proprietarie).


Non ho ancora capito bene. Ma tu devi semplicemente gestire con un programma Gambas librerie in C ?
Ad ogni modo, tieni conto che tu puoi interfacciare Gambas soltanto con librerie condivise (shared library), quelle cioè aventi estensione .so
http://www.gambas-it.org/wiki/index.php?title=Extern:_richiamare_funzioni_esterne_a_Gambas


Se si tratta, in via generale, di rapportarsi a programmi esterni, una modalità può essere quella di gestirli con la classe Process.
Segnalerei in particolare questo sotto-capitolo della nostra WIKI:
https://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Trasmissione_di_dati_fra_due_programmi_Gambas_o_fra_un_programma_esterno_ed_un_programma_Gambas
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: El Berto - 25 Aprile 2013, 14:01:04
Allora, io ho un hardware custom su cui gira linux, la scheda mi trasmette 12'000 Bytes/secondo.
Io attualmente posso lavorare in 2 modi:

1) con script, che mi restituisce un risultato in formato testo (per esempio richiedo la trasmissione di 8 Bytes):
Codice: [Seleziona]
>ROT -getdata 8
00 00 00 00 00 00 00 00
>

e che gestivo in Gambas con:
Codice: [Seleziona]
Shell ("ROT -getdata 8) wait to MiaStringa
e poi andavo a elaborare il risultato contenuto nella stringa

Questa soluzione viene utilizzata giusto per esempio, perchè anche se inserisco il comando (in Gambas) in un ciclo while, la massima frequenza di esecuzione è di circa 10 Hertz.

2) con una libreria in C:

Codice: [Seleziona]
#include "ROTAS.h"
...
...
ROT_GetData (MyBuffer,8);

In questo modo riesco a richiamare la funzione anche 2000 volte al secondo.

Adesso la cosa "obbligata" mi sembra quella di trasmettere in qualche modo il buffer MyBuffer a Gambas.
Non ho idea di come fare, come soluzione ultima posso aspettare di accumulare abbastanza dati e scriverli in un file che poi andrò a elaborare con Gambas.
Semplicemente supponevo che ci fosse un modo di condividere direttamente una variabile in memoria....
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: vuott - 25 Aprile 2013, 15:33:43
2) con una libreria in C:

Codice: [Seleziona]
#include "ROTAS.h"
...
...
ROT_GetData (MyBuffer,8);

Adesso la cosa "obbligata" mi sembra quella di trasmettere in qualche modo il buffer MyBuffer a Gambas.
Il codice dell'applicativo in C dovrebbe avere alla fine, ovviamente, un
 
Codice: c [Seleziona]
    ........
    .......
    ROT_GetData (MyBuffer,8);

   return MyBuffer;
 }

e la funzione Gambas che invoca la libreria C (purché, come già detto, sia una "libreria condivisa": nome_libreria.so), sia in grado di ricevere il valore ritornante dalla libreria C.  :-\


Semplicemente supponevo che ci fosse un modo di condividere direttamente una variabile in memoria....
Non credo che i due programmi possano puntare al medesimo indirizzo di memoria mediante una variabile. Ricordo che io tentai di fare delle prove analoghe alle tue utilizzando anche variabili di tipo Pointer addirittura fra due applicativi Gambas, e non ho ottenuto risultati positivi.


Non so, poi, se con la Classe DBus sia possibile ottenere quello che tu vuoi; ...ma qui ci vorrebbe un intervento charificatore del nostro amico milio, che in questo forum è uno dei più esperti conoscitori di quella Classe.
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: Picavbg - 25 Aprile 2013, 17:50:07
un'area di transito potrebbe essere quella degli "Appunti" di sistema, in modo da fare una sorta di copia-incolla. Il programma in C va a scrivere un'informazione qualsiasi negli "Appunti", mentre il programma in Gambas va a leggerla. Naturalmente l'informazione andrebbe accompagnata da una stringa costituente il protocollo di riconoscimento fra i programmi interessati, e ciò perchè qualsiasi software attivo può andare a scrivere in quell'area.
Non so se l'idea possa tornare utile. Personalmente non ho esperienza; mai fatta una cosa del genere.
 :ciao:
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: vuott - 25 Aprile 2013, 22:36:05
un'area di transito potrebbe essere quella degli "Appunti" di sistema, in modo da fare una sorta di copia-incolla. Il programma in C va a scrivere un'informazione qualsiasi negli "Appunti", mentre il programma in Gambas va a leggerla.

Uhmmm... interessante questa cosa ! Andrebbe approfondita.
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: vuott - 25 Aprile 2013, 23:43:43
Uhmmm... interessante questa cosa ! Andrebbe approfondita.


Allora, ho fatto una prova, però con due programmi Gambas, usando la Classe ''Clipboard'' e più specificamente le funzioni ''.Copy()'' e ''.Paste()''.

Funziona perfettamente !



L'unico limite è che durante la trasmissione dei dati non si deve effettuare alcun'altra copia di caratteri (per esempio con il mouse), o comunque di altri dati, altrimenti verrà trasmesso il contenuto della nuova e più recente copia di dati appena effettuata.
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: Picavbg - 26 Aprile 2013, 13:40:56
L'unico limite è che durante la trasmissione dei dati non si deve effettuare alcun'altra copia di caratteri (per esempio con il mouse), o comunque di altri dati, altrimenti verrà trasmesso il contenuto della nuova e più recente copia di dati appena effettuata.
Ma infatti avevo indicato nell'idea anche l'aggiunta al messaggio da copiare negli Appunti di un codice di protocollo che il 2° programma dovrebbe riconoscere per catturare il messaggio vero e proprio. Se il primo dei due programmi si chiama, per es. Progr01, mentre il secondo si chiama Progr02, il messaggio che Progr01 scrioverà negli appunti potrebbe essere:
"Progr01.scrivente|messaggio n.1"
Il Progr02, andando a leggere catturerà tutto il messaggio, trasferendolo in una variabile di comodo e, dopo avere riconosciuto la parte iniziale  del messaggio "Progr01.scrivente|" trasferirà la parte finale della stringa nella variabile definitiva, cioè "messaggio n.1"
 :ciao:
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: vuott - 26 Aprile 2013, 14:35:20
... il 2° programma dovrebbe riconoscere per catturare il messaggio vero e proprio.

Sì, certo, un protocollo di riconoscimento del messaggio.
Resta però il pericolo di perdere per sempre i dati copiati negli Appunti di sistema dal primo programma, qualora si sia effettuato un Copia di altri dati.
Ciò rende impossibile durante il processo, di effettuare dei Copia, al fine di non rischiare di perdere dati appena copiati negli Appunti di sistema dal primo programma, ma non ancora raccolti dal secondo.
Insomma, i dati sono un po'... esposti.

Il limite è questo.  :-\
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: Picavbg - 26 Aprile 2013, 16:08:25
Ciò rende impossibile durante il processo, di effettuare dei Copia, al fine di non rischiare di perdere dati appena copiati negli Appunti di sistema dal primo programma, ma non ancora raccolti dal secondo.
Insomma, i dati sono un po'... esposti.

Il limite è questo.  :-\

Si, purtroppo è proprio così. L'alternativa è quella di regisitrare i dati da passare al 2° programma in un file sequenziale oppure di ricghiamarlo direttamente. Per codesta 2a ipotesi  ricordo vagamente che lo facevo in GWBasic, ma non ne ricordo la tecnica. Ma la risposta si trova in questa discussione (http://www.gambas-it.org/smf/index.php?topic=2243.msg24613#msg24613). Ti ricordi?  ;)
 :ciao:
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: allegfede - 26 Aprile 2013, 16:54:31
io ancora non ho capito .......

ci dici chiaramente l'architettura del sistema?

macchina linux? che deve leggere da dove? dalla seriale? dalla parallela? da usb? da un file messo su un NAS?

che fa' lo "script" in C? la libreria che dici e' open source? hai il codice?

se dici che lo script mette i dati in un buffer, poi che ci fa'?

non e' possibile accedere alla stessa area di memoria da due applicazioni differenti (il s.o. e' pensato prorpio per evitare che ci' accada) .....

se hai la possibilita' di scrivere l'app in C al limite puoi fargli aprire un socket TCP. lo stesso in gambas e poi scambi i dati come se fosse una normale trasmissione via rete, od in push od in pull, solo in localhost che e' una scheggia.

oppure l'area della clipboard, ma devi generare un evento che il client intercetti ....

.... pero' magari un po' di informazioni in piu' possono servire .....
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: vuott - 26 Aprile 2013, 17:34:52

se hai la possibilita' di scrivere l'app in C al limite puoi fargli aprire un socket TCP. lo stesso in gambas e poi scambi i dati come se fosse una normale trasmissione via rete, od in push od in pull, solo in localhost che e' una scheggia.


Vedi ?
L'amico allegfede ha aggiunto altra roba interessante. Sembra, insomma, che ci sia soltanto l'imbarazzo della scelta.  :)

Si potrebbe addirittura aggiungere, per farci male  ;D , una comunicazione di dati via ALSA tra i due programmi; ma - seppur fattibile - si complicherebbero un po' le cose.
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: md9327 - 30 Aprile 2013, 14:02:22
Non ho ben capito se il problema è la lettura dei dati ricevuti in real time o meno.

Ne il programma gambas deve solo trattare, con molta calma, questi dati, credo ti basti usare un file, alimentato tramite pipe dal programma C. Il programma gambas può, magari con un timer, andare a leggere questa pipe e caricarsi i dati. Eventualmente può anche svuotare la pipe (modalità fifo), così questa rimane solo come una sorta di cache tra i due programmi.

Poi...

Se il programma gambas fà solo da interfaccia grafica per l'utente, magari può anche reinviare indietro dati lui stesso al programma C. Non conoscendo la modalità con cui il programma C possa ricevere dati, non posso darti ulteriori consigli...
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: splugenbrau - 03 Maggio 2013, 12:54:11
Prova questi link:

http://gambasdoc.org/help/howto/extern
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

il secondo riguardo al lancio di threads separati in C (processi separati);
il primo riguardo al passaggio di variabili e indirizzi di variabili RAM tra Gambas e C.

Ciao.
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: vuott - 03 Maggio 2013, 15:53:25
Prova questi link:

http://gambasdoc.org/help/howto/extern

....riguardo al passaggio di variabili e indirizzi di variabili RAM tra Gambas e C.

Questa pagina da te segnalata fa riferimento, però, al caso in cui vi siano funzioni esterne, da richiamare in un applicativo Gambas e presenti in librerie condivise .so .
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: splugenbrau - 04 Maggio 2013, 09:11:33
Si, alcuni mesi fa feci un programmino piccolo piccolo e la parte C la compilai cosi:

# cc -shared -o subc.so.4 subc4.c

forse le stesse opzioni valgono anche per gcc, bisogna indagare.

Extern é un indicazione per l'interprete di Gambas, mentre la funzione della controparte C credo di ricordare che non abbia bisogno di indicazioni particolari.

Titolo: Re: Scambiare dati con uno script in C?
Inserito da: vuott - 04 Maggio 2013, 14:25:16
L'argomento posto in questa discussione è molto stimolante, ma ritengo vada chiarito, in particolare da chi l'ha aperta, se essa vuole essere una discussione a livello teorico-cognitivo, oppure meramente pratico.
Nel primo caso, a mio modesto giudizio, le possibilità esperibili sono varie. Nel secondo caso, invece, andrebbe tenuto conto dell'approccio. Voglio dire che io procederei per gradi... cominciando a vedere se può andare bene il dialogo del programma Gambas con il progamma C attraverso la gestione del suo processo con la classe Process... spesso non è necessario utilizzare strumenti complessi per ottenere un risultato.



Extern é un indicazione per l'interprete di Gambas, mentre la funzione della controparte C credo di ricordare che non abbia bisogno di indicazioni particolari.
http://www.gambas-it.org/wiki/index.php?title=Extern:_richiamare_funzioni_esterne_a_Gambas
Titolo: Re: Scambiare dati con uno script in C?
Inserito da: md9327 - 07 Maggio 2013, 14:03:56
Perfetto vuott!!!  :ok: