@@ -14,6 +14,10 @@ const std::vector<std::pair<MqttPublisherFbImpl::SignalStatus, std::string>> Mqt
1414 {SignalStatus::Invalid, " Invalid" },
1515 {SignalStatus::Valid, " Valid" }};
1616
17+ const std::vector<std::pair<MqttPublisherFbImpl::PublishingStatus, std::string>> MqttPublisherFbImpl::publishingStatusMap =
18+ {{PublishingStatus::Ok, " Ok" },
19+ {PublishingStatus::SampleSkipped, " SampleSkipped" }};
20+
1721MqttPublisherFbImpl::MqttPublisherFbImpl (const ContextPtr& ctx,
1822 const ComponentPtr& parent,
1923 const FunctionBlockTypePtr& type,
@@ -24,10 +28,14 @@ MqttPublisherFbImpl::MqttPublisherFbImpl(const ContextPtr& ctx,
2428 jsonDataWorker(loggerComponent),
2529 inputPortCount(0 ),
2630 running(true ),
27- hasError(false )
31+ hasError(false ),
32+ skippedMsgCnt(0 ),
33+ publishingStatusTimer(helper::utils::Timer(1000 , false ))
2834{
2935 initComponentStatus ();
30- initSignalStatus ();
36+ addTypesToTypeManager (context.getTypeManager ());
37+ setSignalStatus (SignalStatus::NotConnected, " " , true );
38+ setPublishingStatus (PublishingStatus::Ok, " " , true );
3139 if (config.assigned ())
3240 initProperties (populateDefaultConfig (type.createDefaultConfig (), config));
3341 else
@@ -171,8 +179,12 @@ void MqttPublisherFbImpl::updateInputPorts()
171179
172180void MqttPublisherFbImpl::validateInputPorts ()
173181{
182+ skippedMsgCnt = 0 ;
183+ publishedMsgCnt = 0 ;
184+ setPublishingStatus (PublishingStatus::Ok);
174185 if (signalContexts.size () == 1 ) // no one input port is connected
175186 {
187+ setComponentStatus (ComponentStatus::Ok);
176188 setSignalStatus (SignalStatus::NotConnected);
177189 }
178190 else
@@ -280,6 +292,7 @@ void MqttPublisherFbImpl::readerLoop()
280292 msgs = handler->processSignalContexts (signalContexts);
281293 }
282294 sendMessages (msgs);
295+ updatePublishingStatus ();
283296 std::this_thread::sleep_for (std::chrono::milliseconds (config.periodMs ));
284297 }
285298}
@@ -291,7 +304,13 @@ void MqttPublisherFbImpl::sendMessages(const MqttData& data)
291304 auto status = mqttClient->publish (topic, (void *)msg.c_str (), msg.length (), config.qos );
292305 if (!status.success )
293306 {
294- LOG_W (" Failed to publish data to {}; reason - {}" , topic, status.msg );
307+ ++skippedMsgCnt;
308+ lastSkippedReason = std::move (status.msg );
309+ LOG_W (" Failed to publish data to {}; reason - {}" , topic, lastSkippedReason);
310+ }
311+ else
312+ {
313+ ++publishedMsgCnt;
295314 }
296315 }
297316}
@@ -301,27 +320,55 @@ std::string MqttPublisherFbImpl::getLocalId()
301320 return std::string (MQTT_LOCAL_PUB_FB_ID_PREFIX + std::to_string (localIndex++));
302321}
303322
304- void MqttPublisherFbImpl::initSignalStatus ( )
323+ void MqttPublisherFbImpl::setSignalStatus ( const SignalStatus status, std::string message, bool init )
305324{
325+ signalStatus = EnumerationWithIntValue (MQTT_PUB_FB_SIG_STATUS_TYPE, static_cast <Int>(status), context.getTypeManager ());
326+ if (init)
327+ statusContainer.template asPtr <IComponentStatusContainerPrivate>(true ).addStatusWithMessage (MQTT_PUB_FB_SIG_STATUS_NAME,
328+ signalStatus,
329+ message);
330+ else
331+ statusContainer.template asPtr <IComponentStatusContainerPrivate>(true ).setStatusWithMessage (MQTT_PUB_FB_SIG_STATUS_NAME,
332+ signalStatus,
333+ message);
334+ }
306335
307- addTypeToTypeManager (context.getTypeManager ());
308-
309- signalStatus = EnumerationWithIntValue (MQTT_PUB_FB_SIG_STATUS_TYPE,
310- static_cast <Int>(SignalStatus::NotConnected),
311- this ->context .getTypeManager ());
312- statusContainer.template asPtr <IComponentStatusContainerPrivate>(true ).addStatus (" SignalStatus" ,
313- signalStatus);
336+ void MqttPublisherFbImpl::updatePublishingStatus ()
337+ {
338+ if (publishingStatusTimer.expired ())
339+ {
340+ publishingStatusTimer.restart ();
341+ if (skippedMsgCnt != 0 )
342+ {
343+ if (statusContainer.getStatus (" ComponentStatus" ) == ComponentStatus::Ok)
344+ setComponentStatusWithMessage (ComponentStatus::Warning, " Some messages were not published!" );
345+ setPublishingStatus (PublishingStatus::SampleSkipped,
346+ fmt::format (" Published: {}; Skipped: {}; last reason - {}" ,
347+ publishedMsgCnt,
348+ skippedMsgCnt,
349+ lastSkippedReason));
350+ }
351+ else
352+ {
353+ setPublishingStatus (PublishingStatus::Ok, fmt::format (" Published: {};" , publishedMsgCnt));
354+ }
355+ }
314356}
315357
316- void MqttPublisherFbImpl::setSignalStatus (const SignalStatus status, std::string message)
358+ void MqttPublisherFbImpl::setPublishingStatus (const PublishingStatus status, std::string message, bool init )
317359{
318- signalStatus = EnumerationWithIntValue (MQTT_PUB_FB_SIG_STATUS_TYPE, static_cast <Int>(status), this ->context .getTypeManager ());
319- statusContainer.template asPtr <IComponentStatusContainerPrivate>(true ).setStatusWithMessage (" SignalStatus" ,
320- signalStatus,
321- message);
360+ publishingStatus = EnumerationWithIntValue (MQTT_PUB_FB_PUB_STATUS_TYPE, static_cast <Int>(status), context.getTypeManager ());
361+ if (init)
362+ statusContainer.template asPtr <IComponentStatusContainerPrivate>(true ).addStatusWithMessage (MQTT_PUB_FB_PUB_STATUS_NAME,
363+ publishingStatus,
364+ message);
365+ else
366+ statusContainer.template asPtr <IComponentStatusContainerPrivate>(true ).setStatusWithMessage (MQTT_PUB_FB_PUB_STATUS_NAME,
367+ publishingStatus,
368+ message);
322369}
323370
324- void MqttPublisherFbImpl::addTypeToTypeManager (daq::TypeManagerPtr manager)
371+ void MqttPublisherFbImpl::addTypesToTypeManager (daq::TypeManagerPtr manager)
325372{
326373 if (!manager.hasType (MQTT_PUB_FB_SIG_STATUS_TYPE))
327374 {
@@ -331,5 +378,14 @@ void MqttPublisherFbImpl::addTypeToTypeManager(daq::TypeManagerPtr manager)
331378
332379 manager.addType (EnumerationType (MQTT_PUB_FB_SIG_STATUS_TYPE, list));
333380 }
381+
382+ if (!manager.hasType (MQTT_PUB_FB_PUB_STATUS_TYPE))
383+ {
384+ auto list = List<IString>();
385+ for (const auto & [_, st] : publishingStatusMap)
386+ list.pushBack (st);
387+
388+ manager.addType (EnumerationType (MQTT_PUB_FB_PUB_STATUS_TYPE, list));
389+ }
334390}
335391END_NAMESPACE_OPENDAQ_MQTT_STREAMING_MODULE
0 commit comments