Skip to content

Commit dd9d234

Browse files
committed
mqtt: dynamic properties for publisher FB
1 parent f5d9710 commit dd9d234

3 files changed

Lines changed: 21 additions & 6 deletions

File tree

mqtt_streaming_module/include/mqtt_streaming_module/handler_factory.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ class HandlerFactory
3131
{
3232
if (config.sharedTs)
3333
{
34-
return std::make_unique<MultipleSharedHandler>(config.useSignalNames, config.topicName);
34+
return std::make_unique<MultipleSharedHandler>(config.useSignalNames,
35+
config.topicName.empty() ? publisherFbGlobalId : config.topicName);
3536
}
3637
else if (config.topicMode == TopicMode::Single)
3738
{
@@ -42,7 +43,8 @@ class HandlerFactory
4243
}
4344
else if (config.topicMode == TopicMode::Multi)
4445
{
45-
return std::make_unique<MultipleHandler>(config.useSignalNames, config.topicName);
46+
return std::make_unique<MultipleHandler>(config.useSignalNames,
47+
config.topicName.empty() ? publisherFbGlobalId : config.topicName);
4648
}
4749

4850
return std::make_unique<SingleHandler>(config.useSignalNames);

mqtt_streaming_module/include/mqtt_streaming_module/mqtt_publisher_fb_impl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class MqttPublisherFbImpl final : public FunctionBlock
5555
static std::string getLocalId();
5656
void initProperties(const PropertyObjectPtr& config);
5757
void readProperties();
58+
void propertyChanged();
5859
void updateInputPorts();
5960
void validateInputPorts();
6061
template <typename retT, typename intfT>

mqtt_streaming_module/src/mqtt_publisher_fb_impl.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@ FunctionBlockTypePtr MqttPublisherFbImpl::CreateType()
5252
defaultConfig.addProperty(builder.build());
5353
}
5454
{
55-
auto builder = StringPropertyBuilder(PROPERTY_NAME_PUB_TOPIC_NAME, "")
56-
.setDescription("")
57-
.setVisible(EvalValue(std::string("$") + PROPERTY_NAME_PUB_TOPIC_MODE + " == 1"));
55+
auto builder =
56+
StringPropertyBuilder(PROPERTY_NAME_PUB_TOPIC_NAME, "")
57+
.setDescription(
58+
"Topic name for publishing in multiple-topic mode. If left empty, the Publisher's Global ID is used as the topic name.")
59+
.setVisible(EvalValue(std::string("$") + PROPERTY_NAME_PUB_TOPIC_MODE + " == 1"));
5860
defaultConfig.addProperty(builder.build());
5961
}
6062
{
@@ -190,6 +192,8 @@ void MqttPublisherFbImpl::initProperties(const PropertyObjectPtr& config)
190192
if (const auto internalProp = prop.asPtrOrNull<IPropertyInternal>(true); internalProp.assigned())
191193
{
192194
objPtr.addProperty(internalProp.clone());
195+
objPtr.getOnPropertyValueWrite(prop.getName()) +=
196+
[this](PropertyObjectPtr& obj, PropertyValueEventArgsPtr& args) { propertyChanged(); };
193197
}
194198
}
195199
objPtr.setPropertyValue(propName, prop.getValue());
@@ -200,7 +204,7 @@ void MqttPublisherFbImpl::initProperties(const PropertyObjectPtr& config)
200204
void MqttPublisherFbImpl::readProperties()
201205
{
202206
auto lock = this->getRecursiveConfigLock();
203-
int tmpTopicMode = readProperty<int, IInteger>(PROPERTY_NAME_PUB_TOPIC_MODE, false);
207+
int tmpTopicMode = readProperty<int, IInteger>(PROPERTY_NAME_PUB_TOPIC_MODE, 0);
204208
if (tmpTopicMode < static_cast<int>(TopicMode::_count) && tmpTopicMode >= 0)
205209
config.topicMode = static_cast<TopicMode>(tmpTopicMode);
206210
else
@@ -218,6 +222,14 @@ void MqttPublisherFbImpl::readProperties()
218222
config.topicName = readProperty<std::string, IString>(PROPERTY_NAME_PUB_TOPIC_NAME, DEFAULT_PUB_TOPIC_NAME);
219223
}
220224

225+
void MqttPublisherFbImpl::propertyChanged()
226+
{
227+
auto lock = this->getRecursiveConfigLock();
228+
readProperties();
229+
handler = HandlerFactory::create(this->config, globalId.toStdString());
230+
validateInputPorts();
231+
}
232+
221233
template <typename retT, typename intfT>
222234
retT MqttPublisherFbImpl::readProperty(const std::string& propertyName, const retT defaultValue)
223235
{

0 commit comments

Comments
 (0)