Denislam Valeev / Mbed OS Nucleo_rtos_basic
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LoRaMacMib.cpp Source File

LoRaMacMib.cpp

00001 /**
00002  / _____)             _              | |
00003 ( (____  _____ ____ _| |_ _____  ____| |__
00004  \____ \| ___ |    (_   _) ___ |/ ___)  _ \
00005  _____) ) ____| | | || |_| ____( (___| | | |
00006 (______/|_____)_|_|_| \__)_____)\____)_| |_|
00007     (C)2013 Semtech
00008  ___ _____ _   ___ _  _____ ___  ___  ___ ___
00009 / __|_   _/_\ / __| |/ / __/ _ \| _ \/ __| __|
00010 \__ \ | |/ _ \ (__| ' <| _| (_) |   / (__| _|
00011 |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
00012 embedded.connectivity.solutions===============
00013 
00014 Description: LoRaWAN stack layer that controls both MAC and PHY underneath
00015 
00016 License: Revised BSD License, see LICENSE.TXT file include in the project
00017 
00018 Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jaeckle ( STACKFORCE )
00019 
00020 
00021 Copyright (c) 2017, Arm Limited and affiliates.
00022 
00023 SPDX-License-Identifier: BSD-3-Clause
00024 */
00025 
00026 #include "lorastack/mac/LoRaMac.h"
00027 #include "lorastack/mac/LoRaMacMib.h"
00028 
00029 LoRaMacMib::LoRaMacMib()
00030 : _lora_mac(NULL), _lora_phy(NULL)
00031 {
00032 }
00033 
00034 LoRaMacMib::~LoRaMacMib()
00035 {
00036 }
00037 
00038 void LoRaMacMib::activate_mib_subsystem(LoRaMac *mac, LoRaPHY *phy)
00039 {
00040     _lora_mac = mac;
00041     _lora_phy = phy;
00042 }
00043 
00044 lorawan_status_t LoRaMacMib::set_request(loramac_mib_req_confirm_t  *mibSet,
00045                                         loramac_protocol_params *params)
00046 {
00047     if (mibSet == NULL || _lora_phy == NULL || _lora_mac == NULL) {
00048          return LORAWAN_STATUS_PARAMETER_INVALID;
00049     }
00050 
00051     lorawan_status_t status = LORAWAN_STATUS_OK;
00052     verification_params_t verify;
00053 
00054 
00055     switch (mibSet->type ) {
00056         case MIB_DEVICE_CLASS : {
00057             params->dev_class = mibSet->param .dev_class ;
00058             switch (params->dev_class) {
00059                 case CLASS_A : {
00060                     // Set the radio into sleep to setup a defined state
00061                     _lora_phy->put_radio_to_sleep();
00062                     break;
00063                 }
00064                 case CLASS_B : {
00065                     break;
00066                 }
00067                 case CLASS_C : {
00068                     // Set the is_node_ack_requested indicator to default
00069                     params->is_node_ack_requested = false;
00070                     // Set the radio into sleep mode in case we are still in RX mode
00071                     _lora_phy->put_radio_to_sleep();
00072                     // Compute Rx2 windows parameters in case the RX2 datarate has changed
00073                     _lora_phy->compute_rx_win_params(
00074                             params->sys_params.rx2_channel.datarate,
00075                             params->sys_params.min_rx_symb,
00076                             params->sys_params.max_sys_rx_error,
00077                             &params->rx_window2_config);
00078                     _lora_mac->open_continuous_rx2_window();
00079                     break;
00080                 }
00081             }
00082             break;
00083         }
00084         case MIB_NETWORK_JOINED : {
00085             params->is_nwk_joined = mibSet->param .is_nwk_joined ;
00086             break;
00087         }
00088         case MIB_ADR : {
00089             params->sys_params.adr_on = mibSet->param .is_adr_enable ;
00090             break;
00091         }
00092         case MIB_NET_ID : {
00093             params->net_id = mibSet->param .net_id ;
00094             break;
00095         }
00096         case MIB_DEV_ADDR : {
00097             params->dev_addr = mibSet->param .dev_addr ;
00098             break;
00099         }
00100         case MIB_NWK_SKEY : {
00101             if (mibSet->param .nwk_skey  != NULL) {
00102                 memcpy(params->keys.nwk_skey, mibSet->param .nwk_skey ,
00103                        sizeof(params->keys.nwk_skey));
00104             } else {
00105                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00106             }
00107             break;
00108         }
00109         case MIB_APP_SKEY : {
00110             if (mibSet->param .app_skey  != NULL) {
00111                 memcpy(params->keys.app_skey, mibSet->param .app_skey ,
00112                        sizeof(params->keys.app_skey));
00113             } else {
00114                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00115             }
00116             break;
00117         }
00118         case MIB_PUBLIC_NETWORK : {
00119             params->is_nwk_public = mibSet->param .enable_public_nwk ;
00120             _lora_phy->setup_public_network_mode(params->is_nwk_public);
00121             break;
00122         }
00123         case MIB_REPEATER_SUPPORT : {
00124             params->is_repeater_supported = mibSet->param .enable_repeater_support ;
00125             break;
00126         }
00127         case MIB_RX2_CHANNEL : {
00128             verify.datarate = mibSet->param .rx2_channel .datarate ;
00129 
00130             if (_lora_phy->verify(&verify, PHY_RX_DR ) == true) {
00131                 params->sys_params.rx2_channel = mibSet->param .rx2_channel ;
00132 
00133                 if ((params->dev_class == CLASS_C )
00134                         && (params->is_nwk_joined == true)) {
00135                     // We can only compute the RX window parameters directly, if we are already
00136                     // in class c mode and joined. We cannot setup an RX window in case of any other
00137                     // class type.
00138                     // Set the radio into sleep mode in case we are still in RX mode
00139                     _lora_phy->put_radio_to_sleep();
00140                     // Compute Rx2 windows parameters
00141                     _lora_phy->compute_rx_win_params(
00142                             params->sys_params.rx2_channel.datarate,
00143                             params->sys_params.min_rx_symb,
00144                             params->sys_params.max_sys_rx_error,
00145                             &params->rx_window2_config);
00146 
00147                     _lora_mac->open_continuous_rx2_window();
00148                 }
00149             } else {
00150                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00151             }
00152             break;
00153         }
00154         case MIB_RX2_DEFAULT_CHANNEL : {
00155             verify.datarate = mibSet->param .rx2_channel .datarate ;
00156 
00157             if (_lora_phy->verify(&verify, PHY_RX_DR ) == true) {
00158                 params->sys_params.rx2_channel = mibSet->param .default_rx2_channel ;
00159             } else {
00160                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00161             }
00162             break;
00163         }
00164         case MIB_CHANNELS_DEFAULT_MASK :
00165         case MIB_CHANNELS_MASK : {
00166             // channel masks must not be tempered with.
00167             // They should be manipulated only on request with certain
00168             // APIs like add_channel() and remove_channel()
00169             // You should be able to get these MIB parameters, not set
00170             status = LORAWAN_STATUS_SERVICE_UNKNOWN;
00171             break;
00172         }
00173         case MIB_CHANNELS_NB_REP : {
00174             if ((mibSet->param .channel_nb_rep  >= 1)
00175                     && (mibSet->param .channel_nb_rep  <= 15)) {
00176                 params->sys_params.retry_num = mibSet->param .channel_nb_rep ;
00177             } else {
00178                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00179             }
00180             break;
00181         }
00182         case MIB_MAX_RX_WINDOW_DURATION : {
00183             params->sys_params.max_rx_win_time = mibSet->param .max_rx_window ;
00184             break;
00185         }
00186         case MIB_RECEIVE_DELAY_1 : {
00187             params->sys_params.recv_delay1 = mibSet->param .recv_delay1 ;
00188             break;
00189         }
00190         case MIB_RECEIVE_DELAY_2 : {
00191             params->sys_params.recv_delay2 = mibSet->param .recv_delay2 ;
00192             break;
00193         }
00194         case MIB_JOIN_ACCEPT_DELAY_1 : {
00195             params->sys_params.join_accept_delay1 = mibSet->param .join_accept_delay1 ;
00196             break;
00197         }
00198         case MIB_JOIN_ACCEPT_DELAY_2 : {
00199             params->sys_params.join_accept_delay2 = mibSet->param .join_accept_delay2 ;
00200             break;
00201         }
00202         case MIB_CHANNELS_DEFAULT_DATARATE : {
00203             verify.datarate = mibSet->param .default_channel_data_rate ;
00204 
00205             if (_lora_phy->verify(&verify, PHY_DEF_TX_DR ) == true) {
00206                 params->sys_params.channel_data_rate = verify.datarate;
00207             } else {
00208                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00209             }
00210             break;
00211         }
00212         case MIB_CHANNELS_DATARATE : {
00213             verify.datarate = mibSet->param .channel_data_rate ;
00214 
00215             if (_lora_phy->verify(&verify, PHY_TX_DR ) == true) {
00216                 params->sys_params.channel_data_rate = verify.datarate;
00217             } else {
00218                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00219             }
00220             break;
00221         }
00222         case MIB_CHANNELS_DEFAULT_TX_POWER : {
00223             verify.tx_power = mibSet->param .default_channel_tx_pwr ;
00224 
00225             if (_lora_phy->verify(&verify, PHY_DEF_TX_POWER ) == true) {
00226                 params->sys_params.channel_tx_power = verify.tx_power;
00227             } else {
00228                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00229             }
00230             break;
00231         }
00232         case MIB_CHANNELS_TX_POWER : {
00233             verify.tx_power = mibSet->param .channel_tx_pwr ;
00234 
00235             if (_lora_phy->verify(&verify, PHY_TX_POWER ) == true) {
00236                 params->sys_params.channel_tx_power = verify.tx_power;
00237             } else {
00238                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00239             }
00240             break;
00241         }
00242         case MIB_UPLINK_COUNTER : {
00243             params->ul_frame_counter = mibSet->param .ul_frame_counter ;
00244             break;
00245         }
00246         case MIB_DOWNLINK_COUNTER : {
00247             params->dl_frame_counter = mibSet->param .dl_frame_counter ;
00248             break;
00249         }
00250         case MIB_SYSTEM_MAX_RX_ERROR : {
00251             params->sys_params.max_sys_rx_error = mibSet->param .max_rx_sys_error ;
00252             break;
00253         }
00254         case MIB_MIN_RX_SYMBOLS : {
00255             params->sys_params.min_rx_symb = mibSet->param .min_rx_symb ;
00256             break;
00257         }
00258         case MIB_ANTENNA_GAIN : {
00259             params->sys_params.antenna_gain = mibSet->param .antenna_gain ;
00260             break;
00261         }
00262         default:
00263             status = LORAWAN_STATUS_SERVICE_UNKNOWN;
00264             break;
00265     }
00266 
00267     return status;
00268 }
00269 
00270 lorawan_status_t LoRaMacMib::get_request(loramac_mib_req_confirm_t  *mibGet,
00271                                         loramac_protocol_params *params)
00272 {
00273     lorawan_status_t status = LORAWAN_STATUS_OK;
00274     get_phy_params_t get_phy;
00275     phy_param_t  phy_param;
00276     rx2_channel_params  rx2_channel;
00277 
00278     if( mibGet == NULL )
00279     {
00280         return LORAWAN_STATUS_PARAMETER_INVALID;
00281     }
00282 
00283     switch( mibGet->type  )
00284     {
00285         case MIB_DEVICE_CLASS :
00286         {
00287             mibGet->param .dev_class  = params->dev_class;
00288             break;
00289         }
00290         case MIB_NETWORK_JOINED :
00291         {
00292             mibGet->param .is_nwk_joined  = params->is_nwk_joined;
00293             break;
00294         }
00295         case MIB_ADR :
00296         {
00297             mibGet->param .is_adr_enable  = params->sys_params.adr_on;
00298             break;
00299         }
00300         case MIB_NET_ID :
00301         {
00302             mibGet->param .net_id  = params->net_id;
00303             break;
00304         }
00305         case MIB_DEV_ADDR :
00306         {
00307             mibGet->param .dev_addr  = params->dev_addr;
00308             break;
00309         }
00310         case MIB_NWK_SKEY :
00311         {
00312             mibGet->param .nwk_skey  =params->keys.nwk_skey;
00313             break;
00314         }
00315         case MIB_APP_SKEY :
00316         {
00317             mibGet->param .app_skey  = params->keys.app_skey;
00318             break;
00319         }
00320         case MIB_PUBLIC_NETWORK :
00321         {
00322             mibGet->param .enable_public_nwk  = params->is_nwk_public;
00323             break;
00324         }
00325         case MIB_REPEATER_SUPPORT :
00326         {
00327             mibGet->param .enable_repeater_support  = params->is_repeater_supported;
00328             break;
00329         }
00330         case MIB_CHANNELS :
00331         {
00332             get_phy.attribute = PHY_CHANNELS ;
00333             phy_param = _lora_phy->get_phy_params( &get_phy );
00334 
00335             mibGet->param .channel_list  = phy_param.channel_params ;
00336             break;
00337         }
00338         case MIB_RX2_CHANNEL :
00339         {
00340             mibGet->param .rx2_channel  = params->sys_params.rx2_channel;
00341             break;
00342         }
00343         case MIB_RX2_DEFAULT_CHANNEL :
00344         {
00345             get_phy.attribute = PHY_DEF_RX2_DR ;
00346             phy_param = _lora_phy->get_phy_params( &get_phy );
00347             rx2_channel.datarate  = phy_param.value ;
00348 
00349             get_phy.attribute = PHY_DEF_RX2_FREQUENCY ;
00350             phy_param = _lora_phy->get_phy_params( &get_phy );
00351             rx2_channel.frequency  = phy_param.value ;
00352 
00353             mibGet->param .rx2_channel  = rx2_channel;
00354             break;
00355         }
00356         case MIB_CHANNELS_DEFAULT_MASK :
00357         {
00358             get_phy.attribute = PHY_DEFAULT_CHANNEL_MASK ;
00359             phy_param = _lora_phy->get_phy_params( &get_phy );
00360 
00361             mibGet->param .default_channel_mask  = phy_param.channel_mask ;
00362             break;
00363         }
00364         case MIB_CHANNELS_MASK :
00365         {
00366             get_phy.attribute = PHY_CHANNEL_MASK ;
00367             phy_param = _lora_phy->get_phy_params( &get_phy );
00368 
00369             mibGet->param .channel_mask  = phy_param.channel_mask ;
00370             break;
00371         }
00372         case MIB_CHANNELS_NB_REP :
00373         {
00374             mibGet->param .channel_nb_rep  = params->sys_params.retry_num;
00375             break;
00376         }
00377         case MIB_MAX_RX_WINDOW_DURATION :
00378         {
00379             mibGet->param .max_rx_window  = params->sys_params.max_rx_win_time;
00380             break;
00381         }
00382         case MIB_RECEIVE_DELAY_1 :
00383         {
00384             mibGet->param .recv_delay1  = params->sys_params.recv_delay1;
00385             break;
00386         }
00387         case MIB_RECEIVE_DELAY_2 :
00388         {
00389             mibGet->param .recv_delay2  = params->sys_params.recv_delay2;
00390             break;
00391         }
00392         case MIB_JOIN_ACCEPT_DELAY_1 :
00393         {
00394             mibGet->param .join_accept_delay1  = params->sys_params.join_accept_delay1;
00395             break;
00396         }
00397         case MIB_JOIN_ACCEPT_DELAY_2 :
00398         {
00399             mibGet->param .join_accept_delay2  = params->sys_params.join_accept_delay2;
00400             break;
00401         }
00402         case MIB_CHANNELS_DEFAULT_DATARATE :
00403         {
00404             get_phy.attribute = PHY_DEF_TX_DR ;
00405             phy_param = _lora_phy->get_phy_params( &get_phy );
00406             mibGet->param .default_channel_data_rate  = phy_param.value ;
00407             break;
00408         }
00409         case MIB_CHANNELS_DATARATE :
00410         {
00411             mibGet->param .channel_data_rate  = params->sys_params.channel_data_rate;
00412             break;
00413         }
00414         case MIB_CHANNELS_DEFAULT_TX_POWER :
00415         {
00416             get_phy.attribute = PHY_DEF_TX_POWER ;
00417             phy_param = _lora_phy->get_phy_params( &get_phy );
00418             mibGet->param .default_channel_tx_pwr  = phy_param.value ;
00419             break;
00420         }
00421         case MIB_CHANNELS_TX_POWER :
00422         {
00423             mibGet->param .channel_tx_pwr  = params->sys_params.channel_tx_power;
00424             break;
00425         }
00426         case MIB_UPLINK_COUNTER :
00427         {
00428             mibGet->param .ul_frame_counter  = params->ul_frame_counter;
00429             break;
00430         }
00431         case MIB_DOWNLINK_COUNTER :
00432         {
00433             mibGet->param .dl_frame_counter  = params->dl_frame_counter;
00434             break;
00435         }
00436         case MIB_MULTICAST_CHANNEL :
00437         {
00438             mibGet->param .multicast_list  = params->multicast_channels;
00439             break;
00440         }
00441         case MIB_SYSTEM_MAX_RX_ERROR :
00442         {
00443             mibGet->param .max_rx_sys_error  = params->sys_params.max_sys_rx_error;
00444             break;
00445         }
00446         case MIB_MIN_RX_SYMBOLS :
00447         {
00448             mibGet->param .min_rx_symb  = params->sys_params.min_rx_symb;
00449             break;
00450         }
00451         case MIB_ANTENNA_GAIN :
00452         {
00453             mibGet->param .antenna_gain  = params->sys_params.antenna_gain;
00454             break;
00455         }
00456         default:
00457             status = LORAWAN_STATUS_SERVICE_UNKNOWN;
00458             break;
00459     }
00460 
00461     return status;
00462 }