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";
98 typedef void(*TaskFunction)(GlobalData* globalData);
173 RTTaskCreationParameters(
const char*
const argFunctionName,
const char*
const argLibraryName =
nullptr,
const char*
const argLibraryDirectory =
nullptr)
180 if (argFunctionName ==
nullptr)
182 throw std::invalid_argument(
"Task function name must not be null.");
186 if (argLibraryName !=
nullptr)
195 if (argLibraryDirectory !=
nullptr)
313 typedef int32_t (*GlobalMemberOffsetGetter)(
const char*
const name);
314 typedef int32_t (*GlobalNamesGetter)(
const char* names[], int32_t capacity);
315 typedef int32_t (*GlobalMemberTypeGetter)(
const char*
const name);
317 inline constexpr int32_t GlobalMaxSize = 2048;
319#if !defined(RSI_INTERNAL)
373 virtual int64_t
ExecutionCountAbsoluteWait(int64_t count = ExecutionCountDefault, int32_t timeoutMs = ExecutionCountWaitTimeoutMillisecondsDefault) = 0;
385 virtual int64_t
ExecutionCountRelativeWait(int64_t count = ExecutionCountDefault, int32_t timeoutMs = ExecutionCountWaitTimeoutMillisecondsDefault) = 0;
412 static constexpr int64_t ExecutionCountWaitFailure = -1;
414 static constexpr int64_t ExecutionCountDefault = 1;
416 static constexpr int32_t ExecutionCountWaitTimeoutMillisecondsDefault = 250;
474 virtual RapidVector<const char*>
GlobalNamesGet(
const char*
const libraryName =
nullptr,
const char*
const libraryDirectory =
nullptr) = 0;
538 virtual RTTask*
TaskSubmit(
const char*
const functionName,
const char*
const libraryName = RTTaskCreationParameters::LibraryNameDefault,
const char*
const libraryDirectory =
nullptr) = 0;
591 template <
int32_t Capacity>
592 class GlobalMetadataMap {
610 constexpr GlobalMetadataMap() : data(), tail(0) {}
612 constexpr GlobalMetadataMap(std::initializer_list<Metadata> initData)
614 for (
const auto& item : initData)
620 constexpr int32_t Size()
const {
return tail; }
622 constexpr Metadata operator[](int32_t index)
const {
return data[index]; }
624 constexpr Metadata operator[](
const char* key)
const
626 for (int32_t index = 0; index < tail; ++index)
628 auto& metadata = data[index];
629 if (std::strcmp(metadata.key, key)==0)
634 constexpr char errorMessageFormat[] =
"Key '%s' not found in GlobalMetadata.";
635 constexpr int32_t bufferSize = 256;
636 char buffer[bufferSize] = {0};
637 std::snprintf(buffer, bufferSize, errorMessageFormat, key);
638 throw std::out_of_range(buffer);
642 Metadata data[Capacity]{};
648 template<
typename Type,
typename =
void>
650 template<
typename Type>
651 struct RSIDataTypeGet<Type, typename std::enable_if<std::is_integral<Type>::value && std::is_signed<Type>::value , void>::type>
653 template<
typename Type>
654 struct RSIDataTypeGet<Type, typename std::enable_if<std::is_integral<Type>::value && std::is_unsigned<Type>::value , void>::type>
656 template<
typename Type>
657 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.
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)).
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.
int32_t TaskPriority
Priority of the task (coming soon).
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 int32_t 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...
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.
uint64_t CycleTimeLast
Execution time of the last cycle in nanoseconds.
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.
RTTaskStatus provides status information for a real-time task, including its current state,...
RTTaskState State
Current state of the task.
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.
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.