📄 lightbulb.c
字号:
* None.
****************************************************************************/
PRIVATE void vProcessEventQueues(void)
{
MAC_MlmeDcfmInd_s *psMlmeInd;
MAC_McpsDcfmInd_s *psMcpsInd;
AppQApiHwInd_s *psAHI_Ind;
/* Check for anything on the MCPS upward queue */
do
{
psMcpsInd = psAppQApiReadMcpsInd();
if (psMcpsInd != NULL)
{
vProcessIncomingData(psMcpsInd);
vAppQApiReturnMcpsIndBuffer(psMcpsInd);
}
} while (psMcpsInd != NULL);
/* Check for anything on the MLME upward queue */
do
{
psMlmeInd = psAppQApiReadMlmeInd();
if (psMlmeInd != NULL)
{
vProcessIncomingMlme(psMlmeInd);
vAppQApiReturnMlmeIndBuffer(psMlmeInd);
}
} while (psMlmeInd != NULL);
/* Check for anything on the AHI upward queue */
do
{
psAHI_Ind = psAppQApiReadHwInd();
if (psAHI_Ind != NULL)
{
vProcessIncomingHwEvent(psAHI_Ind);
vAppQApiReturnHwIndBuffer(psAHI_Ind);
}
} while (psAHI_Ind != NULL);
}
/****************************************************************************
*
* NAME: vProcessIncomingMlme
*
* DESCRIPTION:
* Process any incoming managment events from the stack.
*
* PARAMETERS: Name RW Usage
* psMlmeInd
*
* RETURNS:
* None.
*
* NOTES:
* None.
****************************************************************************/
PRIVATE void vProcessIncomingMlme(MAC_MlmeDcfmInd_s *psMlmeInd)
{
switch(psMlmeInd->u8Type)
{
case MAC_MLME_IND_ASSOCIATE:
/* Only allow nodes to associate if network has been started */
if (sCoordData.sSystem.eState == E_STATE_RUNNING_LIGHT_BULB_APP)
{
vHandleNodeAssociation(psMlmeInd);
}
break;
}
}
/****************************************************************************
*
* NAME: vProcessIncomingData
*
* DESCRIPTION:
* Process incoming data events from the stack.
*
* PARAMETERS: Name RW Usage
* psMcpsInd
*
* RETURNS:
* None.
*
* NOTES:
* None.
****************************************************************************/
PRIVATE void vProcessIncomingData(MAC_McpsDcfmInd_s *psMcpsInd)
{
MAC_RxFrameData_s *psFrame;
uint16 u16NodeAddr;
psFrame = &psMcpsInd->uParam.sIndData.sFrame;
/* Check that this is a data frame */
if (psMcpsInd->u8Type == MAC_MCPS_IND_DATA)
{
/* Check that data is from one of the light switches */
u16NodeAddr = psFrame->sSrcAddr.uAddr.u16Short;
if ((u16NodeAddr == sCoordData.sNode.asAssocNodes[0].u16ShortAddr)
|| (u16NodeAddr == sCoordData.sNode.asAssocNodes[1].u16ShortAddr))
{
/* Toggle light bulb */
if (bLightBulbState == OFF)
{
vLightBulb(ON);
}
else
{
vLightBulb(OFF);
}
}
}
}
/****************************************************************************
*
* NAME: vProcessIncomingHwEvent
*
* DESCRIPTION:
* Process any hardware events.
*
* PARAMETERS: Name RW Usage
* psAHI_Ind
*
* RETURNS:
* None.
*
* NOTES:
* None.
****************************************************************************/
PRIVATE void vProcessIncomingHwEvent(AppQApiHwInd_s *psAHI_Ind)
{
/* No hardware events generated to nothing to be done here */
}
/****************************************************************************
*
* NAME: vHandleNodeAssociation
*
* DESCRIPTION:
* Handle request by node to join the network. If the nodes address matches
* the address of a light switch then it is assumed to be a light switch and
* is allowed to join the network.
*
* PARAMETERS: Name RW Usage
* psMlmeInd
*
* RETURNS:
* None.
*
* NOTES:
* None.
****************************************************************************/
PRIVATE void vHandleNodeAssociation(MAC_MlmeDcfmInd_s *psMlmeInd)
{
MAC_MlmeReqRsp_s sMlmeReqRsp;
MAC_MlmeSyncCfm_s sMlmeSyncCfm;
uint16 u16ShortAddress;
uint32 u32AddrLo;
uint32 u32AddrHi;
/* Default to PAN access denied */
uint8 u8AssocStatus = 2;
/* Default short address */
u16ShortAddress = 0xffff;
/* Check that the node wanting to associate is one of the light switch
devices by checking its extended address */
u32AddrLo = psMlmeInd->uParam.sIndAssociate.sDeviceAddr.u32L;
u32AddrHi = psMlmeInd->uParam.sIndAssociate.sDeviceAddr.u32H;
/* Check that the device only wants to use a short address */
if (psMlmeInd->uParam.sIndAssociate.u8Capability & 0x80)
{
if (sCoordData.sNode.u8AssociatedNodes < MAX_LIGHT_SWITCHES)
{
/* Allocate short address as next in list */
u16ShortAddress = LIGHT_SWITCH_NODE_ADDR_BASE + sCoordData.sNode.u8AssociatedNodes;
/* Store details for future use */
sCoordData.sNode.asAssocNodes[sCoordData.sNode.u8AssociatedNodes].u32ExtAddrHi = u32AddrHi;
sCoordData.sNode.asAssocNodes[sCoordData.sNode.u8AssociatedNodes].u32ExtAddrLo = u32AddrLo;
sCoordData.sNode.asAssocNodes[sCoordData.sNode.u8AssociatedNodes].u16ShortAddr = u16ShortAddress;
sCoordData.sNode.u8AssociatedNodes++;
/* Assume association succeeded */
u8AssocStatus = 0;
if (sCoordData.sNode.u8AssociatedNodes == 1)
{
vAHI_DioSetOutput(0, (LIGHTBULB_LED_1_MASK + LIGHTBULB_LED_2_MASK));
}
else if (sCoordData.sNode.u8AssociatedNodes == 2)
{
vAHI_DioSetOutput(0, (LIGHTBULB_LED_1_MASK + LIGHTBULB_LED_2_MASK + LIGHTBULB_LED_3_MASK));
}
}
}
/* Create association response */
sMlmeReqRsp.u8Type = MAC_MLME_RSP_ASSOCIATE;
sMlmeReqRsp.u8ParamLength = sizeof(MAC_MlmeRspAssociate_s);
memcpy(&sMlmeReqRsp.uParam.sRspAssociate.sDeviceAddr,
&psMlmeInd->uParam.sIndAssociate.sDeviceAddr,
MAC_EXT_ADDR_LEN);
sMlmeReqRsp.uParam.sRspAssociate.u16AssocShortAddr = u16ShortAddress;
sMlmeReqRsp.uParam.sRspAssociate.u8Status = u8AssocStatus;
sMlmeReqRsp.uParam.sRspAssociate.u8SecurityEnable = FALSE;
/* Send association response. There is no confirmation for an association
response, hence no need to check */
vAppApiMlmeRequest(&sMlmeReqRsp, &sMlmeSyncCfm);
}
/****************************************************************************
*
* NAME: bStartCoordinator
*
* DESCRIPTION:
* Starts the network by configuring the controller board to act as the PAN
* coordinator.
*
* PARAMETERS: Name RW Usage
* None.
*
* RETURNS:
* TRUE if network was started successfully otherwise FALSE
*
* NOTES:
* None.
****************************************************************************/
PRIVATE bool_t bStartCoordinator(void)
{
/* Structures used to hold data for MLME request and response */
MAC_MlmeReqRsp_s sMlmeReqRsp;
MAC_MlmeSyncCfm_s sMlmeSyncCfm;
/* Start Pan */
sMlmeReqRsp.u8Type = MAC_MLME_REQ_START;
sMlmeReqRsp.u8ParamLength = sizeof(MAC_MlmeReqStart_s);
sMlmeReqRsp.uParam.sReqStart.u16PanId = PAN_ID;
//sMlmeReqRsp.uParam.sReqStart.u8Channel = sCoordData.sSystem.u8Channel;
sMlmeReqRsp.uParam.sReqStart.u8Channel = 0x0B;
sMlmeReqRsp.uParam.sReqStart.u8BeaconOrder = 0x0f; /* No beacons */
sMlmeReqRsp.uParam.sReqStart.u8SuperframeOrder = 0x0f;
sMlmeReqRsp.uParam.sReqStart.u8PanCoordinator = TRUE;
sMlmeReqRsp.uParam.sReqStart.u8BatteryLifeExt = FALSE;
sMlmeReqRsp.uParam.sReqStart.u8Realignment = FALSE;
sMlmeReqRsp.uParam.sReqStart.u8SecurityEnable = FALSE;
vAppApiMlmeRequest(&sMlmeReqRsp, &sMlmeSyncCfm);
if (sMlmeSyncCfm.u8Status != MAC_MLME_CFM_OK)
{
/* Error during MLME-Start */
return(FALSE);
}
return(TRUE);
}
/****************************************************************************
*
* NAME: vLightBulb
*
* DESCRIPTION:
* Set the state of the light bulb to ON or OFF.
*
* PARAMETERS: Name RW Usage
* bState
*
* RETURNS:
* None.
*
* NOTES:
* None.
****************************************************************************/
PRIVATE void vLightBulb(bool_t bState)
{
if (bState)
{
vAHI_DioSetOutput(0, LIGHTBULB_LED_OUTPUTS_MASK);
bLightBulbState = ON;
}
else
{
vAHI_DioSetOutput(LIGHTBULB_LED_OUTPUTS_MASK, 0);
bLightBulbState = OFF;
}
}
/****************************************************************************/
/*** END OF FILE ***/
/****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -