Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 9eeb8af

Browse files
author
Islam Wahdan
authored
Merge pull request #27 from pycom/lorawan_fixes
modlora: Added support for Class C multicast
2 parents 43f34ca + f544621 commit 9eeb8af

File tree

3 files changed

+93
-24
lines changed

3 files changed

+93
-24
lines changed

esp32/mods/modlora.c

Lines changed: 66 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,6 +1898,47 @@ STATIC mp_obj_t lora_join(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *
18981898
}
18991899
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(lora_join_obj, 1, lora_join);
19001900

1901+
STATIC mp_obj_t lora_join_multicast_group (mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
1902+
static const mp_arg_t allowed_args[] = {
1903+
{ MP_QSTR_mcAddress, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = -1} },
1904+
{ MP_QSTR_mcNwkKey, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
1905+
{ MP_QSTR_mcAppKey, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
1906+
};
1907+
1908+
// parse args
1909+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
1910+
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(args), allowed_args, args);
1911+
1912+
mp_buffer_info_t bufinfo_0, bufinfo_1;
1913+
mp_get_buffer_raise(args[1].u_obj, &bufinfo_0, MP_BUFFER_READ);
1914+
mp_get_buffer_raise(args[2].u_obj, &bufinfo_1, MP_BUFFER_READ);
1915+
1916+
MulticastParams_t *channelParam = m_new_obj(MulticastParams_t);
1917+
channelParam->Next = NULL;
1918+
channelParam->DownLinkCounter = 0;
1919+
channelParam->Address = args[0].u_int;
1920+
memcpy(channelParam->NwkSKey, bufinfo_0.buf, sizeof(channelParam->NwkSKey));
1921+
memcpy(channelParam->AppSKey, bufinfo_1.buf, sizeof(channelParam->AppSKey));
1922+
1923+
if (LoRaMacMulticastChannelLink(channelParam) == LORAMAC_STATUS_OK) {
1924+
return mp_const_true;
1925+
}
1926+
1927+
return mp_const_false;
1928+
}
1929+
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(lora_join_multicast_group_obj, 0, lora_join_multicast_group);
1930+
1931+
STATIC mp_obj_t lora_leave_multicast_group (mp_obj_t self_in, mp_obj_t multicast_addr_obj) {
1932+
uint32_t mcAddr = mp_obj_get_int(multicast_addr_obj);
1933+
MulticastParams_t *channelParam = LoRaMacMulticastGetChannel(mcAddr);
1934+
if (LoRaMacMulticastChannelUnlink(channelParam) == LORAMAC_STATUS_OK) {
1935+
m_del_obj(MulticastParams_t, channelParam);
1936+
return mp_const_true;
1937+
}
1938+
return mp_const_false;
1939+
}
1940+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(lora_leave_multicast_group_obj, lora_leave_multicast_group);
1941+
19011942
STATIC mp_obj_t lora_compliance_test(mp_uint_t n_args, const mp_obj_t *args) {
19021943
// get
19031944
if (n_args == 1) {
@@ -2301,29 +2342,31 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(lora_airtime_obj, lora_airtime);
23012342

23022343
STATIC const mp_map_elem_t lora_locals_dict_table[] = {
23032344
// instance methods
2304-
{ MP_OBJ_NEW_QSTR(MP_QSTR_init), (mp_obj_t)&lora_init_obj },
2305-
{ MP_OBJ_NEW_QSTR(MP_QSTR_join), (mp_obj_t)&lora_join_obj },
2306-
{ MP_OBJ_NEW_QSTR(MP_QSTR_tx_power), (mp_obj_t)&lora_tx_power_obj },
2307-
{ MP_OBJ_NEW_QSTR(MP_QSTR_bandwidth), (mp_obj_t)&lora_bandwidth_obj },
2308-
{ MP_OBJ_NEW_QSTR(MP_QSTR_frequency), (mp_obj_t)&lora_frequency_obj },
2309-
{ MP_OBJ_NEW_QSTR(MP_QSTR_coding_rate), (mp_obj_t)&lora_coding_rate_obj },
2310-
{ MP_OBJ_NEW_QSTR(MP_QSTR_preamble), (mp_obj_t)&lora_preamble_obj },
2311-
{ MP_OBJ_NEW_QSTR(MP_QSTR_sf), (mp_obj_t)&lora_sf_obj },
2312-
{ MP_OBJ_NEW_QSTR(MP_QSTR_power_mode), (mp_obj_t)&lora_power_mode_obj },
2313-
{ MP_OBJ_NEW_QSTR(MP_QSTR_stats), (mp_obj_t)&lora_stats_obj },
2314-
{ MP_OBJ_NEW_QSTR(MP_QSTR_has_joined), (mp_obj_t)&lora_has_joined_obj },
2315-
{ MP_OBJ_NEW_QSTR(MP_QSTR_add_channel), (mp_obj_t)&lora_add_channel_obj },
2316-
{ MP_OBJ_NEW_QSTR(MP_QSTR_remove_channel), (mp_obj_t)&lora_remove_channel_obj },
2317-
{ MP_OBJ_NEW_QSTR(MP_QSTR_mac), (mp_obj_t)&lora_mac_obj },
2318-
{ MP_OBJ_NEW_QSTR(MP_QSTR_compliance_test), (mp_obj_t)&lora_compliance_test_obj },
2319-
{ MP_OBJ_NEW_QSTR(MP_QSTR_callback), (mp_obj_t)&lora_callback_obj },
2320-
{ MP_OBJ_NEW_QSTR(MP_QSTR_events), (mp_obj_t)&lora_events_obj },
2321-
{ MP_OBJ_NEW_QSTR(MP_QSTR_ischannel_free), (mp_obj_t)&lora_ischannel_free_obj },
2322-
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_battery_level), (mp_obj_t)&lora_set_battery_level_obj },
2323-
{ MP_OBJ_NEW_QSTR(MP_QSTR_nvram_save), (mp_obj_t)&lora_nvram_save_obj },
2324-
{ MP_OBJ_NEW_QSTR(MP_QSTR_nvram_restore), (mp_obj_t)&lora_nvram_restore_obj },
2325-
{ MP_OBJ_NEW_QSTR(MP_QSTR_nvram_erase), (mp_obj_t)&lora_nvram_erase_obj },
2326-
{ MP_OBJ_NEW_QSTR(MP_QSTR_airtime), (mp_obj_t)&lora_airtime_obj },
2345+
{ MP_OBJ_NEW_QSTR(MP_QSTR_init), (mp_obj_t)&lora_init_obj },
2346+
{ MP_OBJ_NEW_QSTR(MP_QSTR_join), (mp_obj_t)&lora_join_obj },
2347+
{ MP_OBJ_NEW_QSTR(MP_QSTR_join_multicast_group), (mp_obj_t)&lora_join_multicast_group_obj },
2348+
{ MP_OBJ_NEW_QSTR(MP_QSTR_leave_multicast_group), (mp_obj_t)&lora_leave_multicast_group_obj },
2349+
{ MP_OBJ_NEW_QSTR(MP_QSTR_tx_power), (mp_obj_t)&lora_tx_power_obj },
2350+
{ MP_OBJ_NEW_QSTR(MP_QSTR_bandwidth), (mp_obj_t)&lora_bandwidth_obj },
2351+
{ MP_OBJ_NEW_QSTR(MP_QSTR_frequency), (mp_obj_t)&lora_frequency_obj },
2352+
{ MP_OBJ_NEW_QSTR(MP_QSTR_coding_rate), (mp_obj_t)&lora_coding_rate_obj },
2353+
{ MP_OBJ_NEW_QSTR(MP_QSTR_preamble), (mp_obj_t)&lora_preamble_obj },
2354+
{ MP_OBJ_NEW_QSTR(MP_QSTR_sf), (mp_obj_t)&lora_sf_obj },
2355+
{ MP_OBJ_NEW_QSTR(MP_QSTR_power_mode), (mp_obj_t)&lora_power_mode_obj },
2356+
{ MP_OBJ_NEW_QSTR(MP_QSTR_stats), (mp_obj_t)&lora_stats_obj },
2357+
{ MP_OBJ_NEW_QSTR(MP_QSTR_has_joined), (mp_obj_t)&lora_has_joined_obj },
2358+
{ MP_OBJ_NEW_QSTR(MP_QSTR_add_channel), (mp_obj_t)&lora_add_channel_obj },
2359+
{ MP_OBJ_NEW_QSTR(MP_QSTR_remove_channel), (mp_obj_t)&lora_remove_channel_obj },
2360+
{ MP_OBJ_NEW_QSTR(MP_QSTR_mac), (mp_obj_t)&lora_mac_obj },
2361+
{ MP_OBJ_NEW_QSTR(MP_QSTR_compliance_test), (mp_obj_t)&lora_compliance_test_obj },
2362+
{ MP_OBJ_NEW_QSTR(MP_QSTR_callback), (mp_obj_t)&lora_callback_obj },
2363+
{ MP_OBJ_NEW_QSTR(MP_QSTR_events), (mp_obj_t)&lora_events_obj },
2364+
{ MP_OBJ_NEW_QSTR(MP_QSTR_ischannel_free), (mp_obj_t)&lora_ischannel_free_obj },
2365+
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_battery_level), (mp_obj_t)&lora_set_battery_level_obj },
2366+
{ MP_OBJ_NEW_QSTR(MP_QSTR_nvram_save), (mp_obj_t)&lora_nvram_save_obj },
2367+
{ MP_OBJ_NEW_QSTR(MP_QSTR_nvram_restore), (mp_obj_t)&lora_nvram_restore_obj },
2368+
{ MP_OBJ_NEW_QSTR(MP_QSTR_nvram_erase), (mp_obj_t)&lora_nvram_erase_obj },
2369+
{ MP_OBJ_NEW_QSTR(MP_QSTR_airtime), (mp_obj_t)&lora_airtime_obj },
23272370

