| 396 | } |
| 397 | |
| 398 | void Ganglion::decompress_firmware_3 ( |
| 399 | struct GanglionLib::GanglionData *data, float *last_data, double *acceleration, double *package) |
| 400 | { |
| 401 | int bits_per_num = 0; |
| 402 | unsigned char package_bits[160] = {0}; // 20 * 8 |
| 403 | for (int i = 0; i < 20; i++) |
| 404 | { |
| 405 | uchar_to_bits (data->data[i], package_bits + i * 8); |
| 406 | } |
| 407 | |
| 408 | // 18 bit compression, sends 17 MSBs + sign bit of 24-bit sample |
| 409 | if (data->data[0] >= 0 && data->data[0] < 100) |
| 410 | { |
| 411 | int last_digit = data->data[0] % 10; |
| 412 | switch (last_digit) |
| 413 | { |
| 414 | // accel data is signed, so we must cast it to signed char |
| 415 | // swap x and z, and invert z to convert to standard coordinate space. |
| 416 | case 0: |
| 417 | acceleration[2] = -accel_scale * (char)data->data[19]; |
| 418 | break; |
| 419 | case 1: |
| 420 | acceleration[1] = accel_scale * (char)data->data[19]; |
| 421 | break; |
| 422 | case 2: |
| 423 | acceleration[0] = accel_scale * (char)data->data[19]; |
| 424 | break; |
| 425 | default: |
| 426 | break; |
| 427 | } |
| 428 | bits_per_num = 18; |
| 429 | } |
| 430 | else if (data->data[0] >= 100 && data->data[0] < 200) |
| 431 | { |
| 432 | bits_per_num = 19; |
| 433 | } |
| 434 | |
| 435 | // handle compressed data for 18 or 19 bits |
| 436 | for (int i = 8, counter = 0; i < bits_per_num * 8; i += bits_per_num, counter++) |
| 437 | { |
| 438 | if (bits_per_num == 18) |
| 439 | { |
| 440 | last_data[counter] = (float)(cast_ganglion_bits_to_int32<18> (package_bits + i) << 6); |
| 441 | } |
| 442 | else |
| 443 | { |
| 444 | last_data[counter] = (float)(cast_ganglion_bits_to_int32<19> (package_bits + i) << 5); |
| 445 | } |
| 446 | } |
| 447 | |
| 448 | // add first encoded package |
| 449 | package[board_descr["default"]["package_num_channel"].get<int> ()] = data->data[0]; |
| 450 | package[board_descr["default"]["eeg_channels"][0].get<int> ()] = eeg_scale * last_data[0]; |
| 451 | package[board_descr["default"]["eeg_channels"][1].get<int> ()] = eeg_scale * last_data[1]; |
| 452 | package[board_descr["default"]["eeg_channels"][2].get<int> ()] = eeg_scale * last_data[2]; |
| 453 | package[board_descr["default"]["eeg_channels"][3].get<int> ()] = eeg_scale * last_data[3]; |
| 454 | package[board_descr["default"]["accel_channels"][0].get<int> ()] = acceleration[0]; |
| 455 | package[board_descr["default"]["accel_channels"][1].get<int> ()] = acceleration[1]; |
nothing calls this directly
no test coverage detected