⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 endpoint.c.bak

📁 代码为Jennic的基于IEEE802.15.4协议栈星型网源代码
💻 BAK
📖 第 1 页 / 共 3 页
字号:
            {                /* Try, try again */                vStartAssociate();            }            break;        case E_STATE_ASSOC_TO_SCAN:            vStartScan();            break;        default:            break;        }        break;    case MAC_MLME_IND_BEACON_NOTIFY:        /* Beacon has arrived. If in sync'ing mode, should only see this           once synchronisation has been achieved. If running, use this           to time reading of sensors. In other states, ignore it */        switch (sDemoData.sSystem.eState)        {        case E_STATE_SYNCING:            /* Can now associate */            vStartAssociate();            break;        case E_STATE_RUNNING:            /* Process received data in beacon payload */            vProcessRxBeacon(psMlmeInd);            break;        default:            break;        }        break;    case MAC_MLME_IND_SYNC_LOSS:        /* Lost sync with coordinator so try to find coordinator again */        if (sDemoData.sSystem.eState != E_STATE_ASSOCIATING)        {            vStartScan();        }        else        {            sDemoData.sSystem.eState = E_STATE_ASSOC_TO_SCAN;        }        break;    default:        break;    }}/**************************************************************************** * * NAME: bProcessKeyPress * * DESCRIPTION: * Porcesses buttons, to turn on or off the remote switch or to detect a * reset request. * * RETURNS: * TRUE if reset combination detected. * ****************************************************************************/PRIVATE bool_t bProcessKeyPress(void){    uint8  u8KeysDown;    /* Check for key press. We don't bother with a debouce       algorithm as in all cases repeated presses have same effect       anyway. We also don't bother to check that the hardware       interrupt was caused by a key press */    u8KeysDown = u8ButtonReadRfd();    /* Keys control virtual switch value that is passed to the central       controller */    switch (u8KeysDown)    {    case E_KEY_0:        sDemoData.sControls.u8Switch = 0;        break;    case E_KEY_1:        sDemoData.sControls.u8Switch = 1;        break;    }    /* Return TRUE if both keys are pressed at once, to indicate that a       soft reset is required */    return (u8KeysDown == E_KEYS_0_AND_1);}/**************************************************************************** * * NAME: vProcessRead * * DESCRIPTION: * Gets the current readings from each sensor. If the light level causes the * low light alarm to be triggered, an LED is illuminated. * * RETURNS: * void * * NOTES: * This is not an efficient way to read the sensors as much time is wasted * waiting for the humidity and temperature sensor to complete. The sensor * pulls a DIO line low when it is ready, and this could be used to generate * an interrupt to indicate when data is ready to be read. * ****************************************************************************/PRIVATE void vProcessRead(void){    /* Read light level, adjust to range 0-6 in a slightly non-linear way */    sDemoData.sSensors.u8AlsResult = u8FindMin((uint8)(u16ALSreadChannelResult() >> 9), 6);    /* Set LED 1 based on light level */    if ((sDemoData.sSensors.u8AlsResult <= sDemoData.sControls.u8LightAlarmLevel)        && (sDemoData.sControls.u8LightAlarmLevel < 7))    {        vLedControl(1, TRUE);    }    else    {        vLedControl(1, FALSE);    }    /* Read temperature, 0-52 are acceptable. Polls until result received */    vHTSstartReadTemp();    sDemoData.sSensors.u8TempResult = u8FindMin((uint8)u16HTSreadTempResult(), 52);    /* Read humidity, 0-104 are acceptable. Polls until result received */    vHTSstartReadHumidity();    sDemoData.sSensors.u8HtsResult = u8FindMin((uint8)u16HTSreadHumidityResult(), 104);}/**************************************************************************** * * NAME: vProcessTxBlock * * DESCRIPTION: * Creates an MCPS request to transmit a frame and passes it to the 802.15.4 * stack. The payload contains sensor information. * * RETURNS: * void * ****************************************************************************/PRIVATE void vProcessTxBlock(void){    MAC_McpsReqRsp_s  sMcpsReqRsp;    MAC_McpsSyncCfm_s sMcpsSyncCfm;    uint8 *pu8Payload;    /* Create frame transmission request */    sMcpsReqRsp.u8Type = MAC_MCPS_REQ_DATA;    sMcpsReqRsp.u8ParamLength = sizeof(MAC_McpsReqData_s);    /* Set handle so we can match confirmation to request */    sMcpsReqRsp.uParam.sReqData.u8Handle = sDemoData.sTransceiver.u8CurrentTxHandle;    /* Use short address for source */    sMcpsReqRsp.uParam.sReqData.sFrame.sSrcAddr.u8AddrMode = 2;    sMcpsReqRsp.uParam.sReqData.sFrame.sSrcAddr.u16PanId = DEMO_PAN_ID;    sMcpsReqRsp.uParam.sReqData.sFrame.sSrcAddr.uAddr.u16Short = sDemoData.sSystem.u16ShortAddr;    /* Use short address for destination */    sMcpsReqRsp.uParam.sReqData.sFrame.sDstAddr.u8AddrMode = 2;    sMcpsReqRsp.uParam.sReqData.sFrame.sDstAddr.u16PanId = DEMO_PAN_ID;    sMcpsReqRsp.uParam.sReqData.sFrame.sDstAddr.uAddr.u16Short = DEMO_COORD_ADDR;    /* Frame requires ack but not security, indirect transmit or GTS */    sMcpsReqRsp.uParam.sReqData.sFrame.u8TxOptions = MAC_TX_OPTION_ACK;    /* Payload is 8 bytes (room for expansion) and contains:         ID byte so coordinator knows this is sensor information         Previous beacon sequence number (for debug, can tell if beacon missed)         Virtual switch value         Sensor values: temp, humidity, light    */    sMcpsReqRsp.uParam.sReqData.sFrame.u8SduLength = 8;    pu8Payload = sMcpsReqRsp.uParam.sReqData.sFrame.au8Sdu;    pu8Payload[0] = DEMO_ENDPOINT_IDENTIFIER;    pu8Payload[1] = sDemoData.sTransceiver.u8PrevRxBsn;    pu8Payload[2] = sDemoData.sControls.u8Switch;    pu8Payload[3] = sDemoData.sSensors.u8TempResult;    pu8Payload[4] = sDemoData.sSensors.u8HtsResult;    pu8Payload[5] = sDemoData.sSensors.u8AlsResult;    /* Request transmit */    vAppApiMcpsRequest(&sMcpsReqRsp, &sMcpsSyncCfm);}/**************************************************************************** * * NAME: vProcessRxBeacon * * DESCRIPTION: * Processes the beacon payload received from the coordinator. Checks that * it is valid for the demo (8 bytes, with an identifier in the first byte) * then stores data passed from coordinator (light level alarm, remote switch * value). After processing reception, calls vProcessTxBlock to send a frame * back. * * PARAMETERS:      Name            RW  Usage *                  psMlmeInd       R   Pointer to MLME event structure * * RETURNS: * void * ****************************************************************************/PRIVATE void vProcessRxBeacon(MAC_MlmeDcfmInd_s *psMlmeInd){    uint8 *pu8Payload;    uint8 u8RxVal;    uint8 u8Bsn;    /* There has been a beacon notify, so get configuration from beacon       payload and re-synchronise timing */    if ((psMlmeInd->uParam.sIndBeacon.u8SDUlength != 8)        || (psMlmeInd->uParam.sIndBeacon.u8SDU[0] != DEMO_BEACON_IDENTIFIER))    {        /* Not the payload we were looking for */        return;    }    pu8Payload = psMlmeInd->uParam.sIndBeacon.u8SDU;    /* Store beacon sequence number */    u8Bsn = psMlmeInd->uParam.sIndBeacon.u8BSN;    /* Read local 'relay' control and light low alarm level, as specified by       the user at the coordinator. Relay control is emulated by illuminating       an LED on the board */    u8RxVal = pu8Payload[1 + sDemoData.sSystem.u8ThisNode];    vLedControl(0, (bool_t)(u8RxVal & 0x01));    sDemoData.sControls.u8LightAlarmLevel = (u8RxVal >> 1) & 0x7;    if (((uint8)(u8Bsn - sDemoData.sTransceiver.u8PrevRxBsn)) > 7)    {        sDemoData.sTransceiver.u8PrevRxBsn = u8Bsn;        /* Respond to beacon by sending a frame and changing state to wait for           it to complete */        vProcessTxBlock();        sDemoData.sSystem.eState = E_STATE_TX_DATA;    }}/**************************************************************************** * * NAME: u8FindMin * * DESCRIPTION: * Returns the smallest of two values. * * PARAMETERS:      Name    RW  Usage *                  u8Val1  R   First value to compare *                  u8Val2  R   Second value to compare * * RETURNS: * uint8, lowest of two input values * ****************************************************************************/PRIVATE uint8 u8FindMin(uint8 u8Val1, uint8 u8Val2){    if (u8Val1 < u8Val2)    {        return u8Val1;    }    return u8Val2;}/**************************************************************************** * * NAME: vDisplayError * * DESCRIPTION: * Used to display fatal errors, by sending them to UART0 if this approach * has been enabled at compile time. * * Sits in an endless loop afterwards. * * PARAMETERS:      Name            RW  Usage *                  pcErrorMessage  R   Message to display *                  u32Data         R   Data to display * * RETURNS: * void, never returns * ****************************************************************************/PRIVATE void vDisplayError(char *pcErrorMessage, uint32 u32Data){#ifdef UART0_DEBUG    vDebug(pcErrorMessage);    vDisplayHex(u32Data, 8);#endif    /* Fatal error has occurred, so loop indefinitely */    while (1);}/**************************************************************************** * * NAME: vDebug * * DESCRIPTION: * Sends a string to UART0 using the hardware API. * * PARAMETERS:      Name            RW  Usage *                  pcMessage       R   Null-terminated message to send * * RETURNS: * void * ****************************************************************************/#ifdef UART0_DEBUGPRIVATE void vDebug(char *pcMessage){    while (*pcMessage)    {        while ((u8AHI_UartReadLineStatus(0) & 0x20) == 0);        vAHI_UartWriteData(0, *pcMessage);        pcMessage++;    }}PRIVATE void vDisplayHex(uint32 u32Data, int iSize){    char acValue[9];    char *pcString = acValue;    uint8 u8Nybble;    int i, j;    j = 0;    for (i = (iSize << 2) - 4; i >= 0; i -= 4)    {        u8Nybble = (uint8)((u32Data >> i) & 0x0f);        u8Nybble += 0x30;        if (u8Nybble > 0x39)            u8Nybble += 7;        *pcString = u8Nybble;        pcString++;    }    *pcString = '\0';    vDebug(acValue);}#endif/****************************************************************************//***        END OF FILE                                                   ***//****************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -