diff --git a/.github/workflows/cppcheck.yml b/.github/workflows/cppcheck.yml index 3d47ec469..0b7850f5f 100644 --- a/.github/workflows/cppcheck.yml +++ b/.github/workflows/cppcheck.yml @@ -15,7 +15,7 @@ jobs: env: DEBIAN_FRONTEND: noninteractive - name: Run Cppcheck - run: cppcheck --std=c++11 -ithird_party/spdlog -ithird_party/libsvm -ithird_party/SimpleBLE -ithird_party/fmt -ithird_party/SimpleDBus -ithird_party/SimpleBluez -ithird_party/kissfft -isrc/utils/os_serial_ioctl.cpp --error-exitcode=1 --xml --xml-version=2 --force src cpp_package third_party 2>cppcheck_res.xml + run: cppcheck --std=c++11 -ithird_party/wavelib -ithird_party/spdlog -ithird_party/libsvm -ithird_party/SimpleBLE -ithird_party/fmt -ithird_party/SimpleDBus -ithird_party/SimpleBluez -ithird_party/kissfft -isrc/utils/os_serial_ioctl.cpp --error-exitcode=1 --xml --xml-version=2 --force src cpp_package third_party 2>cppcheck_res.xml - name: Generate Report if: ${{ failure() }} run: cppcheck-htmlreport --title=BrainFlow --file=cppcheck_res.xml --report-dir=report diff --git a/.github/workflows/run_android.yml b/.github/workflows/run_android.yml index 5e71369c8..5181196c0 100644 --- a/.github/workflows/run_android.yml +++ b/.github/workflows/run_android.yml @@ -64,7 +64,7 @@ jobs: cd $GITHUB_WORKSPACE/tools zip -r jniLibs.zip jniLibs - name: Install AWS CLI - run: sudo -H python3 -m pip install awscli==1.21.10 + run: sudo -H python3 -m pip install awscli==1.35.24 - name: Upload To AWS if: ${{ github.event_name == 'push' && github.repository == 'brainflow-dev/brainflow' }} run: | diff --git a/docs/SupportedBoards.rst b/docs/SupportedBoards.rst index 8ede7cbd6..1f188db83 100644 --- a/docs/SupportedBoards.rst +++ b/docs/SupportedBoards.rst @@ -1026,12 +1026,14 @@ Ant Neuro has many devices and all of them are supported by BrainFlow: - :code:`ANT_NEURO_EE_225_BOARD` - :code:`ANT_NEURO_EE_511_BOARD` -Initialization Example: +Initialization example: .. code-block:: python params = BrainFlowInputParams() - board = BoardShim(BoardIds.ANT_NEURO_EE_410_BOARD, params) + board = BoardShim(BoardIds.ANT_NEURO_EE_410_BOARD, params) # 8 channel amplifier + +`More elaborate example `_ (reading EEG and impedances) Supported platforms: @@ -1040,7 +1042,10 @@ Supported platforms: Available commands: +- Set impedance mode: :code:`board.config_board("impedance_mode:1")`, mode 0 or 1. - Set sampling rate: :code:`board.config_board("sampling_rate:500")`, for available values check docs from Ant Neuro. +- Set reference range: :code:`board.config_board("reference_range:1.0")`, for available values check docs from Ant Neuro. +- Set bipolar range: :code:`board.config_board("bipolar_range:2.5")`, for available values check docs from Ant Neuro. For more information about Ant Neuro boards please refer to their User Manual. diff --git a/python_package/examples/tests/eego_impedances_and_eeg.py b/python_package/examples/tests/eego_impedances_and_eeg.py new file mode 100644 index 000000000..fd921fa0b --- /dev/null +++ b/python_package/examples/tests/eego_impedances_and_eeg.py @@ -0,0 +1,29 @@ +import time + +from brainflow.board_shim import BoardShim, BrainFlowInputParams, BoardIds + +if __name__ == '__main__': + params = BrainFlowInputParams() + board = BoardShim(BoardIds.ANT_NEURO_EE_411_BOARD, params) # 8 channel amplifier + board.prepare_session() + + # Get impedance data + board.config_board('impedance_mode:1') + board.start_stream() + for i in range(5): + time.sleep(1) + data = board.get_board_data() # get all data and remove it from internal buffer + print(f'{data.shape[0]} channels x {data.shape[1]} samples') + board.stop_stream() + + # Get EEG data + board.config_board('impedance_mode:0') + board.start_stream() + for i in range(3): + time.sleep(1) + data = board.get_board_data() # get all data and remove it from internal buffer + print(f'{data.shape[0]} channels x {data.shape[1]} samples') + board.stop_stream() + + board.release_session() + diff --git a/src/board_controller/ant_neuro/ant_neuro.cpp b/src/board_controller/ant_neuro/ant_neuro.cpp index 34293eb56..e49ed3a38 100644 --- a/src/board_controller/ant_neuro/ant_neuro.cpp +++ b/src/board_controller/ant_neuro/ant_neuro.cpp @@ -71,6 +71,8 @@ AntNeuroBoard::AntNeuroBoard (int board_id, struct BrainFlowInputParams params) } reference_range = -1.0; bipolar_range = -1.0; + impedance_mode = false; + impedance_package_num = -1; } AntNeuroBoard::~AntNeuroBoard () @@ -100,6 +102,8 @@ int AntNeuroBoard::prepare_session () { sampling_rate = amp->getSamplingRatesAvailable ()[0]; } + impedance_mode = false; + impedance_package_num = 0; } catch (const exceptions::notFound &e) { @@ -143,10 +147,18 @@ int AntNeuroBoard::start_stream (int buffer_size, const char *streamer_params) try { - safe_logger (spdlog::level::info, - "sampling rate: {}, reference range: {}, bipolar range: {}", sampling_rate, - reference_range, bipolar_range); - stream = amp->OpenEegStream (sampling_rate, reference_range, bipolar_range); + if (impedance_mode) + { + safe_logger (spdlog::level::info, "start impedance stream"); + stream = amp->OpenImpedanceStream (); + } + else + { + safe_logger (spdlog::level::info, + "start eeg stream (sampling rate: {}, reference range: {}, bipolar range: {})", + sampling_rate, reference_range, bipolar_range); + stream = amp->OpenEegStream (sampling_rate, reference_range, bipolar_range); + } } catch (const std::runtime_error &e) { @@ -217,6 +229,7 @@ void AntNeuroBoard::read_thread () } std::vector emg_channels; std::vector eeg_channels; + std::vector resistance_channels; try { emg_channels = board_descr["default"]["emg_channels"].get> (); @@ -233,6 +246,15 @@ void AntNeuroBoard::read_thread () { safe_logger (spdlog::level::trace, "device has no eeg channels"); } + try + { + resistance_channels = + board_descr["default"]["resistance_channels"].get> (); + } + catch (...) + { + safe_logger (spdlog::level::trace, "device has no resistance_channels channels"); + } std::vector ant_channels = stream->getChannelList (); while (keep_alive) @@ -245,17 +267,26 @@ void AntNeuroBoard::read_thread () { int eeg_counter = 0; int emg_counter = 0; + int resistance_counter = 0; for (int j = 0; j < buf_channels_len; j++) { if ((ant_channels[j].getType () == channel::reference) && (eeg_counter < (int)eeg_channels.size ())) { package[eeg_channels[eeg_counter++]] = buf.getSample (j, i); + if (impedance_mode) + { + resistance_counter++; + } } if ((ant_channels[j].getType () == channel::bipolar) && (emg_counter < (int)emg_channels.size ())) { package[emg_channels[emg_counter++]] = buf.getSample (j, i); + if (impedance_mode) + { + resistance_counter++; + } } if (ant_channels[j].getType () == channel::sample_counter) { @@ -267,11 +298,32 @@ void AntNeuroBoard::read_thread () package[board_descr["default"]["other_channels"][0].get ()] = buf.getSample (j, i); } + if ((ant_channels[j].getType () == channel::impedance_reference) && + (resistance_counter < (int)resistance_channels.size ())) + { + package[resistance_channels[resistance_counter++]] = buf.getSample (j, i); + } + if ((ant_channels[j].getType () == channel::impedance_ground) && + (resistance_counter < (int)resistance_channels.size ())) + { + package[resistance_channels[resistance_counter++]] = buf.getSample (j, i); + } } package[board_descr["default"]["timestamp_channel"].get ()] = get_timestamp (); + if (impedance_mode) + { + package[board_descr["default"]["package_num_channel"].get ()] = + impedance_package_num++; + } push_package (package); } std::this_thread::sleep_for (std::chrono::milliseconds (1)); + if (impedance_mode) + { + // some more sleep; twice every second should be more than enough + // if left out, it yields impedances at around 64 Hz + std::this_thread::sleep_for (std::chrono::milliseconds (500)); + } } catch (...) { @@ -293,6 +345,7 @@ int AntNeuroBoard::config_board (std::string config, std::string &response) std::string prefix = "sampling_rate:"; std::string rv_prefix = "reference_range:"; std::string bv_prefix = "bipolar_range:"; + std::string mode_prefix = "impedance_mode:"; if (config.find (prefix) != std::string::npos) { @@ -391,6 +444,34 @@ int AntNeuroBoard::config_board (std::string config, std::string &response) return (int)BrainFlowExitCodes::STATUS_OK; } + else if (config.find (mode_prefix) != std::string::npos) + { + bool new_impedance_mode; + std::string value = config.substr (mode_prefix.size ()); + + if (value == "0" || value == "1") + { + try + { + new_impedance_mode = static_cast (std::stod (value)); + } + catch (...) + { + safe_logger (spdlog::level::err, "format is '{}value'", mode_prefix.c_str ()); + return (int)BrainFlowExitCodes::INVALID_ARGUMENTS_ERROR; + } + + impedance_mode = new_impedance_mode; + return (int)BrainFlowExitCodes::STATUS_OK; + } + else + { + safe_logger (spdlog::level::err, "not supported value provided"); + safe_logger (spdlog::level::debug, "supported values: '0' or '1'"); + return (int)BrainFlowExitCodes::INVALID_ARGUMENTS_ERROR; + } + } + safe_logger (spdlog::level::err, "format is '{}value'", prefix.c_str ()); return (int)BrainFlowExitCodes::INVALID_ARGUMENTS_ERROR; } diff --git a/src/board_controller/ant_neuro/inc/ant_neuro.h b/src/board_controller/ant_neuro/inc/ant_neuro.h index 873511318..2a0f85492 100644 --- a/src/board_controller/ant_neuro/inc/ant_neuro.h +++ b/src/board_controller/ant_neuro/inc/ant_neuro.h @@ -28,6 +28,8 @@ class AntNeuroBoard : public Board int sampling_rate; double reference_range; double bipolar_range; + bool impedance_mode; + int impedance_package_num; void read_thread (); #endif diff --git a/src/board_controller/board.cpp b/src/board_controller/board.cpp index fd67ad832..58bd3867c 100644 --- a/src/board_controller/board.cpp +++ b/src/board_controller/board.cpp @@ -467,7 +467,7 @@ int Board::get_board_data (int data_count, int preset, double *data_buf) if (dbs.find (preset) == dbs.end ()) { safe_logger (spdlog::level::err, - "stream is not startted or no preset: {} found for this board", preset); + "stream is not started or no preset: {} found for this board", preset); return (int)BrainFlowExitCodes::INVALID_ARGUMENTS_ERROR; } if (!dbs[preset]) diff --git a/src/board_controller/brainflow_boards.cpp b/src/board_controller/brainflow_boards.cpp index 884e2efb5..0ba7f1450 100644 --- a/src/board_controller/brainflow_boards.cpp +++ b/src/board_controller/brainflow_boards.cpp @@ -486,152 +486,173 @@ BrainFlowBoards::BrainFlowBoards() { {"name", "AntNeuroEE410"}, {"sampling_rate", 2000}, - {"timestamp_channel", 10}, - {"marker_channel", 11}, + {"timestamp_channel", 12}, + {"marker_channel", 13}, {"package_num_channel", 0}, - {"num_rows", 12}, + {"num_rows", 14}, {"emg_channels", {1, 2, 3, 4, 5, 6, 7, 8}}, - {"other_channels", {9}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}, + {"other_channels", {11}} }; brainflow_boards_json["boards"]["25"]["default"] = { {"name", "AntNeuroEE411"}, {"sampling_rate", 2000}, - {"timestamp_channel", 10}, - {"marker_channel", 11}, + {"timestamp_channel", 12}, + {"marker_channel", 13}, {"package_num_channel", 0}, - {"num_rows", 12}, + {"num_rows", 14}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8}}, - {"other_channels", {9}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}, + {"other_channels", {11}} }; brainflow_boards_json["boards"]["26"]["default"] = { {"name", "AntNeuroEE430"}, {"sampling_rate", 512}, - {"timestamp_channel", 10}, - {"marker_channel", 11}, + {"timestamp_channel", 12}, + {"marker_channel", 13}, {"package_num_channel", 0}, - {"num_rows", 12}, + {"num_rows", 14}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8}}, - {"other_channels", {9}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}, + {"other_channels", {11}} }; brainflow_boards_json["boards"]["27"]["default"] = { {"name", "AntNeuroEE211"}, {"sampling_rate", 2000}, - {"timestamp_channel", 66}, - {"marker_channel", 67}, + {"timestamp_channel", 68}, + {"marker_channel", 69}, {"package_num_channel", 0}, - {"num_rows", 68}, + {"num_rows", 70}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64}}, - {"other_channels", {65}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66}}, + {"other_channels", {67}} }; brainflow_boards_json["boards"]["28"]["default"] = { {"name", "AntNeuroEE212"}, {"sampling_rate", 2000}, - {"timestamp_channel", 34}, - {"marker_channel", 35}, + {"timestamp_channel", 36}, + {"marker_channel", 37}, {"package_num_channel", 0}, - {"num_rows", 36}, + {"num_rows", 38}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}}, - {"other_channels", {33}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34}}, + {"other_channels", {35}} }; brainflow_boards_json["boards"]["29"]["default"] = { {"name", "AntNeuroEE213"}, {"sampling_rate", 2000}, - {"timestamp_channel", 18}, - {"marker_channel", 19}, + {"timestamp_channel", 20}, + {"marker_channel", 21}, {"package_num_channel", 0}, - {"num_rows", 20}, + {"num_rows", 22}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}}, - {"other_channels", {17}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}}, + {"other_channels", {19}} }; brainflow_boards_json["boards"]["30"]["default"] = { {"name", "AntNeuroEE214"}, {"sampling_rate", 2000}, - {"timestamp_channel", 58}, - {"marker_channel", 59}, + {"timestamp_channel", 60}, + {"marker_channel", 61}, {"package_num_channel", 0}, - {"num_rows", 60}, + {"num_rows", 62}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}}, {"emg_channels", {33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56}}, - {"other_channels", {57}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58}}, + {"other_channels", {59}} }; brainflow_boards_json["boards"]["31"]["default"] = { {"name", "AntNeuroEE215"}, {"sampling_rate", 2000}, - {"timestamp_channel", 90}, - {"marker_channel", 91}, + {"timestamp_channel", 92}, + {"marker_channel", 93}, {"package_num_channel", 0}, - {"num_rows", 92}, + {"num_rows", 94}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64}}, {"emg_channels", {65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88}}, - {"other_channels", {89}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90}}, + {"other_channels", {91}} }; brainflow_boards_json["boards"]["32"]["default"] = { {"name", "AntNeuroEE221"}, {"sampling_rate", 16000}, - {"timestamp_channel", 18}, - {"marker_channel", 19}, + {"timestamp_channel", 20}, + {"marker_channel", 21}, {"package_num_channel", 0}, - {"num_rows", 20}, + {"num_rows", 22}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}}, - {"other_channels", {17}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}}, + {"other_channels", {19}} }; brainflow_boards_json["boards"]["33"]["default"] = { {"name", "AntNeuroEE222"}, {"sampling_rate", 16000}, - {"timestamp_channel", 34}, - {"marker_channel", 35}, + {"timestamp_channel", 36}, + {"marker_channel", 37}, {"package_num_channel", 0}, - {"num_rows", 36}, + {"num_rows", 38}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}}, - {"other_channels", {33}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34}}, + {"other_channels", {35}} }; brainflow_boards_json["boards"]["34"]["default"] = { {"name", "AntNeuroEE223"}, {"sampling_rate", 16000}, - {"timestamp_channel", 58}, - {"marker_channel", 59}, + {"timestamp_channel", 60}, + {"marker_channel", 61}, {"package_num_channel", 0}, - {"num_rows", 60}, + {"num_rows", 62}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}}, {"emg_channels", {33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56}}, - {"other_channels", {57}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58}}, + {"other_channels", {59}} }; brainflow_boards_json["boards"]["35"]["default"] = { {"name", "AntNeuroEE224"}, {"sampling_rate", 16000}, - {"timestamp_channel", 66}, - {"marker_channel", 67}, + {"timestamp_channel", 68}, + {"marker_channel", 69}, {"package_num_channel", 0}, - {"num_rows", 68}, + {"num_rows", 70}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64}}, - {"other_channels", {65}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66}}, + {"other_channels", {67}} }; brainflow_boards_json["boards"]["36"]["default"] = { {"name", "AntNeuroEE225"}, {"sampling_rate", 16000}, - {"timestamp_channel", 90}, - {"marker_channel", 91}, + {"timestamp_channel", 92}, + {"marker_channel", 93}, {"package_num_channel", 0}, - {"num_rows", 92}, + {"num_rows", 94}, {"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64}}, {"emg_channels", {65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88}}, - {"other_channels", {89}} + {"resistance_channels", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90}}, + {"other_channels", {91}} }; brainflow_boards_json["boards"]["37"]["default"] = {