18#if !defined(RSI_INTERNAL)
22#define RSI_GLOBAL(type, name) \
23 static_assert(sizeof(std::atomic<type>) == sizeof(type), "Expected size of "#type" to be equal to std::atomic<"#type">."); \
24 alignas(uint64_t) std::atomic<type> name
26#define REGISTER_GLOBAL(name) \
27 { #name, offsetof(GlobalData, name), sizeof(GlobalData::name), RSIDataTypeGet<decltype(GlobalData::name.load())>::type }
33namespace RealTimeTasks
38 class RTTaskImplementation;
39 class RTTaskManagerImplementation;
47 static constexpr int32_t RTTaskManagerCountMaximum = 8;
49 static constexpr int32_t RTTaskCountMaximum = 64;
51 static constexpr char RTTaskManagerExecutableName[] =
"rttaskmanager";
117 using TaskFunction = int32_t(*)(GlobalData*,
char*,
const uint32_t);
192 RTTaskCreationParameters(
const char*
const argFunctionName,
const char*
const argLibraryName =
nullptr,
const char*
const argLibraryDirectory =
nullptr)
199 if (argFunctionName ==
nullptr)
201 throw std::invalid_argument(
"Task function name must not be null.");
205 if (argLibraryName !=
nullptr)
214 if (argLibraryDirectory !=
nullptr)
274 static constexpr uint64_t ErrorMessageSizeMaximum = 512;
275 char ErrorMessage[ErrorMessageSizeMaximum] = {};
356 typedef int32_t (*GlobalMemberOffsetGetter)(
const char*
const name);
357 typedef int32_t (*GlobalNamesGetter)(
const char* names[], int32_t capacity);
358 typedef int32_t (*GlobalMemberTypeGetter)(
const char*
const name);
360 inline constexpr int32_t GlobalMaxSize = 2048;
362#if !defined(RSI_INTERNAL)
416 virtual int64_t
ExecutionCountAbsoluteWait(int64_t count = ExecutionCountDefault, int32_t timeoutMs = ExecutionCountWaitTimeoutMillisecondsDefault) = 0;
428 virtual int64_t
ExecutionCountRelativeWait(int64_t count = ExecutionCountDefault, int32_t timeoutMs = ExecutionCountWaitTimeoutMillisecondsDefault) = 0;
455 static constexpr int64_t ExecutionCountWaitFailure = -1;
457 static constexpr int64_t ExecutionCountDefault = 1;
459 static constexpr int32_t ExecutionCountWaitTimeoutMillisecondsDefault = 250;
517 virtual RapidVector<const char*>
GlobalNamesGet(
const char*
const libraryName =
nullptr,
const char*
const libraryDirectory =
nullptr) = 0;
581 virtual RTTask*
TaskSubmit(
const char*
const functionName,
const char*
const libraryName = RTTaskCreationParameters::LibraryNameDefault,
const char*
const libraryDirectory =
nullptr) = 0;
634 template <
int32_t Capacity>
635 class GlobalMetadataMap {
653 constexpr GlobalMetadataMap() : data(), tail(0) {}
655 constexpr GlobalMetadataMap(std::initializer_list<Metadata> initData)
657 for (
const auto& item : initData)
663 constexpr int32_t Size()
const {
return tail; }
665 constexpr Metadata operator[](int32_t index)
const {
return data[index]; }
667 constexpr Metadata operator[](
const char* key)
const
669 for (int32_t index = 0; index < tail; ++index)
671 auto& metadata = data[index];
672 if (std::strcmp(metadata.key, key)==0)
677 constexpr char errorMessageFormat[] =
"Key '%s' not found in GlobalMetadata.";
678 constexpr int32_t bufferSize = 256;
679 char buffer[bufferSize] = {0};
680 std::snprintf(buffer, bufferSize, errorMessageFormat, key);
681 throw std::out_of_range(buffer);
685 Metadata data[Capacity]{};
691 template<
typename Type,
typename =
void>
693 template<
typename Type>
694 struct RSIDataTypeGet<Type, typename std::enable_if<std::is_integral<Type>::value && std::is_signed<Type>::value , void>::type>
696 template<
typename Type>
697 struct RSIDataTypeGet<Type, typename std::enable_if<std::is_integral<Type>::value && std::is_unsigned<Type>::value , void>::type>
699 template<
typename Type>
700 struct RSIDataTypeGet<Type, typename std::enable_if<std::is_floating_point<Type>::value, void>::type>
The RapidCode base class. All non-error objects are derived from this class.
RTTaskStatus StatusGet()=0
Get the current status of the task.
void Stop()=0
Stop the task from executing.
void TimingReset()=0
Reset the timing statistics for the task.
int32_t IdGet()=0
Get the ID of the task.
RTTaskInfo InfoGet()=0
Get information about the task.
int64_t ExecutionCountAbsoluteWait(int64_t count=ExecutionCountDefault, int32_t timeoutMs=ExecutionCountWaitTimeoutMillisecondsDefault)=0
Wait for the task to reach a specific execution count.
int64_t ExecutionCountRelativeWait(int64_t count=ExecutionCountDefault, int32_t timeoutMs=ExecutionCountWaitTimeoutMillisecondsDefault)=0
Wait for the task to execute a specific number of times relative to current count.
Interface for controlling and monitoring a single real-time task. See RTTaskManager::TaskSubmit and R...
RTTaskManagerInfo InfoGet()=0
Get information about the manager.
RSI::RapidCode::FirmwareValue GlobalValueGet(const char *const name, const char *const libraryName=nullptr, const char *const libraryDirectory=nullptr)=0
Read a GlobalTag by its name.
RapidVector< RTTask * > TasksGet()=0
Get all tasks managed by this RTTaskManager.
RTTask * TaskSubmit(const RTTaskCreationParameters ¶meters)=0
Submit a new task to the manager using creation parameters.
RSI::RapidCode::FirmwareValue GlobalValueGet(int32_t offset)=0
Read a GlobalTag by its offset. (internal use)
RTTask * TaskSubmit(const char *const functionName, const char *const libraryName=RTTaskCreationParameters::LibraryNameDefault, const char *const libraryDirectory=nullptr)=0
Submit a new task to the manager using function and library names.
void GlobalValueSet(const RSI::RapidCode::FirmwareValue &value, const char *const name, const char *const libraryName=nullptr, const char *const libraryDirectory=nullptr)=0
Set the value of a GlobalTag variable.
RTTaskManagerStatus StatusGet()=0
Get the current status of the manager.
int32_t IdGet()=0
Get the ID of the manager.
static RapidVector< RTTaskManager * > Discover()
Discover all active RTTaskManager instances.
RTTask * TaskSubmit(RTTaskCreationParameters &¶meters)=0
Submit a new task to the manager using move semantics.
RSI::RapidCode::RSIDataType GlobalTypeGet(const char *const name, const char *const libraryName=nullptr, const char *const libraryDirectory=nullptr)=0
Get the type of a GlobalTag variable.
static RTTaskManager * Get(const int32_t managerId)
Get an existing RTTaskManager by ID.
void Shutdown()=0
Shutdown the RTTaskManager firmware.
RapidVector< const char * > GlobalNamesGet(const char *const libraryName=nullptr, const char *const libraryDirectory=nullptr)=0
Get names of all global variables.
static RTTaskManager * Create(const RTTaskManagerCreationParameters ¶meters)
Create a new RTTaskManager instance.
Interface for managing real-time tasks firmware. See Real-Time Tasks for more information.
TaskPriority
Enum representing the priority levels for a real-time task.
@ MediumLow
A medium-low real-time priority level.
@ Low
A low real-time priority level.
@ Highest
The highest real-time priority level for an RTTask. Is below the priority of the main thread of the R...
@ High
A high real-time priority level.
@ Medium
A medium real-time priority level. This is the default priority for real-time tasks.
@ MediumHigh
A medium-high real-time priority level.
@ Lowest
The lowest real-time priority level for an RTTask. Is above standard thread priorities.
@ NonRealTime
A task without any real-time priority, given the operating system's default.
RTTaskManagerState
Enum representing the possible states of an RTTaskManager.
@ Stopped
Manager firmware is initialized but not currently running.
RTTaskState
Enum representing the possible states of a real-time task.
@ Dead
Task is not initialized or has been terminated.
@ Waiting
Task is active but waiting for its next scheduled execution time.
@ Running
Task is currently executing.
@ Disabled
Task is initialized but not currently executing.
PlatformType
Enum representing the platform type for an RTTaskManager.
@ Native
Native platform (where the library is running, Windows or Linux).
@ Windows
Standard Windows (useful for debugging tasks before running on INtime).
@ Linux
Linux with PREEMPT_RT.
RSIDataType
Data types for User Limits and other triggers.
@ RSIDataTypeUINT32
uint32 (unsigned 32-bit integer)
@ RSIDataTypeDOUBLE
double (64-bit floating point)
@ RSIDataTypeINT64
int64 (signed 64-bit integer)
@ RSIDataTypeINVALID
invalid
@ RSIDataTypeINT16
signed 16-bit integer
@ RSIDataTypeUINT16
unsigned 16-bit integer
@ RSIDataTypeINT32
int32 (signed 32-bit integer)
@ RSIDataTypeUINT64
uint64 (unsigned 64-bit integer)
@ RSIDataTypeFLOAT
float (32-bit floating point, rarely used)
RTTaskCreationParameters(const char *const argFunctionName, const char *const argLibraryName=nullptr, const char *const argLibraryDirectory=nullptr)
Constructor with function name and library details.
RTTaskCreationParameters specifies all the information required to create and configure a real-time t...
static constexpr int32_t RepeatForever
Special value to indicate the task should repeat forever.
char FunctionName[NameLengthMaximum]
Name of the task function to execute.
char LibraryName[NameLengthMaximum]
Name of the library containing the task function.
char UserLabel[NameLengthMaximum]
User-defined label for the task.
int32_t Repeats
Number of times the task should execute (RepeatForever for infinite, 0 for none (one-shot)).
TaskPriority Priority
Priority of the task (coming soon).
static constexpr int32_t RepeatNone
Special value to indicate the task should not repeat.
static constexpr int32_t PeriodDefault
Default execution period in RMP sample periods.
static constexpr int32_t DirectoryLengthMaximum
Maximum length of the library directory path.
char LibraryDirectory[DirectoryLengthMaximum]
Path to the directory containing the library with the task function.
int32_t Period
Execution period of the task in RMP sample periods.
static constexpr int32_t PhaseDefault
Default phase offset for task execution.
int32_t Phase
Phase offset for task execution. For example, if you have 4 tasks with a period of 4,...
static constexpr bool EnableTimingDefault
Default setting for timing measurements.
static constexpr int32_t NameLengthMaximum
Maximum length of name fields (library, function, user label).
static constexpr TaskPriority PriorityDefault
Default priority for real-time tasks.
static constexpr const char *const LibraryNameDefault
Default library name for the task function.
bool EnableTiming
Whether to enable timing measurements for the task. Keep in mind, enabling timing does add a small am...
RTTaskInfo provides information about a real-time task, including its creation parameters....
RTTaskCreationParameters CreationParameters
Creation parameters used to create the task.
RTTaskManagerCreationParameters specifies all the information required to create and configure an RTT...
bool NoRmp
Disable the initialization of the RMP and RapidCode objects on task manager startup and their use in ...
char UserLabel[NameLengthMaximum]
User-defined label for the manager.
int32_t CpuCore
[Linux] CPU core to which the manager should be pinned (-1 for no pinning).
static constexpr int32_t DirectoryLengthMaximum
Maximum length of the directory path.
char NodeName[NameLengthMaximum]
[INtime] Name of the node on which the manager will run.
char RTTaskDirectory[DirectoryLengthMaximum]
Path to the directory containing the real-time task libraries.
static constexpr int32_t NameLengthMaximum
Maximum length of name fields (node name, user label).
Information about RTTaskManager firmware, including its creation parameters and ID....
int32_t Id
ID of the manager.
RTTaskManagerCreationParameters CreationParameters
Creation parameters used to create the manager.
RTTaskManagerStatus provides status information for RTTaskManager firmware, including its current sta...
uint64_t CycleTimeMax
Maximum execution time of a cycle in nanoseconds.
uint64_t TaskSubmissionCount
Number of tasks submitted to the manager.
RTTaskManagerState State
Current state of the manager.
double StartTimeDeltaMean
Mean difference between the current and previous start of the main task manager loop execution in nan...
uint64_t CycleTimeLast
Execution time of the last cycle in nanoseconds.
uint64_t StartTimeDeltaLast
Last difference between the current and previous start of the main task manager loop execution in nan...
double CycleTimeMean
Mean execution time of cycles in nanoseconds.
uint64_t CycleTimeMin
Minimum execution time of a cycle in nanoseconds.
int64_t CycleCount
Number of cycles executed by the manager.
uint64_t StartTimeDeltaMax
Maximum difference between the current and previous start of the main task manager loop execution in ...
RTTaskStatus provides status information for a real-time task, including its current state,...
double StartTimeDeltaMean
Mean difference between the current and previous start of the task execution in nanoseconds.
RTTaskState State
Current state of the task.
uint64_t StartTimeDeltaLast
Last difference between the current and previous start of the task execution in nanoseconds.
static constexpr uint64_t InvalidExecutionTime
Invalid value for execution time, indicating timing is not enabled or the task has not executed.
uint64_t ExecutionTimeMin
Minimum execution time of the task in nanoseconds.
uint64_t ExecutionTimeMax
Maximum execution time of the task in nanoseconds.
int64_t ExecutionCount
Number of times the task has executed.
uint64_t StartTimeDeltaMax
Maximum difference between the current and previous start of the task execution in nanoseconds.
double ExecutionTimeMean
Mean execution time of the task in nanoseconds.
uint64_t ExecutionTimeLast
Last execution time of the task in nanoseconds.
RTTaskStatus()=default
Default constructor.
static constexpr int64_t InvalidExecutionCount
Invalid value for execution count, indicating the task has not executed.
Union representing a generic RMP firmware value with multiple data types, stored in 64-bits.