1.2.3 Using the Data Link Layer Module
The following code shows a basic example on how to use Meters And More DLL:
// ***************************************************************************** // ***************************************************************************** // Section: Global Data Definitions // ***************************************************************************** // ***************************************************************************** static const uint8_t appDataTxDataBuffer[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; APP_DATA appData; static CACHE_ALIGN uint8_t appDataRxDataBuffer[CACHE_ALIGNED_SIZE_GET(APP_PLC_BUFFER_SIZE)]; // ***************************************************************************** // ***************************************************************************** // Section: Application Callback Functions // ***************************************************************************** // ***************************************************************************** static void APP_TxTimeout_Callback (uintptr_t context) { SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "Tx Timeout expired\r\n"); } static void APP_DLL_DataIndication_callback(DLL_DATA_IND_PARAMS *indParams) { SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "DLL_DATA_INDICATION: DSAP=%hhu, ECC=%hhu, SrcAddr=0x" "%02X%02X%02X%02X%02X%02X, LSDU=0x", indParams->dsap, indParams->ecc, indParams->srcAddress.address[0], indParams->srcAddress.address[1], indParams->srcAddress.address[2], indParams->srcAddress.address[3], indParams->srcAddress.address[4], indParams->srcAddress.address[5]); for (uint8_t i = 0; i < indParams->lsduLen; i++) { SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "%02X", indParams->lsdu[i]); } SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "\r\n"); memcpy(appDataRxDataBuffer, indParams->lsdu, indParams->lsduLen); } static void APP_DLL_DataConfirm_callback(DLL_DATA_CONFIRM_PARAMS *cfmParams) { SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "DLL_DATA_CONFIRM (Result %hhu)\r\n", cfmParams->txStatus); SYS_TIME_TimerDestroy(appData.txTimeoutHandle); } static void APP_DLL_EventIndication_callback(DLL_EVENT_IND_PARAMS *indParams) { SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "DLL_EVENT_INDICATION: Id=%hhu, Value=0x", indParams->eventId); for (uint8_t i = 0; i < indParams->eventValue.length; i++) { SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "%02X", indParams->eventValue.value[i]); } SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "\r\n"); } // ***************************************************************************** // ***************************************************************************** // Section: Application Initialization and State Machine Functions // ***************************************************************************** // ***************************************************************************** void APP_Initialize ( void ) { /* IDLE state is used to signal when application is started */ appData.state = APP_STATE_INIT; /* Configure DLL Data Request parameters */ appData.drParams.ecc = DLL_ECC_DISABLED; appData.drParams.lsdu = (uint8_t *)appDataTxDataBuffer; appData.drParams.lsduLen = sizeof(appDataTxDataBuffer); appData.drParams.dsap = DLL_DSAP_APPLICATION_FRAME; appData.drParams.serviceClass = SERVICE_CLASS_RA; appData.drParams.maxResponseLen = 122; appData.drParams.dstAddress.routeSize = TEST_NUM_REPETERS + 1; /* First Address in the route (Node A) */ appData.drParams.dstAddress.macAddress[0].address[0] = 0x00; appData.drParams.dstAddress.macAddress[0].address[1] = 0xAA; appData.drParams.dstAddress.macAddress[0].address[2] = 0x00; appData.drParams.dstAddress.macAddress[0].address[3] = 0xAA; appData.drParams.dstAddress.macAddress[0].address[4] = 0x00; appData.drParams.dstAddress.macAddress[0].address[5] = 0xAA; } void APP_Tasks ( void ) { /* Refresh WDG */ CLEAR_WATCHDOG(); /* Check the application's current state. */ switch ( appData.state ) { case APP_STATE_INIT: { DLL_DataIndicationCallbackRegister(APP_DLL_DataIndication_callback); DLL_DataConfirmCallbackRegister(APP_DLL_DataConfirm_callback); DLL_EventIndicationCallbackRegister(APP_DLL_EventIndication_callback); /* Set MAC address */ const DLL_IB_VALUE value = { .length = 6, .value = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00} }; DLL_SetRequest(MAC_ACA_ADDRESS_IB, 0, &value); appData.state = APP_STATE_TX_FRAME; break; } case APP_STATE_TX_FRAME: { if (DLL_GetStatus() == DLL_STATUS_READY) { DLL_DataRequest(&appData.drParams); SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "DLL_DATA_REQUEST\r\n"); /* Start timer to detect TX timeout */ uint32_t txTimeoutUS = DLL_GetTxTimeout(); appData.txTimeoutHandle = SYS_TIME_CallbackRegisterUS(APP_TxTimeout_Callback, 0, txTimeoutUS, SYS_TIME_SINGLE); SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "Tx Timeout started: %u us\r\n", txTimeoutUS); appData.state = APP_STATE_WAITING; } break; } case APP_STATE_WAITING: { break; } /* The default state should never be executed. */ default: { break; } } }
