/*
µRtWare is a lightweight publish/subscribe middleware for real-time
applications. It was developed as part of the software habitat for the
Autonomous Mini Robot [1] (AMiRo) but can be used for other purposes as well.
Copyright (C) 2018..2020 Thomas Schöpping et al.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef URTWARE_SUBSCRIBER_H
#define URTWARE_SUBSCRIBER_H
#include
#include
/******************************************************************************/
/* CONSTANTS */
/******************************************************************************/
/******************************************************************************/
/* SETTINGS */
/******************************************************************************/
/******************************************************************************/
/* CHECKS */
/******************************************************************************/
/******************************************************************************/
/* DATA STRUCTURES AND TYPES */
/******************************************************************************/
/**
* @brief nrt subscriber
*/
typedef struct urt_nrtsubscriber
{
urt_basesubscriber_t base;
#if (URT_CFG_PUBSUB_PROFILING)
urt_delay_t minLatency;
urt_delay_t maxLatency;
#endif /* URT_CFG_PUBSUB_PROFILING */
}urt_nrtsubscriber_t;
/**
* @brief srt subscriber
*/
typedef struct urt_srtsubscriber
{
urt_basesubscriber_t base;
void* cbparams;
urt_usefulness_f* usefulnesscb;
#if (URT_CFG_PUBSUB_PROFILING)
urt_delay_t minLatency;
urt_delay_t maxLatency;
#endif /* URT_CFG_PUBSUB_PROFILING */
}urt_srtsubscriber_t;
/**
* @brief frt subscriber
*/
typedef struct urt_frtsubscriber
{
urt_basesubscriber_t base;
#if (URT_CFG_PUBSUB_QOS_DEADLINECHECKS)
urt_delay_t deadlineOffset;
#endif /* URT_CFG_PUBSUB_QOS_DEADLINECHECKS */
#if (URT_CFG_PUBSUB_QOS_JITTERCHECKS)
urt_delay_t maxJitter;
#endif /* URT_CFG_PUBSUB_QOS_JITTERCHECKS */
#if (URT_CFG_PUBSUB_QOS_JITTERCHECKS || URT_CFG_PUBSUB_PROFILING)
urt_delay_t minLatency;
urt_delay_t maxLatency;
#endif /* URT_CFG_PUBSUB_QOS_JITTERCHECKS || URT_CFG_PUBSUB_PROFILING */
}urt_frtsubscriber_t;
/**
* @brief nrt subscriber
*/
typedef struct urt_hrtsubscriber
{
urt_basesubscriber_t base;
struct urt_hrtsubscriber* next;
#if (URT_CFG_PUBSUB_QOS_DEADLINECHECKS)
urt_delay_t deadlineOffset;
urt_osTimer_t qosDeadlineTimer;
#endif /* URT_CFG_PUBSUB_QOS_DEADLINECHECKS */
#if (URT_CFG_PUBSUB_QOS_JITTERCHECKS)
urt_delay_t maxJitter;
#endif /* URT_CFG_PUBSUB_QOS_JITTERCHECKS */
#if (URT_CFG_PUBSUB_QOS_JITTERCHECKS || URT_CFG_PUBSUB_PROFILING)
urt_delay_t minLatency;
urt_delay_t maxLatency;
#endif /* URT_CFG_PUBSUB_QOS_JITTERCHECKS || URT_CFG_PUBSUB_PROFILING */
#if (URT_CFG_PUBSUB_QOS_RATECHECKS)
urt_delay_t expectedRate;
#endif /* URT_CFG_PUBSUB_QOS_RATECHECKS */
}urt_hrtsubscriber_t;
/******************************************************************************/
/* MACROS */
/******************************************************************************/
/******************************************************************************/
/* EXTERN DECLARATIONS */
/******************************************************************************/
#if defined(__cplusplus)
extern "C" {
#endif /* defined(__cplusplus) */
void urtNrtSubscriberInit(urt_nrtsubscriber_t* subscriber);
urt_status_t urtNrtSubscriberSubscribe(urt_nrtsubscriber_t* subscriber, urt_topic_t* topic, urt_message_t* messages);
urt_status_t urtNrtSubscriberFetchNextMessage(urt_nrtsubscriber_t* subscriber, void* payload, size_t bytes, urt_delay_t* latency);
urt_status_t urtNrtSubscriberFetchLatestMessage(urt_nrtsubscriber_t* subscriber, void* payload, size_t bytes, urt_delay_t* latency);
urt_status_t urtNrtSubscriberUnsubscribe(urt_nrtsubscriber_t* subscriber);
void urtSrtSubscriberInit(urt_srtsubscriber_t* subscriber);
urt_status_t urtSrtSubscriberSubscribe(urt_srtsubscriber_t* subscriber, urt_topic_t* topic, urt_message_t* messages, urt_usefulness_f* usefulnesscb, void* cbparams);
urt_status_t urtSrtSubscriberFetchNextMessage(urt_srtsubscriber_t* subscriber, void* payload, size_t bytes, urt_delay_t* latency);
urt_status_t urtSrtSubscriberFetchLatestMessage(urt_srtsubscriber_t* subscriber, void* payload, size_t bytes, urt_delay_t* latency);
float urtSrtSubscriberCalculateUsefulness(urt_srtsubscriber_t* subscriber, urt_delay_t latency);
urt_status_t urtSrtSubscriberUnsubscribe(urt_srtsubscriber_t* subscriber);
void urtFrtSubscriberInit(urt_frtsubscriber_t* subscriber);
urt_status_t urtFrtSubscriberSubscribe(urt_frtsubscriber_t* subscriber, urt_topic_t* topic, urt_message_t* messages, urt_delay_t deadline, urt_delay_t jitter);
urt_status_t urtFrtSubscriberFetchNextMessage(urt_frtsubscriber_t* subscriber, void* payload, size_t bytes, urt_delay_t* latency);
urt_status_t urtFrtSubscriberFetchLatestMessage(urt_frtsubscriber_t* subscriber, void* payload, size_t bytes, urt_delay_t* latency);
bool urtFrtSubscriberCalculateValidity(urt_frtsubscriber_t* subscriber, urt_delay_t latency);
urt_status_t urtFrtSubscriberUnsubscribe(urt_frtsubscriber_t* subscriber);
void urtHrtSubscriberInit(urt_hrtsubscriber_t* subscriber);
urt_status_t urtHrtSubscriberSubscribe(urt_hrtsubscriber_t* subscriber, urt_topic_t* topic, urt_message_t* messages, urt_delay_t deadline, urt_delay_t rate, urt_delay_t jitter);
urt_status_t urtHrtSubscriberFetchNextMessage(urt_hrtsubscriber_t* subscriber, void* payload, size_t bytes, urt_delay_t* latency);
urt_status_t urtHrtSubscriberFetchLatestMessage(urt_hrtsubscriber_t* subscriber, void* payload, size_t bytes, urt_delay_t* latency);
urt_status_t urtHrtSubscriberUnsubscribe(urt_hrtsubscriber_t* subscriber);
#if defined(__cplusplus)
}
#endif /* defined(__cplusplus) */
/******************************************************************************/
/* INLINE FUNCTIONS */
/******************************************************************************/
#endif /* URTWARE_SUBSCRIBER_H */