Reworked BLE according to v0.11 of the KTag Beacon Specification (#2)

This was done to support the new KTag Konfigurator app, which Jack created for his Senior Design project.

Co-authored-by: Joe Kearney <joe@clubk.club>
Reviewed-on: #2
This commit is contained in:
Joe Kearney 2025-06-08 21:52:29 +00:00
parent 4fe072f2d3
commit bfcdf4c354
26 changed files with 917 additions and 128 deletions

View file

@ -147,17 +147,19 @@ void BLE_UpdateInstigationPacket(uint32_t Game_Length_in_ms, uint32_t Time_Remai
}
}
void BLE_UpdateStatusPacket()
void BLE_UpdateStatusPacket(uint8_t current_state)
{
static uint8_t EventNumber = 0;
uint8_t team_ID;
uint8_t player_ID;
uint8_t weapon_ID;
uint32_t secondary_color;
Protocol_T protocol;
(void) SETTINGS_get_uint8_t(SYSTEMK_SETTING_TEAMID, &team_ID);
(void) SETTINGS_get_uint8_t(SYSTEMK_SETTING_PLAYERID, &player_ID);
(void) SETTINGS_get_uint8_t(SYSTEMK_SETTING_WEAPONID, &weapon_ID);
(void) SETTINGS_get_uint32_t(SYSTEMK_SETTING_SECONDARY_COLOR, &secondary_color);
protocol = GetWeaponFromID(weapon_ID).Protocol;
uint32_t Team_Color = (uint32_t)PROTOCOLS_GetColor(protocol, team_ID, player_ID);
@ -180,17 +182,17 @@ void BLE_UpdateStatusPacket()
Advertising_Data.data[13] = player_ID;
Advertising_Data.data[14] = Get_Health();
Advertising_Data.data[15] = 0x00;
Advertising_Data.data[16] = MAX_HEALTH;
Advertising_Data.data[16] = Get_Max_Health();
Advertising_Data.data[17] = 0x00;
Advertising_Data.data[18] = (Team_Color >> 0) & 0xFF;
Advertising_Data.data[19] = (Team_Color >> 8) & 0xFF;
Advertising_Data.data[20] = (Team_Color >> 16) & 0xFF;
Advertising_Data.data[21] = (Team_Color >> 24) & 0xFF;
Advertising_Data.data[22] = (Team_Color >> 0) & 0xFF; // Secondary Color
Advertising_Data.data[23] = (Team_Color >> 8) & 0xFF; // Secondary Color
Advertising_Data.data[24] = (Team_Color >> 16) & 0xFF; // Secondary Color
Advertising_Data.data[25] = (Team_Color >> 24) & 0xFF; // Secondary Color
Advertising_Data.data[26] = 0xFF;
Advertising_Data.data[22] = (secondary_color >> 0) & 0xFF;
Advertising_Data.data[23] = (secondary_color >> 8) & 0xFF;
Advertising_Data.data[24] = (secondary_color >> 16) & 0xFF;
Advertising_Data.data[25] = (secondary_color >> 24) & 0xFF;
Advertising_Data.data[26] = current_state;
Advertising_Data.data[27] = 0xFF;
Advertising_Data.data[28] = 0xFF;
Advertising_Data.data[29] = 0xFF;
@ -237,12 +239,12 @@ void BLE_UpdateTagPacket(int16_t damage, color_t color, uint8_t target_BD_ADDR[B
Advertising_Data.data[17] = (color >> 8) & 0xFF;
Advertising_Data.data[18] = (color >> 16) & 0xFF;
Advertising_Data.data[19] = (color >> 24) & 0xFF;
Advertising_Data.data[20] = target_BD_ADDR[0],
Advertising_Data.data[21] = target_BD_ADDR[1],
Advertising_Data.data[22] = target_BD_ADDR[2],
Advertising_Data.data[23] = target_BD_ADDR[3],
Advertising_Data.data[24] = target_BD_ADDR[4],
Advertising_Data.data[25] = target_BD_ADDR[5],
Advertising_Data.data[20] = target_BD_ADDR[0];
Advertising_Data.data[21] = target_BD_ADDR[1];
Advertising_Data.data[22] = target_BD_ADDR[2];
Advertising_Data.data[23] = target_BD_ADDR[3];
Advertising_Data.data[24] = target_BD_ADDR[4];
Advertising_Data.data[25] = target_BD_ADDR[5];
Advertising_Data.data[26] = 0xFF;
Advertising_Data.data[27] = 0xFF;
Advertising_Data.data[28] = 0xFF;
@ -257,6 +259,168 @@ void BLE_UpdateTagPacket(int16_t damage, color_t color, uint8_t target_BD_ADDR[B
}
}
//! Event number used for all BLE_PACKET_TYPE_PARAMETERS packets.
static uint8_t ParametersEventNumber = 0;
void BLE_RespondToConfigurationPacket(const BLE_ParametersPacket_T *const packet, BLE_ConfigurationSubtype_T response)
{
Advertising_Data.length = BLE_KTAG_PACKET_TOTAL_SIZE;
// Manufacturer Specific Data
Advertising_Data.data[0] = 0x1E;
Advertising_Data.data[1] = 0xFF;
Advertising_Data.data[2] = 0xFF;
Advertising_Data.data[3] = 0xFF;
Advertising_Data.data[4] = 'K';
Advertising_Data.data[5] = 'T';
Advertising_Data.data[6] = 'a';
Advertising_Data.data[7] = 'g';
Advertising_Data.data[8] = BLE_PACKET_TYPE_PARAMETERS;
Advertising_Data.data[9] = ParametersEventNumber++;
Advertising_Data.data[10] = packet->BD_ADDR[0];
Advertising_Data.data[11] = packet->BD_ADDR[1];
Advertising_Data.data[12] = packet->BD_ADDR[2];
Advertising_Data.data[13] = packet->BD_ADDR[3];
Advertising_Data.data[14] = packet->BD_ADDR[4];
Advertising_Data.data[15] = packet->BD_ADDR[5];
Advertising_Data.data[16] = (uint8_t)response;
Advertising_Data.data[17] = (uint8_t)((packet->key_one >> 0) & 0xFF);
Advertising_Data.data[18] = (uint8_t)((packet->key_one >> 8) & 0xFF);
Advertising_Data.data[19] = (uint8_t)((packet->value_one >> 0) & 0xFF);
Advertising_Data.data[20] = (uint8_t)((packet->value_one >> 8) & 0xFF);
Advertising_Data.data[21] = (uint8_t)((packet->value_one >> 16) & 0xFF);
Advertising_Data.data[22] = (uint8_t)((packet->value_one >> 24) & 0xFF);
Advertising_Data.data[23] = (uint8_t)((packet->key_two >> 0) & 0xFF);
Advertising_Data.data[24] = (uint8_t)((packet->key_two >> 8) & 0xFF);
Advertising_Data.data[25] = (uint8_t)((packet->value_two >> 0) & 0xFF);
Advertising_Data.data[26] = (uint8_t)((packet->value_two >> 8) & 0xFF);
Advertising_Data.data[27] = (uint8_t)((packet->value_two >> 16) & 0xFF);
Advertising_Data.data[28] = (uint8_t)((packet->value_two >> 24) & 0xFF);
Advertising_Data.data[29] = 0xFF;
Advertising_Data.data[30] = 0xFF;
SystemKResult_T result = BLE_SetAdvertisingData(&Advertising_Data);
if (result != SYSTEMK_RESULT_SUCCESS)
{
KLOG_ERROR(KLOG_TAG, "Error responding to configuration packet!");
}
if (BLE_ScanAndAdvertise() != SYSTEMK_RESULT_SUCCESS)
{
KLOG_ERROR(KLOG_TAG, "Couldn't scan and advertise!");
}
}
void BLE_BroadcastCurrentParameterInfoPacket(const BLE_ParameterKey_T key_one, const uint32_t value_one, const BLE_ParameterKey_T key_two, const uint32_t value_two)
{
Advertising_Data.length = BLE_KTAG_PACKET_TOTAL_SIZE;
// Manufacturer Specific Data
Advertising_Data.data[0] = 0x1E;
Advertising_Data.data[1] = 0xFF;
Advertising_Data.data[2] = 0xFF;
Advertising_Data.data[3] = 0xFF;
Advertising_Data.data[4] = 'K';
Advertising_Data.data[5] = 'T';
Advertising_Data.data[6] = 'a';
Advertising_Data.data[7] = 'g';
Advertising_Data.data[8] = BLE_PACKET_TYPE_PARAMETERS;
Advertising_Data.data[9] = ParametersEventNumber++;
Advertising_Data.data[10] = BLE_BROADCAST_ADDRESS[0];
Advertising_Data.data[11] = BLE_BROADCAST_ADDRESS[1];
Advertising_Data.data[12] = BLE_BROADCAST_ADDRESS[2];
Advertising_Data.data[13] = BLE_BROADCAST_ADDRESS[3];
Advertising_Data.data[14] = BLE_BROADCAST_ADDRESS[4];
Advertising_Data.data[15] = BLE_BROADCAST_ADDRESS[5];
Advertising_Data.data[16] = BLE_CURRENT_PARAMETER_INFORMATION;
Advertising_Data.data[17] = (uint8_t)((key_one >> 0) & 0xFF);
Advertising_Data.data[18] = (uint8_t)((key_one >> 8) & 0xFF);
Advertising_Data.data[19] = (uint8_t)((value_one >> 0) & 0xFF);
Advertising_Data.data[20] = (uint8_t)((value_one >> 8) & 0xFF);
Advertising_Data.data[21] = (uint8_t)((value_one >> 16) & 0xFF);
Advertising_Data.data[22] = (uint8_t)((value_one >> 24) & 0xFF);
Advertising_Data.data[23] = (uint8_t)((key_two >> 0) & 0xFF);
Advertising_Data.data[24] = (uint8_t)((key_two >> 8) & 0xFF);
Advertising_Data.data[25] = (uint8_t)((value_two >> 0) & 0xFF);
Advertising_Data.data[26] = (uint8_t)((value_two >> 8) & 0xFF);
Advertising_Data.data[27] = (uint8_t)((value_two >> 16) & 0xFF);
Advertising_Data.data[28] = (uint8_t)((value_two >> 24) & 0xFF);
Advertising_Data.data[29] = 0xFF;
Advertising_Data.data[30] = 0xFF;
SystemKResult_T result = BLE_SetAdvertisingData(&Advertising_Data);
if (result != SYSTEMK_RESULT_SUCCESS)
{
KLOG_ERROR(KLOG_TAG, "Error responding to configuration packet!");
}
}
void BLE_UpdateHelloPacket()
{
static uint8_t EventNumber = 0;
uint32_t device_type32;
uint16_t device_type = BLE_DEVICE_TYPE_UNKNOWN;
if (SETTINGS_get_uint32_t(SYSTEMK_SETTING_DEVICE_TYPE, &device_type32) == SYSTEMK_RESULT_SUCCESS)
{
device_type = (uint16_t)device_type32;
}
uint8_t team_ID;
(void) SETTINGS_get_uint8_t(SYSTEMK_SETTING_TEAMID, &team_ID);
char device_name[SYSTEMK_MAX_CHARS_IN_DEVICE_NAME + 1];
SystemKResult_T result = SETTINGS_get_device_name(&device_name[0]);
if (result != SYSTEMK_RESULT_SUCCESS)
{
strcpy(device_name, "Anonymous");
}
Advertising_Data.length = BLE_KTAG_PACKET_TOTAL_SIZE;
// Manufacturer Specific Data
Advertising_Data.data[0] = 0x1E;
Advertising_Data.data[1] = 0xFF;
Advertising_Data.data[2] = 0xFF;
Advertising_Data.data[3] = 0xFF;
Advertising_Data.data[4] = 'K';
Advertising_Data.data[5] = 'T';
Advertising_Data.data[6] = 'a';
Advertising_Data.data[7] = 'g';
Advertising_Data.data[8] = BLE_PACKET_TYPE_HELLO;
Advertising_Data.data[9] = EventNumber++;
Advertising_Data.data[10] = SYSTEMK_MAJOR_VERSION;
Advertising_Data.data[11] = SYSTEMK_MINOR_VERSION;
Advertising_Data.data[12] = (device_type >> 0) & 0xFF;
Advertising_Data.data[13] = (device_type >> 8) & 0xFF;
Advertising_Data.data[14] = team_ID;
Advertising_Data.data[15] = device_name[0];
Advertising_Data.data[16] = device_name[1];
Advertising_Data.data[17] = device_name[2];
Advertising_Data.data[18] = device_name[3];
Advertising_Data.data[19] = device_name[4];
Advertising_Data.data[20] = device_name[5];
Advertising_Data.data[21] = device_name[6];
Advertising_Data.data[22] = device_name[7];
Advertising_Data.data[23] = device_name[8];
Advertising_Data.data[24] = device_name[9];
Advertising_Data.data[25] = device_name[10];
Advertising_Data.data[26] = device_name[11];
Advertising_Data.data[27] = device_name[12];
Advertising_Data.data[28] = device_name[13];
Advertising_Data.data[29] = device_name[14];
Advertising_Data.data[30] = device_name[15];
result = BLE_SetAdvertisingData(&Advertising_Data);
if (result != SYSTEMK_RESULT_SUCCESS)
{
KLOG_ERROR(KLOG_TAG, "Error updating hello packet!");
}
}
bool BLE_IsBLEPacketForMe(const uint8_t BD_ADDR[6])
{
bool for_me = false;
@ -286,12 +450,12 @@ bool BLE_IsBLEPacketForMe(const uint8_t BD_ADDR[6])
}
// Is this the broadcast address?
if ((BD_ADDR[0] == 0xFF) &&
(BD_ADDR[1] == 0xFF) &&
(BD_ADDR[2] == 0xFF) &&
(BD_ADDR[3] == 0xFF) &&
(BD_ADDR[4] == 0xFF) &&
(BD_ADDR[5] == 0xFF))
if ((BD_ADDR[0] == BLE_BROADCAST_ADDRESS[0]) &&
(BD_ADDR[1] == BLE_BROADCAST_ADDRESS[1]) &&
(BD_ADDR[2] == BLE_BROADCAST_ADDRESS[2]) &&
(BD_ADDR[3] == BLE_BROADCAST_ADDRESS[3]) &&
(BD_ADDR[4] == BLE_BROADCAST_ADDRESS[4]) &&
(BD_ADDR[5] == BLE_BROADCAST_ADDRESS[5]))
{
for_me = true;
}