Autore Topic: Scambiare dati con uno script in C?  (Letto 2194 volte)

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Scambiare dati con uno script in C?
« il: 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.

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #1 il: 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 ]

se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #2 il: 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:
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #3 il: 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....

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #4 il: 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
« Ultima modifica: 24 Settembre 2020, 23:21:14 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #5 il: 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....

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #6 il: 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.
« Ultima modifica: 25 Aprile 2013, 15:52:43 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #7 il: 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:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #8 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #9 il: 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.
« Ultima modifica: 26 Aprile 2013, 00:26:04 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #10 il: 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:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #11 il: 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.  :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #12 il: 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. Ti ricordi?  ;)
 :ciao:
« Ultima modifica: 26 Aprile 2013, 16:25:21 da Picavbg »
:ciao:

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #13 il: 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 .....
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Scambiare dati con uno script in C?
« Risposta #14 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »