MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/driver/Scope.hh

165 lines
3.7 KiB
C++

/*
* Scope.hh
*
* Created on: 22 àïð. 2020 ã.
* Author: LeonidTitov
*/
#ifndef UMLIBRARY_DRIVER_SCOPE_HH_
#define UMLIBRARY_DRIVER_SCOPE_HH_
#include "../systemic/IStatus.hh"
#include "CircularBinaryRemoteBuffer.hh"
#include <utility>
#include <memory_resource>
namespace driver {
class Scope {
public:
enum TriggerMode {
Once,
Repeat,
Cyclic
};
typedef unsigned int Times;
struct Frame {
virtual const char * data() const = 0;
virtual std::size_t size() const = 0;
virtual ~Frame() = default;
};
typedef float Time;
typedef std::size_t FrameIndex;
typedef systemic::IValue<bool> Condition;
bool setup( Frame * frame, Condition * condition, TriggerMode mode, Times times_to_on,
Time time_before, Time time_after );
void reset();
bool isSetup() const;
void start(); //!<Çàïóñê ñ ñóùåñòâóþùèìè íàñòðîéêàìè.
void stop(); //!<Îñòàíîâèòü ïîñëå çàâåðøåíèÿ çàïèñè.
void disable(); //!<Îñòàíîâèòü íà òåêóùåì êàäðå.
std::pair<Times, Times> trigger_progress() const;
std::pair<FrameIndex, FrameIndex> data_progress() const;
std::pair<FrameIndex, FrameIndex> data_info() const;
Time sample_time() const;
bool isActive() const;
bool isTriggerFixed() const;
std::pair<const char *, std::size_t> getFrame( FrameIndex );
void freeFrame( FrameIndex );
Scope( peripheral::IMemoryAccess & memory_access,
std::pmr::memory_resource * initialization, std::size_t put_cache_size, std::size_t get_cache_size );
public:
void setSampleTime( float ts_in_second );
void process();
private:
Frame * frame;
peripheral::IMemoryAccess & memory;
std::pmr::polymorphic_allocator<CircularBinaryRemoteBuffer> buffer_constructor;
CircularBinaryRemoteBuffer * buffer;
char * const put_cache; std::size_t const put_cache_size;
char * const get_cache; std::size_t const get_cache_size;
typedef driver::CircularBinaryRemoteBuffer::Index Index;
struct TriggerManager {
static Condition * default_condition();
Condition * condition;
bool prev_condition;
volatile Times counter;
Times threshold;
bool repeat_mode;
bool enable;
bool fixed;
void setup( Condition * c, Times threshold, bool repeatable );
bool at_fix();
void stop();
bool is_fixed() const;
void start();
std::pair<Times, Times> progress() const {
return { Times(counter), threshold };
}
TriggerManager();
} trigger;
struct CaptureManager {
bool before_trigger;
FrameIndex before_trigger_frame_counter;
FrameIndex before_trigger_frame_threshold;
FrameIndex trigger_position;
FrameIndex after_trigger_frame_counter;
FrameIndex after_trigger_frame_threshold;
FrameIndex step_counter;
FrameIndex step_threshold;
bool active;
Index head_index;
void setup( FrameIndex before_fix_frames, FrameIndex after_fix_frames, FrameIndex step );
void fix( std::pair<Index, std::size_t> info );
bool at_shot();
void start();
void stop();
bool is_active() const;
bool is_done() const;
Index head() const;
FrameIndex desired_trigger() const { return before_trigger_frame_threshold; }
std::pair<Times, Times> progress() const {
return { after_trigger_frame_counter, after_trigger_frame_threshold };
}
CaptureManager();
} capture;
//!Ôëàã áåëûé.
bool is_setupped;
Time process_quant;
Time data_quant;
bool restart_on_done;
};
}
#endif /* UMLIBRARY_DRIVER_SCOPE_HH_ */