4#include "moc_Trajectory1D.cpp"
5#include "ui_Trajectory1D.h"
11 : QModuleWidget(Owner, parent),
28 DwellTime = std::chrono::milliseconds(100);
88 auto Widget = std::make_unique<Trajectory1DWidget>(*
this);
99 auto Widget = GetWidget<Trajectory1DWidget>();
100 auto ModuleData = DynExp::dynamic_ModuleData_cast<Trajectory1D>(ModuleDataGetter());
102 Widget->GetUI()->LESampleCount->setText(QString::number(
ModuleData->GetSamples().size()));
108 Widget->GetUI()->PBProgress->setValue(
static_cast<int>((
static_cast<double>(
ModuleData->GetCurrentRepeatCount()) /
ModuleData->GetRepeatCount() +
109 std::max(0.0,
static_cast<double>(
ModuleData->GetCurrentPlaybackPos()) - 1.0)
111 Widget->GetUI()->LRepetition->setText(QString(
"Repetition ") + QString::number(
ModuleData->GetCurrentRepeatCount() + 1)
112 +
" / " + QString::number(
ModuleData->GetRepeatCount()));
121 auto TrajectoryDataInstrData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::DataStreamInstrument>(
ModuleData->GetTrajectoryDataInstr()->GetInstrumentData());
122 auto SampleStream = TrajectoryDataInstrData->GetSampleStream();
124 if (SampleStream->GetNumSamplesWritten() !=
ModuleData->GetLastWrittenSampleID())
126 if (SampleStream->GetNumSamplesWritten() <
ModuleData->GetLastWrittenSampleID())
129 SampleStream->SeekBeg(std::ios_base::in);
130 ModuleData->SetSamples(SampleStream->ReadBasicSamples(SampleStream->GetStreamSizeRead()));
131 ModuleData->SetLastWrittenSampleID(SampleStream->GetNumSamplesWritten());
136 if (!SampleStream->IsBasicSampleTimeUsed())
137 for (
size_t i = 0; i <
ModuleData->GetSamples().size(); ++i)
139 * i /
decltype(
ModuleData->GetDwellTime())::period::den;
162 std::chrono::system_clock::duration TimeEllapsed;
165 ModuleData->SetTrajectoryStartedTime(std::chrono::system_clock::now());
166 TimeEllapsed = std::chrono::milliseconds(0);
169 TimeEllapsed = std::chrono::system_clock::now() -
ModuleData->GetTrajectoryStartedTime();
171 const auto& Samples =
ModuleData->GetSamples();
172 for (
size_t i =
ModuleData->GetCurrentPlaybackPos() - 1; i < Samples.size(); ++i)
174 auto ThisSampleStart = std::chrono::milliseconds(Util::NumToT<std::chrono::milliseconds::rep>(Samples[i].Time * std::chrono::milliseconds::period::den));
175 auto NextSampleStart = i + 1 >= Samples.size() ? std::chrono::milliseconds(0)
176 : std::chrono::milliseconds(Util::NumToT<std::chrono::milliseconds::rep>(Samples[i + 1].Time * std::chrono::milliseconds::period::den));
179 if ((ThisSampleStart <= TimeEllapsed && NextSampleStart > TimeEllapsed) ||
180 (ThisSampleStart <= TimeEllapsed && i + 1 == Samples.size()))
182 const auto Dest = Util::NumToT<DynExpInstr::PositionerStageData::PositionType>(Samples[i].Value *
ModuleData->GetPosMultiplier());
184 ModuleData->GetPositionerStage()->MoveAbsolute(Dest);
186 ModuleData->GetPositionerStage()->MoveRelative(Dest);
234 ModuleData->GetPositionerStage()->StopMotion();
255 auto ModuleParams = DynExp::dynamic_Params_cast<Trajectory1D>(Instance->
ParamsGetter());
260 if (ModuleParams->Communicator.ContainsID())
263 ModuleData->SetTriggerMode(ModuleParams->TriggerMode);
264 ModuleData->SetPositioningMode(ModuleParams->PositioningMode);
265 ModuleData->SetPosMultiplier(ModuleParams->PosMultiplier);
266 ModuleData->SetRepeatCount(std::max(
static_cast<size_t>(1), Util::NumToT<size_t>(ModuleParams->RepeatCount)));
267 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
PositioningModeType PositioningMode
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::PositioningModeType > PositioningModeTypeStrList()
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, ItemIDType CommunicatorID=ItemIDNotSet)
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, regardless of the inter-module communicator ...
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.