4#include "moc_Trajectory1D.cpp"
23 DwellTime = std::chrono::milliseconds(100);
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;
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);
214 ModuleData->GetPositionerStage()->StopMotion();
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()))));
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...
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.