Difference between revisions of "Talk:BCI on Sockets"

From AIRWiki
Jump to: navigation, search
m (Example)
m (Example)
 
(One intermediate revision by the same user not shown)
Line 116: Line 116:
 
                 BENet benet;
 
                 BENet benet;
 
  try {
 
  try {
benet = new BENet("192.168.171.212", 7023, 7024, 7025, sampleBuffer);
+
                benet = new BENet("192.168.171.212", 7023, 7024, 7025, sampleBuffer);
//Setto parametri di acquisizione
+
        //Setto parametri di acquisizione
          benet.acqParamsSet(hwIndexList, 512, (short) 0, (short) 0, (short) 0,
+
          benet.acqParamsSet(hwIndexList, 512, (short) 0, (short) 0, (short) 0,(short) 0, (short) 50, null, 2, 512);
  (short) 0, (short) 50, null, 2, 512);
+
 
           //Avvio Acquisizione
 
           //Avvio Acquisizione
      benet.acqStart();
+
          benet.acqStart();
  //Avvio Thread per la gestione dei dati in arrivo
+
          //Avvio Thread per la gestione dei dati in arrivo
  benet.startThreadData();
+
          benet.startThreadData();
                //Interruzione dell'acquisizione dopo 10 minuti
+
                          //Interruzione dell'acquisizione dopo 10 minuti
                int minutiDiAcquisizione = 10;
+
                          int minutiDiAcquisizione = 10;
  Tools.waitSeconds(minutiDiAcquisizione*60);
+
          Tools.waitSeconds(minutiDiAcquisizione*60);
  benet.stopThreadData();
+
          benet.stopThreadData();
  benet.acqStop();  
+
          benet.acqStop();  
 
  //acquisizione delle impedenze
 
  //acquisizione delle impedenze
 
  benet.ohmStart();
 
  benet.ohmStart();
Line 143: Line 142:
 
  System.out.println("Durante la costruzione della classe ci sono stati problemi sulla connessione al dispositivo");
 
  System.out.println("Durante la costruzione della classe ci sono stati problemi sulla connessione al dispositivo");
 
  }
 
  }
 
 
 
 
   
 
   
 
   
 
   

Latest revision as of 18:09, 15 September 2011

In questa sezione sono raccolte tutte le informazioni riservate relative al driver B-Rain scritto in java per il BENet.

Sorgenti EBNeuro

Queste sono le librerie per l'uso del BENet su Windows:

BENetdll.tar.bz2

Questi sono i sorgenti della DLL fornita da EbNeuro (BelIONet.dll):

sorgentiEBNeuro.zip

Questi sono i binari dei firmware che la dll invia al BNet:

firmware.zip

Documentazione EBNeuro

Questi sono i file di testo che documentano i sorgenti di EbNeuro:

Specifiche/Architettura Software

Mizar & BE Light I/O Module

Configurazione Sistema

BENet:

  • IP: 192.168.171.212
  • Mask: 255.255.255.0
  • Mac: 00:50:C2:62:5D:D8

Dispositivo:

  • IP: 192.168.171.2
  • Mask: 255.255.255.0

Per i nostri test abbiamo utilizzato qusi sempre l'indirizzo 192.168.171.2, ma un qualsiasi indirizzo della classe 192.168.171.0/24 funziona (naturalmente escluso il 212 che è del BENet)

E' possibile cambiare la configurazione di rete di BENet. Si può fare via ControlSocket una volta che è stato caricato il primo Firmware(quello di BENet). Non abbiamo provato a cambiare la configurazione in quanto la configurazioni rimangono salvate nel dispositivo, e una configurazione sbagliata potrebbe causare problemi. Più informazioni su come configurare la rete di BENet possono essere trovate nella documentazione fornita da EBNeuro.

Router

Abbiamo configurato un Router per la connessione wireless con BENet

  • Router: D-Link DI624
  • Credenziali: admin lavadmin
  • essid: B-Rain
  • passwifi: brainwpa
  • Pannello Amministrazione: 192.168.171.1

