MCPcopy Create free account
hub / github.com/brainflow-dev/brainflow / decompress_firmware_3

Method decompress_firmware_3

src/board_controller/openbci/ganglion.cpp:398–466  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

396}
397
398void 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];

Callers

nothing calls this directly

Calls 1

uchar_to_bitsFunction · 0.85

Tested by

no test coverage detected