4 #include "moc_Trajectory1D.cpp"
23 DwellTime = std::chrono::milliseconds(100);
38 {
"Trigger only manually and stop after playback", Trajectory1DData::TriggerModeType::ManualOnce },
39 {
"Trigger only manually each time a trigger event occurs", Trajectory1DData::TriggerModeType::Manual },
40 {
"Trigger when the trajectory data stream changes", Trajectory1DData::TriggerModeType::OnStreamChanged }
73 auto Widget = std::make_unique<Trajectory1DWidget>(*
this);
84 auto Widget = GetWidget<Trajectory1DWidget>();
85 auto ModuleData = DynExp::dynamic_ModuleData_cast<Trajectory1D>(ModuleDataGetter());
87 Widget->GetUI().LESampleCount->setText(QString::number(
ModuleData->GetSamples().size()));
93 Widget->GetUI().PBProgress->setValue(
static_cast<int>((
static_cast<double>(
ModuleData->GetCurrentRepeatCount()) /
ModuleData->GetRepeatCount() +
94 std::max(0.0,
static_cast<double>(
ModuleData->GetCurrentPlaybackPos()) - 1.0)
96 Widget->GetUI().LRepetition->setText(QString(
"Repetition ") + QString::number(
ModuleData->GetCurrentRepeatCount() + 1)
97 +
" / " + QString::number(
ModuleData->GetRepeatCount()));
106 auto TrajectoryDataInstrData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::DataStreamInstrument>(
ModuleData->GetTrajectoryDataInstr()->GetInstrumentData());
107 auto SampleStream = TrajectoryDataInstrData->GetSampleStream();
109 if (SampleStream->GetNumSamplesWritten() !=
ModuleData->GetLastWrittenSampleID())
111 if (SampleStream->GetNumSamplesWritten() <
ModuleData->GetLastWrittenSampleID())
114 SampleStream->SeekBeg(std::ios_base::in);
115 ModuleData->SetSamples(SampleStream->ReadBasicSamples(SampleStream->GetStreamSizeRead()));
116 ModuleData->SetLastWrittenSampleID(SampleStream->GetNumSamplesWritten());
121 if (!SampleStream->IsBasicSampleTimeUsed())
122 for (
size_t i = 0; i <
ModuleData->GetSamples().size(); ++i)
124 * i / decltype(
ModuleData->GetDwellTime())::period::den;
129 case Trajectory1DData::TriggerModeType::OnStreamChanged:
132 case Trajectory1DData::TriggerModeType::Manual:
147 std::chrono::system_clock::duration TimeEllapsed;
150 ModuleData->SetTrajectoryStartedTime(std::chrono::system_clock::now());
151 TimeEllapsed = std::chrono::milliseconds(0);
154 TimeEllapsed = std::chrono::system_clock::now() -
ModuleData->GetTrajectoryStartedTime();
156 const auto& Samples =
ModuleData->GetSamples();
157 for (
size_t i =
ModuleData->GetCurrentPlaybackPos() - 1; i < Samples.size(); ++i)
159 auto ThisSampleStart = std::chrono::milliseconds(Util::NumToT<std::chrono::milliseconds::rep>(Samples[i].Time * std::chrono::milliseconds::period::den));
160 auto NextSampleStart = i + 1 >= Samples.size() ? std::chrono::milliseconds(0)
161 : std::chrono::milliseconds(Util::NumToT<std::chrono::milliseconds::rep>(Samples[i + 1].Time * std::chrono::milliseconds::period::den));
164 if ((ThisSampleStart <= TimeEllapsed && NextSampleStart > TimeEllapsed) ||
165 (ThisSampleStart <= TimeEllapsed && i + 1 == Samples.size()))
167 ModuleData->GetPositionerStage()->MoveAbsolute(Samples[i].Value);
187 case Trajectory1DData::TriggerModeType::Manual: [[fallthrough]];
188 case Trajectory1DData::TriggerModeType::OnStreamChanged:
214 ModuleData->GetPositionerStage()->StopMotion();
221 (
ModuleData->GetTriggerMode() != Trajectory1DData::TriggerModeType::ManualOnce ||
235 auto ModuleParams = DynExp::dynamic_Params_cast<Trajectory1D>(Instance->
ParamsGetter());
240 if (ModuleParams->Communicator.ContainsID())
243 ModuleData->SetTriggerMode(ModuleParams->TriggerMode);
244 ModuleData->SetRepeatCount(std::max(
static_cast<size_t>(1), Util::NumToT<size_t>(ModuleParams->RepeatCount)));
245 ModuleData->SetDwellTime(std::chrono::milliseconds(Util::NumToT<std::chrono::milliseconds::rep>(std::max(1.0, ModuleParams->DwellTime.Get()))));
247 ModuleData->SetReady(
ModuleData->GetTriggerMode() != Trajectory1DData::TriggerModeType::ManualOnce);
Implementation of a module to interpret samples stored in a data stream instrument as trajectories of...
size_t LastWrittenSampleID
size_t CurrentPlaybackPos
0 means waiting for trigger. Values > 0 mean running. They indicate the sample to be written next.
DynExpInstr::DataStreamBase::BasicSampleListType Samples
std::chrono::time_point< std::chrono::system_clock > TrajectoryStartedTime
TriggerModeType TriggerMode
void ResetImpl(dispatch_tag< QModuleDataBase >) override final
size_t CurrentRepeatCount
bool Ready
Running (not necessarily triggered yet) if true.
std::chrono::milliseconds DwellTime
static Util::TextValueListType< Trajectory1DData::TriggerModeType > TriggerModeTypeStrList()
void ResetImpl(dispatch_tag< QModuleBase >) override final
void UpdateStream(Util::SynchronizedPointer< ModuleDataType > &ModuleData)
std::unique_ptr< DynExp::QModuleWidget > MakeUIWidget() override final
Used by InitUI() as a factory function for the module's user interface widget. Create the widget here...
void Start(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void OnTriggerClicked(DynExp::ModuleInstance *Instance, bool) const
void OnTrigger(DynExp::ModuleInstance *Instance) const
void Trigger(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void OnInit(DynExp::ModuleInstance *Instance) const override final
This event is triggered right before the module thread starts. Override it to lock instruments this m...
size_t NumFailedUpdateAttempts
void OnStartClicked(DynExp::ModuleInstance *Instance, bool) const
void Stop(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void OnExit(DynExp::ModuleInstance *Instance) const override final
This event is triggered right before the module thread terminates (not due to an exception,...
void OnStopClicked(DynExp::ModuleInstance *Instance, bool) const
void OnStop(DynExp::ModuleInstance *Instance) const
Util::DynExpErrorCodes::DynExpErrorCodes ModuleMainLoop(DynExp::ModuleInstance &Instance) override final
Module main loop. The function is executed periodically by the module thread. Also refer to GetMainLo...
void OnStart(DynExp::ModuleInstance *Instance) const
void Move(Util::SynchronizedPointer< ModuleDataType > &ModuleData)
void UpdateUIChild(const ModuleBase::ModuleDataGetterType &ModuleDataGetter) override final
static void Register(const ModuleBase &Listener, CallableT EventFunc)
Registers/Subscribes module Listener to the event with the event function EventFunc....
static void Deregister(const ModuleBase &Listener)
Deregisters/unsubscribes module Listener from the event. Indirectly calls ModuleBase::RemoveRegistere...
const std::unique_ptr< ModuleDataType > ModuleData
Module data belonging to this ModuleBase instance.
Refer to ParamsBase::dispatch_tag.
Defines data for a thread belonging to a ModuleBase instance. Refer to RunnableInstance.
const ModuleBase::ModuleDataGetterType ModuleDataGetter
Getter for module's data. Refer to ModuleBase::ModuleDataGetterType.
Refer to ParamsBase::dispatch_tag.
QModuleWidget * Widget
User interface widget belonging to the module.
void Connect(SenderType *Sender, SignalType Signal, ReceiverType *Receiver, EventType Event)
Uses Qt's connect mechanism to connect a QObject's signal to a DynExp module's event....
const Object::ParamsGetterType ParamsGetter
Invoke to obtain the parameters (derived from ParamsBase) of Owner.
void UnlockObject(LinkedObjectWrapperContainer< ObjectT > &ObjectWrapperContainer)
Unlocks an Object instance stored in the LinkedObjectWrapperContainer ObjectWrapperContainer....
void LockObject(const ParamsBase::Param< ObjectLink< ObjectT >> &LinkParam, LinkedObjectWrapperContainer< ObjectT > &ObjectWrapperContainer, std::chrono::milliseconds Timeout=ObjectLinkBase::LockObjectTimeoutDefault)
Locks an Object instance referenced by a parameter LinkParam of type ParamsBase::Param< ObjectLink< O...
const auto & GetOwner() const noexcept
Returns Owner.
Pointer to lock a class derived from ISynchronizedPointerLockable for synchronizing between threads....
Thrown when an operation timed out before it could be completed, especially used for locking shared d...
@ Continuous
Run continuously disabling the trigger.
DynExp's module namespace contains the implementation of DynExp modules which extend DynExp's core fu...
DynExpErrorCodes
DynExp's error codes
std::vector< std::pair< TextType, ValueType > > TextValueListType
Type of a list containing key-value pairs where key is a text of type Util::TextType.
Accumulates include statements to provide a precompiled header.
double DataType
Data type of time and value.