API del driver B-Rain

Documentazione dei Metodi pubblici del driver B-Rain

Classe BENet

BENet(String IPAddress, int BootPort, int CtrlPort, int DataPort, SamplesBuffer sampleBuffer) throws ConnectionProblem Costruttore della Classe BENet.

  • IPAddress String Indirizzo IP del dispositivo a cui connettersi (192.168.171.212)
  • BootPort Porta per la gestione del boot (7023)
  • CtrlPort Porta per la gestione dei controlli (7024)
  • DataPort Porta per la ricezione dei dati (7025)
  • samplesBuffer Buffer circolare che immagazzina i dati.

In caso di problemi riscontrati durante l'instaurazione della connessione viene sollevata l'eccezione ConnectionProblem.

acqParamSet

void acqParamsSet(ArrayList<Short> hwIndexList, int sampleRate, short coupling, short dynRange, short lowPass, short highPass, short notch, byte[] label, int BufferSecs, int PacketRate) Questo metodo setta tutti i canali con la medesima configurazione. E' possibile fare un settaggio differente per ogni canale ma questa funzionalità non è implementata in B-Rain.

  • hwIndexList lista degli indici dei canali che si voglio acquisire. (HwIndex Map)
  • sampleRate Frequenza di acquisizione espressa in Hz
  • coupling 0 per AC, 1 per DC
  • dynRange Sensibilità dei canali Talk:BCI_on_Sockets#Data
  • lowPass indice del filtro passa basso Non abbiamo trovato questi indici. Chiedere ad EBNeuro
  • highPass indice del filtro passa alto Non abbiamo trovato questi indici. Chiedere ad EBNeuro
  • notch frequenza per filtro Notch
  • label Non abbiamo trovato utilità a questo parametro. Comunque è stato inserito in quanto parte della struttura che poi viene inviata al dispositivo per il settaggio dei canali
  • BufferSecs Seconds of DataBuffer (vedi EBNeuro src)
  • PacketRate Frequenza con cui lui di invia i pacchetti (Per come è fatto deve essere uguale a sampleRate)

AcqStart

void AcqStart() Metodo che attiva la modalità di acquisizione EEG Da lanciare prima di leggere dalla dataSocket

OhmStart

void OhmStart() Metodo che attiva la modalità OhmMeter Da lanciare prima di chiedere i valori di impedenza

startThreadData

void startThreadData() Avvia il Thread di Acquisizione dati.

stopThreadData

void stopThreadData() Interrompe il Thread di Acquisizione dati.

AcqStop

void AcqStop() Disattiva le modalità di acquisizione(spegne sia AcqStart che ohmStart)

Example

Questo è un esempio di utilizzo delle dll di EbNeuro su Windows:

esempioUsodll.zip

Questo è un esempio dell'uso dei metodi pubblici della classe BENet del driver B-Rain per un'acquisizione EEG della durata di 10 minuti:

 public class Main {

          public static void main(String[] args) {
		//Creo lista degli indici
		ArrayList<Short> hwIndexList = new ArrayList<Short>();
		
		//Seleziono i canali che mi interessano
		hwIndexList.add(new Short((short) 0));	
		hwIndexList.add(new Short((short) 1));
		hwIndexList.add(new Short((short) 2));		
		hwIndexList.add(new Short((short) 3));
		hwIndexList.add(new Short((short) 4));

                //Creo Buffer di Acquisizione
		int numberOfSampleToStore = 100000;
		SamplesBuffer sampleBuffer = new SamplesBuffer(numberOfSampleToStore);

		//Inizializzo BENet indicando Ip porte e buffer
                BENet benet;
		try {
	                 benet = new BENet("192.168.171.212", 7023, 7024, 7025, sampleBuffer);
		         //Setto parametri di acquisizione
 		         benet.acqParamsSet(hwIndexList, 512, (short) 0, (short) 0, (short) 0,(short) 0, (short) 50, null, 2, 512);
 		         //Avvio Acquisizione
 		         benet.acqStart();
 		         //Avvio Thread per la gestione dei dati in arrivo
 		         benet.startThreadData();
                         //Interruzione dell'acquisizione dopo 10 minuti
                         int minutiDiAcquisizione = 10;
 		         Tools.waitSeconds(minutiDiAcquisizione*60);
 		         benet.stopThreadData();
 		         benet.acqStop(); 
			//acquisizione delle impedenze
			benet.ohmStart();
			while (true) {
				OhmData[] ohmDataArray = benet.getOhmData();
				System.out.print("Impedenze: ");
				for (int i = 0; i < ohmDataArray.length; i++) {
					System.out.print(i+")"+ohmDataArray[i]+ " ");
				}
				System.out.println();
				Tools.waitSeconds(3);
			}
		} catch (ConnectionProblem e) {
			System.out.println("Durante la costruzione della classe ci sono stati problemi sulla connessione al dispositivo");
		}


	}
}

