/*----------------------------------------------------------------------------* * NAME * startBeaconing * * DESCRIPTION * This function is called to start beacon advertisements * * RETURNS * Nothing. * *---------------------------------------------------------------------------*/ void startBeaconing(void) { uint8 advData[BEACON_ADVERT_SIZE]; uint16 offset = 0; /* set the GAP Broadcaster role */ GapSetMode(gap_role_broadcaster, gap_mode_discover_no, gap_mode_connect_no, gap_mode_bond_no, gap_mode_security_none); /* clear the existing advertisement data */ LsStoreAdvScanData(0, NULL, ad_src_advertise); /* set the advertisement interval */ GapSetAdvInterval(BEACON_ADVERTISING_INTERVAL_MIN, BEACON_ADVERTISING_INTERVAL_MAX); /* store the manufacturing data */ advData[offset++] = AD_TYPE_MANUF; /* Apple company code, little endian */ advData[offset++] = 0x4C; advData[offset++] = 0x00; advData[offset++] = 2; /* Magic number */ advData[offset++] = 0x15; /* Length of the beacon payload */ /* Beacon UUID */ MemCopy(advData + offset, g_app_data.uuid, sizeof(g_app_data.uuid)); offset += sizeof(g_app_data.uuid); /* Beacon major */ advData[offset++] = WORD_MSB(g_app_data.major); advData[offset++] = WORD_LSB(g_app_data.major); /* Beacon minor */ advData[offset++] = WORD_MSB(g_app_data.minor); advData[offset++] = WORD_LSB(g_app_data.minor); /* Beacon TX Power */ advData[offset++] = g_app_data.txPower; /* store the advertisement data */ LsStoreAdvScanData(BEACON_ADVERT_SIZE, advData, ad_src_advertise); /* Start broadcasting */ LsStartStopAdvertise(TRUE, whitelist_disabled, ls_addr_type_random); }
/*----------------------------------------------------------------------------* * NAME * startAdvertising * * DESCRIPTION * This function is called to start advertisements. * * Advertisement packet will contain Flags AD and Manufacturer-specific * AD with Manufacturer id set to CSR and payload set to the value of * the User Key 0. The payload size is set by the User Key 1. * * +--------+-------------------------------------------------+ * |FLAGS AD|MANUFACTURER AD | * +--------+-------------------------------------------------+ * 0 2 3 * * RETURNS * Nothing. * *---------------------------------------------------------------------------*/ void startAdvertising(void) { uint8 advData[MAX_ADVERT_PACKET_SIZE]; uint16 offset = 0; uint8 filler; uint16 advInterval; uint8 advPayloadSize; ls_addr_type addressType = ls_addr_type_public; /* use public address */ /* initialise values from User CsKeys */ /* read User key 0 for the payload filler */ filler = (uint8)(CSReadUserKey(0) & 0x00FF); /* read User key 1 for the payload size */ advPayloadSize = (uint8)(CSReadUserKey(1) & 0x00FF); /* range check */ if((advPayloadSize < 1) || (advPayloadSize > MAX_ADVERT_PAYLOAD_SIZE)) { /* revert to default payload size */ advPayloadSize = DEFAULT_ADVERT_PAYLOAD_SIZE; } /* read User key 2 for the advertising interval */ advInterval = CSReadUserKey(2); /* range check */ if((advInterval < MIN_ADVERTISING_INTERVAL) || (advInterval > MAX_ADVERTISING_INTERVAL)) { /* revert to default advertising interval */ advInterval = DEFAULT_ADVERTISING_INTERVAL; } /* read address type from User key 3 */ if(CSReadUserKey(3)) { /* use random address type */ addressType = ls_addr_type_random; /* generate and set the random address */ appSetRandomAddress(); } /* set the GAP Broadcaster role */ GapSetMode(gap_role_broadcaster, gap_mode_discover_no, gap_mode_connect_no, gap_mode_bond_no, gap_mode_security_none); /* clear the existing advertisement data, if any */ LsStoreAdvScanData(0, NULL, ad_src_advertise); /* set the advertisement interval, API accepts the value in microseconds */ GapSetAdvInterval(advInterval * MILLISECOND, advInterval * MILLISECOND); /* manufacturer-specific data */ advData[0] = AD_TYPE_MANUF; /* CSR company code, little endian */ advData[1] = 0x0A; advData[2] = 0x00; /* fill in the rest of the advertisement */ for(offset = 0; offset < advPayloadSize; offset++) { advData[3 + offset] = filler; } /* store the advertisement data */ LsStoreAdvScanData(advPayloadSize + 3, advData, ad_src_advertise); /* Start broadcasting */ LsStartStopAdvertise(TRUE, whitelist_disabled, addressType); }