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();
}
Ejemplo n.º 2
0
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;
}