21const gsdml::GSDMLSubmodule& RequireAumaSubmodule(
const gsdml::GSDMLDevice& device,
22 const std::string& moduleId,
23 const std::string& submoduleId)
25 const auto*
module = device.FindModule(moduleId);
26 if (module ==
nullptr)
28 throw std::invalid_argument(
"AUMA simulator GSDML is missing module: " + moduleId);
31 const auto inlineIt =
module->submodules.find(submoduleId);
32 if (inlineIt != module->submodules.end())
34 return inlineIt->second;
37 const auto* submodule = device.FindSubmodule(submoduleId);
38 if (submodule ==
nullptr)
40 throw std::invalid_argument(
"AUMA simulator GSDML is missing submodule: " + submoduleId);
50std::uint16_t ResolveFixedSlot(
const gsdml::GSDMLDevice& device,
51 const std::string& moduleId,
52 const std::uint16_t fallback)
54 for (
const auto& reference : device.moduleReferences)
56 if (reference.moduleId == moduleId && !reference.fixedSlots.empty())
58 return static_cast<std::uint16_t
>(reference.fixedSlots.front());
68std::uint16_t ResolveFixedSubslot(
const gsdml::GSDMLSubmodule& submodule,
69 const std::uint16_t fallback)
71 if (!submodule.fixedSubslots.empty())
73 return static_cast<std::uint16_t
>(submodule.fixedSubslots.front());
83std::uint16_t ResolveModuleReferenceSubslot(
const gsdml::GSDMLModule& module,
84 const std::string& submoduleId,
85 const std::uint16_t fallback)
87 for (
const auto& reference : module.submoduleReferences)
89 if (reference.submoduleId == submoduleId && !reference.fixedSubslots.empty())
91 return static_cast<std::uint16_t
>(reference.fixedSubslots.front());
101 const std::uint16_t inputFrameId,
102 const std::uint16_t outputFrameId,
103 const std::uint16_t sendClockFactor,
104 const std::uint16_t reductionRatio,
105 const std::uint16_t watchdogFactor,
106 const std::uint16_t dataHoldFactor)
108 const auto* inputModule = device.
FindModule(
"ID_MODULE_ADI_IN_0");
109 const auto* outputModule = device.
FindModule(
"ID_MODULE_ADI_OUT_0");
110 if (inputModule ==
nullptr || outputModule ==
nullptr)
112 throw std::invalid_argument(
"AUMA GSDML does not contain the expected ADI modules");
115 const auto* input = &RequireAumaSubmodule(device, inputModule->id,
"ID_SUBMOD_ADI_IN_0");
116 const auto* output = &RequireAumaSubmodule(device, outputModule->id,
"ID_SUBMOD_ADI_OUT_0");
118 if (input->inputLength <= 0 || output->outputLength <= 0)
120 throw std::invalid_argument(
"AUMA simulator GSDML contains empty process-data modules");
123 const auto inputSlot = ResolveFixedSlot(device, inputModule->id, 1U);
124 const auto outputSlot = ResolveFixedSlot(device, outputModule->id, 2U);
125 const auto inputSubslot = ResolveModuleReferenceSubslot(
126 *inputModule, input->id, ResolveFixedSubslot(*input, 1U));
127 const auto outputSubslot = ResolveModuleReferenceSubslot(
128 *outputModule, output->id, ResolveFixedSubslot(*output, 1U));
135 constexpr std::uint16_t kAumaInputCsduLength = 43U;
136 constexpr std::uint16_t kAumaOutputCsduLength = 25U;
147 std::max<std::uint16_t>(kAumaInputCsduLength,
148 static_cast<std::uint16_t
>(input->inputLength + 1));
154 static_cast<std::uint16_t
>(input->inputLength),
155 static_cast<std::uint16_t
>(input->inputLength),
167 std::max<std::uint16_t>(kAumaOutputCsduLength,
168 static_cast<std::uint16_t
>(output->outputLength + 9));
174 static_cast<std::uint16_t
>(output->outputLength),
175 static_cast<std::uint16_t
>(output->outputLength + 8),
182 (void)dataHoldFactor;
constexpr std::uint16_t IOCR_TYPE_INPUT
IOCR direction: Device -> Controller.
constexpr std::uint16_t IOCR_TYPE_OUTPUT
IOCR direction: Controller -> Device.
VirtualAumaIocrConfiguration MakeVirtualAumaIocrConfiguration(const gsdml::GSDMLDevice &device, std::uint16_t inputFrameId=0x9000, std::uint16_t outputFrameId=0x8001, std::uint16_t sendClockFactor=32, std::uint16_t reductionRatio=8, std::uint16_t watchdogFactor=3, std::uint16_t dataHoldFactor=3)
Build the standard two-module AUMA SGx process-data layout from its GSDML.
Complete parsed GSDML device profile.
const GSDMLModule * FindModule(const std::string &moduleId) const
Look up a module by its GSDML ID.
std::vector< IODataObject > objects
IO data objects carried in this IOCR's cyclic frame.
std::uint16_t dataLength
Total cyclic data length in bytes.
std::uint16_t typeIOCR
IOCR direction: 1=Input, 2=Output.
std::uint16_t referenceIOCR
IOCR reference assigned during AR establishment.
std::uint16_t sendClockFactor
Send clock base factor (31.25us units).
std::uint16_t frameId
Frame ID assigned to this IOCR.
std::uint16_t reductionRatio
Reduction ratio relative to the send clock.
std::uint16_t watchdogFactor
Watchdog factor (missed-frame tolerance before a timeout fault).
Input and output RTC1 configurations used by the virtual AUMA peer.
rt::IOCRConfig input
Device-to-controller IOCR.
rt::IOCRConfig output
Controller-to-device IOCR.
Helpers for constructing a GSDML-derived AUMA SGx RTC1 test configuration.