<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.bci2000.org/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Madamek2</id>
	<title>BCI2000 Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.bci2000.org/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Madamek2"/>
	<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php/Special:Contributions/Madamek2"/>
	<updated>2026-06-30T02:03:43Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=9973</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=9973"/>
		<updated>2022-10-24T20:48:16Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Acquisition via low-latency connection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz if you use all 512 Channels.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This module requires the VS2012 C++ runtime to be installed (https://www.microsoft.com/en-us/download/details.aspx?id=30679). If the runtime is not installed you will get an error for a missing DLL!&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: 6082&lt;br /&gt;
*Known to compile under: 6082&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Hardware Configuration==&lt;br /&gt;
This Acquisition module has two ways to stream data from a Pegasus/Cheetah System.&lt;br /&gt;
===Acquisition via the NetCom Interface===&lt;br /&gt;
To acquire data via the NetCom interface the experimental Computer (Running BCI2000) has to be connected to the Pegasus/Cheetah System (Running the Acquisition Software) via Ethernet.&lt;br /&gt;
&lt;br /&gt;
(1) Make sure that both computers are on the same subnet and that the Acquisition Software is running on the Pegasus/Cheetah System (You don&#039;t need to start an acquisition or recording).&amp;lt;br&amp;gt;&lt;br /&gt;
(2) Configure BCI2000 with the correct IP address (ServerName). Be aware that the Pegasus/Cheetah System has multiple Network ports!&amp;lt;br&amp;gt;&lt;br /&gt;
(3) After pressing Set Config in BCI2000 it should seamlessly connect to the Pegasus/Cheetah System. BCI2000 will automatically start data acquisition. &amp;lt;br&amp;gt;&lt;br /&gt;
You can check if BCI2000 has connected correctly by opening the Acquisition System Status on the Pegasus/Cheetah System. In this window you should see a field called NetCom Clients. If BCI2000 is connected, it should be listed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Netcominterface.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Acquisition via low-latency connection===&lt;br /&gt;
The low-latency stream allows us to tap directly into the data streamed from the ADC without the Pegasus/Cheetah System. This approach significantly reduces latency and increases the stability of the timebase.&lt;br /&gt;
While data is streamed directly from the amplifier, configuration still requires the Pegasus/Cheetah System and connection via the NetCom interface. You can follow the steps above to ensure that you are able to connect to the NetCom Interface.&lt;br /&gt;
&lt;br /&gt;
The low-latency stream requires direct connection to the amplifier via a fiber optic ethernet connection. Therefore, the BCI2000 computer requires an optical ethernet interface. &lt;br /&gt;
The optical ethernet card has to be configured identical to the card installed in the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(1) Obtain the IP address, subnet mask as well as the MAC address. &lt;br /&gt;
To get this information open a command window on the Pegasus/Cheetah System (To find the command prompt type cmd in the Windows 10 search bar).&lt;br /&gt;
Type &amp;lt;code&amp;gt;ipconfig -all&amp;lt;/code&amp;gt; which will give you information of all Network adapters.&lt;br /&gt;
You will need to find the physical port that connects the amplifier with the Pegasus/Cheetah System. A good way to ensure that you chose the correct adapter is to turn of the amplifier and check which adapter changed.&lt;br /&gt;
Your result might look different than the example below.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Ethernet adapter Ethernet:&lt;br /&gt;
  Connection-specific DNS Suffix  . :&lt;br /&gt;
  Description . . . . . . . . . . . : Intel(R) Ethernet Server Adapter I350-F2&lt;br /&gt;
  Physical Address. . . . . . . . . : 48-2A-E3-40-45-DB&lt;br /&gt;
  Link-local IPv6 Address . . . . . : fe80::cc21:7e8e:f65a:158e%11&lt;br /&gt;
  IPv4 Address. . . . . . . . . . . : 172.20.2.144&lt;br /&gt;
  Subnet Mask . . . . . . . . . . . : 255.255.0.0&lt;br /&gt;
  Lease Obtained. . . . . . . . . . : Wednesday, July 15, 2020 8:25:32 AM&lt;br /&gt;
  Lease Expires . . . . . . . . . . : Thursday, July 16, 2020 8:25:25 AM&lt;br /&gt;
  Default Gateway . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCP Server . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCPv6 IAID . . . . . . . . . . . : 105392867&lt;br /&gt;
  DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-24-67-EF-14-48-2A-E3-40-45-DB&lt;br /&gt;
  DNS Servers . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  NetBIOS over Tcpip. . . . . . . . : Enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You will need the information shown in Physical Address (MAC address), IPv4 Address, and Subnet Mask.&lt;br /&gt;
&lt;br /&gt;
(2) Change the settings of the fiber card Network Adapter on your BCI2000 machine.&lt;br /&gt;
To change the MAC address you can use a tool like the [https://technitium.com/tmac/ Technitium MAC Address Changer]. Make sure that you are changing the correct Network connection!&lt;br /&gt;
&lt;br /&gt;
(3) Replace your current MAC address with the Physical Address obtained from the Pegasus/Cheetah System.&lt;br /&gt;
To change IP address and Subnet mask you can follow a tutorial like this one:[https://www.wikihow.com/Change-Your-IP-Address Change IP Address (Start at step 3)  ].&lt;br /&gt;
&lt;br /&gt;
(4) Connect the BCI2000 computer to the Amplifier with an appropriate fiber cable. The BCI2000 machine should be connected via the free fiber-cable ethernet port on the amplifier. Make sure that you plugged the fiber cable into the free port on the amplifier and not the free fiber port on the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(5) Check if the data gets streamed to the BCI2000 computer. If you have configured everything correctly, data should now be streamed to your computer if the acquisition is started on the Pegasus/Cheetah System.&lt;br /&gt;
The easiest way to check this is to open the Task Manager (Ctrl+Shift+Esc) on the BCI2000 system. In the performance tab, you can monitor incoming and outgoing traffic on your network adapters. If you were successful, you should see a steady inflow of data on the ethernet port which connects your computer to the amplifier. If you are unsure, open the task manager on the Pegasus/Cheetah System, you should see the same type of data usage.&lt;br /&gt;
&lt;br /&gt;
(6) Start BCI2000 and enable UseDirectUDPStream for the Low-Latency stream.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
===Signal Properties===&lt;br /&gt;
Signal Properties describe Settings common to most Amplifiers.&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Samples per channel per digitized block. Together with the sampling rate, this parameter determines how often per second data is collected, processed, and feedback is updated.&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; Sampling rate of the data. The SamplingRate has to be an integer fraction of 32kHz.&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames:&#039;&#039;&#039; List of Names for Channels. Space-separated list; Must be the same length as Number of Channels. If set to auto, BCI2000 will query the Names from the Neuralynx system.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; Setting is not used in this module, default is 0&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used, default is 1&lt;br /&gt;
===NeuralynxNetCom===&lt;br /&gt;
This Section describes Settings Necessary to communicate with the Cheetah/Pegasus System via the NetCom Interface&lt;br /&gt;
* &#039;&#039;&#039;ServerName:&#039;&#039;&#039; IP Address of the NetCom server (Typically the IP of your Cheetah/Pegasus System)&lt;br /&gt;
&lt;br /&gt;
===NeuralynxUDPStream===&lt;br /&gt;
Settings if you want to use the Low Latency Stream. This requires a fiber-optic connection between the Amplifier and the BCI2000 computer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Boards:&#039;&#039;&#039; The Number of Boards which are connected in the Neuralynx Chassis&lt;br /&gt;
* &#039;&#039;&#039;SourceChnList:&#039;&#039;&#039; List of transmitted Channels. This allows you to only submit a subset of Channels. Its a list of channel ids (starting from 0). If set to auto, all channels will be transmitted.&lt;br /&gt;
* &#039;&#039;&#039;UseDirectUDPSTream:&#039;&#039;&#039; Easy way to switch the UDP stream on or off. This has to be enabled for low latency communication&lt;br /&gt;
* &#039;&#039;&#039;UDPStreamPort:&#039;&#039;&#039; Port through which the BCI2000 computer receives data from the Neuralynx System. This port is provided by Neuralynx.&lt;br /&gt;
* &#039;&#039;&#039;DecimationFactor:&#039;&#039;&#039; Decimation Factor for incoming Data. Incoming Data is sampled at 32kHz. If Decimation Factor is set, SamplingRate has to match or has to be set to auto. similarly, if SamplingRate is set, DecimationFactor can be set to auto and the system will determine the correct decimation factor automatically. The following Decimation factors are supported: 2,  4,  5,  8, 10, 16, 20, 25, 32, 40, 50, 64, 80, 100, 125, 128. Downsampling is done after an antialiasing filter is applied to the original signal. The filter depends on the decimation factor.&lt;br /&gt;
* &#039;&#039;&#039;NRDStreamingFile:&#039;&#039;&#039; Leave Empty. This can be used to stream data from a Neuralynx NRD file for debugging purposes.&lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=9728</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=9728"/>
		<updated>2022-07-12T21:02:28Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz if you use all 512 Channels.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This module requires the VS2012 C++ runtime to be installed (https://www.microsoft.com/en-us/download/details.aspx?id=30679). If the runtime is not installed you will get an error for a missing DLL!&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: 6082&lt;br /&gt;
*Known to compile under: 6082&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Hardware Configuration==&lt;br /&gt;
This Acquisition module has two ways to stream data from a Pegasus/Cheetah System.&lt;br /&gt;
===Acquisition via the NetCom Interface===&lt;br /&gt;
To acquire data via the NetCom interface the experimental Computer (Running BCI2000) has to be connected to the Pegasus/Cheetah System (Running the Acquisition Software) via Ethernet.&lt;br /&gt;
&lt;br /&gt;
(1) Make sure that both computers are on the same subnet and that the Acquisition Software is running on the Pegasus/Cheetah System (You don&#039;t need to start an acquisition or recording).&amp;lt;br&amp;gt;&lt;br /&gt;
(2) Configure BCI2000 with the correct IP address (ServerName). Be aware that the Pegasus/Cheetah System has multiple Network ports!&amp;lt;br&amp;gt;&lt;br /&gt;
(3) After pressing Set Config in BCI2000 it should seamlessly connect to the Pegasus/Cheetah System. BCI2000 will automatically start data acquisition. &amp;lt;br&amp;gt;&lt;br /&gt;
You can check if BCI2000 has connected correctly by opening the Acquisition System Status on the Pegasus/Cheetah System. In this window you should see a field called NetCom Clients. If BCI2000 is connected, it should be listed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Netcominterface.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Acquisition via low-latency connection===&lt;br /&gt;
The low-latency stream allows us to tap directly into the data streamed from the ADC without the Pegasus/Cheetah System. This approach significantly reduces latency and increases the stability of the timebase.&lt;br /&gt;
While data is streamed directly from the amplifier, configuration still requires the Pegasus/Cheetah System and connection via the NetCom interface. You can follow the steps above to ensure that you are able to connect to the NetCom Interface.&lt;br /&gt;
&lt;br /&gt;
The low-latency stream requires direct connection to the amplifier via a fiber optic ethernet connection. Therefore, the BCI2000 computer requires an optical ethernet interface. &lt;br /&gt;
The optical ethernet card has to be configured identical to the card installed in the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(1) Obtain the IP address, subnet mask as well as the MAC address. &lt;br /&gt;
To get this information open a command window on the Pegasus/Cheetah System (To find the command prompt type cmd in the Windows 10 search bar).&lt;br /&gt;
Type &amp;lt;code&amp;gt;ipconfig -all&amp;lt;/code&amp;gt; which will give you information of all Network adapters.&lt;br /&gt;
You will need to find the physical port that connects the amplifier with the Pegasus/Cheetah System. A good way to ensure that you chose the correct adapter is to turn of the amplifier and check which adapter changed.&lt;br /&gt;
Your result might look different than the example below.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Ethernet adapter Ethernet:&lt;br /&gt;
  Connection-specific DNS Suffix  . :&lt;br /&gt;
  Description . . . . . . . . . . . : Intel(R) Ethernet Server Adapter I350-F2&lt;br /&gt;
  Physical Address. . . . . . . . . : 48-2A-E3-40-45-DB&lt;br /&gt;
  Link-local IPv6 Address . . . . . : fe80::cc21:7e8e:f65a:158e%11&lt;br /&gt;
  IPv4 Address. . . . . . . . . . . : 172.20.2.144&lt;br /&gt;
  Subnet Mask . . . . . . . . . . . : 255.255.0.0&lt;br /&gt;
  Lease Obtained. . . . . . . . . . : Wednesday, July 15, 2020 8:25:32 AM&lt;br /&gt;
  Lease Expires . . . . . . . . . . : Thursday, July 16, 2020 8:25:25 AM&lt;br /&gt;
  Default Gateway . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCP Server . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCPv6 IAID . . . . . . . . . . . : 105392867&lt;br /&gt;
  DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-24-67-EF-14-48-2A-E3-40-45-DB&lt;br /&gt;
  DNS Servers . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  NetBIOS over Tcpip. . . . . . . . : Enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You will need the information shown in Physical Address (MAC address), IPv4 Address, and Subnet Mask.&lt;br /&gt;
&lt;br /&gt;
(2) Change the settings of the fiber card Network Adapter on your BCI2000 machine.&lt;br /&gt;
To change the MAC address you can use a tool like the [https://technitium.com/tmac/ Technitium MAC Address Changer]. Make sure that you are changing the correct Network connection!&lt;br /&gt;
&lt;br /&gt;
(3) Replace your current MAC address with the Physical Address obtained from the Pegasus/Cheetah System.&lt;br /&gt;
To change IP address and Subnet mask you can follow a tutorial like this one:[https://www.professionaltutorial.com/change-ip-address-in-windows-10/ Change IP Address (Start at step 3)  ].&lt;br /&gt;
&lt;br /&gt;
(4) Connect the BCI2000 computer to the Amplifier with an appropriate fiber cable. The BCI2000 machine should be connected via the free fiber-cable ethernet port on the amplifier. Make sure that you plugged the fiber cable into the free port on the amplifier and not the free fiber port on the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(5) Check if the data gets streamed to the BCI2000 computer. If you have configured everything correctly, data should now be streamed to your computer if the acquisition is started on the Pegasus/Cheetah System.&lt;br /&gt;
The easiest way to check this is to open the Task Manager (Ctrl+Shift+Esc) on the BCI2000 system. In the performance tab, you can monitor incoming and outgoing traffic on your network adapters. If you were successful, you should see a steady inflow of data on the ethernet port which connects your computer to the amplifier. If you are unsure, open the task manager on the Pegasus/Cheetah System, you should see the same type of data usage.&lt;br /&gt;
&lt;br /&gt;
(6) Start BCI2000 and enable UseDirectUDPStream for the Low-Latency stream.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
===Signal Properties===&lt;br /&gt;
Signal Properties describe Settings common to most Amplifiers.&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Samples per channel per digitized block. Together with the sampling rate, this parameter determines how often per second data is collected, processed, and feedback is updated.&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; Sampling rate of the data. The SamplingRate has to be an integer fraction of 32kHz.&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames:&#039;&#039;&#039; List of Names for Channels. Space-separated list; Must be the same length as Number of Channels. If set to auto, BCI2000 will query the Names from the Neuralynx system.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; Setting is not used in this module, default is 0&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used, default is 1&lt;br /&gt;
===NeuralynxNetCom===&lt;br /&gt;
This Section describes Settings Necessary to communicate with the Cheetah/Pegasus System via the NetCom Interface&lt;br /&gt;
* &#039;&#039;&#039;ServerName:&#039;&#039;&#039; IP Address of the NetCom server (Typically the IP of your Cheetah/Pegasus System)&lt;br /&gt;
&lt;br /&gt;
===NeuralynxUDPStream===&lt;br /&gt;
Settings if you want to use the Low Latency Stream. This requires a fiber-optic connection between the Amplifier and the BCI2000 computer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Boards:&#039;&#039;&#039; The Number of Boards which are connected in the Neuralynx Chassis&lt;br /&gt;
* &#039;&#039;&#039;SourceChnList:&#039;&#039;&#039; List of transmitted Channels. This allows you to only submit a subset of Channels. Its a list of channel ids (starting from 0). If set to auto, all channels will be transmitted.&lt;br /&gt;
* &#039;&#039;&#039;UseDirectUDPSTream:&#039;&#039;&#039; Easy way to switch the UDP stream on or off. This has to be enabled for low latency communication&lt;br /&gt;
* &#039;&#039;&#039;UDPStreamPort:&#039;&#039;&#039; Port through which the BCI2000 computer receives data from the Neuralynx System. This port is provided by Neuralynx.&lt;br /&gt;
* &#039;&#039;&#039;DecimationFactor:&#039;&#039;&#039; Decimation Factor for incoming Data. Incoming Data is sampled at 32kHz. If Decimation Factor is set, SamplingRate has to match or has to be set to auto. similarly, if SamplingRate is set, DecimationFactor can be set to auto and the system will determine the correct decimation factor automatically. The following Decimation factors are supported: 2,  4,  5,  8, 10, 16, 20, 25, 32, 40, 50, 64, 80, 100, 125, 128. Downsampling is done after an antialiasing filter is applied to the original signal. The filter depends on the decimation factor.&lt;br /&gt;
* &#039;&#039;&#039;NRDStreamingFile:&#039;&#039;&#039; Leave Empty. This can be used to stream data from a Neuralynx NRD file for debugging purposes.&lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=9672</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=9672"/>
		<updated>2022-07-03T15:51:19Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Known Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz if you use all 512 Channels.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This module requires the VS2012 C++ runtime to be installed (https://www.microsoft.com/en-us/download/details.aspx?id=30679). If the runtime is not installed you will get an error for a missing DLL!&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: 6082&lt;br /&gt;
*Known to compile under: 6082&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Hardware Configuration==&lt;br /&gt;
This Acquisition module has two ways to stream data from a Pegasus/Cheetah System.&lt;br /&gt;
===Acquisition via the NetCom Interface===&lt;br /&gt;
To acquire data via the NetCom interface the experimental Computer (Running BCI2000) has to be connected to the Pegasus/Cheetah System (Running the Acquisition Software) via Ethernet.&lt;br /&gt;
&lt;br /&gt;
(1) Make sure that both computers are on the same subnet and that the Acquisition Software is running on the Pegasus/Cheetah System (You don&#039;t need to start an acquisition or recording).&amp;lt;br&amp;gt;&lt;br /&gt;
(2) Configure BCI2000 with the correct IP address (ServerName). Be aware that the Pegasus/Cheetah System has multiple Network ports!&amp;lt;br&amp;gt;&lt;br /&gt;
(3) After pressing Set Config in BCI2000 it should seamlessly connect to the Pegasus/Cheetah System. BCI2000 will automatically start data acquisition. &amp;lt;br&amp;gt;&lt;br /&gt;
You can check if BCI2000 has connected correctly by opening the Acquisition System Status on the Pegasus/Cheetah System. In this window you should see a field called NetCom Clients. If BCI2000 is connected, it should be listed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Netcominterface.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Acquisition via low-latency connection===&lt;br /&gt;
The low-latency stream allows us to tap directly into the data streamed from the ADC without the Pegasus/Cheetah System. This approach significantly reduces latency and increases the stability of the timebase.&lt;br /&gt;
While data is streamed directly from the amplifier, configuration still requires the Pegasus/Cheetah System and connection via the NetCom interface. You can follow the steps above to ensure that you are able to connect to the NetCom Interface.&lt;br /&gt;
&lt;br /&gt;
The low-latency stream requires direct connection to the amplifier via a fiber optic ethernet connection. Therefore, the BCI2000 computer requires an optical ethernet interface. &lt;br /&gt;
The optical ethernet card has to be configured identical to the card installed in the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(1) Obtain the IP address, subnet mask as well as the MAC address. &lt;br /&gt;
To get this information open a command window on the Pegasus/Cheetah System (To find the command prompt type cmd in the Windows 10 search bar).&lt;br /&gt;
Type &amp;lt;code&amp;gt;ipconfig -all&amp;lt;/code&amp;gt; which will give you information of all Network adapters.&lt;br /&gt;
You will need to find the physical port that connects the amplifier with the Pegasus/Cheetah System. A good way to ensure that you chose the correct adapter is to turn of the amplifier and check which adapter changed.&lt;br /&gt;
Your result might look different than the example below.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Ethernet adapter Ethernet:&lt;br /&gt;
  Connection-specific DNS Suffix  . :&lt;br /&gt;
  Description . . . . . . . . . . . : Intel(R) Ethernet Server Adapter I350-F2&lt;br /&gt;
  Physical Address. . . . . . . . . : 48-2A-E3-40-45-DB&lt;br /&gt;
  Link-local IPv6 Address . . . . . : fe80::cc21:7e8e:f65a:158e%11&lt;br /&gt;
  IPv4 Address. . . . . . . . . . . : 172.20.2.144&lt;br /&gt;
  Subnet Mask . . . . . . . . . . . : 255.255.0.0&lt;br /&gt;
  Lease Obtained. . . . . . . . . . : Wednesday, July 15, 2020 8:25:32 AM&lt;br /&gt;
  Lease Expires . . . . . . . . . . : Thursday, July 16, 2020 8:25:25 AM&lt;br /&gt;
  Default Gateway . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCP Server . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCPv6 IAID . . . . . . . . . . . : 105392867&lt;br /&gt;
  DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-24-67-EF-14-48-2A-E3-40-45-DB&lt;br /&gt;
  DNS Servers . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  NetBIOS over Tcpip. . . . . . . . : Enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You will need the information shown in Physical Address (MAC address), IPv4 Address, and Subnet Mask.&lt;br /&gt;
&lt;br /&gt;
(2) Change the settings of the fiber card Network Adapter on your BCI2000 machine.&lt;br /&gt;
To change the MAC address you can use a tool like the [https://technitium.com/tmac/ Technitium MAC Address Changer]. Make sure that you are changing the correct Network connection!&lt;br /&gt;
&lt;br /&gt;
(3) Replace your current MAC address with the Physical Address obtained from the Pegasus/Cheetah System.&lt;br /&gt;
To change IP address and Subnet mask you can follow a tutorial like this one:[https://www.professionaltutorial.com/change-ip-address-in-windows-10/ Change IP Address (Start at step 3)  ].&lt;br /&gt;
&lt;br /&gt;
(4) Connect the BCI2000 computer to the Amplifier with an appropriate fiber cable. The BCI2000 machine should be connected via the free fiber-cable ethernet port on the amplifier. Make sure that you plugged the fiber cable into the free port on the amplifier and not the free fiber port on the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(5) Check if the data gets streamed to the BCI2000 computer. If you have configured everything correctly, data should now be streamed to your computer if the acquisition is started on the Pegasus/Cheetah System.&lt;br /&gt;
The easiest way to check this is to open the Task Manager (Ctrl+Shift+Esc) on the BCI2000 system. In the performance tab, you can monitor incoming and outgoing traffic on your network adapters. If you were successful, you should see a steady inflow of data on the ethernet port which connects your computer to the amplifier. If you are unsure, open the task manager on the Pegasus/Cheetah System, you should see the same type of data usage.&lt;br /&gt;
&lt;br /&gt;
(6) Start BCI2000 and enable UseDirectUDPStream for the Low-Latency stream.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
===Signal Properties===&lt;br /&gt;
Signal Properties describe Settings common to most Amplifiers.&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Samples per channel per digitized block. Together with the sampling rate, this parameter determines how often per second data is collected, processed, and feedback is updated.&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; Sampling rate of the data. The SamplingRate has to be an integer fraction of 32kHz.&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames:&#039;&#039;&#039; List of Names for Channels. Space-separated list; Must be the same length as Number of Channels. If set to auto, BCI2000 will query the Names from the Neuralynx system.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; Setting is not used in this module, default is 0&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used, default is 1&lt;br /&gt;
===NeuralynxNetCom===&lt;br /&gt;
This Section describes Settings Necessary to communicate with the Cheetah/Pegasus System via the NetCom Interface&lt;br /&gt;
* &#039;&#039;&#039;ServerName:&#039;&#039;&#039; IP Address of the NetCom server (Typically the IP of your Cheetah/Pegasus System)&lt;br /&gt;
&lt;br /&gt;
===NeuralynxUDPStream===&lt;br /&gt;
Settings if you want to use the Low Latency Stream. This requires a fiber-optic connection between the Amplifier and the BCI2000 computer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Boards:&#039;&#039;&#039; The Number of Boards which are connected in the Neuralynx Chassis&lt;br /&gt;
* &#039;&#039;&#039;SourceChnList:&#039;&#039;&#039; List of transmitted Channels. This allows you to only submit a subset of Channels. Its a list of channel ids (starting from 0). If set to auto, all channels will be transmitted.&lt;br /&gt;
* &#039;&#039;&#039;UseDirectUDPSTream:&#039;&#039;&#039; Easy way to switch the UDP stream on or off. This has to be enabled for low latency communication&lt;br /&gt;
* &#039;&#039;&#039;UDPStreamPort:&#039;&#039;&#039; Port through which the BCI2000 computer receives data from the Neuralynx System. This port is provided by Neuralynx.&lt;br /&gt;
* &#039;&#039;&#039;DecimationFactor:&#039;&#039;&#039; Decimation Factor for incoming Data. Incoming Data is sampled at 32kHz. If Decimation Factor is set, SamplingRate has to match or has to be set to auto. similarly, if SamplingRate is set, DecimationFactor can be set to auto and the system will determine the correct decimation factor automatically. Downsampling will be achieved by a simple moving average filter.&lt;br /&gt;
* &#039;&#039;&#039;NRDStreamingFile:&#039;&#039;&#039; Leave Empty. This can be used to stream data from a Neuralynx NRD file for debugging purposes. &lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NihonKohdenSource&amp;diff=9655</id>
		<title>Contributions:NihonKohdenSource</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NihonKohdenSource&amp;diff=9655"/>
		<updated>2022-06-22T14:33:58Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The Nihon Kohden JE-120A amplifier is a clinical monitoring system capable of acquiring EEG or ECoG signals from up to 256 channels. &lt;br /&gt;
Paired with the QI-123A LAN converter box, this system can provide a research data stream in addition to the clinical data stream. &lt;br /&gt;
The research data stream can be sampled at up to 2kHz for 256 channels, 5kHz for 128 channels or 10kHz for 64 channels.&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
http://{{SERVERNAME}}/svn/trunk/src/private/SignalSource/NihonKohdenSource&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
Griffin Milsap (griffin.milsap@gmail.com)&lt;br /&gt;
Johns Hopkins University&lt;br /&gt;
&lt;br /&gt;
Peter Brunner (brunner@neurotechcenter.org)&lt;br /&gt;
Washington University in St. Louis&lt;br /&gt;
&lt;br /&gt;
Markus Adamek (adamek@neurotechcenter.org)&lt;br /&gt;
Washington University in St. Louis&lt;br /&gt;
&lt;br /&gt;
Alexander Belsten (belsten@neurotechcenter.org)&lt;br /&gt;
Washington University in St. Louis&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
# Version 1.0 (r4913): November 2015 - Initial release.&lt;br /&gt;
# Version 1.1 (r6245): March 2021 - Updated to support x64.&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 4913&lt;br /&gt;
*Tested under: 6245&lt;br /&gt;
*Known to compile under: 6245&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Functional Description==&lt;br /&gt;
This setup requires the following components: &lt;br /&gt;
* &#039;&#039;&#039;JE-120A amplifier&#039;&#039;&#039;: &lt;br /&gt;
* &#039;&#039;&#039;QI-123A LAN converter&#039;&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
The amplifier is a clinical monitoring system capable of acquiring EEG or ECoG signals from up to 256 channels. Paired with the QI-123A LAN converter box, this system can provide a research data stream in addition to the clinical data stream. The research data stream can be sampled at up to 2kHz for 256 channels, 5kHz for 128 channels or 10kHz for 64 channels.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Input range&#039;&#039;&#039;: ±3.2 mV or ±12.8 mV (selectable)&lt;br /&gt;
* &#039;&#039;&#039;Effective resolution&#039;&#039;&#039;: 16 bit (97.65 nV/LSB) or 16 bit (390.62 nV/LSB) (selectable)&lt;br /&gt;
* &#039;&#039;&#039;Input impedance&#039;&#039;&#039;: 200 MΩ&lt;br /&gt;
* &#039;&#039;&#039;Sampling Rates&#039;&#039;&#039;: 100Hz, 200Hz, 500Hz, 1000Hz, 2000Hz, 5000Hz, 10000Hz&lt;br /&gt;
&lt;br /&gt;
==Clinical Setup==&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
This source module is located in a private directory of BCI2000. To build the source, you must have the necessary credentials, enable &amp;lt;code&amp;gt;BUILD_PRIVATE&amp;lt;/code&amp;gt; in CMake, and modify the CMakeLists.txt in the private and SignalSource directories to build to NihonKohdenSource.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
* &#039;&#039;&#039;SourceCh&#039;&#039;&#039; total number of channels to be acquired from the source module or auto for all channels enabled in the Neuroworkbench&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize&#039;&#039;&#039; number of samples acquired in each block or auto for default setting (1/10th of sampling rate)&lt;br /&gt;
** &#039;&#039;&#039;NOTE:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot;&amp;gt;Only specific combinations of SampleBlockSize and SampleRate are valid!  See [[#Valid Operating Modes]]&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;SampleRate&#039;&#039;&#039; determines the rate at which the device samples data. &amp;lt;br/&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;NOTE:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot;&amp;gt;Only specific combinations of SampleBlockSize and SampleRate are valid!  See [[#Valid Operating Modes]]&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames&#039;&#039;&#039; is a convenience parameter.  Name channels here and they can be referenced by these names later.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset&#039;&#039;&#039; auto for default settings (0 for each channel).&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain&#039;&#039;&#039; auto for default settings (1 for each channel).&lt;br /&gt;
* &#039;&#039;&#039;SourceChList&#039;&#039;&#039; list of channels that should be acquired or auto for all channels enabled in the Neuroworkbench&lt;br /&gt;
* &#039;&#039;&#039;SourceBufferSize&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Valid Operating Modes===&lt;br /&gt;
The NihonKohdenSource only accepts specific sampling rates. The number of channels acquired is limited at sampling rates of 5000 Hz and above. The following table shows all valid combinations of sample rate and maximum number of channels. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!SamplingRate&lt;br /&gt;
!Max SourceCh&lt;br /&gt;
!Aliasing Filter Cut-Off&lt;br /&gt;
|-&lt;br /&gt;
![samples/sec]&lt;br /&gt;
![channels]&lt;br /&gt;
![Hz]&lt;br /&gt;
|-&lt;br /&gt;
|100 &lt;br /&gt;
|256 &lt;br /&gt;
|30 or 35&lt;br /&gt;
|-&lt;br /&gt;
|200 &lt;br /&gt;
|256 &lt;br /&gt;
|60 or 70&lt;br /&gt;
|-&lt;br /&gt;
|500 &lt;br /&gt;
|256 &lt;br /&gt;
|120&lt;br /&gt;
|-&lt;br /&gt;
|1000 &lt;br /&gt;
|256&lt;br /&gt;
|300 &lt;br /&gt;
|-&lt;br /&gt;
|2000 &lt;br /&gt;
|256&lt;br /&gt;
|600 &lt;br /&gt;
|-&lt;br /&gt;
|5000 &lt;br /&gt;
|128 &lt;br /&gt;
|1200&lt;br /&gt;
|-&lt;br /&gt;
|10000 &lt;br /&gt;
|64 &lt;br /&gt;
|3000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Valid Operating Modes===&lt;br /&gt;
&lt;br /&gt;
===State Variables===&lt;br /&gt;
* &#039;&#039;&#039;DC01&#039;&#039;&#039; to &#039;&#039;&#039;DC16&#039;&#039;&#039; DC Input data&lt;br /&gt;
** Digital Range: 0 to 65535&lt;br /&gt;
** Analog Range: 0xFFFF(Max)-0x8000(0V)-0x0000(Min). (Signed.)&lt;br /&gt;
** 1LSB: 366.3uV&lt;br /&gt;
* &#039;&#039;&#039;SpO2&#039;&#039;&#039;&lt;br /&gt;
** Digital Range: 0 to 100 &lt;br /&gt;
** 0 means 0%, 100 means 100%&lt;br /&gt;
* &#039;&#039;&#039;EtCO2&#039;&#039;&#039;&lt;br /&gt;
** Digital Range: 0 to 100 &lt;br /&gt;
** 0 means 0mmHg, 100 means 100mmHg&lt;br /&gt;
* &#039;&#039;&#039;BP1&#039;&#039;&#039; to &#039;&#039;&#039;BP2&#039;&#039;&#039;&lt;br /&gt;
** not implemented&lt;br /&gt;
* &#039;&#039;&#039;DigitalMark1&#039;&#039;&#039; to &#039;&#039;&#039;DigitalMark2&#039;&#039;&#039;&lt;br /&gt;
** not implemented&lt;br /&gt;
&lt;br /&gt;
==DC Input From Other Devices==&lt;br /&gt;
Analog data from a g.TRIGbox and parallel port can be obtained though the JE120A&#039;s DC inputs. A parallel port Y-splitter and a custom cable is necessary. Connection of the custom cables and Y-splitter is outlined in the image below.&lt;br /&gt;
&lt;br /&gt;
[[File:Parrallel Ports to JE120A.jpg|700px|alt text]] &lt;br /&gt;
&lt;br /&gt;
The outputs from the g.TRIGbox and parallel port to the DC input of the JE120A are defined below. Note that the g.TRIGbox trigger outputs are the TTL pins. See [[Contributions:ParallelPortFilter]] for information on how to set the outputs of a parallel port from BCI2000. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! JE120A&lt;br /&gt;
! &lt;br /&gt;
! g.TRIGbox&lt;br /&gt;
! &lt;br /&gt;
! Parallel Port&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
| Pin No.&lt;br /&gt;
| Signal&lt;br /&gt;
| Pin No.&lt;br /&gt;
| Signal&lt;br /&gt;
| Pin No.&lt;br /&gt;
| Signal&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| DC01&lt;br /&gt;
| 2&lt;br /&gt;
| Output A&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| DC02&lt;br /&gt;
| 3&lt;br /&gt;
| Output B&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| DC03&lt;br /&gt;
| 4&lt;br /&gt;
| Output C&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| DC04&lt;br /&gt;
| 5&lt;br /&gt;
| Output D&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| DC05&lt;br /&gt;
| 8&lt;br /&gt;
| Encoded Output&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| DC06&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| DC07&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| DC08&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| DC09&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 2&lt;br /&gt;
| Data0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| DC10&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 3&lt;br /&gt;
| Data1&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| DC11&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 4&lt;br /&gt;
| Data2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| DC12&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 5&lt;br /&gt;
| Data3&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| DC13&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 6&lt;br /&gt;
| Data4&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| DC14&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 7&lt;br /&gt;
| Data5&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| DC15&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 8&lt;br /&gt;
| Data6&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| DC16&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 9&lt;br /&gt;
| Data7&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| GND&lt;br /&gt;
| 1&lt;br /&gt;
| GND&lt;br /&gt;
| 24&lt;br /&gt;
| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Certification Results==&lt;br /&gt;
The Nihon Kohden certification was performed to give a better understanding of the restraints that must be placed on the system when using this device. Certification success criteria was determined internally and without rigor, and reflects our experience with psychophysical experiments and the performance we expect to need for the system. More information about certification testing can be found on the [[User Reference:BCI2000Certification|certification wiki page]]. &lt;br /&gt;
&lt;br /&gt;
===PC Specifications===&lt;br /&gt;
*Lenovo Thinkpad E580 (https://www.lenovo.com/us/en/laptops/thinkpad/thinkpad-e-series/ThinkPad-E580/p/22TP2TEE580)&lt;br /&gt;
*Processor: Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2.7GHz&lt;br /&gt;
*Installed Ram: 8.00 GB&lt;br /&gt;
*Graphics Card: Intel(R) HD Graphics 620&lt;br /&gt;
*System Type: 64-bit operating system, x64-based processor&lt;br /&gt;
*BCI2000 compiled with MSVC2019 and Qt 5.15.2&lt;br /&gt;
*g.USBamp UB with driver version 3.16.00 installed&lt;br /&gt;
&lt;br /&gt;
===Certification Tests Performed===&lt;br /&gt;
Certification testing varied number of channels (4, 8, 16) task (P3Spell (7x7 grid), P3Spell (1x1 grid), CursorTask, CursorTaskLow, and StimulusPresentation), and tested audio and video latency, for a total of 15 performed tasks.&lt;br /&gt;
&lt;br /&gt;
===Success Criteria and Overall Results===&lt;br /&gt;
{|border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Name&lt;br /&gt;
|Actual Latency&lt;br /&gt;
|Success Criteria&lt;br /&gt;
|Result&lt;br /&gt;
|-&lt;br /&gt;
|Timestamp Latency Mean&lt;br /&gt;
|2.81 µs&lt;br /&gt;
|1 ms&lt;br /&gt;
|passed&lt;br /&gt;
|-&lt;br /&gt;
|Timestamp Latency STD&lt;br /&gt;
|2.75 ms&lt;br /&gt;
|5 ms&lt;br /&gt;
|passed&lt;br /&gt;
|-&lt;br /&gt;
|Processing Latency Mean&lt;br /&gt;
|35 ms&lt;br /&gt;
|20 ms&lt;br /&gt;
|failed&lt;br /&gt;
|-&lt;br /&gt;
|Processing Latency STD&lt;br /&gt;
|164 ms&lt;br /&gt;
|10 ms&lt;br /&gt;
|failed&lt;br /&gt;
|-&lt;br /&gt;
|Video Latency Mean&lt;br /&gt;
|66.9 ms&lt;br /&gt;
|65 ms&lt;br /&gt;
|failed&lt;br /&gt;
|-&lt;br /&gt;
|Video Latency STD&lt;br /&gt;
|6.31 ms&lt;br /&gt;
|20 ms&lt;br /&gt;
|passed&lt;br /&gt;
|-&lt;br /&gt;
|Audio Latency Mean&lt;br /&gt;
|76.2 ms&lt;br /&gt;
|65 ms&lt;br /&gt;
|failed&lt;br /&gt;
|-&lt;br /&gt;
|Audio Latency STD&lt;br /&gt;
|3.94 ms&lt;br /&gt;
|20 ms&lt;br /&gt;
|passed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Individual Task Breakdown===&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:black 1px solid;width:1000px;height:600px;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Overall result: 0/15 tasks passed, 15/15 tasks failed, 15 tasks are missing data&lt;br /&gt;
&lt;br /&gt;
global 2021-03-04T16:21:40&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=0, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=3417, &amp;lt;x&amp;gt;=299µs±2.86ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=654, &amp;lt;x&amp;gt;=32.7ms±151ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=679, &amp;lt;x&amp;gt;=11.3ms±11ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=596, &amp;lt;x&amp;gt;=66.6ms±6.19ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTask_1000_16ch_100ms001/CursorTask_1000_16ch_100msS001R01.dat 2021-03-04T13:54:29&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=219, &amp;lt;x&amp;gt;=-2.54ms±2.22ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=4.18ms±2.01ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=8.1ms±5.14ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=68.9ms±4.24ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTask_1000_4ch_100ms001/CursorTask_1000_4ch_100msS001R01.dat 2021-03-04T13:52:40&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=215, &amp;lt;x&amp;gt;=1.83ms±2.73ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=5.34ms±2.74ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=6.84ms±17.5ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=64.8ms±4.47ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTask_1000_8ch_100ms001/CursorTask_1000_8ch_100msS001R01.dat 2021-03-04T13:53:44&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=219, &amp;lt;x&amp;gt;=804µs±2.37ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=5.44ms±2.59ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=4.1ms±19ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=64.3ms±5.8ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTaskLow_1000_16ch_100ms001/CursorTaskLow_1000_16ch_100msS001R01.dat 2021-03-04T13:56:29&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=220, &amp;lt;x&amp;gt;=2.39ms±2.65ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=9.09ms±3.08ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=7.1ms±5.17ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=61.9ms±2.85ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTaskLow_1000_4ch_100ms001/CursorTaskLow_1000_4ch_100msS001R01.dat 2021-03-04T13:55:08&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=219, &amp;lt;x&amp;gt;=2.08ms±2.78ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=5.86ms±2.78ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=9.32ms±3.79ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=64.1ms±2.39ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTaskLow_1000_8ch_100ms001/CursorTaskLow_1000_8ch_100msS001R01.dat 2021-03-04T13:55:45&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=220, &amp;lt;x&amp;gt;=3.46ms±2.48ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=8.04ms±2.55ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=12.9ms±7.38ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=65.2ms±5.02ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3Spell_1000_16ch_100ms001/P3Spell_1000_16ch_100msS001R01.dat 2021-03-04T13:50:11&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=291, &amp;lt;x&amp;gt;=-2.07ms±1.79ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=16, &amp;lt;x&amp;gt;=389ms±645ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=20, &amp;lt;x&amp;gt;=28ms±5.56ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=1, &amp;lt;x&amp;gt;=45.9ms±0&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3Spell_1000_4ch_100ms001/P3Spell_1000_4ch_100msS001R01.dat 2021-03-04T13:48:40&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=290, &amp;lt;x&amp;gt;=-59.1µs±1.98ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=18, &amp;lt;x&amp;gt;=2.85ms±1.75ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=20, &amp;lt;x&amp;gt;=27.1ms±5.46ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=4, &amp;lt;x&amp;gt;=85.2ms±2.19ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3Spell_1000_8ch_100ms001/P3Spell_1000_8ch_100msS001R01.dat 2021-03-04T13:49:26&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=291, &amp;lt;x&amp;gt;=-1.26ms±1.26ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=16, &amp;lt;x&amp;gt;=102ms±387ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=20, &amp;lt;x&amp;gt;=28ms±7.5ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=15, &amp;lt;x&amp;gt;=86.1ms±4.06ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3SpellSingle_1000_16ch_100ms001/P3SpellSingle_1000_16ch_100msS001R01.dat 2021-03-04T13:52:06&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=131, &amp;lt;x&amp;gt;=-227µs±1.11ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=39, &amp;lt;x&amp;gt;=3.11ms±947µs&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=40, &amp;lt;x&amp;gt;=9.68ms±8.75ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=40, &amp;lt;x&amp;gt;=67ms±6.66ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3SpellSingle_1000_4ch_100ms001/P3SpellSingle_1000_4ch_100msS001R01.dat 2021-03-04T13:51:02&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=131, &amp;lt;x&amp;gt;=-1.21ms±1.79ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=36, &amp;lt;x&amp;gt;=51.8ms±111ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=40, &amp;lt;x&amp;gt;=15.5ms±7.06ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=6, &amp;lt;x&amp;gt;=70.7ms±927µs&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3SpellSingle_1000_8ch_100ms001/P3SpellSingle_1000_8ch_100msS001R01.dat 2021-03-04T13:51:36&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=132, &amp;lt;x&amp;gt;=137µs±1.25ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=39, &amp;lt;x&amp;gt;=3.39ms±1.34ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=40, &amp;lt;x&amp;gt;=8.05ms±7.17ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=40, &amp;lt;x&amp;gt;=67ms±6.31ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/StimulusPresentationAV_1000_16ch_100ms001/StimulusPresentationAV_1000_16ch_100msS001R01.dat 2021-03-04T13:57:58&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=209, &amp;lt;x&amp;gt;=1.77ms±2.55ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=48, &amp;lt;x&amp;gt;=5.23ms±2.3ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=12.5ms±7.65ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=39.7ms±2.34ms&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=66.5ms±4.88ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=75.4ms±2.29ms&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/StimulusPresentationAV_1000_4ch_100ms001/StimulusPresentationAV_1000_4ch_100msS001R01.dat 2021-03-04T13:56:59&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=210, &amp;lt;x&amp;gt;=926µs±2.31ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=46, &amp;lt;x&amp;gt;=29.8ms±97.7ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=12.6ms±6.24ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=40ms±2.58ms&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=67.3ms±2.79ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=72.6ms±2.4ms&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/StimulusPresentationAV_1000_8ch_100ms001/StimulusPresentationAV_1000_8ch_100msS001R01.dat 2021-03-04T13:57:28&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=210, &amp;lt;x&amp;gt;=-2.46ms±2.29ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=47, &amp;lt;x&amp;gt;=162ms±194ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=10.2ms±7.56ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=41.7ms±2.48ms&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=69ms±4.73ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=81.2ms±3.09ms&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NihonKohdenSource&amp;diff=9654</id>
		<title>Contributions:NihonKohdenSource</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NihonKohdenSource&amp;diff=9654"/>
		<updated>2022-06-22T14:33:00Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The Nihon Kohden JE-120A amplifier is a clinical monitoring system capable of acquiring EEG or ECoG signals from up to 256 channels. &lt;br /&gt;
Paired with the QI-123A LAN converter box, this system can provide a research data stream in addition to the clinical data stream. &lt;br /&gt;
The research data stream can be sampled at up to 2kHz for 256 channels, 5kHz for 128 channels or 10kHz for 64 channels.&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
http://{{SERVERNAME}}/svn/trunk/src/private/SignalSource/NihonKohdenSource&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
Griffin Milsap (griffin.milsap@gmail.com)&lt;br /&gt;
Johns Hopkins University&lt;br /&gt;
&lt;br /&gt;
Peter Brunner (brunner@neurotechcenter.org)&lt;br /&gt;
Washington University in St. Louis&lt;br /&gt;
&lt;br /&gt;
Markus Adamek (adamek@neurotechcenter.org)&lt;br /&gt;
Washington University in St. Louis&lt;br /&gt;
&lt;br /&gt;
Alexander Belsten (belsten@neurotechcenter.org)&lt;br /&gt;
Washington University in St. Louis&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
# Version 1.0 (r4913): November 2015 - Initial release.&lt;br /&gt;
# Version 1.1 (r6245): March 2021 - Updated to support x64.&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 4913&lt;br /&gt;
*Tested under: 6245&lt;br /&gt;
*Known to compile under: 6245&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Functional Description==&lt;br /&gt;
This setup requires the following components: &lt;br /&gt;
* &#039;&#039;&#039;JE-120A amplifier&#039;&#039;&#039;: &lt;br /&gt;
* &#039;&#039;&#039;QI-123A LAN converter&#039;&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
The amplifier is a clinical monitoring system capable of acquiring EEG or ECoG signals from up to 256 channels. Paired with the QI-123A LAN converter box, this system can provide a research data stream in addition to the clinical data stream. The research data stream can be sampled at up to 2kHz for 256 channels, 5kHz for 128 channels or 10kHz for 64 channels.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Input range&#039;&#039;&#039;: ±3.2 mV or ±12.8 mV (selectable)&lt;br /&gt;
* &#039;&#039;&#039;Effective resolution&#039;&#039;&#039;: 16 bit (97.65 nV/LSB) or 16 bit (390.62 nV/LSB) (selectable)&lt;br /&gt;
* &#039;&#039;&#039;Input impedance&#039;&#039;&#039;: 200 MΩ&lt;br /&gt;
* &#039;&#039;&#039;Sampling Rates&#039;&#039;&#039;: 100Hz, 200Hz, 500Hz, 1000Hz, 2000Hz, 5000Hz, 10000Hz&lt;br /&gt;
&lt;br /&gt;
==Clinical Setup==&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
This source module is located in a private directory of BCI2000. To build the source, you must have the necessary credentials, enable &amp;lt;code&amp;gt;BUILD_PRIVATE&amp;lt;/code&amp;gt; in CMake, and modify the CMakeLists.txt in the private and SignalSource directories to build to NihonKohdenSource.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
* &#039;&#039;&#039;SourceCh&#039;&#039;&#039; total number of channels to be acquired from the source module or auto for all channels enabled in the Neurworkbench&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize&#039;&#039;&#039; number of samples acquired in each block or auto for default setting (1/10th of sampling rate)&lt;br /&gt;
** &#039;&#039;&#039;NOTE:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot;&amp;gt;Only specific combinations of SampleBlockSize and SampleRate are valid!  See [[#Valid Operating Modes]]&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;SampleRate&#039;&#039;&#039; determines the rate at which the device samples data. &amp;lt;br/&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;NOTE:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot;&amp;gt;Only specific combinations of SampleBlockSize and SampleRate are valid!  See [[#Valid Operating Modes]]&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames&#039;&#039;&#039; is a convenience parameter.  Name channels here and they can be referenced by these names later.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset&#039;&#039;&#039; auto for default settings (0 for each channel).&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain&#039;&#039;&#039; auto for default settings (1 for each channel).&lt;br /&gt;
* &#039;&#039;&#039;SourceChList&#039;&#039;&#039; list of channels that should be acquired or auto for all channels enabled in the Neurworkbench&lt;br /&gt;
* &#039;&#039;&#039;SourceBufferSize&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Valid Operating Modes===&lt;br /&gt;
The NihonKohdenSource only accepts specific sampling rates. The number of channels acquired is limited at sampling rates of 5000 Hz and above. The following table shows all valid combinations of sample rate and maximum number of channels. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!SamplingRate&lt;br /&gt;
!Max SourceCh&lt;br /&gt;
!Aliasing Filter Cut-Off&lt;br /&gt;
|-&lt;br /&gt;
![samples/sec]&lt;br /&gt;
![channels]&lt;br /&gt;
![Hz]&lt;br /&gt;
|-&lt;br /&gt;
|100 &lt;br /&gt;
|256 &lt;br /&gt;
|30 or 35&lt;br /&gt;
|-&lt;br /&gt;
|200 &lt;br /&gt;
|256 &lt;br /&gt;
|60 or 70&lt;br /&gt;
|-&lt;br /&gt;
|500 &lt;br /&gt;
|256 &lt;br /&gt;
|120&lt;br /&gt;
|-&lt;br /&gt;
|1000 &lt;br /&gt;
|256&lt;br /&gt;
|300 &lt;br /&gt;
|-&lt;br /&gt;
|2000 &lt;br /&gt;
|256&lt;br /&gt;
|600 &lt;br /&gt;
|-&lt;br /&gt;
|5000 &lt;br /&gt;
|128 &lt;br /&gt;
|1200&lt;br /&gt;
|-&lt;br /&gt;
|10000 &lt;br /&gt;
|64 &lt;br /&gt;
|3000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Valid Operating Modes===&lt;br /&gt;
&lt;br /&gt;
===State Variables===&lt;br /&gt;
* &#039;&#039;&#039;DC01&#039;&#039;&#039; to &#039;&#039;&#039;DC16&#039;&#039;&#039; DC Input data&lt;br /&gt;
** Digital Range: 0 to 65535&lt;br /&gt;
** Analog Range: 0xFFFF(Max)-0x8000(0V)-0x0000(Min). (Signed.)&lt;br /&gt;
** 1LSB: 366.3uV&lt;br /&gt;
* &#039;&#039;&#039;SpO2&#039;&#039;&#039;&lt;br /&gt;
** Digital Range: 0 to 100 &lt;br /&gt;
** 0 means 0%, 100 means 100%&lt;br /&gt;
* &#039;&#039;&#039;EtCO2&#039;&#039;&#039;&lt;br /&gt;
** Digital Range: 0 to 100 &lt;br /&gt;
** 0 means 0mmHg, 100 means 100mmHg&lt;br /&gt;
* &#039;&#039;&#039;BP1&#039;&#039;&#039; to &#039;&#039;&#039;BP2&#039;&#039;&#039;&lt;br /&gt;
** not implemented&lt;br /&gt;
* &#039;&#039;&#039;DigitalMark1&#039;&#039;&#039; to &#039;&#039;&#039;DigitalMark2&#039;&#039;&#039;&lt;br /&gt;
** not implemented&lt;br /&gt;
&lt;br /&gt;
==DC Input From Other Devices==&lt;br /&gt;
Analog data from a g.TRIGbox and parallel port can be obtained though the JE120A&#039;s DC inputs. A parallel port Y-splitter and a custom cable is necessary. Connection of the custom cables and Y-splitter is outlined in the image below.&lt;br /&gt;
&lt;br /&gt;
[[File:Parrallel Ports to JE120A.jpg|700px|alt text]] &lt;br /&gt;
&lt;br /&gt;
The outputs from the g.TRIGbox and parallel port to the DC input of the JE120A are defined below. Note that the g.TRIGbox trigger outputs are the TTL pins. See [[Contributions:ParallelPortFilter]] for information on how to set the outputs of a parallel port from BCI2000. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! JE120A&lt;br /&gt;
! &lt;br /&gt;
! g.TRIGbox&lt;br /&gt;
! &lt;br /&gt;
! Parallel Port&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
| Pin No.&lt;br /&gt;
| Signal&lt;br /&gt;
| Pin No.&lt;br /&gt;
| Signal&lt;br /&gt;
| Pin No.&lt;br /&gt;
| Signal&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| DC01&lt;br /&gt;
| 2&lt;br /&gt;
| Output A&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| DC02&lt;br /&gt;
| 3&lt;br /&gt;
| Output B&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| DC03&lt;br /&gt;
| 4&lt;br /&gt;
| Output C&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| DC04&lt;br /&gt;
| 5&lt;br /&gt;
| Output D&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| DC05&lt;br /&gt;
| 8&lt;br /&gt;
| Encoded Output&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| DC06&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| DC07&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| DC08&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| DC09&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 2&lt;br /&gt;
| Data0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| DC10&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 3&lt;br /&gt;
| Data1&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| DC11&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 4&lt;br /&gt;
| Data2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| DC12&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 5&lt;br /&gt;
| Data3&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| DC13&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 6&lt;br /&gt;
| Data4&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| DC14&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 7&lt;br /&gt;
| Data5&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| DC15&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 8&lt;br /&gt;
| Data6&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| DC16&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 9&lt;br /&gt;
| Data7&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| GND&lt;br /&gt;
| 1&lt;br /&gt;
| GND&lt;br /&gt;
| 24&lt;br /&gt;
| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Certification Results==&lt;br /&gt;
The Nihon Kohden certification was performed to give a better understanding of the restraints that must be placed on the system when using this device. Certification success criteria was determined internally and without rigor, and reflects our experience with psychophysical experiments and the performance we expect to need for the system. More information about certification testing can be found on the [[User Reference:BCI2000Certification|certification wiki page]]. &lt;br /&gt;
&lt;br /&gt;
===PC Specifications===&lt;br /&gt;
*Lenovo Thinkpad E580 (https://www.lenovo.com/us/en/laptops/thinkpad/thinkpad-e-series/ThinkPad-E580/p/22TP2TEE580)&lt;br /&gt;
*Processor: Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2.7GHz&lt;br /&gt;
*Installed Ram: 8.00 GB&lt;br /&gt;
*Graphics Card: Intel(R) HD Graphics 620&lt;br /&gt;
*System Type: 64-bit operating system, x64-based processor&lt;br /&gt;
*BCI2000 compiled with MSVC2019 and Qt 5.15.2&lt;br /&gt;
*g.USBamp UB with driver version 3.16.00 installed&lt;br /&gt;
&lt;br /&gt;
===Certification Tests Performed===&lt;br /&gt;
Certification testing varied number of channels (4, 8, 16) task (P3Spell (7x7 grid), P3Spell (1x1 grid), CursorTask, CursorTaskLow, and StimulusPresentation), and tested audio and video latency, for a total of 15 performed tasks.&lt;br /&gt;
&lt;br /&gt;
===Success Criteria and Overall Results===&lt;br /&gt;
{|border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Name&lt;br /&gt;
|Actual Latency&lt;br /&gt;
|Success Criteria&lt;br /&gt;
|Result&lt;br /&gt;
|-&lt;br /&gt;
|Timestamp Latency Mean&lt;br /&gt;
|2.81 µs&lt;br /&gt;
|1 ms&lt;br /&gt;
|passed&lt;br /&gt;
|-&lt;br /&gt;
|Timestamp Latency STD&lt;br /&gt;
|2.75 ms&lt;br /&gt;
|5 ms&lt;br /&gt;
|passed&lt;br /&gt;
|-&lt;br /&gt;
|Processing Latency Mean&lt;br /&gt;
|35 ms&lt;br /&gt;
|20 ms&lt;br /&gt;
|failed&lt;br /&gt;
|-&lt;br /&gt;
|Processing Latency STD&lt;br /&gt;
|164 ms&lt;br /&gt;
|10 ms&lt;br /&gt;
|failed&lt;br /&gt;
|-&lt;br /&gt;
|Video Latency Mean&lt;br /&gt;
|66.9 ms&lt;br /&gt;
|65 ms&lt;br /&gt;
|failed&lt;br /&gt;
|-&lt;br /&gt;
|Video Latency STD&lt;br /&gt;
|6.31 ms&lt;br /&gt;
|20 ms&lt;br /&gt;
|passed&lt;br /&gt;
|-&lt;br /&gt;
|Audio Latency Mean&lt;br /&gt;
|76.2 ms&lt;br /&gt;
|65 ms&lt;br /&gt;
|failed&lt;br /&gt;
|-&lt;br /&gt;
|Audio Latency STD&lt;br /&gt;
|3.94 ms&lt;br /&gt;
|20 ms&lt;br /&gt;
|passed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Individual Task Breakdown===&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:black 1px solid;width:1000px;height:600px;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Overall result: 0/15 tasks passed, 15/15 tasks failed, 15 tasks are missing data&lt;br /&gt;
&lt;br /&gt;
global 2021-03-04T16:21:40&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=0, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=3417, &amp;lt;x&amp;gt;=299µs±2.86ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=654, &amp;lt;x&amp;gt;=32.7ms±151ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=679, &amp;lt;x&amp;gt;=11.3ms±11ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=596, &amp;lt;x&amp;gt;=66.6ms±6.19ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTask_1000_16ch_100ms001/CursorTask_1000_16ch_100msS001R01.dat 2021-03-04T13:54:29&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=219, &amp;lt;x&amp;gt;=-2.54ms±2.22ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=4.18ms±2.01ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=8.1ms±5.14ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=68.9ms±4.24ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTask_1000_4ch_100ms001/CursorTask_1000_4ch_100msS001R01.dat 2021-03-04T13:52:40&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=215, &amp;lt;x&amp;gt;=1.83ms±2.73ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=5.34ms±2.74ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=6.84ms±17.5ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=64.8ms±4.47ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTask_1000_8ch_100ms001/CursorTask_1000_8ch_100msS001R01.dat 2021-03-04T13:53:44&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=219, &amp;lt;x&amp;gt;=804µs±2.37ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=5.44ms±2.59ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=4.1ms±19ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=64.3ms±5.8ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTaskLow_1000_16ch_100ms001/CursorTaskLow_1000_16ch_100msS001R01.dat 2021-03-04T13:56:29&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=220, &amp;lt;x&amp;gt;=2.39ms±2.65ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=9.09ms±3.08ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=7.1ms±5.17ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=61.9ms±2.85ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTaskLow_1000_4ch_100ms001/CursorTaskLow_1000_4ch_100msS001R01.dat 2021-03-04T13:55:08&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=219, &amp;lt;x&amp;gt;=2.08ms±2.78ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=5.86ms±2.78ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=9.32ms±3.79ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=64.1ms±2.39ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/CursorTaskLow_1000_8ch_100ms001/CursorTaskLow_1000_8ch_100msS001R01.dat 2021-03-04T13:55:45&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=220, &amp;lt;x&amp;gt;=3.46ms±2.48ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=8.04ms±2.55ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=12.9ms±7.38ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=65.2ms±5.02ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3Spell_1000_16ch_100ms001/P3Spell_1000_16ch_100msS001R01.dat 2021-03-04T13:50:11&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=291, &amp;lt;x&amp;gt;=-2.07ms±1.79ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=16, &amp;lt;x&amp;gt;=389ms±645ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=20, &amp;lt;x&amp;gt;=28ms±5.56ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=1, &amp;lt;x&amp;gt;=45.9ms±0&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3Spell_1000_4ch_100ms001/P3Spell_1000_4ch_100msS001R01.dat 2021-03-04T13:48:40&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=290, &amp;lt;x&amp;gt;=-59.1µs±1.98ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=18, &amp;lt;x&amp;gt;=2.85ms±1.75ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=20, &amp;lt;x&amp;gt;=27.1ms±5.46ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=4, &amp;lt;x&amp;gt;=85.2ms±2.19ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3Spell_1000_8ch_100ms001/P3Spell_1000_8ch_100msS001R01.dat 2021-03-04T13:49:26&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=291, &amp;lt;x&amp;gt;=-1.26ms±1.26ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=16, &amp;lt;x&amp;gt;=102ms±387ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=20, &amp;lt;x&amp;gt;=28ms±7.5ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=15, &amp;lt;x&amp;gt;=86.1ms±4.06ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3SpellSingle_1000_16ch_100ms001/P3SpellSingle_1000_16ch_100msS001R01.dat 2021-03-04T13:52:06&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=131, &amp;lt;x&amp;gt;=-227µs±1.11ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=39, &amp;lt;x&amp;gt;=3.11ms±947µs&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=40, &amp;lt;x&amp;gt;=9.68ms±8.75ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=40, &amp;lt;x&amp;gt;=67ms±6.66ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3SpellSingle_1000_4ch_100ms001/P3SpellSingle_1000_4ch_100msS001R01.dat 2021-03-04T13:51:02&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=131, &amp;lt;x&amp;gt;=-1.21ms±1.79ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=36, &amp;lt;x&amp;gt;=51.8ms±111ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=40, &amp;lt;x&amp;gt;=15.5ms±7.06ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=6, &amp;lt;x&amp;gt;=70.7ms±927µs&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/P3SpellSingle_1000_8ch_100ms001/P3SpellSingle_1000_8ch_100msS001R01.dat 2021-03-04T13:51:36&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=132, &amp;lt;x&amp;gt;=137µs±1.25ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=39, &amp;lt;x&amp;gt;=3.39ms±1.34ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=40, &amp;lt;x&amp;gt;=8.05ms±7.17ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=40, &amp;lt;x&amp;gt;=67ms±6.31ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/StimulusPresentationAV_1000_16ch_100ms001/StimulusPresentationAV_1000_16ch_100msS001R01.dat 2021-03-04T13:57:58&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  passed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=209, &amp;lt;x&amp;gt;=1.77ms±2.55ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=48, &amp;lt;x&amp;gt;=5.23ms±2.3ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=12.5ms±7.65ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=39.7ms±2.34ms&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=66.5ms±4.88ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=75.4ms±2.29ms&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/StimulusPresentationAV_1000_4ch_100ms001/StimulusPresentationAV_1000_4ch_100msS001R01.dat 2021-03-04T13:56:59&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=210, &amp;lt;x&amp;gt;=926µs±2.31ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=46, &amp;lt;x&amp;gt;=29.8ms±97.7ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=12.6ms±6.24ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=40ms±2.58ms&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=67.3ms±2.79ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=72.6ms±2.4ms&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:/BCI2000.x64/data/Certification_nihon_final/StimulusPresentationAV_1000_8ch_100ms001/StimulusPresentationAV_1000_8ch_100msS001R01.dat 2021-03-04T13:57:28&lt;br /&gt;
could not evaluate all 10 requirements:&lt;br /&gt;
  AmpLatency.mean() &amp;lt; time(&amp;quot;7ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  AmpLatency.sdev() &amp;lt; time(&amp;quot;2ms&amp;quot;)  missing or invalid data&lt;br /&gt;
  TimestampLatency.mean() &amp;lt; time(&amp;quot;1ms&amp;quot;)  passed&lt;br /&gt;
  TimestampLatency.sdev() &amp;lt; time(&amp;quot;1ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.mean() &amp;lt; time(&amp;quot;20ms&amp;quot;)  failed&lt;br /&gt;
  ProcessingLatency.sdev() &amp;lt; time(&amp;quot;10ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  VideoLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AudioLatency.mean() &amp;lt; time(&amp;quot;65ms&amp;quot;)  failed&lt;br /&gt;
  AudioLatency.sdev() &amp;lt; time(&amp;quot;20ms&amp;quot;)  passed&lt;br /&gt;
  AmpLatency -- interval between block begin, and amp digital out signal change:&lt;br /&gt;
  n=nan, &amp;lt;x&amp;gt;=nan±nan&lt;br /&gt;
  TimestampLatency -- clock skew between sample clock, and SourceTime time stamp:&lt;br /&gt;
  n=210, &amp;lt;x&amp;gt;=-2.46ms±2.29ms&lt;br /&gt;
  ProcessingLatency -- time interval between block received, and stimulus triggered:&lt;br /&gt;
  n=47, &amp;lt;x&amp;gt;=162ms±194ms&lt;br /&gt;
  PresentationLatency -- time interval between stimulus trigger, and video memory change:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=10.2ms±7.56ms&lt;br /&gt;
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=41.7ms±2.48ms&lt;br /&gt;
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:&lt;br /&gt;
  n=49, &amp;lt;x&amp;gt;=69ms±4.73ms&lt;br /&gt;
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:&lt;br /&gt;
  n=50, &amp;lt;x&amp;gt;=81.2ms±3.09ms&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Programming_Reference:NatusADC&amp;diff=9267</id>
		<title>Programming Reference:NatusADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Programming_Reference:NatusADC&amp;diff=9267"/>
		<updated>2021-11-10T20:29:57Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NatusADC module has 3 main classes - NatusPackageInterface, NatusDataServer and NatusClient. The overview of the NatusADC working is shown in the image below.&lt;br /&gt;
[[File:Prog_Ref_NatusADC_NatusWorking.png|center|800px|Overview of NatusADC working]]&lt;br /&gt;
&lt;br /&gt;
NatusDataServer processes and sends signal from the device to the client application. A project named XLDataExportClient reads signals from the device and calls the NatusDataServer&#039;s functions to send the signal to the client. NatusClient is the client application within the BCI2000 that receives the signals and does the initial processing. NatusPackageInterface contains the implementation of data transfer protocol between serve/device and client and is used by NatusClient and NatusDataServer to communicate with each other over TCP and UDP. NatusDataServer and NatusPackageInterface are independent of the BCI2000 where as NatusClient relies on BCI2000. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The below image explains the context in which packet, blocks, samples and channels are used in this project. A packet may have one or block, a block may have one or more samples and a sample contains values for all the channels.&lt;br /&gt;
[[File:NatusPacketImage.png|center|600px|Packet, block and samples relationship]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== NatusPackageInterface ==&lt;br /&gt;
This class handles the communication between the server/device and the client. It should be included with both - NatusDataServer and NatusClient Class. The class performs the following functions -constructing TCP and UDP packets, sending the packets over TCP/UDP port, receiving packets over TCP/UDP Port, reconstructing the data from the packets and listening for connections on device/server-side. &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The format of the packets constructed along with each field size is as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Caption: Package&lt;br /&gt;
|-&lt;br /&gt;
! PacketLength&lt;br /&gt;
! Command&lt;br /&gt;
! Payload&lt;br /&gt;
!   &lt;br /&gt;
|-&lt;br /&gt;
| uint32&lt;br /&gt;
| uint8&lt;br /&gt;
| Variable Length&lt;br /&gt;
| uint8 (always 0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TCP Commands ===&lt;br /&gt;
The commands through which the NatusDataServer and NatusClient communicate are as follows:&lt;br /&gt;
; CMD_Ping : To check if the connection is successful and data can be sent and received.&lt;br /&gt;
* Command Number: 0x01&lt;br /&gt;
* Parameters/Payload: 0xff&lt;br /&gt;
* Return Value: returns payload &lt;br /&gt;
&lt;br /&gt;
; CMD_GetInformation : To send the device information such as the number of channels and sampling rate to the client application.&lt;br /&gt;
* Command Number: 0x02&lt;br /&gt;
* Parameters/Payload: NULL &lt;br /&gt;
* Return Value: struct NatusDeviceInformation which contains the number of channels, sampling rate, and device identifier.&lt;br /&gt;
&lt;br /&gt;
; CMD_GetChannelNames : To send the channel names as set by the device to the client  application. If no channel names are set, NULL is sent.&lt;br /&gt;
* Command Number: 0x03&lt;br /&gt;
* Parameters/Payload: NULL &lt;br /&gt;
* Return Value: struct NatusChannelInformation which contains all the channels and stream names.&lt;br /&gt;
&lt;br /&gt;
; CMD_StartStream : To start sending channel data over UDP port.&lt;br /&gt;
* Command Number: 0x10&lt;br /&gt;
* Parameters/Payload: NULL &lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_StopStream : To stop sending channel data&lt;br /&gt;
* Command Number: 0x1F&lt;br /&gt;
* Parameters/Payload: NULL &lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_SelectChannels : To send data only for the channels numbers mentioned in the payload. It corresponds to the SourceChList parameter.&lt;br /&gt;
* Command Number: 0x20&lt;br /&gt;
* Parameters/Payload: a list of channel numbers separated by space and stored in a string &lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_SetBlockSize : To set the number of blocks to send per packet. It corresponds to the SeverBlockSize parameter.&lt;br /&gt;
* Command Number: 0x21&lt;br /&gt;
* Parameters/Payload: number of blocks to send per packet stored in uint32_t datatype. &lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_GetDecimationFactor : To get the current decimation factor of the device/server.&lt;br /&gt;
* Command Number: 0x22&lt;br /&gt;
* Parameters/Payload: decimation factor stored in uint32_t datatype. &lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_SetDecimationFactor : To set the decimation factor of the device/server.&lt;br /&gt;
* Command Number: 0x23&lt;br /&gt;
* Parameters/Payload: NULL &lt;br /&gt;
* Return Value: decimation factor stored in uint32_t datatype but casted into uint8_t datatype for transmission over TCP.&lt;br /&gt;
&lt;br /&gt;
; CMD_ERR : The command is sent if there is any type of error.&lt;br /&gt;
* Command Number: 0xFF&lt;br /&gt;
* Parameters/Payload: command which caused the error and the payload generated by the function handling the command.&lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&amp;lt;u&amp;gt;Note:&amp;lt;/u&amp;gt; The packet format for this command is as follows: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Caption: Error Package&lt;br /&gt;
|-&lt;br /&gt;
! PacketLength&lt;br /&gt;
! CMD_ERR (0xFF)&lt;br /&gt;
! Command&lt;br /&gt;
! Payload&lt;br /&gt;
!   &lt;br /&gt;
|-&lt;br /&gt;
| uint32&lt;br /&gt;
| uint8&lt;br /&gt;
| uint8&lt;br /&gt;
| Variable Length&lt;br /&gt;
| uint8 (always 0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UDP Commands ===&lt;br /&gt;
; CMD_StreamPackage: The command is sent from the server/device to the client  application when only 1 block per packet is sent.&lt;br /&gt;
* Command Number: 0x11&lt;br /&gt;
* Parameters/Payload: Channel data of 1 block&lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_VariableSizeStreamPackage: The command is sent from the server/device to the client application when more than 1 block per packet is sent.&lt;br /&gt;
* Command Number: 0x12&lt;br /&gt;
* Parameters/Payload: Channel data of more than 1 block (number of blocks as set by the CMD_SetBlockSize command)&lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
=== Functions and Variables  ===&lt;br /&gt;
The public and protected functions and variables defined in this class are as follows: &lt;br /&gt;
* &#039;&#039;&#039;void Poll ()&#039;&#039;&#039; - The function runs on server/device and continuously waits for any command from the NatusClient over the TCP protocol.&lt;br /&gt;
* &#039;&#039;&#039;void send_data (uint8_t cmd, uint8_t* payload, uint32_t len_payload, bool isError=false, PackageType t = Control)&#039;&#039;&#039; - The function creates a packet using cmd (the command) and the payload. The default values for isError is false (i.e., no error) and PackageType is Control (TCP prototcol). The channel data is sent over Stream PackageType (i.e., UDP Protocol).&lt;br /&gt;
* &#039;&#039;&#039;virtual void data_received (CmdStruct * payload) = 0&#039;&#039;&#039; - The function should be implemented in the child classes to ensure proper processing, in respect ot the child class, of the data recieved via TCP or UDP protocol is done.&lt;br /&gt;
* &#039;&#039;&#039;void printMessage (std::string)&#039;&#039;&#039; - Print the string parameter on the warning window. &lt;br /&gt;
* &#039;&#039;&#039;CmdStruct* getNextPackage ()&#039;&#039;&#039; - The function gets a TCP packet (from the server or from the Client, as the case may be) and store in struct CmdStruct. Definietion of CmdStruct can be found in &#039;&#039;NatusPackageInterface.h&#039;&#039; file.&lt;br /&gt;
* &#039;&#039;&#039;CmdStruct* getNextUDPPackage ()&#039;&#039;&#039; - The function is same as CmdStruct* getNextPackage(), except that it received packet over UDP protocol.  &lt;br /&gt;
* &#039;&#039;&#039;void delete_cmdstruct (CmdStruct* )&#039;&#039;&#039; - The function frees the memory occupied by a CmdStruct pointer.&lt;br /&gt;
* &#039;&#039;&#039;void initWSA ()&#039;&#039;&#039; - The function initializes the Winsock. &lt;br /&gt;
* &#039;&#039;&#039;SOCKET connection&#039;&#039;&#039; - It stores the TCP socket connection, i.e, in server/device - the connection to the client and in client - the connection to the server/device.&lt;br /&gt;
* &#039;&#039;&#039;SOCKET udpSocket&#039;&#039;&#039; - It stores the UDP socket connection.&lt;br /&gt;
* &#039;&#039;&#039;sockaddr_in _udpReceiver&#039;&#039;&#039; - It stores the socket address for IPv4.&lt;br /&gt;
&lt;br /&gt;
== NatusDataServer ==&lt;br /&gt;
This class handles the server-side processing. It performs the following functions - starts-up the TCP and UDP server, check for new connections, gracefully disconnects from the client, registers various callbacks on client connection and deregister the callbacks when the client disconnects and responds to the commands (described in the NatusPackageInterface section) from the client via TCP protocol.&lt;br /&gt;
&lt;br /&gt;
=== Functions and Variables  ===&lt;br /&gt;
The public and protected functions and variables defined in this class are as follows: &lt;br /&gt;
* &#039;&#039;&#039;void Startup (std::uint16_t port)&#039;&#039;&#039; - The function starts up the server and listens for a TCP connection on the port number specified by &#039;&#039;port&#039;&#039; and a UDP connection on the port number &#039;&#039;port+1&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;void CheckForConnection ()&#039;&#039;&#039; - The function checks for a client connection request and accept it if there is one.&lt;br /&gt;
* &#039;&#039;&#039;void RegisterDataStreamCallback (NatusDataStreamRequest, void*)&#039;&#039;&#039; - The function registers the callbacks to start &amp;amp; stop streams.&lt;br /&gt;
* &#039;&#039;&#039;void RegisterInformationCallback (NatusInformationRequest, void*)&#039;&#039;&#039; - The function registers the callback to get the device information.&lt;br /&gt;
* &#039;&#039;&#039;void RegisterChannelInformationCallback (NatusChannelInfoRequest, void*)&#039;&#039;&#039; - The function registers the callback to get the device&#039;s channels&#039; names.&lt;br /&gt;
* &#039;&#039;&#039;void RegisterErrorCallback (NatusResponse, void*)&#039;&#039;&#039; - The function registers the callback to call incase of any error.&lt;br /&gt;
* &#039;&#039;&#039;void UnregisterCallbacks ()&#039;&#039;&#039; - The function deregisters all the callbacks. It is called before closing the connection with the client.&lt;br /&gt;
* &#039;&#039;&#039;void SendStreamData (float* data, uint32_t numdata)&#039;&#039;&#039; - The function accepts the channel &#039;&#039;data&#039;&#039; and the number of channels &#039;&#039;numdata&#039;&#039; and prepares the data by decimating it (if decimation factor is set) and by making packets with required number of blocks which are then sent to the client. &lt;br /&gt;
* &#039;&#039;&#039;void Disconnect ()&#039;&#039;&#039; - The function gracefully closes the UDP and TCP connection with the client.&lt;br /&gt;
* &#039;&#039;&#039;bool HasClient ()&#039;&#039;&#039; - The function checks if there is a client connected to the server/device.&lt;br /&gt;
* &#039;&#039;&#039;int _channelsToStream[MAX_NUM_CHANNELS]&#039;&#039;&#039; -  It stores the channel numbers which are to be streamed. The end of the array is defined by storing the last element as -1.&lt;br /&gt;
* &#039;&#039;&#039;int _numberOfChannelsToStream&#039;&#039;&#039; - It stores the number of channels to stream.&lt;br /&gt;
* &#039;&#039;&#039;void data_received (CmdStruct *payload)&#039;&#039;&#039; - The function checks for the command received from the client and calls the appropriate function to fulfill the client&#039;s request.&lt;br /&gt;
* &#039;&#039;&#039;void start_UDP_sever (std::uint16_t port)&#039;&#039;&#039; - The function opens up a UDP connection at the &#039;&#039;port&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== NatusClient ==&lt;br /&gt;
This class handles the client-side processing. It connects with the server/device, gets data from the operator module of the NatusADC and sends it to the server/device. It uses various commands as described in the NatusDataServer to set different parameters. Another important function of this class &#039;interpolateMissingBlocks&#039; linearly interpolates the missing UDP packets which contain the channel data values. Eg. &amp;lt;br/&amp;gt; &lt;br /&gt;
Consider the scenario where for a single channel with 1 sample per block, 1 block per packet is sent with decimation factor is 1. Suppose we received packet 1 and 3, packet 2 was lost. Data for packet 2 is interpolated as follows: &lt;br /&gt;
&amp;lt;br/&amp;gt; Interpolation formula&lt;br /&gt;
&#039;&#039;Interpolated Value = ((Current Packet value – Previous Packet value) / (Current Packet Number – Previous Packet Number)) * (Interpolated Packet Number – Previous Packet Number) + Previous Packet Value&#039;&#039;&lt;br /&gt;
[[File:Programming_Reference_NatusADC_Interpolation.png|center|500px|Linear Interpolation example]]&lt;br /&gt;
&lt;br /&gt;
=== Functions and Variables ===&lt;br /&gt;
The public and protected functions and variables defined in this class are as follows: &lt;br /&gt;
* &#039;&#039;&#039;NatusDeviceInformation GetInformation ()&#039;&#039;&#039; - The function sends a CMD_GetInformation command to the server/device over TCP to query the sampling rate and number of channels of the device. It stores the received information in the &#039;&#039;NatusDeviceInformation&#039;&#039; struct type variable.&lt;br /&gt;
* &#039;&#039;&#039;void Connect (std::string server_name, int port)&#039;&#039;&#039; - The function establishes a TCP connection with the &#039;&#039;server_name&#039;&#039; server at port number &#039;&#039;port&#039;&#039; and calls the &#039;&#039;init_udp&#039;&#039; function to establish a UDP connection at port &#039;&#039;port+1&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;bool TryConnect (std::string server_name, int port)&#039;&#039;&#039; - The function tries to establish a TCP and UDP connection again with the &#039;&#039;server_name&#039;&#039; if the connection is lost and returns &#039;&#039;true&#039;&#039; if the connection is successful otherwise &#039;&#039;false&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;void Disconnect ()&#039;&#039;&#039; - The function gracefully closes the TCP and UDP connection with the server/device.&lt;br /&gt;
* &#039;&#039;&#039;void StartStream ()&#039;&#039;&#039; - The function sends the CMD_StartStream command to the server/device to request the channel stream data, which the server/device sends over the UDP.&lt;br /&gt;
* &#039;&#039;&#039;void StopStream ()&#039;&#039;&#039; -  The function sends the CMD_StopStream command to the server/device. &lt;br /&gt;
* &#039;&#039;&#039;uint8_t Ping (uint8_t ping)&#039;&#039;&#039; - The function sends a CMD_PING command to the sever/device with data stored in &#039;&#039;ping&#039;&#039; as payload.&lt;br /&gt;
* &#039;&#039;&#039;NatusSampleBlock* ReadStream ()&#039;&#039;&#039; - The function gets channel data blocks from the server/device through a UDP protocol, calls the &#039;&#039;interpolateMissingBlocks&#039;&#039; if there is any missing blocks, adds the block to the &#039;&#039;_receivequeue&#039;&#039; and returns the first block from the &#039;&#039;_receivequeue&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;NatusSampleBlock* create_natus_sampleblock (uint8_t* payload)&#039;&#039;&#039; - The function creates and returns a NatusSampleBlock structure variable from the payload passes. NatusSampleBlock contains block number, number of samples, samples and a boolean specifying whether the block was recieved from the server/device or was interpolated.&lt;br /&gt;
* &#039;&#039;&#039;void DeleteSampleBlock (NatusSampleBlock*)&#039;&#039;&#039; - The function free the space occupied by the NatusSampleBlock variable passed to it.&lt;br /&gt;
* &#039;&#039;&#039;void SetSampleBlockSize (uint32_t blocksize)&#039;&#039;&#039; - The function sends CMD_SetBlockSize command to the server/device to set number of blocks to be sent in a packet as &#039;&#039;blocksize&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;void SetDecimationFactor (uint32_t decimationFactor)&#039;&#039;&#039; - The function sends CMD_SetDecimationFactor command to the server/device to set the decimation factor as &#039;&#039;decimationFactor&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;NatusChannelInformation GetChannelInfo ()&#039;&#039;&#039; - The function sends CMD_GetChannelNames command to the server/device to query the channel and stream names of the device and stores them in a NatusChannelInformation structure.&lt;br /&gt;
* &#039;&#039;&#039;int GetDecimationFactor ()&#039;&#039;&#039; - The function queries from the server/device over TCP, the current decimation factor and returns it.&lt;br /&gt;
* &#039;&#039;&#039;int SelectChannelsToStream (std::string channels)&#039;&#039;&#039; -  The function sends CMD_SelectChannels command to the server/device along with the channels to stream stored in a space separated &#039;&#039;channels&#039;&#039; string.&lt;br /&gt;
* &#039;&#039;&#039;int _channelsToStream[MAX_NUM_CHANNELS]&#039;&#039;&#039; - It stores the channel numbers which are to be streamed.  &lt;br /&gt;
* &#039;&#039;&#039;NatusChannelInformation channelInfo&#039;&#039;&#039; - The structure stores the channel and stream names of the device.  The NatusChannelInformation structure definition can be found in &#039;&#039;NatusPackageInterface.h&#039;&#039; file.&lt;br /&gt;
* &#039;&#039;&#039;void data_received (CmdStruct *payload)&#039;&#039;&#039; - The function checks if the data received from the server/device does not contain a CMD_ERR code.&lt;br /&gt;
* &#039;&#039;&#039;CmdStruct* blockForPackage(uint32_t timeout)&#039;&#039;&#039; - The function waits to receive a TCP packet from server/device for the time specified by the &#039;&#039;timeout&#039;&#039; variable.&lt;br /&gt;
* &#039;&#039;&#039;std::queue&amp;lt;NatusSampleBlock*&amp;gt; _receivequeue&#039;&#039;&#039; - The queue stores the blocks received for processing.&lt;br /&gt;
* &#039;&#039;&#039;bool init_udp (int port)&#039;&#039;&#039; - The function creates and binds a UDP socket. If completed successfully, it returns &#039;&#039;true&#039;&#039;, otherwise &#039;&#039;false&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;NatusSampleBlock _prevblock&#039;&#039;&#039; - It stores the last data block received from the server/device and is used to check if any block is lost in between, when the client receives a new data block. &lt;br /&gt;
* &#039;&#039;&#039;void interpolateMissingBlocks (NatusSampleBlock*)&#039;&#039;&#039; - The function linearly interpolates any number of missing blocks between the current received data block and the last recieved data block.&lt;br /&gt;
* &#039;&#039;&#039;void emptyReceiveQueue ()&#039;&#039;&#039; - The function frees the memory occupied by the queue &#039;&#039;_receivequeue&#039;&#039; whenever the connection is closed or restarted.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
[[Contributions:NatusADC]], [[User Reference:DataIOFilter]], [[Programming Reference:GenericADC Class]]&lt;br /&gt;
[[Category:Filters]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Programming_Reference:NatusADC&amp;diff=9266</id>
		<title>Programming Reference:NatusADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Programming_Reference:NatusADC&amp;diff=9266"/>
		<updated>2021-11-10T20:22:07Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* NatusPackageInterface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NatusADC module has 3 main classes - NatusPackageInterface, NatusDataServer and NatusClient. The overview of the NatusADC working is shown in the image below.&lt;br /&gt;
[[File:Prog_Ref_NatusADC_NatusWorking.png|center|800px|Overview of NatusADC working]]&lt;br /&gt;
&lt;br /&gt;
NatusDataServer processes and sends signal from the device to the client application. A project named XLDataExportClient reads signals from the device and calls the NatusDataServer&#039;s functions to send the signal to the client. NatusClient is the client application within the BCI2000 that receives the signals and does the initial processing. NatusPackageInterface contains the implementation of data transfer protocol between serve/device and client and is used by NatusClient and NatusDataServer to communicate with each other over TCP and UDP. NatusDataServer and NatusPackageInterface are independent of the BCI2000 where as NatusClient relies on BCI2000. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The below image explains the context in which packet, blocks, samples and channels are used in this project. A packet may have one or block, a block may have one or more samples and a sample contains values for all the channels.&lt;br /&gt;
[[File:NatusPacketImage.png|center|600px|Packet, block and samples relationship]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== NatusPackageInterface ==&lt;br /&gt;
This class handles the communication between the server/device and the client. It should be included with both - NatusDataServer and NatusClient Class. The class performs the following functions -constructing TCP and UDP packets, sending the packets over TCP/UDP port, receiving packets over TCP/UDP Port, reconstructing the data from the packets and listening for connections on device/server-side. &#039;&#039;Note - The file limits the maximum number of channels for a device (stored in MAX_NUM_CHANNELS in NatusPackageInterface.h) to 100.&#039;&#039;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The format of the packets constructed along with each field size is as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Caption: Package&lt;br /&gt;
|-&lt;br /&gt;
! PacketLength&lt;br /&gt;
! Command&lt;br /&gt;
! Payload&lt;br /&gt;
!   &lt;br /&gt;
|-&lt;br /&gt;
| uint32&lt;br /&gt;
| uint8&lt;br /&gt;
| Variable Length&lt;br /&gt;
| uint8 (always 0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TCP Commands ===&lt;br /&gt;
The commands through which the NatusDataServer and NatusClient communicate are as follows:&lt;br /&gt;
; CMD_Ping : To check if the connection is successful and data can be sent and received.&lt;br /&gt;
* Command Number: 0x01&lt;br /&gt;
* Parameters/Payload: 0xff&lt;br /&gt;
* Return Value: returns payload &lt;br /&gt;
&lt;br /&gt;
; CMD_GetInformation : To send the device information such as the number of channels and sampling rate to the client application.&lt;br /&gt;
* Command Number: 0x02&lt;br /&gt;
* Parameters/Payload: NULL &lt;br /&gt;
* Return Value: struct NatusDeviceInformation which contains the number of channels, sampling rate, and device identifier.&lt;br /&gt;
&lt;br /&gt;
; CMD_GetChannelNames : To send the channel names as set by the device to the client  application. If no channel names are set, NULL is sent.&lt;br /&gt;
* Command Number: 0x03&lt;br /&gt;
* Parameters/Payload: NULL &lt;br /&gt;
* Return Value: struct NatusChannelInformation which contains all the channels and stream names.&lt;br /&gt;
&lt;br /&gt;
; CMD_StartStream : To start sending channel data over UDP port.&lt;br /&gt;
* Command Number: 0x10&lt;br /&gt;
* Parameters/Payload: NULL &lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_StopStream : To stop sending channel data&lt;br /&gt;
* Command Number: 0x1F&lt;br /&gt;
* Parameters/Payload: NULL &lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_SelectChannels : To send data only for the channels numbers mentioned in the payload. It corresponds to the SourceChList parameter.&lt;br /&gt;
* Command Number: 0x20&lt;br /&gt;
* Parameters/Payload: a list of channel numbers separated by space and stored in a string &lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_SetBlockSize : To set the number of blocks to send per packet. It corresponds to the SeverBlockSize parameter.&lt;br /&gt;
* Command Number: 0x21&lt;br /&gt;
* Parameters/Payload: number of blocks to send per packet stored in uint32_t datatype. &lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_GetDecimationFactor : To get the current decimation factor of the device/server.&lt;br /&gt;
* Command Number: 0x22&lt;br /&gt;
* Parameters/Payload: decimation factor stored in uint32_t datatype. &lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_SetDecimationFactor : To set the decimation factor of the device/server.&lt;br /&gt;
* Command Number: 0x23&lt;br /&gt;
* Parameters/Payload: NULL &lt;br /&gt;
* Return Value: decimation factor stored in uint32_t datatype but casted into uint8_t datatype for transmission over TCP.&lt;br /&gt;
&lt;br /&gt;
; CMD_ERR : The command is sent if there is any type of error.&lt;br /&gt;
* Command Number: 0xFF&lt;br /&gt;
* Parameters/Payload: command which caused the error and the payload generated by the function handling the command.&lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&amp;lt;u&amp;gt;Note:&amp;lt;/u&amp;gt; The packet format for this command is as follows: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Caption: Error Package&lt;br /&gt;
|-&lt;br /&gt;
! PacketLength&lt;br /&gt;
! CMD_ERR (0xFF)&lt;br /&gt;
! Command&lt;br /&gt;
! Payload&lt;br /&gt;
!   &lt;br /&gt;
|-&lt;br /&gt;
| uint32&lt;br /&gt;
| uint8&lt;br /&gt;
| uint8&lt;br /&gt;
| Variable Length&lt;br /&gt;
| uint8 (always 0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UDP Commands ===&lt;br /&gt;
; CMD_StreamPackage: The command is sent from the server/device to the client  application when only 1 block per packet is sent.&lt;br /&gt;
* Command Number: 0x11&lt;br /&gt;
* Parameters/Payload: Channel data of 1 block&lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
; CMD_VariableSizeStreamPackage: The command is sent from the server/device to the client application when more than 1 block per packet is sent.&lt;br /&gt;
* Command Number: 0x12&lt;br /&gt;
* Parameters/Payload: Channel data of more than 1 block (number of blocks as set by the CMD_SetBlockSize command)&lt;br /&gt;
* Return Value: NULL&lt;br /&gt;
&lt;br /&gt;
=== Functions and Variables  ===&lt;br /&gt;
The public and protected functions and variables defined in this class are as follows: &lt;br /&gt;
* &#039;&#039;&#039;void Poll ()&#039;&#039;&#039; - The function runs on server/device and continuously waits for any command from the NatusClient over the TCP protocol.&lt;br /&gt;
* &#039;&#039;&#039;void send_data (uint8_t cmd, uint8_t* payload, uint32_t len_payload, bool isError=false, PackageType t = Control)&#039;&#039;&#039; - The function creates a packet using cmd (the command) and the payload. The default values for isError is false (i.e., no error) and PackageType is Control (TCP prototcol). The channel data is sent over Stream PackageType (i.e., UDP Protocol).&lt;br /&gt;
* &#039;&#039;&#039;virtual void data_received (CmdStruct * payload) = 0&#039;&#039;&#039; - The function should be implemented in the child classes to ensure proper processing, in respect ot the child class, of the data recieved via TCP or UDP protocol is done.&lt;br /&gt;
* &#039;&#039;&#039;void printMessage (std::string)&#039;&#039;&#039; - Print the string parameter on the warning window. &lt;br /&gt;
* &#039;&#039;&#039;CmdStruct* getNextPackage ()&#039;&#039;&#039; - The function gets a TCP packet (from the server or from the Client, as the case may be) and store in struct CmdStruct. Definietion of CmdStruct can be found in &#039;&#039;NatusPackageInterface.h&#039;&#039; file.&lt;br /&gt;
* &#039;&#039;&#039;CmdStruct* getNextUDPPackage ()&#039;&#039;&#039; - The function is same as CmdStruct* getNextPackage(), except that it received packet over UDP protocol.  &lt;br /&gt;
* &#039;&#039;&#039;void delete_cmdstruct (CmdStruct* )&#039;&#039;&#039; - The function frees the memory occupied by a CmdStruct pointer.&lt;br /&gt;
* &#039;&#039;&#039;void initWSA ()&#039;&#039;&#039; - The function initializes the Winsock. &lt;br /&gt;
* &#039;&#039;&#039;SOCKET connection&#039;&#039;&#039; - It stores the TCP socket connection, i.e, in server/device - the connection to the client and in client - the connection to the server/device.&lt;br /&gt;
* &#039;&#039;&#039;SOCKET udpSocket&#039;&#039;&#039; - It stores the UDP socket connection.&lt;br /&gt;
* &#039;&#039;&#039;sockaddr_in _udpReceiver&#039;&#039;&#039; - It stores the socket address for IPv4.&lt;br /&gt;
&lt;br /&gt;
== NatusDataServer ==&lt;br /&gt;
This class handles the server-side processing. It performs the following functions - starts-up the TCP and UDP server, check for new connections, gracefully disconnects from the client, registers various callbacks on client connection and deregister the callbacks when the client disconnects and responds to the commands (described in the NatusPackageInterface section) from the client via TCP protocol.&lt;br /&gt;
&lt;br /&gt;
=== Functions and Variables  ===&lt;br /&gt;
The public and protected functions and variables defined in this class are as follows: &lt;br /&gt;
* &#039;&#039;&#039;void Startup (std::uint16_t port)&#039;&#039;&#039; - The function starts up the server and listens for a TCP connection on the port number specified by &#039;&#039;port&#039;&#039; and a UDP connection on the port number &#039;&#039;port+1&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;void CheckForConnection ()&#039;&#039;&#039; - The function checks for a client connection request and accept it if there is one.&lt;br /&gt;
* &#039;&#039;&#039;void RegisterDataStreamCallback (NatusDataStreamRequest, void*)&#039;&#039;&#039; - The function registers the callbacks to start &amp;amp; stop streams.&lt;br /&gt;
* &#039;&#039;&#039;void RegisterInformationCallback (NatusInformationRequest, void*)&#039;&#039;&#039; - The function registers the callback to get the device information.&lt;br /&gt;
* &#039;&#039;&#039;void RegisterChannelInformationCallback (NatusChannelInfoRequest, void*)&#039;&#039;&#039; - The function registers the callback to get the device&#039;s channels&#039; names.&lt;br /&gt;
* &#039;&#039;&#039;void RegisterErrorCallback (NatusResponse, void*)&#039;&#039;&#039; - The function registers the callback to call incase of any error.&lt;br /&gt;
* &#039;&#039;&#039;void UnregisterCallbacks ()&#039;&#039;&#039; - The function deregisters all the callbacks. It is called before closing the connection with the client.&lt;br /&gt;
* &#039;&#039;&#039;void SendStreamData (float* data, uint32_t numdata)&#039;&#039;&#039; - The function accepts the channel &#039;&#039;data&#039;&#039; and the number of channels &#039;&#039;numdata&#039;&#039; and prepares the data by decimating it (if decimation factor is set) and by making packets with required number of blocks which are then sent to the client. &lt;br /&gt;
* &#039;&#039;&#039;void Disconnect ()&#039;&#039;&#039; - The function gracefully closes the UDP and TCP connection with the client.&lt;br /&gt;
* &#039;&#039;&#039;bool HasClient ()&#039;&#039;&#039; - The function checks if there is a client connected to the server/device.&lt;br /&gt;
* &#039;&#039;&#039;int _channelsToStream[MAX_NUM_CHANNELS]&#039;&#039;&#039; -  It stores the channel numbers which are to be streamed. The end of the array is defined by storing the last element as -1.&lt;br /&gt;
* &#039;&#039;&#039;int _numberOfChannelsToStream&#039;&#039;&#039; - It stores the number of channels to stream.&lt;br /&gt;
* &#039;&#039;&#039;void data_received (CmdStruct *payload)&#039;&#039;&#039; - The function checks for the command received from the client and calls the appropriate function to fulfill the client&#039;s request.&lt;br /&gt;
* &#039;&#039;&#039;void start_UDP_sever (std::uint16_t port)&#039;&#039;&#039; - The function opens up a UDP connection at the &#039;&#039;port&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== NatusClient ==&lt;br /&gt;
This class handles the client-side processing. It connects with the server/device, gets data from the operator module of the NatusADC and sends it to the server/device. It uses various commands as described in the NatusDataServer to set different parameters. Another important function of this class &#039;interpolateMissingBlocks&#039; linearly interpolates the missing UDP packets which contain the channel data values. Eg. &amp;lt;br/&amp;gt; &lt;br /&gt;
Consider the scenario where for a single channel with 1 sample per block, 1 block per packet is sent with decimation factor is 1. Suppose we received packet 1 and 3, packet 2 was lost. Data for packet 2 is interpolated as follows: &lt;br /&gt;
&amp;lt;br/&amp;gt; Interpolation formula&lt;br /&gt;
&#039;&#039;Interpolated Value = ((Current Packet value – Previous Packet value) / (Current Packet Number – Previous Packet Number)) * (Interpolated Packet Number – Previous Packet Number) + Previous Packet Value&#039;&#039;&lt;br /&gt;
[[File:Programming_Reference_NatusADC_Interpolation.png|center|500px|Linear Interpolation example]]&lt;br /&gt;
&lt;br /&gt;
=== Functions and Variables ===&lt;br /&gt;
The public and protected functions and variables defined in this class are as follows: &lt;br /&gt;
* &#039;&#039;&#039;NatusDeviceInformation GetInformation ()&#039;&#039;&#039; - The function sends a CMD_GetInformation command to the server/device over TCP to query the sampling rate and number of channels of the device. It stores the received information in the &#039;&#039;NatusDeviceInformation&#039;&#039; struct type variable.&lt;br /&gt;
* &#039;&#039;&#039;void Connect (std::string server_name, int port)&#039;&#039;&#039; - The function establishes a TCP connection with the &#039;&#039;server_name&#039;&#039; server at port number &#039;&#039;port&#039;&#039; and calls the &#039;&#039;init_udp&#039;&#039; function to establish a UDP connection at port &#039;&#039;port+1&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;bool TryConnect (std::string server_name, int port)&#039;&#039;&#039; - The function tries to establish a TCP and UDP connection again with the &#039;&#039;server_name&#039;&#039; if the connection is lost and returns &#039;&#039;true&#039;&#039; if the connection is successful otherwise &#039;&#039;false&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;void Disconnect ()&#039;&#039;&#039; - The function gracefully closes the TCP and UDP connection with the server/device.&lt;br /&gt;
* &#039;&#039;&#039;void StartStream ()&#039;&#039;&#039; - The function sends the CMD_StartStream command to the server/device to request the channel stream data, which the server/device sends over the UDP.&lt;br /&gt;
* &#039;&#039;&#039;void StopStream ()&#039;&#039;&#039; -  The function sends the CMD_StopStream command to the server/device. &lt;br /&gt;
* &#039;&#039;&#039;uint8_t Ping (uint8_t ping)&#039;&#039;&#039; - The function sends a CMD_PING command to the sever/device with data stored in &#039;&#039;ping&#039;&#039; as payload.&lt;br /&gt;
* &#039;&#039;&#039;NatusSampleBlock* ReadStream ()&#039;&#039;&#039; - The function gets channel data blocks from the server/device through a UDP protocol, calls the &#039;&#039;interpolateMissingBlocks&#039;&#039; if there is any missing blocks, adds the block to the &#039;&#039;_receivequeue&#039;&#039; and returns the first block from the &#039;&#039;_receivequeue&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;NatusSampleBlock* create_natus_sampleblock (uint8_t* payload)&#039;&#039;&#039; - The function creates and returns a NatusSampleBlock structure variable from the payload passes. NatusSampleBlock contains block number, number of samples, samples and a boolean specifying whether the block was recieved from the server/device or was interpolated.&lt;br /&gt;
* &#039;&#039;&#039;void DeleteSampleBlock (NatusSampleBlock*)&#039;&#039;&#039; - The function free the space occupied by the NatusSampleBlock variable passed to it.&lt;br /&gt;
* &#039;&#039;&#039;void SetSampleBlockSize (uint32_t blocksize)&#039;&#039;&#039; - The function sends CMD_SetBlockSize command to the server/device to set number of blocks to be sent in a packet as &#039;&#039;blocksize&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;void SetDecimationFactor (uint32_t decimationFactor)&#039;&#039;&#039; - The function sends CMD_SetDecimationFactor command to the server/device to set the decimation factor as &#039;&#039;decimationFactor&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;NatusChannelInformation GetChannelInfo ()&#039;&#039;&#039; - The function sends CMD_GetChannelNames command to the server/device to query the channel and stream names of the device and stores them in a NatusChannelInformation structure.&lt;br /&gt;
* &#039;&#039;&#039;int GetDecimationFactor ()&#039;&#039;&#039; - The function queries from the server/device over TCP, the current decimation factor and returns it.&lt;br /&gt;
* &#039;&#039;&#039;int SelectChannelsToStream (std::string channels)&#039;&#039;&#039; -  The function sends CMD_SelectChannels command to the server/device along with the channels to stream stored in a space separated &#039;&#039;channels&#039;&#039; string.&lt;br /&gt;
* &#039;&#039;&#039;int _channelsToStream[MAX_NUM_CHANNELS]&#039;&#039;&#039; - It stores the channel numbers which are to be streamed.  &lt;br /&gt;
* &#039;&#039;&#039;NatusChannelInformation channelInfo&#039;&#039;&#039; - The structure stores the channel and stream names of the device.  The NatusChannelInformation structure definition can be found in &#039;&#039;NatusPackageInterface.h&#039;&#039; file.&lt;br /&gt;
* &#039;&#039;&#039;void data_received (CmdStruct *payload)&#039;&#039;&#039; - The function checks if the data received from the server/device does not contain a CMD_ERR code.&lt;br /&gt;
* &#039;&#039;&#039;CmdStruct* blockForPackage(uint32_t timeout)&#039;&#039;&#039; - The function waits to receive a TCP packet from server/device for the time specified by the &#039;&#039;timeout&#039;&#039; variable.&lt;br /&gt;
* &#039;&#039;&#039;std::queue&amp;lt;NatusSampleBlock*&amp;gt; _receivequeue&#039;&#039;&#039; - The queue stores the blocks received for processing.&lt;br /&gt;
* &#039;&#039;&#039;bool init_udp (int port)&#039;&#039;&#039; - The function creates and binds a UDP socket. If completed successfully, it returns &#039;&#039;true&#039;&#039;, otherwise &#039;&#039;false&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;NatusSampleBlock _prevblock&#039;&#039;&#039; - It stores the last data block received from the server/device and is used to check if any block is lost in between, when the client receives a new data block. &lt;br /&gt;
* &#039;&#039;&#039;void interpolateMissingBlocks (NatusSampleBlock*)&#039;&#039;&#039; - The function linearly interpolates any number of missing blocks between the current received data block and the last recieved data block.&lt;br /&gt;
* &#039;&#039;&#039;void emptyReceiveQueue ()&#039;&#039;&#039; - The function frees the memory occupied by the queue &#039;&#039;_receivequeue&#039;&#039; whenever the connection is closed or restarted.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
[[Contributions:NatusADC]], [[User Reference:DataIOFilter]], [[Programming Reference:GenericADC Class]]&lt;br /&gt;
[[Category:Filters]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Programming_Howto:Download_the_BCI2000_Sourcecode&amp;diff=8785</id>
		<title>Programming Howto:Download the BCI2000 Sourcecode</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Programming_Howto:Download_the_BCI2000_Sourcecode&amp;diff=8785"/>
		<updated>2021-02-22T19:13:15Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Choose a checkout directory */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Back==&lt;br /&gt;
To [[Programming Howto:Building and Customizing BCI2000|this howto&#039;s overview page]].&lt;br /&gt;
&lt;br /&gt;
==Choose a checkout directory==&lt;br /&gt;
Right-click a Windows explorer window, and choose &amp;quot;SVN Checkout...&amp;quot; from the context menu. Use &amp;lt;code&amp;gt;https://www.bci2000.org/svn/trunk&amp;lt;/code&amp;gt; as the repository URL.&lt;br /&gt;
&lt;br /&gt;
[[File:SVN_3-2294.png.png|center]]&lt;br /&gt;
&lt;br /&gt;
Enter the desired checkout directory in the dialog that comes up.&lt;br /&gt;
&lt;br /&gt;
[[File:SVN_4-2294.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Enter user name and password==&lt;br /&gt;
When prompted, enter user name and password as chosen in the registration step.&lt;br /&gt;
Check &amp;quot;Save authentication&amp;quot; if you don&#039;t like to enter your credentials each time you check out or update BCI2000.&lt;br /&gt;
&lt;br /&gt;
[[File:SVN_3-2315.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Wait for the checkout to complete==&lt;br /&gt;
A list of files will scroll by while the source code is downloaded.&lt;br /&gt;
&lt;br /&gt;
[[File:SVN_4-2326.png|center]]&lt;br /&gt;
&lt;br /&gt;
Once the download has been finished, click &amp;quot;OK&amp;quot; to dismiss the checkout dialog.&lt;br /&gt;
&lt;br /&gt;
[[File:SVN_5-2333.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Next step==&lt;br /&gt;
As a next step, learn how to [[Programming Howto:Configure BCI2000 for Compilation|configure BCI2000 for compilation]].&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[Programming Howto:Building and Customizing BCI2000]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Programming_Howto:Configure_BCI2000_for_Compilation&amp;diff=8532</id>
		<title>Programming Howto:Configure BCI2000 for Compilation</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Programming_Howto:Configure_BCI2000_for_Compilation&amp;diff=8532"/>
		<updated>2020-09-02T17:48:42Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Tell CMake which Qt installation to use */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Back==&lt;br /&gt;
To [[Programming Howto:Building and Customizing BCI2000|this howto&#039;s overview page]].&lt;br /&gt;
&lt;br /&gt;
==Run the CMake GUI==&lt;br /&gt;
Double-click &amp;quot;Configure.sh.cmd&amp;quot; in your BCI2000 build directory.&lt;br /&gt;
&lt;br /&gt;
[[File:use_cmake_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
==Tell CMake which Qt installation to use==&lt;br /&gt;
Click &amp;quot;AddEntry&amp;quot; in the CMake window ...&lt;br /&gt;
&lt;br /&gt;
[[File:use_cmake_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
... and enter the path to a Qt directory that is consistent with the compiler you are going to use. Use Qt5_DIR as the name for the new entry. Be aware that the entry is case sensitive&lt;br /&gt;
&lt;br /&gt;
[[File:use_cmake_3.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
==Perform the configuration step==&lt;br /&gt;
In the CMake window, click &amp;quot;Configure&amp;quot; ...&lt;br /&gt;
&lt;br /&gt;
[[File:use_cmake_4.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
... and choose a generator that is consistent with your compiler, and the Qt directory chosen above. Then click &amp;quot;Finish&amp;quot; to perform the configuration step.&lt;br /&gt;
&lt;br /&gt;
[[File:use_cmake_5.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
You will see a list of targets scrolling by, and a number of new entries in the variable list at the top of the window, marked in red.&lt;br /&gt;
&lt;br /&gt;
[[File:use_cmake_6.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
==Choose build options==&lt;br /&gt;
Make sure the &amp;quot;Grouped&amp;quot; checkbox is checked, and configure the build by customizing values in the &amp;quot;BUILD&amp;quot; ...&lt;br /&gt;
&lt;br /&gt;
[[File:use_cmake_7.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
... and &amp;quot;EXTENSIONS&amp;quot; group. Then, click &amp;quot;Generate&amp;quot; to create build files.&lt;br /&gt;
&lt;br /&gt;
[[File:use_cmake_8.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
When CMake displays its &amp;quot;Generating done&amp;quot; message, ...&lt;br /&gt;
&lt;br /&gt;
[[File:use_cmake_9.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
... your BCI2000 build directory will now contain a VisualStudio solution file, as well as a number of additional CMake-generated files.&lt;br /&gt;
&lt;br /&gt;
[[File:use_cmake_10.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
==Next step==&lt;br /&gt;
As a next step, learn how to [[Programming Howto:Compile BCI2000|compile BCI2000]].&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[Programming Howto:Building and Customizing BCI2000]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8513</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8513"/>
		<updated>2020-07-15T17:29:59Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Acquisition via low-latency connection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz if you use all 512 Channels.&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: 6082&lt;br /&gt;
*Known to compile under: 6082&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Hardware Configuration==&lt;br /&gt;
This Acquisition module has two ways to stream data from a Pegasus/Cheetah System.&lt;br /&gt;
===Acquisition via the NetCom Interface===&lt;br /&gt;
To acquire data via the NetCom interface the experimental Computer (Running BCI2000) has to be connected to the Pegasus/Cheetah System (Running the Acquisition Software) via Ethernet.&lt;br /&gt;
&lt;br /&gt;
(1) Make sure that both computers are on the same subnet and that the Acquisition Software is running on the Pegasus/Cheetah System (You don&#039;t need to start an acquisition or recording).&amp;lt;br&amp;gt;&lt;br /&gt;
(2) Configure BCI2000 with the correct IP address (ServerName). Be aware that the Pegasus/Cheetah System has multiple Network ports!&amp;lt;br&amp;gt;&lt;br /&gt;
(3) After pressing Set Config in BCI2000 it should seamlessly connect to the Pegasus/Cheetah System. BCI2000 will automatically start data acquisition. &amp;lt;br&amp;gt;&lt;br /&gt;
You can check if BCI2000 has connected correctly by opening the Acquisition System Status on the Pegasus/Cheetah System. In this window you should see a field called NetCom Clients. If BCI2000 is connected, it should be listed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Netcominterface.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Acquisition via low-latency connection===&lt;br /&gt;
The low-latency stream allows us to tap directly into the data streamed from the ADC without the Pegasus/Cheetah System. This approach significantly reduces latency and increases the stability of the timebase.&lt;br /&gt;
While data is streamed directly from the amplifier, configuration still requires the Pegasus/Cheetah System and connection via the NetCom interface. You can follow the steps above to ensure that you are able to connect to the NetCom Interface.&lt;br /&gt;
&lt;br /&gt;
The low-latency stream requires direct connection to the amplifier via a fiber optic ethernet connection. Therefore, the BCI2000 computer requires an optical ethernet interface. &lt;br /&gt;
The optical ethernet card has to be configured identical to the card installed in the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(1) Obtain the IP address, subnet mask as well as the MAC address. &lt;br /&gt;
To get this information open a command window on the Pegasus/Cheetah System (To find the command prompt type cmd in the Windows 10 search bar).&lt;br /&gt;
Type &amp;lt;code&amp;gt;ipconfig -all&amp;lt;/code&amp;gt; which will give you information of all Network adapters.&lt;br /&gt;
You will need to find the physical port that connects the amplifier with the Pegasus/Cheetah System. A good way to ensure that you chose the correct adapter is to turn of the amplifier and check which adapter changed.&lt;br /&gt;
Your result might look different than the example below.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Ethernet adapter Ethernet:&lt;br /&gt;
  Connection-specific DNS Suffix  . :&lt;br /&gt;
  Description . . . . . . . . . . . : Intel(R) Ethernet Server Adapter I350-F2&lt;br /&gt;
  Physical Address. . . . . . . . . : 48-2A-E3-40-45-DB&lt;br /&gt;
  Link-local IPv6 Address . . . . . : fe80::cc21:7e8e:f65a:158e%11&lt;br /&gt;
  IPv4 Address. . . . . . . . . . . : 172.20.2.144&lt;br /&gt;
  Subnet Mask . . . . . . . . . . . : 255.255.0.0&lt;br /&gt;
  Lease Obtained. . . . . . . . . . : Wednesday, July 15, 2020 8:25:32 AM&lt;br /&gt;
  Lease Expires . . . . . . . . . . : Thursday, July 16, 2020 8:25:25 AM&lt;br /&gt;
  Default Gateway . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCP Server . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCPv6 IAID . . . . . . . . . . . : 105392867&lt;br /&gt;
  DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-24-67-EF-14-48-2A-E3-40-45-DB&lt;br /&gt;
  DNS Servers . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  NetBIOS over Tcpip. . . . . . . . : Enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You will need the information shown in Physical Address (MAC address), IPv4 Address, and Subnet Mask.&lt;br /&gt;
&lt;br /&gt;
(2) Change the settings of the fiber card Network Adapter on your BCI2000 machine.&lt;br /&gt;
To change the MAC address you can use a tool like the [https://technitium.com/tmac/ Technitium MAC Address Changer]. Make sure that you are changing the correct Network connection!&lt;br /&gt;
&lt;br /&gt;
(3) Replace your current MAC address with the Physical Address obtained from the Pegasus/Cheetah System.&lt;br /&gt;
To change IP address and Subnet mask you can follow a tutorial like this one:[https://www.professionaltutorial.com/change-ip-address-in-windows-10/ Change IP Address (Start at step 3)  ].&lt;br /&gt;
&lt;br /&gt;
(4) Connect the BCI2000 computer to the Amplifier with an appropriate fiber cable. The BCI2000 machine should be connected via the free fiber-cable ethernet port on the amplifier. Make sure that you plugged the fiber cable into the free port on the amplifier and not the free fiber port on the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(5) Check if the data gets streamed to the BCI2000 computer. If you have configured everything correctly, data should now be streamed to your computer if the acquisition is started on the Pegasus/Cheetah System.&lt;br /&gt;
The easiest way to check this is to open the Task Manager (Ctrl+Shift+Esc) on the BCI2000 system. In the performance tab, you can monitor incoming and outgoing traffic on your network adapters. If you were successful, you should see a steady inflow of data on the ethernet port which connects your computer to the amplifier. If you are unsure, open the task manager on the Pegasus/Cheetah System, you should see the same type of data usage.&lt;br /&gt;
&lt;br /&gt;
(6) Start BCI2000 and enable UseDirectUDPStream for the Low-Latency stream.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
===Signal Properties===&lt;br /&gt;
Signal Properties describe Settings common to most Amplifiers.&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Samples per channel per digitized block. Together with the sampling rate, this parameter determines how often per second data is collected, processed, and feedback is updated.&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; Sampling rate of the data. The SamplingRate has to be an integer fraction of 32kHz.&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames:&#039;&#039;&#039; List of Names for Channels. Space-separated list; Must be the same length as Number of Channels. If set to auto, BCI2000 will query the Names from the Neuralynx system.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; Setting is not used in this module, default is 0&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used, default is 1&lt;br /&gt;
===NeuralynxNetCom===&lt;br /&gt;
This Section describes Settings Necessary to communicate with the Cheetah/Pegasus System via the NetCom Interface&lt;br /&gt;
* &#039;&#039;&#039;ServerName:&#039;&#039;&#039; IP Address of the NetCom server (Typically the IP of your Cheetah/Pegasus System)&lt;br /&gt;
&lt;br /&gt;
===NeuralynxUDPStream===&lt;br /&gt;
Settings if you want to use the Low Latency Stream. This requires a fiber-optic connection between the Amplifier and the BCI2000 computer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Boards:&#039;&#039;&#039; The Number of Boards which are connected in the Neuralynx Chassis&lt;br /&gt;
* &#039;&#039;&#039;SourceChnList:&#039;&#039;&#039; List of transmitted Channels. This allows you to only submit a subset of Channels. Its a list of channel ids (starting from 0). If set to auto, all channels will be transmitted.&lt;br /&gt;
* &#039;&#039;&#039;UseDirectUDPSTream:&#039;&#039;&#039; Easy way to switch the UDP stream on or off. This has to be enabled for low latency communication&lt;br /&gt;
* &#039;&#039;&#039;UDPStreamPort:&#039;&#039;&#039; Port through which the BCI2000 computer receives data from the Neuralynx System. This port is provided by Neuralynx.&lt;br /&gt;
* &#039;&#039;&#039;DecimationFactor:&#039;&#039;&#039; Decimation Factor for incoming Data. Incoming Data is sampled at 32kHz. If Decimation Factor is set, SamplingRate has to match or has to be set to auto. similarly, if SamplingRate is set, DecimationFactor can be set to auto and the system will determine the correct decimation factor automatically. Downsampling will be achieved by a simple moving average filter.&lt;br /&gt;
* &#039;&#039;&#039;NRDStreamingFile:&#039;&#039;&#039; Leave Empty. This can be used to stream data from a Neuralynx NRD file for debugging purposes. &lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8512</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8512"/>
		<updated>2020-07-15T17:29:32Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Acquisition via low-latency connection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz if you use all 512 Channels.&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: 6082&lt;br /&gt;
*Known to compile under: 6082&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Hardware Configuration==&lt;br /&gt;
This Acquisition module has two ways to stream data from a Pegasus/Cheetah System.&lt;br /&gt;
===Acquisition via the NetCom Interface===&lt;br /&gt;
To acquire data via the NetCom interface the experimental Computer (Running BCI2000) has to be connected to the Pegasus/Cheetah System (Running the Acquisition Software) via Ethernet.&lt;br /&gt;
&lt;br /&gt;
(1) Make sure that both computers are on the same subnet and that the Acquisition Software is running on the Pegasus/Cheetah System (You don&#039;t need to start an acquisition or recording).&amp;lt;br&amp;gt;&lt;br /&gt;
(2) Configure BCI2000 with the correct IP address (ServerName). Be aware that the Pegasus/Cheetah System has multiple Network ports!&amp;lt;br&amp;gt;&lt;br /&gt;
(3) After pressing Set Config in BCI2000 it should seamlessly connect to the Pegasus/Cheetah System. BCI2000 will automatically start data acquisition. &amp;lt;br&amp;gt;&lt;br /&gt;
You can check if BCI2000 has connected correctly by opening the Acquisition System Status on the Pegasus/Cheetah System. In this window you should see a field called NetCom Clients. If BCI2000 is connected, it should be listed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Netcominterface.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Acquisition via low-latency connection===&lt;br /&gt;
The low-latency stream allows us to tap directly into the data streamed from the ADC without the Pegasus/Cheetah System. This approach significantly reduces latency and increases the stability of the timebase.&lt;br /&gt;
While data is streamed directly from the amplifier, configuration still requires the Pegasus/Cheetah System and connection via the NetCom interface. You can follow the steps above to ensure that you are able to connect to the NetCom Interface.&lt;br /&gt;
&lt;br /&gt;
The low-latency stream requires direct connection to the amplifier via a fiber optic ethernet connection. Therefore, the BCI2000 computer requires an optical ethernet interface. &lt;br /&gt;
The optical ethernet card has to be configured identical to the card installed in the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(1) Obtain the IP address, subnet mask as well as the MAC address. &lt;br /&gt;
To get this information open a command window on the Pegasus/Cheetah System (To find the command prompt type cmd in the Windows 10 search bar).&lt;br /&gt;
Type &amp;lt;code&amp;gt;ipconfig -all&amp;lt;/code&amp;gt; which will give you information of all Network adapters.&lt;br /&gt;
You will need to find the physical port that connects the amplifier with the Pegasus/Cheetah System. A good way to ensure that you chose the correct adapter is to turn of the amplifier and check which adapter changed.&lt;br /&gt;
Your result might look different than the example below.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Ethernet adapter Ethernet:&lt;br /&gt;
  Connection-specific DNS Suffix  . :&lt;br /&gt;
  Description . . . . . . . . . . . : Intel(R) Ethernet Server Adapter I350-F2&lt;br /&gt;
  Physical Address. . . . . . . . . : 48-2A-E3-40-45-DB&lt;br /&gt;
  Link-local IPv6 Address . . . . . : fe80::cc21:7e8e:f65a:158e%11&lt;br /&gt;
  IPv4 Address. . . . . . . . . . . : 172.20.2.144&lt;br /&gt;
  Subnet Mask . . . . . . . . . . . : 255.255.0.0&lt;br /&gt;
  Lease Obtained. . . . . . . . . . : Wednesday, July 15, 2020 8:25:32 AM&lt;br /&gt;
  Lease Expires . . . . . . . . . . : Thursday, July 16, 2020 8:25:25 AM&lt;br /&gt;
  Default Gateway . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCP Server . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCPv6 IAID . . . . . . . . . . . : 105392867&lt;br /&gt;
  DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-24-67-EF-14-48-2A-E3-40-45-DB&lt;br /&gt;
  DNS Servers . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  NetBIOS over Tcpip. . . . . . . . : Enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You will need the information shown in Physical Address (MAC address), IPv4 Address, and Subnet Mask.&lt;br /&gt;
&lt;br /&gt;
(2) Change the settings of the fiber card Network Adapter on your BCI2000 machine.&lt;br /&gt;
To change the MAC address you can use a tool like the [https://technitium.com/tmac/ Technitium MAC Address Changer]. Make sure that you are changing the correct Network connection!&lt;br /&gt;
&lt;br /&gt;
(3)Replace your current MAC address with the Physical Address obtained from the Pegasus/Cheetah System.&lt;br /&gt;
To change IP address and Subnet mask you can follow a tutorial like this one:[https://www.professionaltutorial.com/change-ip-address-in-windows-10/ Change IP Address (Start at step 3)  ].&lt;br /&gt;
&lt;br /&gt;
(4) Connect the BCI2000 computer to the Amplifier with an appropriate fiber cable. The BCI2000 machine should be connected via the free fiber-cable ethernet port on the amplifier. Make sure that you plugged the fiber cable into the free port on the amplifier and not the free fiber port on the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(5) Check if the data gets streamed to the BCI2000 computer. If you have configured everything correctly, data should now be streamed to your computer if the acquisition is started on the Pegasus/Cheetah System.&lt;br /&gt;
The easiest way to check this is to open the Task Manager (Ctrl+Shift+Esc) on the BCI2000 system. In the performance tab, you can monitor incoming and outgoing traffic on your network adapters. If you were successful, you should see a steady inflow of data on the ethernet port which connects your computer to the amplifier. If you are unsure, open the task manager on the Pegasus/Cheetah System, you should see the same type of data usage.&lt;br /&gt;
&lt;br /&gt;
(6) Start BCI2000 and enable UseDirectUDPStream for the Low-Latency stream.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
===Signal Properties===&lt;br /&gt;
Signal Properties describe Settings common to most Amplifiers.&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Samples per channel per digitized block. Together with the sampling rate, this parameter determines how often per second data is collected, processed, and feedback is updated.&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; Sampling rate of the data. The SamplingRate has to be an integer fraction of 32kHz.&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames:&#039;&#039;&#039; List of Names for Channels. Space-separated list; Must be the same length as Number of Channels. If set to auto, BCI2000 will query the Names from the Neuralynx system.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; Setting is not used in this module, default is 0&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used, default is 1&lt;br /&gt;
===NeuralynxNetCom===&lt;br /&gt;
This Section describes Settings Necessary to communicate with the Cheetah/Pegasus System via the NetCom Interface&lt;br /&gt;
* &#039;&#039;&#039;ServerName:&#039;&#039;&#039; IP Address of the NetCom server (Typically the IP of your Cheetah/Pegasus System)&lt;br /&gt;
&lt;br /&gt;
===NeuralynxUDPStream===&lt;br /&gt;
Settings if you want to use the Low Latency Stream. This requires a fiber-optic connection between the Amplifier and the BCI2000 computer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Boards:&#039;&#039;&#039; The Number of Boards which are connected in the Neuralynx Chassis&lt;br /&gt;
* &#039;&#039;&#039;SourceChnList:&#039;&#039;&#039; List of transmitted Channels. This allows you to only submit a subset of Channels. Its a list of channel ids (starting from 0). If set to auto, all channels will be transmitted.&lt;br /&gt;
* &#039;&#039;&#039;UseDirectUDPSTream:&#039;&#039;&#039; Easy way to switch the UDP stream on or off. This has to be enabled for low latency communication&lt;br /&gt;
* &#039;&#039;&#039;UDPStreamPort:&#039;&#039;&#039; Port through which the BCI2000 computer receives data from the Neuralynx System. This port is provided by Neuralynx.&lt;br /&gt;
* &#039;&#039;&#039;DecimationFactor:&#039;&#039;&#039; Decimation Factor for incoming Data. Incoming Data is sampled at 32kHz. If Decimation Factor is set, SamplingRate has to match or has to be set to auto. similarly, if SamplingRate is set, DecimationFactor can be set to auto and the system will determine the correct decimation factor automatically. Downsampling will be achieved by a simple moving average filter.&lt;br /&gt;
* &#039;&#039;&#039;NRDStreamingFile:&#039;&#039;&#039; Leave Empty. This can be used to stream data from a Neuralynx NRD file for debugging purposes. &lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8511</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8511"/>
		<updated>2020-07-15T17:28:56Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz if you use all 512 Channels.&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: 6082&lt;br /&gt;
*Known to compile under: 6082&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Hardware Configuration==&lt;br /&gt;
This Acquisition module has two ways to stream data from a Pegasus/Cheetah System.&lt;br /&gt;
===Acquisition via the NetCom Interface===&lt;br /&gt;
To acquire data via the NetCom interface the experimental Computer (Running BCI2000) has to be connected to the Pegasus/Cheetah System (Running the Acquisition Software) via Ethernet.&lt;br /&gt;
&lt;br /&gt;
(1) Make sure that both computers are on the same subnet and that the Acquisition Software is running on the Pegasus/Cheetah System (You don&#039;t need to start an acquisition or recording).&amp;lt;br&amp;gt;&lt;br /&gt;
(2) Configure BCI2000 with the correct IP address (ServerName). Be aware that the Pegasus/Cheetah System has multiple Network ports!&amp;lt;br&amp;gt;&lt;br /&gt;
(3) After pressing Set Config in BCI2000 it should seamlessly connect to the Pegasus/Cheetah System. BCI2000 will automatically start data acquisition. &amp;lt;br&amp;gt;&lt;br /&gt;
You can check if BCI2000 has connected correctly by opening the Acquisition System Status on the Pegasus/Cheetah System. In this window you should see a field called NetCom Clients. If BCI2000 is connected, it should be listed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Netcominterface.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Acquisition via low-latency connection===&lt;br /&gt;
The low-latency stream allows us to tap directly into the data streamed from the ADC without the Pegasus/Cheetah System. This approach significantly reduces latency and increases the stability of the timebase.&lt;br /&gt;
While data is streamed directly from the amplifier, configuration still requires the Pegasus/Cheetah System and connection via the NetCom interface. You can follow the steps above to ensure that you are able to connect to the NetCom Interface.&lt;br /&gt;
&lt;br /&gt;
The low-latency stream requires direct connection to the amplifier via a fiber optic ethernet connection. Therefore, the BCI2000 computer requires an optical ethernet interface. &lt;br /&gt;
The optical ethernet card has to be configured identical to the card installed in the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(1) Obtain the IP address, subnet mask as well as the MAC address. &lt;br /&gt;
To get this information open a command window on the Pegasus/Cheetah System (To find the command prompt type cmd in the Windows 10 search bar).&lt;br /&gt;
Type &amp;lt;code&amp;gt;ipconfig -all&amp;lt;/code&amp;gt; which will give you information of all Network adapters.&lt;br /&gt;
You will need to find the physical port that connects the amplifier with the Pegasus/Cheetah System. A good way to ensure that you chose the correct adapter is to turn of the amplifier and check which adapter changed.&lt;br /&gt;
Your result might look different than the example below.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Ethernet adapter Ethernet:&lt;br /&gt;
  Connection-specific DNS Suffix  . :&lt;br /&gt;
  Description . . . . . . . . . . . : Intel(R) Ethernet Server Adapter I350-F2&lt;br /&gt;
  Physical Address. . . . . . . . . : 48-2A-E3-40-45-DB&lt;br /&gt;
  Link-local IPv6 Address . . . . . : fe80::cc21:7e8e:f65a:158e%11&lt;br /&gt;
  IPv4 Address. . . . . . . . . . . : 172.20.2.144&lt;br /&gt;
  Subnet Mask . . . . . . . . . . . : 255.255.0.0&lt;br /&gt;
  Lease Obtained. . . . . . . . . . : Wednesday, July 15, 2020 8:25:32 AM&lt;br /&gt;
  Lease Expires . . . . . . . . . . : Thursday, July 16, 2020 8:25:25 AM&lt;br /&gt;
  Default Gateway . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCP Server . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  DHCPv6 IAID . . . . . . . . . . . : 105392867&lt;br /&gt;
  DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-24-67-EF-14-48-2A-E3-40-45-DB&lt;br /&gt;
  DNS Servers . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
  NetBIOS over Tcpip. . . . . . . . : Enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You will need the information shown in Physical Address (MAC address), IPv4 Address, and Subnet Mask.&lt;br /&gt;
&lt;br /&gt;
(2) Change the settings of the fiber card Network Adapter on your BCI2000 machine.&lt;br /&gt;
To change the MAC address you can use a tool like the [https://technitium.com/tmac/ Technitium MAC Address Changer]. Make sure that you are changing the correct Network connection!&lt;br /&gt;
&lt;br /&gt;
(3)Replace your current MAC address with the Physical Address obtained from the Pegasus/Cheetah System.&lt;br /&gt;
To change IP address and Subnet mask you can follow a tutorial like this one:[Change IP Address (Start at step 3)  https://www.professionaltutorial.com/change-ip-address-in-windows-10/].&lt;br /&gt;
&lt;br /&gt;
(4) Connect the BCI2000 computer to the Amplifier with an appropriate fiber cable. The BCI2000 machine should be connected via the free fiber-cable ethernet port on the amplifier. Make sure that you plugged the fiber cable into the free port on the amplifier and not the free fiber port on the Pegasus/Cheetah System.&lt;br /&gt;
&lt;br /&gt;
(5) Check if the data gets streamed to the BCI2000 computer. If you have configured everything correctly, data should now be streamed to your computer if the acquisition is started on the Pegasus/Cheetah System.&lt;br /&gt;
The easiest way to check this is to open the Task Manager (Ctrl+Shift+Esc) on the BCI2000 system. In the performance tab, you can monitor incoming and outgoing traffic on your network adapters. If you were successful, you should see a steady inflow of data on the ethernet port which connects your computer to the amplifier. If you are unsure, open the task manager on the Pegasus/Cheetah System, you should see the same type of data usage.&lt;br /&gt;
&lt;br /&gt;
(6) Start BCI2000 and enable UseDirectUDPStream for the Low-Latency stream.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
===Signal Properties===&lt;br /&gt;
Signal Properties describe Settings common to most Amplifiers.&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Samples per channel per digitized block. Together with the sampling rate, this parameter determines how often per second data is collected, processed, and feedback is updated.&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; Sampling rate of the data. The SamplingRate has to be an integer fraction of 32kHz.&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames:&#039;&#039;&#039; List of Names for Channels. Space-separated list; Must be the same length as Number of Channels. If set to auto, BCI2000 will query the Names from the Neuralynx system.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; Setting is not used in this module, default is 0&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used, default is 1&lt;br /&gt;
===NeuralynxNetCom===&lt;br /&gt;
This Section describes Settings Necessary to communicate with the Cheetah/Pegasus System via the NetCom Interface&lt;br /&gt;
* &#039;&#039;&#039;ServerName:&#039;&#039;&#039; IP Address of the NetCom server (Typically the IP of your Cheetah/Pegasus System)&lt;br /&gt;
&lt;br /&gt;
===NeuralynxUDPStream===&lt;br /&gt;
Settings if you want to use the Low Latency Stream. This requires a fiber-optic connection between the Amplifier and the BCI2000 computer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Boards:&#039;&#039;&#039; The Number of Boards which are connected in the Neuralynx Chassis&lt;br /&gt;
* &#039;&#039;&#039;SourceChnList:&#039;&#039;&#039; List of transmitted Channels. This allows you to only submit a subset of Channels. Its a list of channel ids (starting from 0). If set to auto, all channels will be transmitted.&lt;br /&gt;
* &#039;&#039;&#039;UseDirectUDPSTream:&#039;&#039;&#039; Easy way to switch the UDP stream on or off. This has to be enabled for low latency communication&lt;br /&gt;
* &#039;&#039;&#039;UDPStreamPort:&#039;&#039;&#039; Port through which the BCI2000 computer receives data from the Neuralynx System. This port is provided by Neuralynx.&lt;br /&gt;
* &#039;&#039;&#039;DecimationFactor:&#039;&#039;&#039; Decimation Factor for incoming Data. Incoming Data is sampled at 32kHz. If Decimation Factor is set, SamplingRate has to match or has to be set to auto. similarly, if SamplingRate is set, DecimationFactor can be set to auto and the system will determine the correct decimation factor automatically. Downsampling will be achieved by a simple moving average filter.&lt;br /&gt;
* &#039;&#039;&#039;NRDStreamingFile:&#039;&#039;&#039; Leave Empty. This can be used to stream data from a Neuralynx NRD file for debugging purposes. &lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8510</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8510"/>
		<updated>2020-07-15T17:08:56Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Functional Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz if you use all 512 Channels.&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: 6082&lt;br /&gt;
*Known to compile under: 6082&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Hardware Configuration==&lt;br /&gt;
This Acquisition module has two ways to stream data from a Pegasus/Cheetah System.&lt;br /&gt;
===Acquisition via the NetCom Interface===&lt;br /&gt;
To acquire data via the NetCom interface the experimental Computer (Running BCI2000) has to be connected to the Pegasus/Cheetah System (Running the Acquisition Software) via Ethernet.&lt;br /&gt;
&lt;br /&gt;
(1) Make sure that both computers are on the same subnet and that the Acquisition Software is running on the Pegasus/Cheetah System (You don&#039;t need to start an acquisition or recording).&amp;lt;br&amp;gt;&lt;br /&gt;
(2) Configure BCI2000 with the correct IP address (ServerName). Be aware that the Pegasus/Cheetah System has multiple Network ports!&amp;lt;br&amp;gt;&lt;br /&gt;
(3) After pressing Set Config in BCI2000 it should seamlessly connect to the Pegasus/Cheetah System. BCI2000 will automatically start data acquisition. &amp;lt;br&amp;gt;&lt;br /&gt;
You can check if BCI2000 has connected correctly by opening the Acquisition System Status on the Pegasus/Cheetah System. In this window you should see a field called NetCom Clients. If BCI2000 is connected, it should be listed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Netcominterface.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Acquisition via low-latency connection===&lt;br /&gt;
The low-latency stream allows us to tap directly into the data streamed from the ADC without the Pegasus/Cheetah System. This approach significantly reduces latency and increases the stability of the timebase.&lt;br /&gt;
While data is streamed directly from the amplifier, configuration still requires the Pegasus/Cheetah System and connection via the NetCom interface. You can follow the steps above to ensure that you are able to connect to the NetCom Interface.&lt;br /&gt;
&lt;br /&gt;
The low-latency stream requires direct connection to the amplifier via a fiber optic ethernet connection. Therefore, the BCI2000 computer requires an optical ethernet interface. &lt;br /&gt;
The optical ethernet card has to be configured identical to the card installed in the Pegasus/Cheetah System.&lt;br /&gt;
(1) Obtain the IP address, subnet mask as well as the MAC address. &lt;br /&gt;
To get this information open a command window on the Pegasus/Cheetah System (To find the command prompt type cmd in the Windows 10 search bar).&lt;br /&gt;
Type &amp;lt;code&amp;gt;ipconfig -all&amp;lt;/code&amp;gt; which will give you information of all Network adapters.&lt;br /&gt;
You will need to find the physical port that connects the amplifier with the Pegasus/Cheetah System. A good way to ensure that you chose the correct adapter is to turn of the amplifier and check which adapter changed.&lt;br /&gt;
Your result might look different than the example below. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Ethernet adapter Ethernet:&lt;br /&gt;
&lt;br /&gt;
   Connection-specific DNS Suffix  . :&lt;br /&gt;
   Description . . . . . . . . . . . : Intel(R) Ethernet Server Adapter I350-F2&lt;br /&gt;
   Physical Address. . . . . . . . . : 48-2A-E3-40-45-DB&lt;br /&gt;
   Link-local IPv6 Address . . . . . : fe80::cc21:7e8e:f65a:158e%11&lt;br /&gt;
   IPv4 Address. . . . . . . . . . . : 172.20.2.144&lt;br /&gt;
   Subnet Mask . . . . . . . . . . . : 255.255.0.0&lt;br /&gt;
   Lease Obtained. . . . . . . . . . : Wednesday, July 15, 2020 8:25:32 AM&lt;br /&gt;
   Lease Expires . . . . . . . . . . : Thursday, July 16, 2020 8:25:25 AM&lt;br /&gt;
   Default Gateway . . . . . . . . . : 172.20.1.1&lt;br /&gt;
   DHCP Server . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
   DHCPv6 IAID . . . . . . . . . . . : 105392867&lt;br /&gt;
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-24-67-EF-14-48-2A-E3-40-45-DB&lt;br /&gt;
   DNS Servers . . . . . . . . . . . : 172.20.1.1&lt;br /&gt;
   NetBIOS over Tcpip. . . . . . . . : Enabled&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will need the information shown in Physical Address (MAC address), IPv4 Address and Subnet Mask.&lt;br /&gt;
(2) Change the settings of the fiber card Network Adapter on your BCI2000 machine.&lt;br /&gt;
To change the MAC address you can use a tool like the [https://technitium.com/tmac/ Technitium MAC Address Changer]. Make sure that you are changing the correct Network connection!&lt;br /&gt;
(3)Replace your current MAC address with the Physical Address obtained from the Pegasus/Cheetah System.&lt;br /&gt;
To change IP address and Subnet mask you can follow a tutorial like this one:[Change IP Address (Start at step 3)  https://www.professionaltutorial.com/change-ip-address-in-windows-10/].&lt;br /&gt;
(4) Connect the BCI2000 computer to the Amplifier with an appropriate fiber cable. The BCI2000 machine should be connected via the free fiber-cable ethernet port on the amplifier. Make sure that you plugged the fiber cable into the free port on the amplifier and not the free fiber port on the Pegasus/Cheetah System.&lt;br /&gt;
(5) Check if the data gets streamed to the BCI2000 computer. If you have configured everything correctly, data should now be streamed to your computer if the acquisition is started on the Pegasus/Cheetah System.&lt;br /&gt;
The easiest way to check this is to open the Task Manager (Ctrl+Shift+Esc) on the BCI2000 system. In the performance tab, you can monitor incoming and outgoing traffic on your network adapters. If you were successful, you should see a steady inflow of data on the ethernet port which connects your computer to the amplifier. If you are unsure, open the task manager on the Pegasus/Cheetah System, you should see the same type of data usage.&lt;br /&gt;
(6) Start BCI2000 and enable UseDirectUDPStream for the Low-Latency stream.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
===Signal Properties===&lt;br /&gt;
Signal Properties describe Settings common to most Amplifiers.&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Samples per channel per digitized block. Together with the sampling rate, this parameter determines how often per second data is collected, processed, and feedback is updated.&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; Sampling rate of the data. The SamplingRate has to be an integer fraction of 32kHz.&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames:&#039;&#039;&#039; List of Names for Channels. Space-separated list; Must be the same length as Number of Channels. If set to auto, BCI2000 will query the Names from the Neuralynx system.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; Setting is not used in this module, default is 0&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used, default is 1&lt;br /&gt;
===NeuralynxNetCom===&lt;br /&gt;
This Section describes Settings Necessary to communicate with the Cheetah/Pegasus System via the NetCom Interface&lt;br /&gt;
* &#039;&#039;&#039;ServerName:&#039;&#039;&#039; IP Address of the NetCom server (Typically the IP of your Cheetah/Pegasus System)&lt;br /&gt;
&lt;br /&gt;
===NeuralynxUDPStream===&lt;br /&gt;
Settings if you want to use the Low Latency Stream. This requires a fiber-optic connection between the Amplifier and the BCI2000 computer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Boards:&#039;&#039;&#039; The Number of Boards which are connected in the Neuralynx Chassis&lt;br /&gt;
* &#039;&#039;&#039;SourceChnList:&#039;&#039;&#039; List of transmitted Channels. This allows you to only submit a subset of Channels. Its a list of channel ids (starting from 0). If set to auto, all channels will be transmitted.&lt;br /&gt;
* &#039;&#039;&#039;UseDirectUDPSTream:&#039;&#039;&#039; Easy way to switch the UDP stream on or off. This has to be enabled for low latency communication&lt;br /&gt;
* &#039;&#039;&#039;UDPStreamPort:&#039;&#039;&#039; Port through which the BCI2000 computer receives data from the Neuralynx System. This port is provided by Neuralynx.&lt;br /&gt;
* &#039;&#039;&#039;DecimationFactor:&#039;&#039;&#039; Decimation Factor for incoming Data. Incoming Data is sampled at 32kHz. If Decimation Factor is set, SamplingRate has to match or has to be set to auto. similarly, if SamplingRate is set, DecimationFactor can be set to auto and the system will determine the correct decimation factor automatically. Downsampling will be achieved by a simple moving average filter.&lt;br /&gt;
* &#039;&#039;&#039;NRDStreamingFile:&#039;&#039;&#039; Leave Empty. This can be used to stream data from a Neuralynx NRD file for debugging purposes. &lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=File:Netcominterface.png&amp;diff=8509</id>
		<title>File:Netcominterface.png</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=File:Netcominterface.png&amp;diff=8509"/>
		<updated>2020-07-15T16:15:25Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: Shows BCI2000 successfully connected to A Pegasus/Cheetah Client&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Shows BCI2000 successfully connected to A Pegasus/Cheetah Client&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8508</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8508"/>
		<updated>2020-07-15T15:59:20Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Source Code Revisions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz if you use all 512 Channels.&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: 6082&lt;br /&gt;
*Known to compile under: 6082&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Functional Description==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
===Signal Properties===&lt;br /&gt;
Signal Properties describe Settings common to most Amplifiers.&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Samples per channel per digitized block. Together with the sampling rate, this parameter determines how often per second data is collected, processed, and feedback is updated.&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; Sampling rate of the data. The SamplingRate has to be an integer fraction of 32kHz.&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames:&#039;&#039;&#039; List of Names for Channels. Space-separated list; Must be the same length as Number of Channels. If set to auto, BCI2000 will query the Names from the Neuralynx system.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; Setting is not used in this module, default is 0&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used, default is 1&lt;br /&gt;
===NeuralynxNetCom===&lt;br /&gt;
This Section describes Settings Necessary to communicate with the Cheetah/Pegasus System via the NetCom Interface&lt;br /&gt;
* &#039;&#039;&#039;ServerName:&#039;&#039;&#039; IP Address of the NetCom server (Typically the IP of your Cheetah/Pegasus System)&lt;br /&gt;
&lt;br /&gt;
===NeuralynxUDPStream===&lt;br /&gt;
Settings if you want to use the Low Latency Stream. This requires a fiber-optic connection between the Amplifier and the BCI2000 computer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Boards:&#039;&#039;&#039; The Number of Boards which are connected in the Neuralynx Chassis&lt;br /&gt;
* &#039;&#039;&#039;SourceChnList:&#039;&#039;&#039; List of transmitted Channels. This allows you to only submit a subset of Channels. Its a list of channel ids (starting from 0). If set to auto, all channels will be transmitted.&lt;br /&gt;
* &#039;&#039;&#039;UseDirectUDPSTream:&#039;&#039;&#039; Easy way to switch the UDP stream on or off. This has to be enabled for low latency communication&lt;br /&gt;
* &#039;&#039;&#039;UDPStreamPort:&#039;&#039;&#039; Port through which the BCI2000 computer receives data from the Neuralynx System. This port is provided by Neuralynx.&lt;br /&gt;
* &#039;&#039;&#039;DecimationFactor:&#039;&#039;&#039; Decimation Factor for incoming Data. Incoming Data is sampled at 32kHz. If Decimation Factor is set, SamplingRate has to match or has to be set to auto. similarly, if SamplingRate is set, DecimationFactor can be set to auto and the system will determine the correct decimation factor automatically. Downsampling will be achieved by a simple moving average filter.&lt;br /&gt;
* &#039;&#039;&#039;NRDStreamingFile:&#039;&#039;&#039; Leave Empty. This can be used to stream data from a Neuralynx NRD file for debugging purposes. &lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8507</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8507"/>
		<updated>2020-07-15T15:58:33Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: /* Known Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz if you use all 512 Channels.&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: --&lt;br /&gt;
*Known to compile under: 6024&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Functional Description==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
===Signal Properties===&lt;br /&gt;
Signal Properties describe Settings common to most Amplifiers.&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Samples per channel per digitized block. Together with the sampling rate, this parameter determines how often per second data is collected, processed, and feedback is updated.&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; Sampling rate of the data. The SamplingRate has to be an integer fraction of 32kHz.&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames:&#039;&#039;&#039; List of Names for Channels. Space-separated list; Must be the same length as Number of Channels. If set to auto, BCI2000 will query the Names from the Neuralynx system.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; Setting is not used in this module, default is 0&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used, default is 1&lt;br /&gt;
===NeuralynxNetCom===&lt;br /&gt;
This Section describes Settings Necessary to communicate with the Cheetah/Pegasus System via the NetCom Interface&lt;br /&gt;
* &#039;&#039;&#039;ServerName:&#039;&#039;&#039; IP Address of the NetCom server (Typically the IP of your Cheetah/Pegasus System)&lt;br /&gt;
&lt;br /&gt;
===NeuralynxUDPStream===&lt;br /&gt;
Settings if you want to use the Low Latency Stream. This requires a fiber-optic connection between the Amplifier and the BCI2000 computer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Boards:&#039;&#039;&#039; The Number of Boards which are connected in the Neuralynx Chassis&lt;br /&gt;
* &#039;&#039;&#039;SourceChnList:&#039;&#039;&#039; List of transmitted Channels. This allows you to only submit a subset of Channels. Its a list of channel ids (starting from 0). If set to auto, all channels will be transmitted.&lt;br /&gt;
* &#039;&#039;&#039;UseDirectUDPSTream:&#039;&#039;&#039; Easy way to switch the UDP stream on or off. This has to be enabled for low latency communication&lt;br /&gt;
* &#039;&#039;&#039;UDPStreamPort:&#039;&#039;&#039; Port through which the BCI2000 computer receives data from the Neuralynx System. This port is provided by Neuralynx.&lt;br /&gt;
* &#039;&#039;&#039;DecimationFactor:&#039;&#039;&#039; Decimation Factor for incoming Data. Incoming Data is sampled at 32kHz. If Decimation Factor is set, SamplingRate has to match or has to be set to auto. similarly, if SamplingRate is set, DecimationFactor can be set to auto and the system will determine the correct decimation factor automatically. Downsampling will be achieved by a simple moving average filter.&lt;br /&gt;
* &#039;&#039;&#039;NRDStreamingFile:&#039;&#039;&#039; Leave Empty. This can be used to stream data from a Neuralynx NRD file for debugging purposes. &lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8506</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8506"/>
		<updated>2020-07-15T15:56:45Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz!&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: --&lt;br /&gt;
*Known to compile under: 6024&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Functional Description==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
===Signal Properties===&lt;br /&gt;
Signal Properties describe Settings common to most Amplifiers.&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Samples per channel per digitized block. Together with the sampling rate, this parameter determines how often per second data is collected, processed, and feedback is updated.&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; Sampling rate of the data. The SamplingRate has to be an integer fraction of 32kHz.&lt;br /&gt;
* &#039;&#039;&#039;ChannelNames:&#039;&#039;&#039; List of Names for Channels. Space-separated list; Must be the same length as Number of Channels. If set to auto, BCI2000 will query the Names from the Neuralynx system.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; Setting is not used in this module, default is 0&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used, default is 1&lt;br /&gt;
===NeuralynxNetCom===&lt;br /&gt;
This Section describes Settings Necessary to communicate with the Cheetah/Pegasus System via the NetCom Interface&lt;br /&gt;
* &#039;&#039;&#039;ServerName:&#039;&#039;&#039; IP Address of the NetCom server (Typically the IP of your Cheetah/Pegasus System)&lt;br /&gt;
&lt;br /&gt;
===NeuralynxUDPStream===&lt;br /&gt;
Settings if you want to use the Low Latency Stream. This requires a fiber-optic connection between the Amplifier and the BCI2000 computer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Boards:&#039;&#039;&#039; The Number of Boards which are connected in the Neuralynx Chassis&lt;br /&gt;
* &#039;&#039;&#039;SourceChnList:&#039;&#039;&#039; List of transmitted Channels. This allows you to only submit a subset of Channels. Its a list of channel ids (starting from 0). If set to auto, all channels will be transmitted.&lt;br /&gt;
* &#039;&#039;&#039;UseDirectUDPSTream:&#039;&#039;&#039; Easy way to switch the UDP stream on or off. This has to be enabled for low latency communication&lt;br /&gt;
* &#039;&#039;&#039;UDPStreamPort:&#039;&#039;&#039; Port through which the BCI2000 computer receives data from the Neuralynx System. This port is provided by Neuralynx.&lt;br /&gt;
* &#039;&#039;&#039;DecimationFactor:&#039;&#039;&#039; Decimation Factor for incoming Data. Incoming Data is sampled at 32kHz. If Decimation Factor is set, SamplingRate has to match or has to be set to auto. similarly, if SamplingRate is set, DecimationFactor can be set to auto and the system will determine the correct decimation factor automatically. Downsampling will be achieved by a simple moving average filter.&lt;br /&gt;
* &#039;&#039;&#039;NRDStreamingFile:&#039;&#039;&#039; Leave Empty. This can be used to stream data from a Neuralynx NRD file for debugging purposes. &lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8468</id>
		<title>Contributions:NeuralynxADC</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:NeuralynxADC&amp;diff=8468"/>
		<updated>2019-11-11T19:59:32Z</updated>

		<summary type="html">&lt;p&gt;Madamek2: Created page with &amp;quot;==Synopsis== The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt; The module is able to record data with two...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
The NeuralynxNetComADC allows data acquisition from [https://neuralynx.com/ Neuralynx] Cheetah or Pegasus system. &amp;lt;br&amp;gt;&lt;br /&gt;
The module is able to record data with two different modes:&amp;lt;br&amp;gt;&lt;br /&gt;
(1) Acquisition via the NetCom interface, which connects to Cheetah/Pegasus. &amp;lt;br&amp;gt;&lt;br /&gt;
(2) Low-latency data acquisition via a fiber cable directly connected to the Acquisition amplifier.&amp;lt;br&amp;gt;&lt;br /&gt;
===Known Issues===&lt;br /&gt;
BCI2000 will not be able to keep up for high sampling rates &amp;amp; channel counts. This will result in a high roundtrip time and increasing memory usage over time, as incoming data is buffered but not processed in time. &lt;br /&gt;
If the low latency data acquisition is used, make sure to downsample data from 32kHz!&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
&lt;br /&gt;
===Authors===&lt;br /&gt;
&lt;br /&gt;
Markus Adamek&lt;br /&gt;
&lt;br /&gt;
===Version History===&lt;br /&gt;
&lt;br /&gt;
===Source Code Revisions===&lt;br /&gt;
*Initial development: 6024&lt;br /&gt;
*Tested under: --&lt;br /&gt;
*Known to compile under: 6024&lt;br /&gt;
*Broken since: --&lt;br /&gt;
&lt;br /&gt;
==Functional Description==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
* &#039;&#039;&#039;SourceCh:&#039;&#039;&#039; The number of channels that the Neuralynx software reads (including the events channel if EventCh is on).&lt;br /&gt;
* &#039;&#039;&#039;SamplingRate:&#039;&#039;&#039; This is the sampling rate of the Neuralynx software after subsampling. Use the value (with the decimals) as it appears in the Acquisition Entities panel of Neuralynx under the Sample Frequency entry when only one channel is selected.&lt;br /&gt;
* &#039;&#039;&#039;SourceChOffset:&#039;&#039;&#039; This is not used in the module.  Set it to 0 to be safe.&lt;br /&gt;
* &#039;&#039;&#039;SourceChGain:&#039;&#039;&#039; This is also not used. Set it to 1.&lt;br /&gt;
* &#039;&#039;&#039;SampleBlockSize:&#039;&#039;&#039; Neuralynx has a set packet of data acquisition of 512 points. Although the module will work with other values it is good to keep this parameter as a multiple of 512. This will provide a much more constant block time. &lt;br /&gt;
* &#039;&#039;&#039;EventCh:&#039;&#039;&#039; A boolean parameter allowing the capture of the events channel of the Neuralynx software as an extra channel into the BCI2000 data stream. If this is set to yes then another channel must be added to the SourceCh, the ChannelNames, SourceChOffset and SourceChGain Parameters.&lt;br /&gt;
&lt;br /&gt;
==States==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[User Reference:Filters]], [[Contributions:ADCs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributions]][[Category:Data Acquisition]]&lt;/div&gt;</summary>
		<author><name>Madamek2</name></author>
	</entry>
</feed>