| 130 | } |
| 131 | |
| 132 | void FreeEEG::read_thread () |
| 133 | { |
| 134 | int res; |
| 135 | constexpr int max_size = 1000; // random value bigger than package size which is unknown |
| 136 | unsigned char b[max_size] = {0}; |
| 137 | float eeg_scale = FreeEEG::ads_vref / float ((pow (2, 23) - 1)) / FreeEEG::ads_gain * 1000000.; |
| 138 | int num_rows = board_descr["default"]["num_rows"]; |
| 139 | double *package = new double[num_rows]; |
| 140 | for (int i = 0; i < num_rows; i++) |
| 141 | { |
| 142 | package[i] = 0.0; |
| 143 | } |
| 144 | bool first_package_received = false; |
| 145 | |
| 146 | std::vector<int> eeg_channels = board_descr["default"]["eeg_channels"]; |
| 147 | |
| 148 | while (keep_alive) |
| 149 | { |
| 150 | int pos = 0; |
| 151 | bool complete_package = false; |
| 152 | while ((keep_alive) && (pos < max_size - 2)) |
| 153 | { |
| 154 | res = serial->read_from_serial_port (b + pos, 1); |
| 155 | int prev_id = (pos <= 0) ? 0 : pos - 1; |
| 156 | if ((b[pos] == FreeEEG::start_byte) && (b[prev_id] == FreeEEG::end_byte) && |
| 157 | (pos >= min_package_size)) |
| 158 | { |
| 159 | complete_package = true; |
| 160 | break; |
| 161 | } |
| 162 | pos += res; |
| 163 | } |
| 164 | if (complete_package) |
| 165 | { |
| 166 | // handle the case that we start reading in the middle of data stream |
| 167 | if (!first_package_received) |
| 168 | { |
| 169 | first_package_received = true; |
| 170 | continue; |
| 171 | } |
| 172 | package[board_descr["default"]["package_num_channel"].get<int> ()] = (double)b[0]; |
| 173 | for (unsigned int i = 0; i < eeg_channels.size (); i++) |
| 174 | { |
| 175 | package[eeg_channels[i]] = (double)eeg_scale * cast_24bit_to_int32 (b + 1 + 3 * i); |
| 176 | } |
| 177 | package[board_descr["default"]["timestamp_channel"].get<int> ()] = get_timestamp (); |
| 178 | push_package (package); |
| 179 | } |
| 180 | else |
| 181 | { |
| 182 | safe_logger ( |
| 183 | spdlog::level::trace, "stopped with pos: {}, keep_alive: {}", pos, keep_alive); |
| 184 | } |
| 185 | } |
| 186 | delete[] package; |
| 187 | } |
| 188 | |
| 189 | int FreeEEG::open_port () |
no test coverage detected