Skip to content

Commit

Permalink
Merge remote-tracking branch 'openbci/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrey1994 committed Dec 17, 2019
2 parents f962df0 + d8e2fd2 commit cd42c9b
Show file tree
Hide file tree
Showing 10 changed files with 258 additions and 313 deletions.
5 changes: 0 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -225,14 +225,12 @@ if (MSVC)
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/$<CONFIG>/${BOARD_CONTROLLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/python-package/brainflow/lib/${BOARD_CONTROLLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/$<CONFIG>/${BOARD_CONTROLLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/java-package/brainflow/src/main/resources/${BOARD_CONTROLLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/$<CONFIG>/${BOARD_CONTROLLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/csharp-package/brainflow/brainflow/lib/${BOARD_CONTROLLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/$<CONFIG>/${BOARD_CONTROLLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/python-package/brainflow/lib/${BOARD_CONTROLLER_COMPILED_NAME}"
)
add_custom_command (TARGET ${DATA_HANDLER_NAME} POST_BUILD
# copy data handler libs
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/$<CONFIG>/${DATA_HANDLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/python-package/brainflow/lib/${DATA_HANDLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/$<CONFIG>/${DATA_HANDLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/java-package/brainflow/src/main/resources/${DATA_HANDLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/$<CONFIG>/${DATA_HANDLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/csharp-package/brainflow/brainflow/lib/${DATA_HANDLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/$<CONFIG>/${DATA_HANDLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/python-package/brainflow/lib/${DATA_HANDLER_COMPILED_NAME}"
)
endif (MSVC)
if (UNIX)
Expand All @@ -241,14 +239,12 @@ if (UNIX)
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/${BOARD_CONTROLLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/python-package/brainflow/lib/${BOARD_CONTROLLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/${BOARD_CONTROLLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/java-package/brainflow/src/main/resources/${BOARD_CONTROLLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/${BOARD_CONTROLLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/csharp-package/brainflow/brainflow/${BOARD_CONTROLLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/${BOARD_CONTROLLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/python-package/brainflow/lib/${BOARD_CONTROLLER_COMPILED_NAME}"
)
add_custom_command (TARGET ${DATA_HANDLER_NAME} POST_BUILD
# copy data handler libs
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/${DATA_HANDLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/python-package/brainflow/lib/${DATA_HANDLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/${DATA_HANDLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/java-package/brainflow/src/main/resources/${DATA_HANDLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/${DATA_HANDLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/csharp-package/brainflow/brainflow/${DATA_HANDLER_COMPILED_NAME}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/compiled/${DATA_HANDLER_COMPILED_NAME}" "${CMAKE_HOME_DIRECTORY}/python-package/brainflow/lib/${DATA_HANDLER_COMPILED_NAME}"
)
endif (UNIX)

Expand All @@ -257,7 +253,6 @@ add_custom_command (TARGET ${BOARD_CONTROLLER_NAME} POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/${BOARDS_JSON}" "${CMAKE_HOME_DIRECTORY}/python-package/brainflow/lib/${BOARDS_JSON}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/${BOARDS_JSON}" "${CMAKE_HOME_DIRECTORY}/java-package/brainflow/src/main/resources/${BOARDS_JSON}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/${BOARDS_JSON}" "${CMAKE_HOME_DIRECTORY}/csharp-package/brainflow/brainflow/lib/${BOARDS_JSON}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_HOME_DIRECTORY}/${BOARDS_JSON}" "${CMAKE_HOME_DIRECTORY}/python-package/brainflow/lib/${BOARDS_JSON}"
)

# install
Expand Down
9 changes: 5 additions & 4 deletions docs/BuildBrainFlow.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ Python

If you want to install it from source files or build unreleased version from github you should compile core module first and run ::

cd python-package
python -m pip install -e .
cd python-package
python -m pip install -e .

C#
----
Expand Down Expand Up @@ -54,8 +54,9 @@ You are able to download jar files directly from `release page <https://github.c

If you want to install it from source files or build unreleased version from github you should compile core module first and run ::

cd java-package
mvn package
cd java-package
cd brainflow
mvn package


Compilation of Core module and C++ binding
Expand Down
4 changes: 1 addition & 3 deletions docs/DataFormatDesc.rst
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,12 @@ Special channels for Cyton Based boards
For analog data we return int32 values but from low level API we return double array so these values are casted to double wo any changes.

**If Cyton End Byte is between 0xC2 and 0xC6 we add raw unprocessed bytes to the second and next channels returned by:**
**Also we add raw unprocessed bytes to the second and next channels returned by:**

.. code-block:: python
get_other_channels (board_id)
For such data we return unprocessed raw bytes you should cast them to integers or floats.

If Cyton End Byte is outside `this range <https://docs.openbci.com/docs/02Cyton/CytonDataFormat#firmware-version-200-fall-2016-to-now-1>`_ we drop entire package.

**Check this example for details:**
Expand Down
38 changes: 17 additions & 21 deletions src/board_controller/openbci/cyton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ void Cyton::read_thread ()
safe_logger (spdlog::level::debug, "unable to read 32 bytes");
continue;
}
if ((b[31] < END_BYTE_STANDARD) || (b[31] > END_BYTE_MAX))
{
safe_logger (spdlog::level::warn, "Wrong end byte {}", b[31]);
continue;
}

double package[22] = {0.};
// package num
Expand All @@ -56,37 +61,28 @@ void Cyton::read_thread ()
package[i + 1] = eeg_scale * cast_24bit_to_int32 (b + 1 + 3 * i);
}
// end byte
package[12] = (double)b[res - 1];
// check end byte
if (b[res - 1] == END_BYTE_STANDARD)
package[12] = (double)b[31];
// place unprocessed bytes for all modes to other_channels
package[13] = (double)b[25];
package[14] = (double)b[26];
package[15] = (double)b[27];
package[16] = (double)b[28];
package[17] = (double)b[29];
package[18] = (double)b[30];
// place processed bytes for accel
if (b[31] == END_BYTE_STANDARD)
{
// accel
package[9] = accel_scale * cast_16bit_to_int32 (b + 25);
package[10] = accel_scale * cast_16bit_to_int32 (b + 27);
package[11] = accel_scale * cast_16bit_to_int32 (b + 29);
}
else if (b[res - 1] == END_BYTE_ANALOG)
// place processed bytes for analog
if (b[31] == END_BYTE_ANALOG)
{
// analog
package[19] = cast_16bit_to_int32 (b + 25);
package[20] = cast_16bit_to_int32 (b + 27);
package[21] = cast_16bit_to_int32 (b + 29);
}
else if ((b[res - 1] > END_BYTE_ANALOG) && (b[res - 1] <= END_BYTE_MAX))
{
// unprocessed bytes
package[13] = (double)b[25];
package[14] = (double)b[26];
package[15] = (double)b[27];
package[16] = (double)b[28];
package[17] = (double)b[29];
package[18] = (double)b[30];
}
else
{
safe_logger (spdlog::level::warn, "Wrong end byte, found {}", b[res - 1]);
continue;
}

double timestamp = get_timestamp ();
db->add_data (timestamp, package);
Expand Down
139 changes: 58 additions & 81 deletions src/board_controller/openbci/cyton_daisy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,133 +47,110 @@ void CytonDaisy::read_thread ()
res = serial->read_from_serial_port (b, 32);
if (res != 32)
{
safe_logger (spdlog::level::debug, "unable to read 32 bytes");
safe_logger (spdlog::level::debug, "unable to read 31 bytes");
continue;
}
if ((b[31] < END_BYTE_STANDARD) || (b[31] > END_BYTE_MAX))
{
safe_logger (spdlog::level::warn, "Wrong end byte {}", b[31]);
continue;
}

// place unprocessed bytes to other_channels for all modes
if ((b[0] % 2 == 0) && (first_sample))
{
// eeg
for (int i = 0; i < 8; i++)
{
package[i + 9] = eeg_scale * cast_24bit_to_int32 (b + 1 + 3 * i);
}
// need to average other_channels
package[21] += (double)b[25];
package[22] += (double)b[26];
package[23] += (double)b[27];
package[24] += (double)b[28];
package[25] += (double)b[29];
package[26] += (double)b[30];
package[21] /= 2.0;
package[22] /= 2.0;
package[23] /= 2.0;
package[24] /= 2.0;
package[25] /= 2.0;
package[26] /= 2.0;
package[20] = (double)b[31];
}
else
{
first_sample = true;
package[0] = (double)b[0];
// eeg
for (int i = 0; i < 8; i++)
{
package[i + 1] = eeg_scale * cast_24bit_to_int32 (b + 1 + 3 * i);
}
// other_channels
package[21] = (double)b[25];
package[22] = (double)b[26];
package[23] = (double)b[27];
package[24] = (double)b[28];
package[25] = (double)b[29];
package[26] = (double)b[30];
}

// check end byte
if (b[res - 1] == END_BYTE_STANDARD) // package has accel data
// place processed accel data
if (b[31] == END_BYTE_STANDARD)
{
if ((b[0] % 2 == 0) && (first_sample))
{
// eeg
for (int i = 0; i < 8; i++)
{
package[i + 9] = eeg_scale * cast_24bit_to_int32 (b + 1 + 3 * i);
}
// need to average accel data
package[17] += accel_scale * cast_16bit_to_int32 (b + 25);
package[18] += accel_scale * cast_16bit_to_int32 (b + 27);
package[19] += accel_scale * cast_16bit_to_int32 (b + 29);
package[17] /= 2.0f;
package[18] /= 2.0f;
package[19] /= 2.0f;
package[20] = (double)b[res - 1];
double timestamp = get_timestamp ();
db->add_data (timestamp, package);
streamer->stream_data (package, 30, timestamp);
package[20] = (double)b[31];
}
else
{
first_sample = true;
package[0] = (double)b[0];
// eeg
for (int i = 0; i < 8; i++)
{
package[i + 1] = eeg_scale * cast_24bit_to_int32 (b + 1 + 3 * i);
}
// accel
package[17] = accel_scale * cast_16bit_to_int32 (b + 25);
package[18] = accel_scale * cast_16bit_to_int32 (b + 27);
package[19] = accel_scale * cast_16bit_to_int32 (b + 29);
}
}
else if (b[res - 1] == END_BYTE_ANALOG) // package has analog data
// place processed analog data
if (b[31] == END_BYTE_ANALOG)
{
if ((b[0] % 2 == 0) && (first_sample))
{
// eeg
for (int i = 0; i < 8; i++)
{
package[i + 9] = eeg_scale * cast_24bit_to_int32 (b + 1 + 3 * i);
}
// need to average analog data
package[27] += cast_16bit_to_int32 (b + 25);
package[28] += cast_16bit_to_int32 (b + 27);
package[29] += cast_16bit_to_int32 (b + 29);
package[27] /= 2.0f;
package[28] /= 2.0f;
package[29] /= 2.0f;
package[20] = (double)b[res - 1]; // cyton end byte
double timestamp = get_timestamp ();
db->add_data (timestamp, package);
streamer->stream_data (package, 30, timestamp);
package[20] = (double)b[31]; // cyton end byte
}
else
{
first_sample = true;
package[0] = (double)b[0];
// eeg
for (int i = 0; i < 8; i++)
{
package[i + 1] = eeg_scale * cast_24bit_to_int32 (b + 1 + 3 * i);
}
// analog
package[27] = cast_16bit_to_int32 (b + 25);
package[28] = cast_16bit_to_int32 (b + 27);
package[29] = cast_16bit_to_int32 (b + 29);
}
}
else if ((b[res - 1] > END_BYTE_STANDARD) &&
(b[res - 1] <= END_BYTE_MAX)) // some data which we dont preprocess but add as raw
// commit package
if ((b[0] % 2 == 0) && (first_sample))
{
if ((b[0] % 2 == 0) && (first_sample))
{
// eeg
for (int i = 0; i < 8; i++)
{
package[i + 9] = eeg_scale * cast_24bit_to_int32 (b + 1 + 3 * i);
}
// need to average other data
package[21] += (double)b[25];
package[22] += (double)b[26];
package[23] += (double)b[27];
package[24] += (double)b[28];
package[25] += (double)b[29];
package[26] += (double)b[30];
package[21] /= 2.0;
package[22] /= 2.0;
package[23] /= 2.0;
package[24] /= 2.0;
package[25] /= 2.0;
package[26] /= 2.0;
package[20] = (double)b[res - 1];
double timestamp = get_timestamp ();
db->add_data (timestamp, package);
streamer->stream_data (package, 30, timestamp);
}
else
{
first_sample = true;
package[0] = (double)b[0];
// eeg
for (int i = 0; i < 8; i++)
{
package[i + 1] = eeg_scale * cast_24bit_to_int32 (b + 1 + 3 * i);
}
// other data
package[21] = (double)b[25];
package[22] = (double)b[26];
package[23] = (double)b[27];
package[24] = (double)b[28];
package[25] = (double)b[29];
package[26] = (double)b[30];
}
}
else
{
safe_logger (spdlog::level::warn, "Wrong end byte, found {}", b[res - 1]);
continue;
double timestamp = get_timestamp ();
db->add_data (timestamp, package);
streamer->stream_data (package, 30, timestamp);
}
}
}

0 comments on commit cd42c9b

Please sign in to comment.