diff --git a/features/nanostack/mbed-mesh-api/mbed-mesh-api/WisunInterface.h b/features/nanostack/mbed-mesh-api/mbed-mesh-api/WisunInterface.h index ee475dfef20..0a4a43b5dc6 100644 --- a/features/nanostack/mbed-mesh-api/mbed-mesh-api/WisunInterface.h +++ b/features/nanostack/mbed-mesh-api/mbed-mesh-api/WisunInterface.h @@ -166,6 +166,22 @@ class WisunInterface : public MeshInterfaceNanostack { * */ mesh_error_t validate_network_regulatory_domain(uint8_t regulatory_domain, uint8_t operating_class, uint8_t operating_mode); + /** + * \brief Set Wi-SUN network PHY mode and channel plan IDs. + * + * Function stores new parameters to mbed-mesh-api and uses them when connect() is called next time. + * If device is already connected to the Wi-SUN network then device will restart network discovery after + * changing the phy_mode_id or channel_plan_id. + * + * Function overwrites parameters defined by Mbed OS configuration. + * + * \param phy_mode_id Values defined in Wi-SUN PHY-specification. Use 0xff to leave parameter unchanged. + * \param channel_plan_id Values defined in Wi-SUN PHY-specification. Use 0xff to leave parameter unchanged. + * \return MESH_ERROR_NONE on success. + * \return MESH_ERROR_UNKNOWN in case of failure. + * */ + mesh_error_t set_network_phy_mode_and_channel_plan_id(uint8_t phy_mode_id, uint8_t channel_plan_id); + /** * \brief Set Wi-SUN network size. * diff --git a/features/nanostack/mbed-mesh-api/mbed_lib.json b/features/nanostack/mbed-mesh-api/mbed_lib.json index 2bc76a35fd6..9a074ecbd43 100644 --- a/features/nanostack/mbed-mesh-api/mbed_lib.json +++ b/features/nanostack/mbed-mesh-api/mbed_lib.json @@ -136,6 +136,14 @@ "help": "Operating mode. Use 255 to use Nanostack default", "value": "255" }, + "wisun-phy-mode-id": { + "help": "PHY mode ID as specified in the Wi-SUN PHY Specification. With default value 255, parameter is not used.", + "value": "255" + }, + "wisun-channel-plan-id": { + "help": "Channel plan ID as specified in the Wi-SUN PHY Specification. With default value 255, parameter is not used.", + "value": "255" + }, "wisun-uc-channel-function": { "help": "Unicast channel function.", "value": "255" diff --git a/features/nanostack/mbed-mesh-api/source/WisunInterface.cpp b/features/nanostack/mbed-mesh-api/source/WisunInterface.cpp index 1d5cf656f4a..a3be0f52cbb 100644 --- a/features/nanostack/mbed-mesh-api/source/WisunInterface.cpp +++ b/features/nanostack/mbed-mesh-api/source/WisunInterface.cpp @@ -98,6 +98,15 @@ nsapi_error_t WisunInterface::configure() } #endif +#if (MBED_CONF_MBED_MESH_API_WISUN_PHY_MODE_ID != 255) || (MBED_CONF_MBED_MESH_API_WISUN_CHANNEL_PLAN_ID != 255) + status = set_network_phy_mode_and_channel_plan_id(MBED_CONF_MBED_MESH_API_WISUN_PHY_MODE_ID, + MBED_CONF_MBED_MESH_API_WISUN_CHANNEL_PLAN_ID); + if (status != MESH_ERROR_NONE) { + tr_error("Failed to set PHY mode and channel plan ID!"); + return NSAPI_ERROR_PARAMETER; + } +#endif + #if (MBED_CONF_MBED_MESH_API_WISUN_UC_CHANNEL_FUNCTION != 255) status = set_unicast_channel_function(static_cast(MBED_CONF_MBED_MESH_API_WISUN_UC_CHANNEL_FUNCTION), MBED_CONF_MBED_MESH_API_WISUN_UC_FIXED_CHANNEL, @@ -306,6 +315,20 @@ mesh_error_t WisunInterface::validate_network_regulatory_domain(uint8_t regulato return MESH_ERROR_NONE; } +mesh_error_t WisunInterface::set_network_phy_mode_and_channel_plan_id(uint8_t phy_mode_id, uint8_t channel_plan_id) +{ + int status = ws_management_phy_mode_id_set(get_interface_id(), phy_mode_id); + if (status != 0) { + return MESH_ERROR_UNKNOWN; + } + status = ws_management_channel_plan_id_set(get_interface_id(), channel_plan_id); + if (status != 0) { + return MESH_ERROR_UNKNOWN; + } + + return MESH_ERROR_NONE; +} + mesh_error_t WisunInterface::set_network_size(uint8_t network_size) { if (network_size == 0xff) {