📄 lightbulb.c
字号:
{
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)
{
vLedControl(LED1, TRUE);
vLedControl(LED2, TRUE);
}
else if (sCoordData.sNode.u8AssociatedNodes == 2)
{
vLedControl(LED1, TRUE);
vLedControl(LED2, TRUE);
vLedControl(LED3, TRUE);
}
}
}
/* 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.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)
{
vLedControl(LED1, TRUE);
vLedControl(LED2, TRUE);
vLedControl(LED3, TRUE);
vLedControl(LED4, TRUE);
bLightBulbState = ON;
}
else
{
vLedControl(LED1, FALSE);
vLedControl(LED2, FALSE);
vLedControl(LED3, FALSE);
vLedControl(LED4, FALSE);
bLightBulbState = OFF;
}
}
/****************************************************************************
*
* NAME: vInitUart
*
* DESCRIPTION:
* Initialise the UART
*
* RETURNS:
* None.
*
****************************************************************************/
PRIVATE void vInitUart(void)
{
/* Enable UART 0: 19200-8-N-1 */
vAHI_UartEnable(E_AHI_UART_0);
vAHI_UartReset(E_AHI_UART_0, TRUE, TRUE);
vAHI_UartReset(E_AHI_UART_0, FALSE, FALSE);
vAHI_UartSetClockDivisor(E_AHI_UART_0, E_AHI_UART_RATE_19200);
vAHI_UartSetControl(E_AHI_UART_0, FALSE, FALSE, E_AHI_UART_WORD_LEN_8, TRUE, FALSE);
vAHI_UartSetInterrupt(E_AHI_UART_0, FALSE, FALSE, FALSE, TRUE, E_AHI_UART_FIFO_LEVEL_1);
vPrintString("uart on\r\n");
}
/****************************************************************************
*
* NAME: vPrintString
*
* DESCRIPTION:
* Sends a string to the circular buffer ready for printing to the UART.
*
* PARAMETERS: Name RW Usage
* pcMessage R Null-terminated message to send
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vPrintString(char *pcMessage)
{
while (*pcMessage)
{
while ((u8AHI_UartReadLineStatus(0) & 0x20) == 0);
vAHI_UartWriteData(0, *pcMessage);
pcMessage++;
}
}
/****************************************************************************/
/*** END OF FILE ***/
/****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -