@@ -21,6 +21,10 @@ FileContext::FileContext (QString const& file_path_and_name,
2121 file_path_and_name_ (file_path_and_name),
2222 event_manager_ (event_manager),
2323 channel_manager_ (channel_manager),
24+ detrend_manager_ (nullptr ),
25+ proxy_manager_ (new ChannelManagerProxy (channel_manager)),
26+ detrend_enabled_ (false ),
27+ detrend_cutoff_hz_ (0.0 ),
2428 basic_header_ (header)
2529{
2630 connect (event_manager_.data (), SIGNAL (changed ()), SLOT (setAsChanged ()));
@@ -30,6 +34,8 @@ FileContext::FileContext (QString const& file_path_and_name,
3034FileContext::~FileContext ()
3135{
3236 qDebug () << " deleting FileContext" ;
37+ delete proxy_manager_;
38+ delete detrend_manager_;
3339 delete channel_manager_;
3440}
3541
@@ -87,13 +93,73 @@ QSharedPointer<EventManager> FileContext::getEventManager ()
8793// -----------------------------------------------------------------------------
8894ChannelManager const & FileContext::getChannelManager () const
8995{
90- return *channel_manager_ ;
96+ return *proxy_manager_ ;
9197}
9298
9399// -----------------------------------------------------------------------------
94100ChannelManager& FileContext::getChannelManager ()
95101{
96- return *channel_manager_;
102+ return *proxy_manager_;
103+ }
104+
105+ // -------------------------------------------------------------------------
106+ void FileContext::precomputeDetrendChannel (double cutoff_hz, ChannelID id)
107+ {
108+ if (!detrend_manager_ || detrend_manager_->hpCutoff () != cutoff_hz)
109+ {
110+ delete detrend_manager_;
111+ detrend_manager_ = new DetrendChannelManager (channel_manager_, cutoff_hz);
112+ detrend_cutoff_hz_ = cutoff_hz;
113+ }
114+ // A getData(id, 0, 1) call is enough to trigger and cache processedChannel()
115+ // which also populates the per-channel min/max cache.
116+ detrend_manager_->getData (id, 0 , 1 );
117+ }
118+
119+ // -------------------------------------------------------------------------
120+ void FileContext::ensureDetrendManager (double cutoff_hz)
121+ {
122+ if (!detrend_manager_ || detrend_manager_->hpCutoff () != cutoff_hz)
123+ {
124+ delete detrend_manager_;
125+ detrend_manager_ = new DetrendChannelManager (channel_manager_, cutoff_hz);
126+ detrend_cutoff_hz_ = cutoff_hz;
127+ }
128+ }
129+
130+ // -------------------------------------------------------------------------
131+ void FileContext::precomputeDetrendChannelFromRaw (ChannelID id,
132+ QSharedPointer<DataBlock const > raw)
133+ {
134+ // detrend_manager_ must already exist (call ensureDetrendManager first).
135+ if (detrend_manager_)
136+ detrend_manager_->precomputeFromRawData (id, raw);
137+ }
138+
139+ // -------------------------------------------------------------------------
140+ bool FileContext::setDetrendEnabled (bool enabled, double hp_cutoff_hz)
141+ {
142+ detrend_enabled_ = enabled;
143+ detrend_cutoff_hz_ = hp_cutoff_hz;
144+
145+ bool rebuilt = false ;
146+ if (enabled)
147+ {
148+ // Only rebuild if parameters changed or no manager exists yet.
149+ if (!detrend_manager_ || detrend_manager_->hpCutoff () != hp_cutoff_hz)
150+ {
151+ delete detrend_manager_;
152+ detrend_manager_ = new DetrendChannelManager (channel_manager_, hp_cutoff_hz);
153+ rebuilt = true ;
154+ }
155+ proxy_manager_->setTarget (detrend_manager_);
156+ }
157+ else
158+ {
159+ proxy_manager_->setTarget (channel_manager_);
160+ // Keep detrend_manager_ alive so toggling back on reuses the cache.
161+ }
162+ return rebuilt;
97163}
98164
99165// -------------------------------------------------------------------------
0 commit comments