You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
575 lines
17 KiB
575 lines
17 KiB
|
|
/* USER CODE BEGIN Header */
|
|
/**
|
|
******************************************************************************
|
|
* File Name : App/app_zigbee.c
|
|
* Description : Zigbee Application.
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
|
|
* All rights reserved.</center></h2>
|
|
*
|
|
* This software component is licensed by ST under Ultimate Liberty license
|
|
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at:
|
|
* www.st.com/SLA0044
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
/* USER CODE END Header */
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "app_common.h"
|
|
#include "app_entry.h"
|
|
#include "dbg_trace.h"
|
|
#include "app_zigbee.h"
|
|
#include "zigbee_interface.h"
|
|
#include "shci.h"
|
|
#include "stm_logging.h"
|
|
#include "app_conf.h"
|
|
#include "stm32wbxx_core_interface_def.h"
|
|
#include "zigbee_types.h"
|
|
#include "stm32_seq.h"
|
|
|
|
/* Private includes -----------------------------------------------------------*/
|
|
#include <assert.h>
|
|
#include "zcl/zcl.h"
|
|
#include "zcl/general/zcl.onoff.swconfig.h"
|
|
|
|
/* USER CODE BEGIN Includes */
|
|
/* USER CODE END Includes */
|
|
|
|
/* Private typedef -----------------------------------------------------------*/
|
|
/* USER CODE BEGIN PTD */
|
|
/* USER CODE END PTD */
|
|
|
|
/* Private defines -----------------------------------------------------------*/
|
|
#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
|
|
#define CHANNEL 11
|
|
|
|
#define SW1_ENDPOINT 1
|
|
|
|
/* Onoff_swconfig (endpoint 1) specific defines ------------------------------------------------*/
|
|
#define SWITCH_TYPE_1 ZCL_ONOFF_SWCONFIG_ON_OFF
|
|
/* USER CODE BEGIN Onoff_swconfig (endpoint 1) defines */
|
|
/* USER CODE END Onoff_swconfig (endpoint 1) defines */
|
|
|
|
/* USER CODE BEGIN PD */
|
|
/* USER CODE END PD */
|
|
|
|
/* Private macros ------------------------------------------------------------*/
|
|
/* USER CODE BEGIN PM */
|
|
/* USER CODE END PM */
|
|
|
|
/* External definition -------------------------------------------------------*/
|
|
enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
|
|
|
|
/* USER CODE BEGIN ED */
|
|
/* USER CODE END ED */
|
|
|
|
/* Private function prototypes -----------------------------------------------*/
|
|
static void APP_ZIGBEE_StackLayersInit(void);
|
|
static void APP_ZIGBEE_ConfigEndpoints(void);
|
|
static void APP_ZIGBEE_NwkForm(void);
|
|
|
|
static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
|
|
static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
|
|
|
|
static void Wait_Getting_Ack_From_M0(void);
|
|
static void Receive_Ack_From_M0(void);
|
|
static void Receive_Notification_From_M0(void);
|
|
|
|
/* USER CODE BEGIN PFP */
|
|
/* USER CODE END PFP */
|
|
|
|
/* Private variables ---------------------------------------------------------*/
|
|
static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
|
|
static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
|
|
static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
|
|
static __IO uint32_t CptReceiveNotifyFromM0 = 0;
|
|
static __IO uint32_t CptReceiveRequestFromM0 = 0;
|
|
|
|
PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
|
|
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
|
|
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
|
|
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
|
|
|
|
struct zigbee_app_info {
|
|
bool has_init;
|
|
struct ZigBeeT *zb;
|
|
enum ZbStartType startupControl;
|
|
enum ZbStatusCodeT join_status;
|
|
uint32_t join_delay;
|
|
bool init_after_join;
|
|
|
|
struct ZbZclClusterT *onoff_swconfig_server_1;
|
|
};
|
|
static struct zigbee_app_info zigbee_app_info;
|
|
|
|
/* USER CODE BEGIN PV */
|
|
/* USER CODE END PV */
|
|
/* Functions Definition ------------------------------------------------------*/
|
|
|
|
/**
|
|
* @brief Zigbee application initialization
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void APP_ZIGBEE_Init(void)
|
|
{
|
|
SHCI_CmdStatus_t ZigbeeInitStatus;
|
|
|
|
APP_DBG("APP_ZIGBEE_Init");
|
|
|
|
/* Check the compatibility with the Coprocessor Wireless Firmware loaded */
|
|
APP_ZIGBEE_CheckWirelessFirmwareInfo();
|
|
|
|
/* Register cmdbuffer */
|
|
APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
|
|
|
|
/* Init config buffer and call TL_ZIGBEE_Init */
|
|
APP_ZIGBEE_TL_INIT();
|
|
|
|
/* Register task */
|
|
/* Create the different tasks */
|
|
|
|
UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
|
|
UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
|
|
|
|
/* Task associated with network creation process */
|
|
UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
|
|
|
|
/* USER CODE BEGIN APP_ZIGBEE_INIT */
|
|
/* USER CODE END APP_ZIGBEE_INIT */
|
|
|
|
/* Start the Zigbee on the CPU2 side */
|
|
ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(ZigbeeInitStatus);
|
|
|
|
/* Initialize Zigbee stack layers */
|
|
APP_ZIGBEE_StackLayersInit();
|
|
|
|
} /* APP_ZIGBEE_Init */
|
|
|
|
/**
|
|
* @brief Initialize Zigbee stack layers
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
static void APP_ZIGBEE_StackLayersInit(void)
|
|
{
|
|
APP_DBG("APP_ZIGBEE_StackLayersInit");
|
|
|
|
zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
|
|
assert(zigbee_app_info.zb != NULL);
|
|
|
|
/* Create the endpoint and cluster(s) */
|
|
APP_ZIGBEE_ConfigEndpoints();
|
|
|
|
/* USER CODE BEGIN APP_ZIGBEE_StackLayersInit */
|
|
/* USER CODE END APP_ZIGBEE_StackLayersInit */
|
|
|
|
/* Configure the joining parameters */
|
|
zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
|
|
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
|
|
zigbee_app_info.startupControl = ZbStartTypeForm;
|
|
|
|
/* Initialization Complete */
|
|
zigbee_app_info.has_init = true;
|
|
|
|
/* run the task */
|
|
UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
|
|
} /* APP_ZIGBEE_StackLayersInit */
|
|
|
|
/**
|
|
* @brief Configure Zigbee application endpoints
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
static void APP_ZIGBEE_ConfigEndpoints(void)
|
|
{
|
|
struct ZbApsmeAddEndpointReqT req;
|
|
struct ZbApsmeAddEndpointConfT conf;
|
|
|
|
memset(&req, 0, sizeof(req));
|
|
|
|
/* Endpoint: SW1_ENDPOINT */
|
|
req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
|
|
req.deviceId = ZCL_DEVICE_ONOFF_SWITCH;
|
|
req.endpoint = SW1_ENDPOINT;
|
|
ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
|
|
assert(conf.status == ZB_STATUS_SUCCESS);
|
|
|
|
/* Onoff swconfig server */
|
|
zigbee_app_info.onoff_swconfig_server_1 = ZbZclOnOffSwConfigServerAlloc(zigbee_app_info.zb, SW1_ENDPOINT, SWITCH_TYPE_1);
|
|
assert(zigbee_app_info.onoff_swconfig_server_1 != NULL);
|
|
ZbZclClusterEndpointRegister(zigbee_app_info.onoff_swconfig_server_1);
|
|
|
|
/* USER CODE BEGIN CONFIG_ENDPOINT */
|
|
/* USER CODE END CONFIG_ENDPOINT */
|
|
} /* APP_ZIGBEE_ConfigEndpoints */
|
|
|
|
/**
|
|
* @brief Handle Zigbee network forming and joining
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
static void APP_ZIGBEE_NwkForm(void)
|
|
{
|
|
if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
|
|
{
|
|
struct ZbStartupT config;
|
|
enum ZbStatusCodeT status;
|
|
|
|
/* Configure Zigbee Logging */
|
|
ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
|
|
|
|
/* Attempt to join a zigbee network */
|
|
ZbStartupConfigGetProDefaults(&config);
|
|
|
|
/* Set the centralized network */
|
|
APP_DBG("Network config : APP_STARTUP_CENTRALIZED_COORDINATOR");
|
|
config.startupControl = zigbee_app_info.startupControl;
|
|
|
|
/* Using the default HA preconfigured Link Key */
|
|
memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
|
|
|
|
config.channelList.count = 1;
|
|
config.channelList.list[0].page = 0;
|
|
config.channelList.list[0].channelMask = 1 << CHANNEL; /*Channel in use */
|
|
|
|
/* Using ZbStartupWait (blocking) */
|
|
status = ZbStartupWait(zigbee_app_info.zb, &config);
|
|
|
|
APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
|
|
zigbee_app_info.join_status = status;
|
|
|
|
if (status == ZB_STATUS_SUCCESS) {
|
|
/* USER CODE BEGIN 0 */
|
|
zigbee_app_info.join_delay = 0U;
|
|
}
|
|
else
|
|
{
|
|
/* USER CODE END 0 */
|
|
APP_DBG("Startup failed, attempting again after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
|
|
zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
|
|
}
|
|
}
|
|
|
|
/* If Network forming/joining was not successful reschedule the current task to retry the process */
|
|
if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
|
|
{
|
|
UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
|
|
}
|
|
|
|
/* USER CODE BEGIN NW_FORM */
|
|
/* USER CODE END NW_FORM */
|
|
} /* APP_ZIGBEE_NwkForm */
|
|
|
|
/*************************************************************
|
|
* ZbStartupWait Blocking Call
|
|
*************************************************************/
|
|
struct ZbStartupWaitInfo {
|
|
bool active;
|
|
enum ZbStatusCodeT status;
|
|
};
|
|
|
|
static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
|
|
{
|
|
struct ZbStartupWaitInfo *info = cb_arg;
|
|
|
|
info->status = status;
|
|
info->active = false;
|
|
UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
|
|
} /* ZbStartupWaitCb */
|
|
|
|
enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
|
|
{
|
|
struct ZbStartupWaitInfo *info;
|
|
enum ZbStatusCodeT status;
|
|
|
|
info = malloc(sizeof(struct ZbStartupWaitInfo));
|
|
if (info == NULL) {
|
|
return ZB_STATUS_ALLOC_FAIL;
|
|
}
|
|
memset(info, 0, sizeof(struct ZbStartupWaitInfo));
|
|
|
|
info->active = true;
|
|
status = ZbStartup(zb, config, ZbStartupWaitCb, info);
|
|
if (status != ZB_STATUS_SUCCESS) {
|
|
info->active = false;
|
|
return status;
|
|
}
|
|
UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
|
|
status = info->status;
|
|
free(info);
|
|
return status;
|
|
} /* ZbStartupWait */
|
|
|
|
/**
|
|
* @brief Trace the error or the warning reported.
|
|
* @param ErrId :
|
|
* @param ErrCode
|
|
* @retval None
|
|
*/
|
|
void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
|
|
{
|
|
switch (ErrId) {
|
|
default:
|
|
APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
|
|
break;
|
|
}
|
|
} /* APP_ZIGBEE_Error */
|
|
|
|
/*************************************************************
|
|
*
|
|
* LOCAL FUNCTIONS
|
|
*
|
|
*************************************************************/
|
|
|
|
/**
|
|
* @brief Warn the user that an error has occurred.
|
|
*
|
|
* @param pMess : Message associated to the error.
|
|
* @param ErrCode: Error code associated to the module (Zigbee or other module if any)
|
|
* @retval None
|
|
*/
|
|
static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
|
|
{
|
|
APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
|
|
/* USER CODE BEGIN TRACE_ERROR */
|
|
/* USER CODE END TRACE_ERROR */
|
|
|
|
} /* APP_ZIGBEE_TraceError */
|
|
|
|
/**
|
|
* @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
|
|
* and display associated information
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
|
|
{
|
|
WirelessFwInfo_t wireless_info_instance;
|
|
WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
|
|
|
|
if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
|
|
APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
|
|
}
|
|
else {
|
|
APP_DBG("**********************************************************");
|
|
APP_DBG("WIRELESS COPROCESSOR FW:");
|
|
/* Print version */
|
|
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
|
|
|
|
switch (p_wireless_info->StackType) {
|
|
case INFO_STACK_TYPE_ZIGBEE_FFD:
|
|
APP_DBG("FW Type : FFD Zigbee stack");
|
|
break;
|
|
case INFO_STACK_TYPE_ZIGBEE_RFD:
|
|
APP_DBG("FW Type : RFD Zigbee stack");
|
|
break;
|
|
default:
|
|
/* No Zigbee device supported ! */
|
|
APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
|
|
break;
|
|
}
|
|
APP_DBG("**********************************************************");
|
|
}
|
|
} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
|
|
|
|
/*************************************************************
|
|
*
|
|
* WRAP FUNCTIONS
|
|
*
|
|
*************************************************************/
|
|
|
|
void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
|
|
{
|
|
p_ZIGBEE_otcmdbuffer = p_buffer;
|
|
} /* APP_ZIGBEE_RegisterCmdBuffer */
|
|
|
|
Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
|
|
{
|
|
return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
|
|
} /* ZIGBEE_Get_OTCmdPayloadBuffer */
|
|
|
|
Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
|
|
{
|
|
return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
|
|
} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
|
|
|
|
Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
|
|
{
|
|
return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
|
|
} /* ZIGBEE_Get_NotificationPayloadBuffer */
|
|
|
|
Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
|
|
{
|
|
return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
|
|
}
|
|
|
|
/**
|
|
* @brief This function is used to transfer the commands from the M4 to the M0.
|
|
*
|
|
* @param None
|
|
* @return None
|
|
*/
|
|
void ZIGBEE_CmdTransfer(void)
|
|
{
|
|
Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
|
|
|
|
/* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
|
|
p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
|
|
/* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
|
|
* + ID (4 bytes) + Size (4 bytes) */
|
|
p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
|
|
|
|
TL_ZIGBEE_SendM4RequestToM0();
|
|
|
|
/* Wait completion of cmd */
|
|
Wait_Getting_Ack_From_M0();
|
|
} /* ZIGBEE_CmdTransfer */
|
|
|
|
/**
|
|
* @brief This function is called when the M0+ acknowledge the fact that it has received a Cmd
|
|
*
|
|
*
|
|
* @param Otbuffer : a pointer to TL_EvtPacket_t
|
|
* @return None
|
|
*/
|
|
void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
|
|
{
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(Otbuffer);
|
|
|
|
Receive_Ack_From_M0();
|
|
} /* TL_ZIGBEE_CmdEvtReceived */
|
|
|
|
/**
|
|
* @brief This function is called when notification from M0+ is received.
|
|
*
|
|
* @param Notbuffer : a pointer to TL_EvtPacket_t
|
|
* @return None
|
|
*/
|
|
void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
|
|
{
|
|
p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
|
|
|
|
Receive_Notification_From_M0();
|
|
} /* TL_ZIGBEE_NotReceived */
|
|
|
|
/**
|
|
* @brief This function is called before sending any ot command to the M0
|
|
* core. The purpose of this function is to be able to check if
|
|
* there are no notifications coming from the M0 core which are
|
|
* pending before sending a new ot command.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void Pre_ZigbeeCmdProcessing(void)
|
|
{
|
|
UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
|
|
} /* Pre_ZigbeeCmdProcessing */
|
|
|
|
/**
|
|
* @brief This function waits for getting an acknowledgment from the M0.
|
|
*
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
static void Wait_Getting_Ack_From_M0(void)
|
|
{
|
|
UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
|
|
} /* Wait_Getting_Ack_From_M0 */
|
|
|
|
/**
|
|
* @brief Receive an acknowledgment from the M0+ core.
|
|
* Each command send by the M4 to the M0 are acknowledged.
|
|
* This function is called under interrupt.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
static void Receive_Ack_From_M0(void)
|
|
{
|
|
UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
|
|
} /* Receive_Ack_From_M0 */
|
|
|
|
/**
|
|
* @brief Receive a notification from the M0+ through the IPCC.
|
|
* This function is called under interrupt.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
static void Receive_Notification_From_M0(void)
|
|
{
|
|
CptReceiveNotifyFromM0++;
|
|
UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
|
|
}
|
|
|
|
/**
|
|
* @brief This function is called when a request from M0+ is received.
|
|
*
|
|
* @param Notbuffer : a pointer to TL_EvtPacket_t
|
|
* @return None
|
|
*/
|
|
void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
|
|
{
|
|
p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
|
|
|
|
CptReceiveRequestFromM0++;
|
|
UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
|
|
}
|
|
|
|
/**
|
|
* @brief Perform initialization of TL for Zigbee.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void APP_ZIGBEE_TL_INIT(void)
|
|
{
|
|
ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
|
|
ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
|
|
ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
|
|
TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
|
|
}
|
|
|
|
/**
|
|
* @brief Process the messages coming from the M0.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
|
|
{
|
|
if (CptReceiveNotifyFromM0 != 0) {
|
|
/* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
|
|
if (CptReceiveNotifyFromM0 > 1U) {
|
|
APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
|
|
}
|
|
else {
|
|
Zigbee_CallBackProcessing();
|
|
}
|
|
/* Reset counter */
|
|
CptReceiveNotifyFromM0 = 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Process the requests coming from the M0.
|
|
* @param
|
|
* @return
|
|
*/
|
|
void APP_ZIGBEE_ProcessRequestM0ToM4(void)
|
|
{
|
|
if (CptReceiveRequestFromM0 != 0) {
|
|
Zigbee_M0RequestProcessing();
|
|
CptReceiveRequestFromM0 = 0;
|
|
}
|
|
}
|
|
/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
|
|
/* USER CODE END FD_LOCAL_FUNCTIONS */
|
|
|
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
|
|
|