diff --git a/BLE/BLE_Packets.c b/BLE/BLE_Packets.c index 8b165fb..b150e6f 100644 --- a/BLE/BLE_Packets.c +++ b/BLE/BLE_Packets.c @@ -259,10 +259,11 @@ 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) { - static uint8_t EventNumber = 0; - Advertising_Data.length = BLE_KTAG_PACKET_TOTAL_SIZE; // Manufacturer Specific Data @@ -275,7 +276,7 @@ void BLE_RespondToConfigurationPacket(const BLE_ParametersPacket_T *const packet Advertising_Data.data[6] = 'a'; Advertising_Data.data[7] = 'g'; Advertising_Data.data[8] = BLE_PACKET_TYPE_PARAMETERS; - Advertising_Data.data[9] = EventNumber++; + 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]; @@ -311,6 +312,51 @@ void BLE_RespondToConfigurationPacket(const BLE_ParametersPacket_T *const packet } } +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; @@ -404,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; } diff --git a/BLE/BLE_Packets.h b/BLE/BLE_Packets.h index 65744c6..48a68ae 100644 --- a/BLE/BLE_Packets.h +++ b/BLE/BLE_Packets.h @@ -295,6 +295,7 @@ void BLE_UpdateInstigationPacket(uint32_t Game_Length_in_ms, uint32_t Time_Remai void BLE_UpdateStatusPacket(uint8_t current_state); void BLE_UpdateTagPacket(int16_t damage, color_t color, uint8_t target_BD_ADDR[BD_ADDR_SIZE]); void BLE_RespondToConfigurationPacket(const BLE_ParametersPacket_T *const packet, BLE_ConfigurationSubtype_T response); +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); void BLE_UpdateHelloPacket(); bool BLE_IsBLEPacketForMe(const uint8_t BD_ADDR[BD_ADDR_SIZE]); diff --git a/BLE/BLE_Utils.c b/BLE/BLE_Utils.c index 1a05031..a0030f4 100644 --- a/BLE/BLE_Utils.c +++ b/BLE/BLE_Utils.c @@ -23,6 +23,8 @@ #include #include +const uint8_t BLE_BROADCAST_ADDRESS[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + //! Converts a 6-byte Bluetooth Low Energy address to a human-readable string (for logging). /*! * \param bd_addr The Bluetooth address as a 6-byte array diff --git a/BLE/BLE_Utils.h b/BLE/BLE_Utils.h index 42cd2b2..84837df 100644 --- a/BLE/BLE_Utils.h +++ b/BLE/BLE_Utils.h @@ -19,4 +19,6 @@ * file in the root of this repository. If not, see . */ + extern const uint8_t BLE_BROADCAST_ADDRESS[6]; + const char* BLE_ADDR_To_Str(const uint8_t bd_addr[6]); \ No newline at end of file diff --git a/Protocols/NEC.c b/Protocols/NEC.c index 263fa7e..4e10e30 100755 --- a/Protocols/NEC.c +++ b/Protocols/NEC.c @@ -109,9 +109,9 @@ static inline void PackPulseTrain(TimedPulseTrain_T *pulsetrain, uint32_t data) TimedPulseTrain_T *NEC_EncodePacket(CommandPacket_T *packet) { - uint32_t packed_data = 0x00000000; + uint32_t data = packet->data; - PackPulseTrain(&Command_Send_Buffer, packed_data); + PackPulseTrain(&Command_Send_Buffer, data); return &Command_Send_Buffer; } diff --git a/States/State_Configuring.c b/States/State_Configuring.c index bf2c664..f11203e 100644 --- a/States/State_Configuring.c +++ b/States/State_Configuring.c @@ -49,10 +49,11 @@ static const char *KLOG_TAG = "STATE_CONFIGURING"; //! Activities for the **Configuring** state. const StateActivity_T STATE_CONFIGURING_Activities = - { - .Entry = Configuring_Entry, - .Do = Configuring_Do, - .Exit = Configuring_Exit}; +{ + .Entry = Configuring_Entry, + .Do = Configuring_Do, + .Exit = Configuring_Exit +}; //! Sets up the Configuring state. /*! diff --git a/States/State_Wrapping_Up.c b/States/State_Wrapping_Up.c index 81273bf..fc915b3 100644 --- a/States/State_Wrapping_Up.c +++ b/States/State_Wrapping_Up.c @@ -30,6 +30,15 @@ static void Wrapping_Up_Entry(StateMachineContext_T * context); static void Wrapping_Up_Do(StateMachineContext_T * context); static void Wrapping_Up_Exit(StateMachineContext_T * context); +static TimerHandle_t BLEInfoRequestResponseTimer = NULL; +static StaticTimer_t xBLEInfoRequestResponseTimerBuffer; +static TickType_t xBLEInfoRequestResponseTimerPeriod = 3000 / portTICK_PERIOD_MS; + +static void BLEInfoRequestResponseTimerCallback(TimerHandle_t xTimer) +{ + BLE_UpdateStatusPacket(STATE_WRAPPING_UP); +} + //! Activities for the **Wrapping Up** state. const StateActivity_T STATE_WRAPPING_UP_Activities = { @@ -52,6 +61,22 @@ static void Wrapping_Up_Entry(StateMachineContext_T * context) { KLOG_ERROR(KLOG_TAG, "Couldn't start BLE!"); } + + if (BLEInfoRequestResponseTimer == NULL) + { + BLEInfoRequestResponseTimer = xTimerCreateStatic( + "BLEInfoRequestResponse", + xBLEInfoRequestResponseTimerPeriod, + pdFALSE, + (void *)0, + BLEInfoRequestResponseTimerCallback, + &xBLEInfoRequestResponseTimerBuffer); + } + + if (BLEInfoRequestResponseTimer == NULL) + { + KLOG_ERROR(KLOG_TAG, "Couldn't create the BLEInfoRequestResponseTimer!"); + } } //! Executes the Wrapping Up state.