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

Method handle_data_notification

src/board_controller/muse/muse_athena.cpp:643–730  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

641}
642
643void MuseAthena::handle_data_notification (const uint8_t *data, size_t size)
644{
645 std::lock_guard<std::mutex> callback_guard (callback_lock);
646
647 size_t offset = 0;
648 while (offset < size)
649 {
650 if (size - offset < PACKET_HEADER_SIZE)
651 {
652 safe_logger (spdlog::level::warn, "Short Athena message tail: {} bytes", size - offset);
653 return;
654 }
655
656 uint8_t packet_len = data[offset];
657 if ((packet_len < PACKET_HEADER_SIZE) || (offset + packet_len > size))
658 {
659 safe_logger (spdlog::level::warn, "Invalid Athena packet length: {}", packet_len);
660 return;
661 }
662
663 const uint8_t *packet = data + offset;
664 uint16_t packet_index =
665 cast_16bit_to_uint16_little_endian ((const unsigned char *)(packet + 1));
666 double packet_host_timestamp = get_timestamp ();
667 uint8_t primary_tag = packet[9];
668 uint8_t primary_block_index = packet[10];
669 uint32_t primary_package_num = ((uint32_t)packet_index << 8) | primary_block_index;
670 const uint8_t *packet_data = packet + PACKET_HEADER_SIZE;
671 size_t packet_data_size = packet_len - PACKET_HEADER_SIZE;
672 size_t packet_data_offset = 0;
673
674 SensorConfig primary_config;
675 if (get_sensor_config (primary_tag, primary_config))
676 {
677 size_t primary_data_len =
678 primary_config.variable_length ? packet_data_size : primary_config.data_len;
679 if ((primary_data_len > 0) && (primary_data_len <= packet_data_size))
680 {
681 parse_sensor_payload (primary_tag, primary_package_num, packet_host_timestamp,
682 packet_data, primary_data_len);
683 packet_data_offset = primary_data_len;
684 }
685 else
686 {
687 safe_logger (spdlog::level::warn,
688 "Invalid Athena primary payload for tag 0x{:02x}: {} bytes",
689 (unsigned int)primary_tag, packet_data_size);
690 packet_data_offset = packet_data_size;
691 }
692 }
693 else
694 {
695 safe_logger (spdlog::level::trace, "Unknown Athena primary tag: 0x{:02x}",
696 (unsigned int)primary_tag);
697 packet_data_offset = packet_data_size;
698 }
699
700 while (packet_data_offset + SUBPACKET_HEADER_SIZE <= packet_data_size)

Callers

nothing calls this directly

Calls 2

get_timestampFunction · 0.85

Tested by

no test coverage detected