Reworked BLE according to v0.12 of the KTag Beacon Specification (#5)
This change to SystemK implements version 0.12 of the KTag Beacon Specification. The spec. is here: [KTag Beacon Specification v0.12](https://ktag.clubk.club/Technology/BLE/KTag%20Beacon%20Specification%20v0.12.pdf) This change also includes the 31AUG2025 changes to the State Machine (now documented [here](https://ktag.clubk.club/Technology/SystemK/SystemKStateMachine.drawio.png)), as well as changes to support automated testing. **All projects should update to this version.** Co-authored-by: Joe Kearney <joe@clubk.club> Reviewed-on: #5
This commit is contained in:
parent
7aa827563a
commit
430aec54b8
22 changed files with 368 additions and 47 deletions
|
@ -22,6 +22,7 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "SystemK.h"
|
||||
|
||||
const uint8_t BLE_BROADCAST_ADDRESS[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
||||
|
||||
|
@ -51,4 +52,76 @@ const char *BLE_ADDR_To_Str(const uint8_t bd_addr[6])
|
|||
|
||||
str_addr[17] = '\0'; // Ensure null termination.
|
||||
return str_addr;
|
||||
}
|
||||
|
||||
SystemKResult_T BLE_HandleCommonEvents(KEvent_T *event)
|
||||
{
|
||||
SystemKResult_T result = SYSTEMK_RESULT_EVENT_NOT_HANDLED;
|
||||
|
||||
if (event->ID == KEVENT_BLE_PACKET_RECEIVED)
|
||||
{
|
||||
BLE_Packet_T * packet = (BLE_Packet_T *)event->Data;
|
||||
|
||||
if (packet->Generic.type == BLE_PACKET_TYPE_EVENT)
|
||||
{
|
||||
BLE_EventPacket_T * event_packet = (BLE_EventPacket_T *)packet;
|
||||
|
||||
if (BLE_IsBLEPacketForMe(event_packet->target_BD_ADDR))
|
||||
{
|
||||
if (BLE_IsPacketNew(event_packet->BD_ADDR, BLE_PACKET_TYPE_EVENT, event_packet->event_number))
|
||||
{
|
||||
if (event_packet->event_ID == BLE_EVENT_QUIET)
|
||||
{
|
||||
uint32_t duration_ms = event_packet->event_data;
|
||||
if (BLE_Quiet(duration_ms) == SYSTEMK_RESULT_SUCCESS)
|
||||
{
|
||||
if (duration_ms > 0)
|
||||
{
|
||||
KLOG_INFO("BLE", "Quiet mode activated for %lu ms.", duration_ms);
|
||||
}
|
||||
else
|
||||
{
|
||||
KLOG_INFO("BLE", "Quiet mode activated until further notice.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
KLOG_ERROR("BLE", "Failed to activate quiet mode.");
|
||||
}
|
||||
result = SYSTEMK_RESULT_SUCCESS;
|
||||
}
|
||||
else if (event_packet->event_ID == BLE_EVENT_UNQUIET)
|
||||
{
|
||||
if (BLE_Unquiet() == SYSTEMK_RESULT_SUCCESS)
|
||||
{
|
||||
KLOG_INFO("BLE", "Quiet mode deactivated.");
|
||||
}
|
||||
else
|
||||
{
|
||||
KLOG_ERROR("BLE", "Failed to deactivate quiet mode.");
|
||||
}
|
||||
result = SYSTEMK_RESULT_SUCCESS;
|
||||
}
|
||||
else if (event_packet->event_ID == BLE_EVENT_FORCE_STATE)
|
||||
{
|
||||
uint32_t requested_state = event_packet->event_data;
|
||||
|
||||
if (requested_state < STATE_IS_OUT_OF_RANGE)
|
||||
{
|
||||
Transition_For_Event(GetContext(), (StateID_T)requested_state, event);
|
||||
KLOG_INFO("BLE", "State %lu forced.", requested_state);
|
||||
result = SYSTEMK_RESULT_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
KLOG_ERROR("BLE", "Attempted to force unknown state %lu.", requested_state);
|
||||
result = SYSTEMK_RESULT_OVERFLOW;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue