BA / SerialCom

Fork of OmniWheels by Gustav Atmel

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_phy(NULL)
00031 {
00032 }
00033 
00034 LoRaMacMib::~LoRaMacMib()
00035 {
00036 }
00037 
00038 void LoRaMacMib::activate_mib_subsystem(LoRaPHY *phy)
00039 {
00040     _lora_phy = phy;
00041 }
00042 
00043 lorawan_status_t LoRaMacMib::set_request(loramac_mib_req_confirm_t  *mibSet,
00044                                         loramac_protocol_params *params)
00045 {
00046     if (mibSet == NULL || _lora_phy == NULL) {
00047          return LORAWAN_STATUS_PARAMETER_INVALID;
00048     }
00049 
00050     lorawan_status_t status = LORAWAN_STATUS_OK;
00051 
00052     switch (mibSet->type ) {
00053         case MIB_DEVICE_CLASS : {
00054             params->dev_class = mibSet->param .dev_class ;
00055             switch (params->dev_class) {
00056                 case CLASS_A : {
00057                     // Set the radio into sleep to setup a defined state
00058                     _lora_phy->put_radio_to_sleep();
00059                     break;
00060                 }
00061                 case CLASS_B : {
00062                     break;
00063                 }
00064                 case CLASS_C : {
00065                     // Set the is_node_ack_requested indicator to default
00066                     params->is_node_ack_requested = false;
00067                     // Set the radio into sleep mode in case we are still in RX mode
00068                     _lora_phy->put_radio_to_sleep();
00069                     // Compute Rx2 windows parameters in case the RX2 datarate has changed
00070                     _lora_phy->compute_rx_win_params(
00071                             params->sys_params.rx2_channel.datarate,
00072                             params->sys_params.min_rx_symb,
00073                             params->sys_params.max_sys_rx_error,
00074                             &params->rx_window2_config);
00075                     break;
00076                 }
00077             }
00078             break;
00079         }
00080         case MIB_NETWORK_JOINED : {
00081             params->is_nwk_joined = mibSet->param .is_nwk_joined ;
00082             break;
00083         }
00084         case MIB_ADR : {
00085             params->sys_params.adr_on = mibSet->param .is_adr_enable ;
00086             break;
00087         }
00088         case MIB_NET_ID : {
00089             params->net_id = mibSet->param .net_id ;
00090             break;
00091         }
00092         case MIB_DEV_ADDR : {
00093             params->dev_addr = mibSet->param .dev_addr ;
00094             break;
00095         }
00096         case MIB_NWK_SKEY : {
00097             if (mibSet->param .nwk_skey  != NULL) {
00098                 memcpy(params->keys.nwk_skey, mibSet->param .nwk_skey ,
00099                        sizeof(params->keys.nwk_skey));
00100             } else {
00101                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00102             }
00103             break;
00104         }
00105         case MIB_APP_SKEY : {
00106             if (mibSet->param .app_skey  != NULL) {
00107                 memcpy(params->keys.app_skey, mibSet->param .app_skey ,
00108                        sizeof(params->keys.app_skey));
00109             } else {
00110                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00111             }
00112             break;
00113         }
00114         case MIB_PUBLIC_NETWORK : {
00115             params->is_nwk_public = mibSet->param .enable_public_nwk ;
00116             _lora_phy->setup_public_network_mode(params->is_nwk_public);
00117             break;
00118         }
00119         case MIB_REPEATER_SUPPORT : {
00120             params->is_repeater_supported = mibSet->param .enable_repeater_support ;
00121             break;
00122         }
00123         case MIB_RX2_CHANNEL : {
00124             if (_lora_phy->verify_rx_datarate(mibSet->param .rx2_channel .datarate ) == true) {
00125                 params->sys_params.rx2_channel = mibSet->param .rx2_channel ;
00126 
00127                 if ((params->dev_class == CLASS_C )
00128                         && (params->is_nwk_joined == true)) {
00129                     // We can only compute the RX window parameters directly, if we are already
00130                     // in class c mode and joined. We cannot setup an RX window in case of any other
00131                     // class type.
00132                     // Set the radio into sleep mode in case we are still in RX mode
00133                     _lora_phy->put_radio_to_sleep();
00134                     // Compute Rx2 windows parameters
00135                     _lora_phy->compute_rx_win_params(
00136                             params->sys_params.rx2_channel.datarate,
00137                             params->sys_params.min_rx_symb,
00138                             params->sys_params.max_sys_rx_error,
00139                             &params->rx_window2_config);
00140                 }
00141             } else {
00142                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00143             }
00144             break;
00145         }
00146         case MIB_RX2_DEFAULT_CHANNEL : {
00147             if (_lora_phy->verify_rx_datarate(mibSet->param .rx2_channel .datarate ) == true) {
00148                 params->sys_params.rx2_channel = mibSet->param .default_rx2_channel ;
00149             } else {
00150                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00151             }
00152             break;
00153         }
00154         case MIB_CHANNELS_DEFAULT_MASK :
00155         case MIB_CHANNELS_MASK : {
00156             // channel masks must not be tempered with.
00157             // They should be manipulated only on request with certain
00158             // APIs like add_channel() and remove_channel()
00159             // You should be able to get these MIB parameters, not set
00160             status = LORAWAN_STATUS_SERVICE_UNKNOWN;
00161             break;
00162         }
00163         case MIB_CHANNELS_NB_REP : {
00164             if ((mibSet->param .channel_nb_rep  >= 1)
00165                     && (mibSet->param .channel_nb_rep  <= 15)) {
00166                 params->sys_params.retry_num = mibSet->param .channel_nb_rep ;
00167             } else {
00168                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00169             }
00170             break;
00171         }
00172         case MIB_MAX_RX_WINDOW_DURATION : {
00173             params->sys_params.max_rx_win_time = mibSet->param .max_rx_window ;
00174             break;
00175         }
00176         case MIB_RECEIVE_DELAY_1 : {
00177             params->sys_params.recv_delay1 = mibSet->param .recv_delay1 ;
00178             break;
00179         }
00180         case MIB_RECEIVE_DELAY_2 : {
00181             params->sys_params.recv_delay2 = mibSet->param .recv_delay2 ;
00182             break;
00183         }
00184         case MIB_JOIN_ACCEPT_DELAY_1 : {
00185             params->sys_params.join_accept_delay1 = mibSet->param .join_accept_delay1 ;
00186             break;
00187         }
00188         case MIB_JOIN_ACCEPT_DELAY_2 : {
00189             params->sys_params.join_accept_delay2 = mibSet->param .join_accept_delay2 ;
00190             break;
00191         }
00192         case MIB_CHANNELS_DEFAULT_DATARATE : {
00193             if (_lora_phy->verify_tx_datarate(mibSet->param .default_channel_data_rate , true)) {
00194                 params->sys_params.channel_data_rate = mibSet->param .default_channel_data_rate ;
00195             } else {
00196                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00197             }
00198             break;
00199         }
00200         case MIB_CHANNELS_DATARATE : {
00201             if (_lora_phy->verify_tx_datarate(mibSet->param .channel_data_rate , false) == true) {
00202                 params->sys_params.channel_data_rate = mibSet->param .channel_data_rate ;
00203             } else {
00204                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00205             }
00206             break;
00207         }
00208         case MIB_CHANNELS_DEFAULT_TX_POWER : {
00209             if (_lora_phy->verify_tx_power(mibSet->param .default_channel_tx_pwr )) {
00210                 params->sys_params.channel_tx_power = mibSet->param .default_channel_tx_pwr ;
00211             } else {
00212                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00213             }
00214             break;
00215         }
00216         case MIB_CHANNELS_TX_POWER : {
00217             if (_lora_phy->verify_tx_power(mibSet->param .channel_tx_pwr )) {
00218                 params->sys_params.channel_tx_power = mibSet->param .channel_tx_pwr ;
00219             } else {
00220                 status = LORAWAN_STATUS_PARAMETER_INVALID;
00221             }
00222             break;
00223         }
00224         case MIB_UPLINK_COUNTER : {
00225             params->ul_frame_counter = mibSet->param .ul_frame_counter ;
00226             break;
00227         }
00228         case MIB_DOWNLINK_COUNTER : {
00229             params->dl_frame_counter = mibSet->param .dl_frame_counter ;
00230             break;
00231         }
00232         case MIB_SYSTEM_MAX_RX_ERROR : {
00233             params->sys_params.max_sys_rx_error = mibSet->param .max_rx_sys_error ;
00234             break;
00235         }
00236         case MIB_MIN_RX_SYMBOLS : {
00237             params->sys_params.min_rx_symb = mibSet->param .min_rx_symb ;
00238             break;
00239         }
00240         case MIB_ANTENNA_GAIN : {
00241             params->sys_params.antenna_gain = mibSet->param .antenna_gain ;
00242             break;
00243         }
00244         default:
00245             status = LORAWAN_STATUS_SERVICE_UNKNOWN;
00246             break;
00247     }
00248 
00249     return status;
00250 }
00251 
00252 lorawan_status_t LoRaMacMib::get_request(loramac_mib_req_confirm_t  *mibGet,
00253                                         loramac_protocol_params *params)
00254 {
00255     lorawan_status_t status = LORAWAN_STATUS_OK;
00256     rx2_channel_params  rx2_channel;
00257 
00258     if( mibGet == NULL )
00259     {
00260         return LORAWAN_STATUS_PARAMETER_INVALID;
00261     }
00262 
00263     switch( mibGet->type  )
00264     {
00265         case MIB_DEVICE_CLASS :
00266         {
00267             mibGet->param .dev_class  = params->dev_class;
00268             break;
00269         }
00270         case MIB_NETWORK_JOINED :
00271         {
00272             mibGet->param .is_nwk_joined  = params->is_nwk_joined;
00273             break;
00274         }
00275         case MIB_ADR :
00276         {
00277             mibGet->param .is_adr_enable  = params->sys_params.adr_on;
00278             break;
00279         }
00280         case MIB_NET_ID :
00281         {
00282             mibGet->param .net_id  = params->net_id;
00283             break;
00284         }
00285         case MIB_DEV_ADDR :
00286         {
00287             mibGet->param .dev_addr  = params->dev_addr;
00288             break;
00289         }
00290         case MIB_NWK_SKEY :
00291         {
00292             mibGet->param .nwk_skey  =params->keys.nwk_skey;
00293             break;
00294         }
00295         case MIB_APP_SKEY :
00296         {
00297             mibGet->param .app_skey  = params->keys.app_skey;
00298             break;
00299         }
00300         case MIB_PUBLIC_NETWORK :
00301         {
00302             mibGet->param .enable_public_nwk  = params->is_nwk_public;
00303             break;
00304         }
00305         case MIB_REPEATER_SUPPORT :
00306         {
00307             mibGet->param .enable_repeater_support  = params->is_repeater_supported;
00308             break;
00309         }
00310         case MIB_CHANNELS :
00311         {
00312             mibGet->param .channel_list  = _lora_phy->get_phy_channels();
00313             break;
00314         }
00315         case MIB_RX2_CHANNEL :
00316         {
00317             mibGet->param .rx2_channel  = params->sys_params.rx2_channel;
00318             break;
00319         }
00320         case MIB_RX2_DEFAULT_CHANNEL :
00321         {
00322             rx2_channel.datarate  = _lora_phy->get_default_rx2_datarate();
00323             rx2_channel.frequency  = _lora_phy->get_default_rx2_frequency();
00324             mibGet->param .rx2_channel  = rx2_channel;
00325             break;
00326         }
00327         case MIB_CHANNELS_DEFAULT_MASK :
00328         {
00329             mibGet->param .default_channel_mask  = _lora_phy->get_channel_mask(true);
00330             break;
00331         }
00332         case MIB_CHANNELS_MASK :
00333         {
00334             mibGet->param .channel_mask  = _lora_phy->get_channel_mask(false);
00335             break;
00336         }
00337         case MIB_CHANNELS_NB_REP :
00338         {
00339             mibGet->param .channel_nb_rep  = params->sys_params.retry_num;
00340             break;
00341         }
00342         case MIB_MAX_RX_WINDOW_DURATION :
00343         {
00344             mibGet->param .max_rx_window  = params->sys_params.max_rx_win_time;
00345             break;
00346         }
00347         case MIB_RECEIVE_DELAY_1 :
00348         {
00349             mibGet->param .recv_delay1  = params->sys_params.recv_delay1;
00350             break;
00351         }
00352         case MIB_RECEIVE_DELAY_2 :
00353         {
00354             mibGet->param .recv_delay2  = params->sys_params.recv_delay2;
00355             break;
00356         }
00357         case MIB_JOIN_ACCEPT_DELAY_1 :
00358         {
00359             mibGet->param .join_accept_delay1  = params->sys_params.join_accept_delay1;
00360             break;
00361         }
00362         case MIB_JOIN_ACCEPT_DELAY_2 :
00363         {
00364             mibGet->param .join_accept_delay2  = params->sys_params.join_accept_delay2;
00365             break;
00366         }
00367         case MIB_CHANNELS_DEFAULT_DATARATE :
00368         {
00369             mibGet->param .default_channel_data_rate  = _lora_phy->get_default_tx_datarate();
00370             break;
00371         }
00372         case MIB_CHANNELS_DATARATE :
00373         {
00374             mibGet->param .channel_data_rate  = params->sys_params.channel_data_rate;
00375             break;
00376         }
00377         case MIB_CHANNELS_DEFAULT_TX_POWER :
00378         {
00379             mibGet->param .default_channel_tx_pwr  = _lora_phy->get_default_tx_power();
00380             break;
00381         }
00382         case MIB_CHANNELS_TX_POWER :
00383         {
00384             mibGet->param .channel_tx_pwr  = params->sys_params.channel_tx_power;
00385             break;
00386         }
00387         case MIB_UPLINK_COUNTER :
00388         {
00389             mibGet->param .ul_frame_counter  = params->ul_frame_counter;
00390             break;
00391         }
00392         case MIB_DOWNLINK_COUNTER :
00393         {
00394             mibGet->param .dl_frame_counter  = params->dl_frame_counter;
00395             break;
00396         }
00397         case MIB_MULTICAST_CHANNEL :
00398         {
00399             mibGet->param .multicast_list  = params->multicast_channels;
00400             break;
00401         }
00402         case MIB_SYSTEM_MAX_RX_ERROR :
00403         {
00404             mibGet->param .max_rx_sys_error  = params->sys_params.max_sys_rx_error;
00405             break;
00406         }
00407         case MIB_MIN_RX_SYMBOLS :
00408         {
00409             mibGet->param .min_rx_symb  = params->sys_params.min_rx_symb;
00410             break;
00411         }
00412         case MIB_ANTENNA_GAIN :
00413         {
00414             mibGet->param .antenna_gain  = params->sys_params.antenna_gain;
00415             break;
00416         }
00417         default:
00418             status = LORAWAN_STATUS_SERVICE_UNKNOWN;
00419             break;
00420     }
00421 
00422     return status;
00423 }