Skip to content

Commit 8f08861

Browse files
committed
skystrip: Fix segment freeze semantics
1 parent e37322d commit 8f08861

13 files changed

+159
-36
lines changed

usermods/usermod_v2_skystrip/cloud_view.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,28 @@ void CloudView::view(time_t now, SkyModel const &model, int16_t dbgPixelIndex) {
4242
name().c_str());
4343
debugPixelString[sizeof(debugPixelString) - 1] = '\0';
4444
}
45-
if (segId_ == DEFAULT_SEG_ID)
45+
if (segId_ == DEFAULT_SEG_ID) {
46+
freezeHandle_.release();
4647
return;
48+
}
4749
if (model.cloud_cover_forecast.empty())
4850
return;
49-
if (segId_ < 0 || segId_ >= strip.getMaxSegments())
51+
if (segId_ < 0 || segId_ >= strip.getMaxSegments()) {
52+
freezeHandle_.release();
5053
return;
54+
}
5155

52-
Segment &seg = strip.getSegment((uint8_t)segId_);
56+
Segment *segPtr = freezeHandle_.acquire(segId_);
57+
if (!segPtr)
58+
return;
59+
Segment &seg = *segPtr;
5360
int len = seg.virtualLength();
54-
if (len <= 0)
61+
if (len <= 0) {
62+
freezeHandle_.release();
5563
return;
64+
}
5665
// Initialize segment drawing parameters so virtualLength()/mapping are valid
5766
seg.beginDraw();
58-
skystrip::util::FreezeGuard freezeGuard(seg, false);
5967

6068
constexpr double kHorizonSec = 48.0 * 3600.0;
6169
const double step = (len > 1) ? (kHorizonSec / double(len - 1)) : 0.0;
@@ -197,6 +205,10 @@ void CloudView::view(time_t now, SkyModel const &model, int16_t dbgPixelIndex) {
197205
}
198206
}
199207

208+
void CloudView::deactivate() {
209+
freezeHandle_.release();
210+
}
211+
200212
void CloudView::addToConfig(JsonObject &subtree) {
201213
subtree[FPSTR(CFG_SEG_ID)] = segId_;
202214
}

usermods/usermod_v2_skystrip/cloud_view.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "interfaces.h"
44
#include "skymodel.h"
5+
#include "util.h"
56

67
class SkyModel;
78

@@ -13,6 +14,7 @@ class CloudView : public IDataViewT<SkyModel> {
1314
void view(time_t now, SkyModel const & model, int16_t dbgPixelIndex) override;
1415
std::string name() const override { return "CV"; }
1516
void appendDebugPixel(Print& s) const override { s.print(debugPixelString); }
17+
void deactivate() override;
1618

1719
void addToConfig(JsonObject& subtree) override;
1820
void appendConfigData(Print& s) override;
@@ -24,4 +26,5 @@ class CloudView : public IDataViewT<SkyModel> {
2426
private:
2527
int16_t segId_;
2628
char debugPixelString[128];
29+
skystrip::util::SegmentFreezeHandle freezeHandle_;
2730
};

usermods/usermod_v2_skystrip/delta_view.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,28 @@ void DeltaView::view(time_t now, SkyModel const &model, int16_t dbgPixelIndex) {
6666
name().c_str());
6767
debugPixelString[sizeof(debugPixelString) - 1] = '\0';
6868
}
69-
if (segId_ == DEFAULT_SEG_ID)
69+
if (segId_ == DEFAULT_SEG_ID) {
70+
freezeHandle_.release();
7071
return;
72+
}
7173
if (model.temperature_forecast.empty())
7274
return;
73-
if (segId_ < 0 || segId_ >= strip.getMaxSegments())
75+
if (segId_ < 0 || segId_ >= strip.getMaxSegments()) {
76+
freezeHandle_.release();
7477
return;
78+
}
7579

76-
Segment &seg = strip.getSegment((uint8_t)segId_);
80+
Segment *segPtr = freezeHandle_.acquire(segId_);
81+
if (!segPtr)
82+
return;
83+
Segment &seg = *segPtr;
7784
int len = seg.virtualLength();
78-
if (len <= 0)
85+
if (len <= 0) {
86+
freezeHandle_.release();
7987
return;
88+
}
8089
// Initialize segment drawing parameters so virtualLength()/mapping are valid
8190
seg.beginDraw();
82-
skystrip::util::FreezeGuard freezeGuard(seg, false);
8391