Informazioni aggiuntive ricavate dai sorgenti

Le comunicazioni con il dispositivo avvengono su tre porte TCP:

  • 7023 Boot (loading del firmware)
  • 7024 Control (Invio di comandi e settaggi)
  • 7025 Data (Ricezione dati)

Reco Port

Sulla porta 7022 UDP è stato implementato un sistema per il riconoscimento dei dispositivi EBNeuro in una sottorete. Per ulteriori informazioni consultare la documentazione EBNeuro

Boot & Ctrl

Ogni messaggio di comunicazione deve avere il seguente formato.

STX 1 byte 0x02
Tag 1 byte
Length 2 byte short (attenzione all'endianess)
msg  Lenght byte
ETX 1 byte 0x03
CampoSTXTagLengthmsgETX
Dimensione1 byte1 byte2 byteLength1 byte

CMD_TO_DSP

Mandato sulla control Socket CMD_TO_DSP è il comando che permette di comunicare con B.E. Light

CampoSTXCMD_TO_DSPLengthCMDParC_LenParA_LenParCETX
Dimensione1 byte1 byte2 byte2byte2byte2byteParC byte1 byte
Info0x20x21Comandi indicati nei sorgenti come BE_CMD_*Length dei parametri che verrano passati Length attesa del pacchetto di risposta0x3

Prestare attenzione all'endianess della parte interna del pacchetto.

Data

La trasmissione sulla socket è monodirezionale, cioè si ricevono dati ma non si trasmette mai niente.

Ogni messaggio ricevuto ha il seguente formato.

Count 4 byte intero progressivo che segnala la progressività dei pacchetti.
Data 2 byte * numero Canali
Regs 44 byte Registri di memoria del dispositivo, vengono inviati solo se è attivo il dispatch mode 
CampoCountDataRegs(Opzionale)
Dimensione4 byte2 byte* n°Chn44 byte

I dati trasmessi sono ordinati per canali in maniera rigorosamente crescente, per esempio se si utilizzano i canali con indice 7,5,23,22 anche se questi sono stati configurati in ordine non crescente sulla data socket arriverà un pacchetto con 4 short in modo che il primo short apparterrà al canale 5.

i dati così ottenuti devono essere normalizzati in base ad una tabella di sensibilità che dipende dal Dynamic Range impostato in fase di Settaggio. Per il B.E.Light:

DynRangeScale Factor
00.125
12.05


Nel caso di perdita della connessione i dati vengono immagazzinati dal BENet in un buffer di grandezza di circa 800 byte (circa 30 secondi di acquisizione su 28 canali). Nel caso si saturi questo buffer e la connessione non sia ristabilita entro il proporzionale ammontare di secondi, i pacchetti successivi all'ultimo pacchetto ricevuto vengono scartati e si riceveranno i nuovi pacchetti con indici perciò maggiori del successivo pacchetto atteso. La perdita di questi pacchetti viene solo notificata nell'output, si lascia a chi utilizzerà il driver la possibilità di modificare il comportamento in questo caso.

Dump Sessione

Nel seguente file si trova un dump di una sessione di connessione fatto a livello di rete con wireshark:

EsempiodiAcquisizione.pcap