Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Flipper-Zero/STM32CubeWB.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_LLD/BLE_LLD_Datarate/STM32_WPAN/App/datarate_app.c')
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_LLD/BLE_LLD_Datarate/STM32_WPAN/App/datarate_app.c374
1 files changed, 374 insertions, 0 deletions
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_LLD/BLE_LLD_Datarate/STM32_WPAN/App/datarate_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_LLD/BLE_LLD_Datarate/STM32_WPAN/App/datarate_app.c
new file mode 100644
index 000000000..eba9d980f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_LLD/BLE_LLD_Datarate/STM32_WPAN/App/datarate_app.c
@@ -0,0 +1,374 @@
+/**
+ ******************************************************************************
+ * File Name : datarate_app.c
+ * Description : BLE LLD simple demo to control LEDs remotely
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2019-2021 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stdbool.h"
+#include "app_common.h"
+#include "stm32_seq.h"
+#include "stm32_lpm.h"
+#include "stm_logging.h"
+#include "dbg_trace.h"
+#include "ble_hal.h"
+#include "ipBLE_lld_public.h"
+#include "app_ble_lld.h"
+#include "datarate_app.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+// Allows to pack and unpack user data in payload (must not exceed 255 bytes)
+typedef PACKED_STRUCT
+{
+ uint8_t led;
+} userPayload;
+
+/* Private defines -----------------------------------------------------------*/
+#define CHANNEL 8 // radio channel
+#define POWER TX_POW_PLUS_6_DB // Transmit power
+#define NET_ID 0x5A964129 // network ID, both devices must use the same
+#define WAKEUP_US 10000 // delay before starting radio operation
+#define RX_TIMEOUT_US (1*1000*1000) // max delay radio will listen for a packet
+#define DEBOUNCE_MS 250 // debouncing delay (ms)
+
+/* Private macros ------------------------------------------------------------*/
+
+/* Private function prototypes -----------------------------------------------*/
+static void radioInit(void);
+static void buttonStart(void);
+static void receiveStart(void);
+static void receiveCb(radioEventType cmd, ActionPacket *ap, void *data, uint8_t size);
+static void transmitStart(void);
+static void transmitCbMaster(radioEventType cmd, ActionPacket *ap, void *data, uint8_t size);
+static void transmitCbSlave(radioEventType cmd, ActionPacket *ap, void *data, uint8_t size);
+
+/* Private variables -----------------------------------------------*/
+static ActionPacket apReceiver[ACTION_PACKET_NB];
+static ActionPacket apTransmit[ACTION_PACKET_NB];
+
+uint8_t SwitchOffGPIO_timer_Id;
+dataRate_t dataRateMode = dataRateOff;
+/* Functions Definition ------------------------------------------------------*/
+
+void DATARATE_APP_Init(void)
+{
+ CheckWirelessFirmwareInfo();
+
+ /* Disable low power */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_BLE_LLD, UTIL_LPM_DISABLE);
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE_LLD, UTIL_LPM_DISABLE );
+
+ /* Register tasks for event processing */
+ UTIL_SEQ_RegTask(1<<CFG_TASK_BUTTON, UTIL_SEQ_RFU, buttonStart);
+
+ APP_BLE_LLD_Init();
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &SwitchOffGPIO_timer_Id, hw_ts_SingleShot, Appli_TS_Callback);
+
+ radioInit();
+ //HW_TS_Start(SwitchOffGPIO_timer_Id, (uint32_t)RX_TIMEOUT_US);
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE_LLD, UTIL_LPM_DISABLE ); // TO ENABLE
+
+}
+
+static void radioInit(void)
+{
+ HAL_BLE_LLD_Init(CFG_HS_STARTUP_TIME, true);
+ HAL_BLE_LLD_Configure(POWER, CHANNEL, true, CFG_BACK2BACK_TIME, NET_ID);
+
+ uint32_t wakeup_time = WAKEUP_US;
+
+ uint32_t window_time1 = RX_TIMEOUT_US;
+ uint32_t window_time2 = 400;
+ uint32_t window_time3 = 450;
+
+ // RECEPTION
+ ActionPacket *ap1;
+ // Packet to send
+ ap1 = &apReceiver[APACKET_1];
+ ap1->actionPacketNb = APACKET_1;
+ ap1->StateMachineNo = STATE_MACHINE_0;
+ ap1->ActionTag = TIMER_WAKEUP;
+ ap1->WakeupTime = wakeup_time;
+ ap1->ReceiveWindowLength = window_time1;
+// ap1->data = &payload1;
+// ap1->dataSize = sizeof(payload1);
+ ap1->nextTrue = APACKET_2;
+ ap1->nextFalse = APACKET_1;
+ ap1->callback = receiveCb;
+ BLE_LLD_SetReservedArea(ap1);
+
+ ActionPacket *ap2;
+ // Packet to send
+ ap2 = &apReceiver[APACKET_2];
+ ap2->actionPacketNb = APACKET_2;
+ ap2->StateMachineNo = STATE_MACHINE_0;
+ ap2->ActionTag = 0x0; //TIMER_WAKEUP;
+ ap2->WakeupTime = wakeup_time;
+ ap2->ReceiveWindowLength = window_time2;
+// ap2->data = &payload2;
+// ap2->dataSize = sizeof(payload2);
+ ap2->nextTrue = APACKET_3;
+ ap2->nextFalse = APACKET_3;
+ ap2->callback = receiveCb;
+ BLE_LLD_SetReservedArea(ap2);
+
+ ActionPacket *ap3;
+ // Packet to send
+ ap3 = &apReceiver[APACKET_3];
+ ap3->actionPacketNb = APACKET_3;
+ ap3->StateMachineNo = STATE_MACHINE_0;
+ ap3->ActionTag = 0x0; //TIMER_WAKEUP;
+ ap3->WakeupTime = wakeup_time;
+ ap3->ReceiveWindowLength = window_time2;
+// ap3->data = &payload3;
+// ap3->dataSize = sizeof(payload3);
+ ap3->nextTrue = APACKET_2;
+ ap3->nextFalse = APACKET_2;
+ ap3->callback = receiveCb;
+ BLE_LLD_SetReservedArea(ap3);
+
+ // TRANSMISSION
+ ActionPacket *ap0;
+ // Packet to send
+ ap0 = &apTransmit[APACKET_0];
+ ap0->actionPacketNb = APACKET_0;
+ ap0->StateMachineNo = STATE_MACHINE_0;
+ ap0->ActionTag = TIMER_WAKEUP;
+ ap0->WakeupTime = wakeup_time;
+ ap0->ReceiveWindowLength = window_time1;
+// ap0->data = &payload0;
+// ap0->dataSize = sizeof(payload0);
+ ap0->nextTrue = APACKET_4;
+ ap0->nextFalse = APACKET_6;
+ ap0->callback = transmitCbMaster;
+ BLE_LLD_SetReservedArea(ap0);
+
+ // Slave LED3
+ ActionPacket *ap4;
+ userPayload payload4;
+ payload4.led = LED3;
+ // Packet to transmit
+ ap4 = &apTransmit[APACKET_4];
+ ap4->actionPacketNb = APACKET_4;
+ ap4->StateMachineNo = STATE_MACHINE_0;
+ ap4->ActionTag = TXRX ; //| TIMER_WAKEUP;
+ ap4->WakeupTime = (2*wakeup_time);
+ ap4->data = &payload4;
+ ap4->dataSize = sizeof(payload4);
+ ap4->nextTrue = APACKET_5;
+ ap4->nextFalse = APACKET_5;
+ ap4->callback = transmitCbSlave;
+ BLE_LLD_SetReservedArea(ap4);
+
+ ActionPacket *ap5;
+ // Packet to transmit
+ ap5 = &apTransmit[APACKET_5];
+ ap5->actionPacketNb = APACKET_5;
+ ap5->StateMachineNo = STATE_MACHINE_0;
+ ap5->ActionTag = 0x0; //TIMER_WAKEUP;
+ ap5->WakeupTime = wakeup_time;
+ ap5->ReceiveWindowLength = window_time3;
+// ap5->data = &payload5;
+// ap5->dataSize = sizeof(payload5);
+ ap5->nextTrue = APACKET_4;
+ ap5->nextFalse = APACKET_4;
+ ap5->callback = transmitCbSlave;
+ BLE_LLD_SetReservedArea(ap5);
+
+ // Master LED2
+ ActionPacket *ap6;
+ // Packet to send
+ ap6 = &apTransmit[APACKET_6];
+ ap6->actionPacketNb = APACKET_6;
+ ap6->StateMachineNo = STATE_MACHINE_0;
+ ap6->ActionTag = 0x0; //TIMER_WAKEUP;
+ ap6->WakeupTime = wakeup_time;
+ ap6->ReceiveWindowLength = window_time3;
+// ap6->data = &payload6;
+// ap6->dataSize = sizeof(payload6);
+ ap6->nextTrue = APACKET_7;
+ ap6->nextFalse = APACKET_7;
+ ap6->callback = transmitCbMaster;
+ BLE_LLD_SetReservedArea(ap6);
+
+ ActionPacket *ap7;
+ userPayload payload7;
+ payload7.led = LED2;
+ // Packet to send
+ ap7 = &apTransmit[APACKET_7];
+ ap7->actionPacketNb = APACKET_7;
+ ap7->StateMachineNo = STATE_MACHINE_0;
+ ap7->ActionTag = TXRX; //| TIMER_WAKEUP;
+ ap7->WakeupTime = (2*wakeup_time);
+ ap7->data = &payload7;
+ ap7->dataSize = sizeof(payload7);
+ ap7->nextTrue = APACKET_6;
+ ap7->nextFalse = APACKET_6;
+ ap7->callback = transmitCbMaster;
+ BLE_LLD_SetReservedArea(ap7);
+
+}
+
+uint8_t led1Toggle=0;
+uint8_t led2Toggle=0;
+uint8_t led3Toggle=0;
+
+static void receiveStart(void)
+{
+ BLE_LLD_MakeActionPacketPending(&apReceiver[APACKET_1]);
+}
+
+static void receiveCb(radioEventType cmd, ActionPacket *ap, void *data, uint8_t size)
+{
+ userPayload *payload = data;
+ Led_TypeDef led;
+ if ((cmd == RX_OK_READY) | (cmd == RX_OK_BUSY)){
+ led = (Led_TypeDef)payload->led;
+ if (led != LED1 && led != LED2 && led != LED3){
+ }else if (led==LED1){
+ if(led1Toggle==100)
+ {
+ led1Toggle=0;
+ BSP_LED_Off(LED2);
+ BSP_LED_Toggle(LED1);
+ } else {
+ led1Toggle++;
+ }
+ }else if (led==LED2){
+ if(led2Toggle==100)
+ {
+ led2Toggle=0;
+ BSP_LED_Off(LED1);
+ BSP_LED_Toggle(LED2);
+ } else {
+ led2Toggle++;
+ }
+ }else if (led==LED3){
+ if(led3Toggle==100)
+ {
+ led3Toggle=0;
+ BSP_LED_Toggle(LED3);
+ } else {
+ led3Toggle++;
+ }
+ }
+ }
+}
+
+int16_t ledChange=0;
+Led_TypeDef ledSwap = LED1;
+
+static void transmitStart(void)
+{
+ BLE_LLD_MakeActionPacketPending(&apTransmit[APACKET_0]);
+}
+
+static void transmitCbMaster(radioEventType cmd, ActionPacket *ap, void *data, uint8_t size)
+{
+ userPayload *payload = data;
+ Led_TypeDef led;
+ if ((cmd == RX_OK_READY) | (cmd == RX_OK_BUSY)){
+ led = (Led_TypeDef)payload->led;
+ if (led != LED1 && led != LED2 && led != LED3){
+ }else{
+ if(led3Toggle==100)
+ {
+ led3Toggle=0;
+ BSP_LED_Toggle(LED3);
+ } else {
+ led3Toggle++;
+ }
+ }
+ }
+ if ((cmd == TX_OK_READY) | (cmd == TX_OK_BUSY)){
+ if(ledChange==1000)
+ {
+ userPayload payloadSwap;
+ ledChange=0;
+ if (ledSwap == LED1){
+ payloadSwap.led = LED2;
+ ledSwap = LED2;
+ } else {
+ payloadSwap.led = LED1;
+ ledSwap = LED1;
+ }
+ ap->data = &payloadSwap;
+ BLE_LLD_SetReservedArea(ap);
+ }
+ ledChange++;
+ }
+}
+
+static void transmitCbSlave(radioEventType cmd, ActionPacket *ap, void *data, uint8_t size)
+{
+ userPayload *payload = data;
+ Led_TypeDef led;
+ if ((cmd == RX_OK_READY) | (cmd == RX_OK_BUSY)){
+ led = (Led_TypeDef)payload->led;
+ if (led != LED1 && led != LED2 && led != LED3){
+ }else if (led==LED1){
+ if(led1Toggle==100)
+ {
+ led1Toggle=0;
+ BSP_LED_Off(LED2);
+ BSP_LED_Toggle(LED1);
+ } else {
+ led1Toggle++;
+ }
+ }else if (led==LED2){
+ if(led2Toggle==100)
+ {
+ led2Toggle=0;
+ BSP_LED_Off(LED1);
+ BSP_LED_Toggle(LED2);
+ } else {
+ led2Toggle++;
+ }
+ }
+ }
+}
+
+static void buttonStart(void)
+{
+ radioInit();
+ if(dataRateMode==dataRateReceive)
+ {
+ receiveStart() ;
+ } else if (dataRateMode==dataRateTransmit) {
+ transmitStart() ;
+ } else {
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE_LLD, UTIL_LPM_ENABLE ); // TO ENABLE
+ HW_TS_Start(SwitchOffGPIO_timer_Id, (uint32_t)RX_TIMEOUT_US);
+ }
+}
+
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ BLE_LLD_StopActivity();
+ switch (GPIO_Pin){
+ case BUTTON_SW1_PIN: dataRateMode = dataRateReceive; break;
+ case BUTTON_SW2_PIN: dataRateMode = dataRateTransmit; break;
+ case BUTTON_SW3_PIN: dataRateMode = dataRateOff; break;
+ default: return;
+ }
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON, CFG_SCH_PRIO_0);
+}
+
+void Appli_TS_Callback(void)
+{
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON, CFG_SCH_PRIO_0);
+}
+