static void handle_l2cap_media_data_packet(uint8_t seid, uint8_t *packet, uint16_t size){ UNUSED(seid); int pos = 0; avdtp_media_packet_header_t media_header; media_header.version = packet[pos] & 0x03; media_header.padding = get_bit16(packet[pos],2); media_header.extension = get_bit16(packet[pos],3); media_header.csrc_count = (packet[pos] >> 4) & 0x0F; pos++; media_header.marker = get_bit16(packet[pos],0); media_header.payload_type = (packet[pos] >> 1) & 0x7F; pos++; media_header.sequence_number = big_endian_read_16(packet, pos); pos+=2; media_header.timestamp = big_endian_read_32(packet, pos); pos+=4; media_header.synchronization_source = big_endian_read_32(packet, pos); pos+=4; UNUSED(media_header); // TODO: read csrc list // printf_hexdump( packet, pos ); // printf("MEDIA HEADER: %u timestamp, version %u, padding %u, extension %u, csrc_count %u\n", // media_header.timestamp, media_header.version, media_header.padding, media_header.extension, media_header.csrc_count); // printf("MEDIA HEADER: marker %02x, payload_type %02x, sequence_number %u, synchronization_source %u\n", // media_header.marker, media_header.payload_type, media_header.sequence_number, media_header.synchronization_source); avdtp_sbc_codec_header_t sbc_header; sbc_header.fragmentation = get_bit16(packet[pos], 7); sbc_header.starting_packet = get_bit16(packet[pos], 6); sbc_header.last_packet = get_bit16(packet[pos], 5); sbc_header.num_frames = packet[pos] & 0x0f; pos++; UNUSED(sbc_header); // printf("SBC HEADER: num_frames %u, fragmented %u, start %u, stop %u\n", sbc_header.num_frames, sbc_header.fragmentation, sbc_header.starting_packet, sbc_header.last_packet); // printf_hexdump( packet+pos, size-pos ); #ifdef DECODE_SBC btstack_sbc_decoder_process_data(&state, 0, packet+pos, size-pos); #endif #ifdef STORE_SBC_TO_SBC_FILE fwrite(packet+pos, size-pos, 1, sbc_file); #endif #ifdef HAVE_PORTAUDIO log_info("PA: bytes avail after recv: %d", btstack_ring_buffer_bytes_available(&ring_buffer)); #endif }
/* decode and store received TLM */ static esp_err_t esp_eddystone_tlm_received(const uint8_t* buf, uint8_t len, esp_eddystone_result_t* res) { uint8_t pos = 0; if(len+4 > EDDYSTONE_TLM_FRAME_LEN) { //ERROR:TLM too long return -1; } res->inform.tlm.version = buf[pos++]; res->inform.tlm.battery_voltage = big_endian_read_16(buf, pos); pos += 2; uint16_t temp = big_endian_read_16(buf, pos); int8_t temp_integral = (int8_t)((temp >> 8) & 0xff); float temp_decimal = (temp & 0xff) / 256.0; res->inform.tlm.temperature = temp_integral + temp_decimal; pos += 2; res->inform.tlm.adv_count = big_endian_read_32(buf, pos); pos += 4; res->inform.tlm.time = big_endian_read_32(buf, pos); return 0; }
static int read_media_data_header(uint8_t *packet, int size, int *offset, avdtp_media_packet_header_t *media_header){ int media_header_len = 12; // without crc int pos = *offset; if (size - pos < media_header_len){ printf("Not enough data to read media packet header, expected %d, received %d\n", media_header_len, size-pos); return 0; } media_header->version = packet[pos] & 0x03; media_header->padding = get_bit16(packet[pos],2); media_header->extension = get_bit16(packet[pos],3); media_header->csrc_count = (packet[pos] >> 4) & 0x0F; pos++; media_header->marker = get_bit16(packet[pos],0); media_header->payload_type = (packet[pos] >> 1) & 0x7F; pos++; media_header->sequence_number = big_endian_read_16(packet, pos); pos+=2; media_header->timestamp = big_endian_read_32(packet, pos); pos+=4; media_header->synchronization_source = big_endian_read_32(packet, pos); pos+=4; *offset = pos; // TODO: read csrc list // printf_hexdump( packet, pos ); if (!is_media_header_reported_once){ is_media_header_reported_once = 1; printf("MEDIA HEADER: %u timestamp, version %u, padding %u, extension %u, csrc_count %u\n", media_header->timestamp, media_header->version, media_header->padding, media_header->extension, media_header->csrc_count); printf("MEDIA HEADER: marker %02x, payload_type %02x, sequence_number %u, synchronization_source %u\n", media_header->marker, media_header->payload_type, media_header->sequence_number, media_header->synchronization_source); } return 1; }
void sdp_parser_handle_service_search(uint8_t * data, uint16_t total_count, uint16_t record_handle_count){ int i; for (i=0;i<record_handle_count;i++){ record_handle = big_endian_read_32(data, i*4); record_counter++; uint8_t event[10]; event[0] = SDP_EVENT_QUERY_SERVICE_RECORD_HANDLE; event[1] = 8; little_endian_store_16(event, 2, total_count); little_endian_store_16(event, 4, record_counter); little_endian_store_32(event, 6, record_handle); (*sdp_parser_callback)(HCI_EVENT_PACKET, 0, event, sizeof(event)); } }