8492
constexpr double kHorizonSec = 48.0 * 3600.0;
8593
const double step = (len > 1) ? (kHorizonSec / double(len - 1)) : 0.0;
@@ -155,6 +163,10 @@ void DeltaView::view(time_t now, SkyModel const &model, int16_t dbgPixelIndex) {
155163
}
156164
}
157165

166+
void DeltaView::deactivate() {
167+
freezeHandle_.release();
168+
}
169+
158170
void DeltaView::addToConfig(JsonObject &subtree) {
159171
subtree[FPSTR(CFG_SEG_ID)] = segId_;
160172
}

usermods/usermod_v2_skystrip/delta_view.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "interfaces.h"
44
#include "skymodel.h"
5+
#include "util.h"
56

67
class SkyModel;
78

@@ -13,6 +14,7 @@ class DeltaView : public IDataViewT<SkyModel> {
1314
void view(time_t now, SkyModel const & model, int16_t dbgPixelIndex) override;
1415
std::string name() const override { return "DV"; }
1516
void appendDebugPixel(Print& s) const override { s.print(debugPixelString); }
17+
void deactivate() override;
1618

1719
void addToConfig(JsonObject& subtree) override;
1820
void appendConfigData(Print& s) override;
@@ -24,4 +26,5 @@ class DeltaView : public IDataViewT<SkyModel> {
2426
private:
2527
int16_t segId_;
2628
char debugPixelString[256];
29+
skystrip::util::SegmentFreezeHandle freezeHandle_;
2730
};

usermods/usermod_v2_skystrip/interfaces.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,8 @@ class IDataViewT : public IConfigurable {
5151

5252
/// Append DebugPixel info
5353
virtual void appendDebugPixel(Print& s) const = 0;
54+
55+
/// Allow view to release any persistent resources (e.g. segment freeze)
56+
/// when the usermod is inactive.
57+
virtual void deactivate() {}
5458
};

usermods/usermod_v2_skystrip/temperature_view.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,28 @@ void TemperatureView::view(time_t now, SkyModel const &model,
6969
name().c_str());
7070
debugPixelString[sizeof(debugPixelString) - 1] = '\0';
7171
}
72-
if (segId_ == DEFAULT_SEG_ID)
72+
if (segId_ == DEFAULT_SEG_ID) {
73+
freezeHandle_.release();
7374
return; // disabled
75+
}
7476
if (model.temperature_forecast.empty())
7577
return; // nothing to render
7678

77-
if (segId_ < 0 || segId_ >= strip.getMaxSegments())
79+
if (segId_ < 0 || segId_ >= strip.getMaxSegments()) {
80+
freezeHandle_.release();
81+
return;
82+
}
83+
Segment *segPtr = freezeHandle_.acquire(segId_);
84+
if (!segPtr)
7885
return;
79-
Segment &seg = strip.getSegment((uint8_t)segId_);
86+
Segment &seg = *segPtr;
8087
int len = seg.virtualLength();
81-
if (len <= 0)
88+
if (len <= 0) {
89+
freezeHandle_.release();
8290
return;
91+
}
8392
// Initialize segment drawing parameters so virtualLength()/mapping are valid
8493
seg.beginDraw();
85-
skystrip::util::FreezeGuard freezeGuard(seg, false);
8694

8795
constexpr double kHorizonSec = 48.0 * 3600.0;
8896
const double step = (len > 1) ? (kHorizonSec / double(len - 1)) : 0.0;
@@ -172,6 +180,10 @@ void TemperatureView::view(time_t now, SkyModel const &model,
172180
}
173181
}
174182

183+
void TemperatureView::deactivate() {
184+
freezeHandle_.release();
185+
}
186+
175187
void TemperatureView::addToConfig(JsonObject &subtree) {
176188
subtree[FPSTR(CFG_SEG_ID)] = segId_;
177189
}

usermods/usermod_v2_skystrip/temperature_view.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "interfaces.h"
44
#include "skymodel.h"
5+
#include "util.h"
56

67
class SkyModel;
78