23282371
#ifdef LORA_OPENTHREAD_ENABLED
23292372
{ MP_OBJ_NEW_QSTR(MP_QSTR_Mesh), (mp_obj_t)&lora_mesh_type },

lib/lora/mac/LoRaMac.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1463,7 +1463,6 @@ static void OnRxWindow2TimerEvent( void )
14631463
else
14641464
{
14651465
RxWindow2Config.RxContinuous = true;
1466-
14671466
if (NetworkActivation == ACTIVATION_TYPE_ABP){
14681467
RxWindow2Config.Datarate = McpsIndication.RxDatarate;
14691468
}
@@ -3110,6 +3109,21 @@ LoRaMacStatus_t LoRaMacMulticastChannelLink( MulticastParams_t *channelParam )
31103109
return LORAMAC_STATUS_OK;
31113110
}
31123111

3112+
MulticastParams_t * LoRaMacMulticastGetChannel(uint32_t multicastAddr)
3113+
{
3114+
MulticastParams_t *cur = MulticastChannels;
3115+
3116+
while (cur != NULL)
3117+
{
3118+
if (cur->Address == multicastAddr) {
3119+
return cur;
3120+
}
3121+
cur = cur->Next;
3122+
}
3123+
3124+
return NULL;
3125+
}
3126+
31133127
LoRaMacStatus_t LoRaMacMulticastChannelUnlink( MulticastParams_t *channelParam )
31143128
{
31153129
if( channelParam == NULL )

lib/lora/mac/LoRaMac.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1855,6 +1855,18 @@ LoRaMacStatus_t LoRaMacMulticastChannelLink( MulticastParams_t *channelParam );
18551855
*/
18561856
LoRaMacStatus_t LoRaMacMulticastChannelUnlink( MulticastParams_t *channelParam );
18571857

1858+
/*!
1859+
* \brief LoRaMAC multicast get channel
1860+
*
1861+
* \details Gets the specified multicast channel from the linked list.
1862+
*
1863+
* \param [IN] multicastAddr - Address of the Multicast channel.
1864+
*
1865+
* \retval MulticastParams_t * Pointer to the multicast channel.
1866+
*/
1867+
1868+
MulticastParams_t * LoRaMacMulticastGetChannel(uint32_t multicastAddr);
1869+
18581870
/*!
18591871
* \brief LoRaMAC MIB-Get
18601872
*

0 commit comments

Comments
 (0)