TEST test_vehicle_parse_local_name(void) { uint8_t data0[] = { 0x50, 0x20, 0x21, 0x01, 0x20, 0x20, 0x5A, 0x39, 0x41, 0x41, 0x33, 0x20, 0x54, 0x4F, 0x4D, 0x4D, 0x59, 0x00 }; anki_vehicle_adv_info_t info; uint8_t err = anki_vehicle_parse_local_name(data0, sizeof(data0), &info); ASSERT_EQ(err, 0); ASSERT_EQ(info.state.full_battery, 1); ASSERT_EQ(info.state.low_battery, 0); ASSERT_EQ(info.state.on_charger, 1); ASSERT_EQ(info.version, 0x2120); ASSERT_STR_EQ((const char *)info.name, (const char *)&data0[8]); PASS(); }
uint8_t anki_vehicle_parse_adv_record(const uint8_t *scan_data, const size_t scan_data_len, anki_vehicle_adv_t *anki_vehicle_adv) { // no data to parse if (scan_data == NULL) return 1; int i = 0; while (i < scan_data_len) { uint8_t len = scan_data[i++]; if (len == 0) break; ble_adv_record_type_t type = scan_data[i]; if (type == ADV_TYPE_INVALID) break; const uint8_t *data = &scan_data[i+1]; uint8_t data_len = len - 1; switch(type) { case ADV_TYPE_INVALID: return -1; break; case ADV_TYPE_FLAGS: if (anki_vehicle_adv != NULL) memmove(&anki_vehicle_adv->flags, data, data_len); break; case ADV_TYPE_UUID_128: { if ((data_len == sizeof(uuid128_t)) && !is_anki_vehicle_service_uuid((uuid128_t*)data) ) return 2; if (anki_vehicle_adv != NULL) { memmove(&anki_vehicle_adv->service_id, data, data_len); } else { return 0; } break; } case ADV_TYPE_LOCAL_NAME: if (anki_vehicle_adv != NULL) { anki_vehicle_parse_local_name(data, data_len, &anki_vehicle_adv->local_name); } break; case ADV_TYPE_TX_POWER: if (anki_vehicle_adv != NULL) memmove(&anki_vehicle_adv->tx_power, data, data_len); break; case ADV_TYPE_MANUFACTURER_DATA: if (anki_vehicle_adv != NULL) { anki_vehicle_parse_mfg_data(data, data_len, &anki_vehicle_adv->mfg_data); } break; default: return 3; printf("\nunknown type: %d\n", type); hexdump("data: ", 80, data, data_len); break; } i += len; } return ((anki_vehicle_adv != NULL) && is_anki_vehicle_service_uuid(&anki_vehicle_adv->service_id)) ? 0 : 2; }