@@ -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}
18991899STATIC 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+
19011942STATIC 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
23022343STATIC 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 },
0 commit comments