@@ -14,6 +15,7 @@ class TemperatureView : public IDataViewT<SkyModel> {
1415
void view(time_t now, SkyModel const & model, int16_t dbgPixelIndex) override;
1516
std::string name() const override { return "TV"; }
1617
void appendDebugPixel(Print& s) const override { s.print(debugPixelString); }
18+
void deactivate() override;
1719

1820
// IConfigurable
1921
void addToConfig(JsonObject& subtree) override;
@@ -26,4 +28,5 @@ class TemperatureView : public IDataViewT<SkyModel> {
2628
private:
2729
int16_t segId_; // -1 means disabled
2830
char debugPixelString[128];
31+
skystrip::util::SegmentFreezeHandle freezeHandle_;
2932
};

usermods/usermod_v2_skystrip/test_pattern_view.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,18 +100,26 @@ void TestPatternView::view(time_t now, SkyModel const &model,
100100
name().c_str());
101101
debugPixelString[sizeof(debugPixelString) - 1] = '\0';
102102
}
103-
if (segId_ == DEFAULT_SEG_ID)
103+
if (segId_ == DEFAULT_SEG_ID) {
104+
freezeHandle_.release();
104105
return;
105-
if (segId_ < 0 || segId_ >= strip.getMaxSegments())
106+
}
107+
if (segId_ < 0 || segId_ >= strip.getMaxSegments()) {
108+
freezeHandle_.release();
106109
return;
110+
}
107111

108-
Segment &seg = strip.getSegment((uint8_t)segId_);
112+
Segment *segPtr = freezeHandle_.acquire(segId_);
113+
if (!segPtr)
114+
return;
115+
Segment &seg = *segPtr;
109116
int len = seg.virtualLength();
110-
if (len <= 0)
117+
if (len <= 0) {
118+
freezeHandle_.release();
111119
return;
120+
}
112121
// Initialize segment drawing parameters so virtualLength()/mapping are valid
113122
seg.beginDraw();
114-
skystrip::util::FreezeGuard freezeGuard(seg, false);
115123

116124
for (int i = 0; i < len; ++i) {
117125
float u = (len > 1) ? float(i) / float(len - 1) : 0.f;
@@ -134,6 +142,10 @@ void TestPatternView::view(time_t now, SkyModel const &model,
134142
}
135143
}
136144

145+
void TestPatternView::deactivate() {
146+
freezeHandle_.release();
147+
}
148+
137149
void TestPatternView::addToConfig(JsonObject &subtree) {
138150
subtree[FPSTR(CFG_SEG_ID)] = segId_;
139151

usermods/usermod_v2_skystrip/test_pattern_view.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "interfaces.h"
44
#include "skymodel.h"
5+
#include "util.h"
56

67
class SkyModel;
78

@@ -13,6 +14,7 @@ class TestPatternView : public IDataViewT<SkyModel> {
1314
void view(time_t now, SkyModel const & model, int16_t dbgPixelIndex) override;
1415
std::string name() const override { return "TP"; }
1516
void appendDebugPixel(Print& s) const override { s.print(debugPixelString); }
17+
void deactivate() override;
1618

1719
void addToConfig(JsonObject& subtree) override;
1820
void appendConfigData(Print& s) override;
@@ -26,4 +28,5 @@ class TestPatternView : public IDataViewT<SkyModel> {
2628
char debugPixelString[128];
2729
float startHue_, startSat_, startVal_;
2830
float endHue_, endSat_, endVal_;
31+
skystrip::util::SegmentFreezeHandle freezeHandle_;
2932
};

usermods/usermod_v2_skystrip/usermod_v2_skystrip.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ void SkyStrip::loop() {
118118

119119
void SkyStrip::handleOverlayDraw() {
120120
// this happens a hundred times a second
121+
if (!enabled_) {
122+
for (auto &view : views_) view->deactivate();
123+
return;
124+
}
125+
if (offMode) {
126+
return;
127+
}
121128
time_t now = skystrip::util::time_now_utc();
122129
for (auto &view : views_) {
123130
view->view(now, *model_, dbgPixelIndex_);
@@ -243,7 +250,6 @@ void SkyStrip::showBooting() {
243250

244251
void SkyStrip::doneBooting() {
245252
Segment& seg = strip.getMainSegment();
246-
seg.freeze = true; // stop any further segment animation
247253
seg.setMode(0); // static palette/color mode
248254
// seg.intensity = 255; // preserve user's settings via webapp
249255
}

0 commit comments

Comments
 (0)