📄 end_dev.c
字号:
//-----------------------------------------------------------------------------
//
// file: end_dev.c
// description: demonstration program, end device function
// Version: 1.0
//
//-------------------------------------------------------------------------------
#pragma SFR
#pragma NOP
#pragma STOP
#pragma HALT
#pragma DI
#pragma EI
///////////////////////////////////////////////////////////////////////////////
// Include
#include "../include/config.h"
#include <stdio.h>
#include <mac_headers.h>
#include "../include/780547.h"
#include "../include/mac_def.h"
///////////////////////////////////////////////////////////////////////////////
// prototype
int UART_StartTx(char *buffer);
///////////////////////////////////////////////////////////////////////////////
// extern
extern volatile WORD g_myShortAddr;
extern WORD g_PanId; // The PAN ID
extern ADDRESS g_coordAddr; // Address of the Coordinator
extern BYTE pTxBuffer[PACKET_LENGTH];
extern BOOL g_KeyPush;
extern BYTE g_KeyMap;
extern BOOL g_DataConfirm;
extern MAC_ENUM g_DataStatus;
///extern UINT32 test;////
///extern char str[10];///
//-------------------------------------------------------------------
// Init End-Device (Data transmitter side)
void InitEndDevice() // __fn__
{
BYTE i,j;
MAC_ENUM status;
MAC_SCAN_RESULT scanResult; // Scan result (can overlap with the beacon payload or the MSDU buffer)
PAN_DESCRIPTOR *pPanDescriptor;
BYTE setAttributeValue;
char s[60];
LED_ON(LED3); // LED3 is ON when End device.
/////////////////////////////////////////////////////////////////
// Initialize variable
g_myShortAddr = 0xFFFF;
WDTE = 0xAC; // Reset Watch Dog Timer
LED_ON(LED4);
// Scan of the Coordinator
///UART_StartTx("\r\n-- Start mlmeScanRequest");
///sprintf(str, "\n%d\n", test);///
///UART_StartTx(str);///
///halWait(1000);///
do {
status = mlmeScanRequest(
ACTIVE_SCAN, // Scan type
MSC_VALID_CHANNELS, // Scan channel
SCAN_DURATION, // Scan duration
&scanResult); // scan result
UART_StartTx("."); // display scan times
} while ( status != SUCCESS );
UART_StartTx("\r\n\r\n-- finish mlmeScanRequest....\r\n>");
for (i = 0; i < scanResult.resultListSize; i++) {
pPanDescriptor = &scanResult.sf.pPANDescriptorList[i];
if (pPanDescriptor->superframeSpec & SS_ASSOCIATION_PERMIT_BM) {
break;
} // if
} // for
/* Check Association Permit */
if ((pPanDescriptor->superframeSpec & SS_ASSOCIATION_PERMIT_BM) == 0 ) {
UART_StartTx("\r\n-- ERROR: Coodinator could not permit Associate.\r\n>");
while (1);
}
/* Check Beacon Order */
if ((pPanDescriptor->superframeSpec & SS_BEACON_ORDER_BM) != 15) {
UART_StartTx("\r\n-- mlmeSyncRequest\r\n>");
mlmeSyncRequest(
pPanDescriptor->logicalChannel, // Channel
TRUE); // TrackBeacon ?
} else {
UART_StartTx("\r\n-- ERROR: Coodinator shall not transmit Beacon.\r\n>");
while (1) ;
}
/////////////////////////////////////////////////////////////////
// Get PAN_ID & Short Address
memcpy(&g_coordAddr, &(pPanDescriptor->coordAddress), sizeof(ADDRESS));
LED_OFF(LED3) ;
g_PanId = pPanDescriptor->coordPanId;
g_coordAddr.Short = pPanDescriptor->coordAddress.Short;
sprintf(s, "\r\n-- PAN ID : 0x%x, Coodinator Address : 0x%x\r\n>", g_PanId, g_coordAddr.Short);
UART_StartTx(s);
/////////////////////////////////////////////////////////////////
// Setting MAC Layer
setAttributeValue = TRUE ;
mlmeSetRequest(MAC_RX_ON_WHEN_IDLE, &setAttributeValue); // Receive OK, while Idle
mlmeSetRequest(MAC_PAN_ID, &g_PanId);
setAttributeValue = (BYTE) BF(pPanDescriptor->superframeSpec, SS_BEACON_ORDER_BM, SS_BEACON_ORDER_IDX);
mlmeSetRequest(MAC_BEACON_ORDER, &setAttributeValue);
setAttributeValue = (BYTE) BF(pPanDescriptor->superframeSpec, SS_SUPERFRAME_ORDER_BM, SS_SUPERFRAME_ORDER_IDX);
mlmeSetRequest(MAC_SUPERFRAME_ORDER, &setAttributeValue);
UART_StartTx("\r\n-- Start mlmeAssociateRequest, and Waiting for my address.\r\n>");
mlmeAssociateRequest(
// CHANNEL_NO, // Logical Channel No
pPanDescriptor->logicalChannel, // Logical Channel No
AM_SHORT_16, // AddressMode for Coordinator
g_PanId, // PAN_ID for Coordinator
&g_coordAddr, // Pointer of Coordinatior Address
(CI_DEVICE_TYPE_IS_FFD_BM | CI_POWER_SOURCE_BM | CI_RX_ON_WHEN_IDLE_BM), // Capability Information
FALSE); // Security
// Waiting for deciding myAddress
while(g_myShortAddr == 0xFFFF);
LED_OFF(LED4);
UART_StartTx("\r\n\r\n-- finish mlmeAssociateRequest....\r\n>");
}
//-------------------------------------------------------------------
// End-Device proc.
void EndDevProc() // __fn__
{
BOOL send;
//-------------------------------------------------
// Sense of Key Info
if (g_KeyPush) {
send = FALSE;
memset(pTxBuffer, 0, PACKET_LENGTH); // Initialize the Transmitting Packet
// SW4 pushed
if (g_KeyMap & BIT01) {
UART_StartTx("\r\n-- mcpsDataRequest SW4.\r\n>");
send = pTxBuffer[0] = TRUE;
}
// SW3 pushed
if (g_KeyMap & BIT00) {
UART_StartTx("\r\n-- mcpsDataRequest SW3.\r\n>");
send = pTxBuffer[1] = TRUE;
}
/////////////////////////////////////////////////////////
// Transmitting the Switch Info.
if (send) {
mcpsDataRequest(
SRC_ADDR_SHORT | DEST_ADDR_SHORT, // Address mode for source and destination
g_PanId, // Source PAN identifier
(ADDRESS*) &g_myShortAddr, // Pointer to the source address (short or extended)
g_PanId, // Destination PAN identifier
&g_coordAddr, // Pointer to the destination address (short or extended)
PACKET_LENGTH, // The length of pMsdu[]
pTxBuffer, // A pointer to the packet payload
7, // A handle to this packet which is used later on with mcpsPurgeRequest() and mcpsDataConfirm()
TX_OPT_NONE); // txOptions
}
g_KeyPush = FALSE; // Permit Key interrupt again
}
//-------------------------------------------------
// Data confirmation
if (g_DataConfirm) {
if (g_DataStatus == SUCCESS) {
UART_StartTx("\r\n-- mcpsDataConfirm SUCCESS.\r\n>");
} else {
UART_StartTx("\r\n-- mcpsDataConfirm FAILED.\r\n>");
}
g_DataConfirm = FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -