Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of OmniWheels by
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 ¶ms->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 ¶ms->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 }
Generated on Fri Jul 22 2022 04:53:51 by
 1.7.2
 1.7.2 
    