Skip to content

Commit 95b9a50

Browse files
avoid alerts on wake from sleep
1 parent 512401f commit 95b9a50

File tree

3 files changed

+47
-25
lines changed

3 files changed

+47
-25
lines changed

src/main.lfm

+6
Original file line numberDiff line numberDiff line change
@@ -4490,4 +4490,10 @@ object LogView: TLogView
44904490
left = 307
44914491
top = 140
44924492
end
4493+
object sleepDetector: TTimer
4494+
Interval = 400
4495+
OnTimer = sleepDetectorTimer
4496+
left = 380
4497+
top = 140
4498+
end
44934499
end

src/main.pas

+20-2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ TLogView = class(TForm)
7171
menuHelp: TMenuItem;
7272
mnuWebSite: TMenuItem;
7373
mnuContents: TMenuItem;
74+
sleepDetector: TTimer;
7475
txtDonation1: TEdit;
7576
txtDonation2: TEdit;
7677
txtDonation3: TEdit;
@@ -98,7 +99,7 @@ TLogView = class(TForm)
9899
mnuTools: TMenuItem;
99100
txtLog: TMemo;
100101
procedure actExitExecute(Sender: TObject);
101-
procedure actPreferencesExecute(Sender: TObject);
102+
procedure actPreferencesExecute(Sender: TObject);
102103
procedure actRefreshGaugeExecute(Sender: TObject);
103104
procedure actRestoreExecute(Sender: TObject);
104105
procedure actStartMinimizedExecute(Sender: TObject);
@@ -115,14 +116,18 @@ TLogView = class(TForm)
115116
procedure mnuWebSiteClick(Sender: TObject);
116117
procedure onSocketReceive(msg: string; ip: string);
117118
procedure onSocketError(msg: string);
119+
procedure sleepDetectorTimer(Sender: TObject);
118120
procedure Timer1Timer(Sender: TObject);
119121
procedure txtDonation1Change(Sender: TObject);
120122
procedure txtDonation2Change(Sender: TObject);
121123
procedure txtDonation3Change(Sender: TObject);
122124

123-
public
125+
//public
124126
procedure LogMsg(msg: string);
125127

128+
private
129+
m_lastSleepCheck: TDateTime;
130+
126131
end;
127132

128133
var
@@ -181,6 +186,8 @@ procedure TLogView.FormCreate(Sender: TObject);
181186
txtDonation1.Text := DONATION_ENS;
182187
txtDonation2.Text := DONATION_ETH;
183188
txtDonation3.Text := DONATION_ETC;
189+
190+
m_lastSleepCheck := Now;
184191
end;
185192

186193
procedure TLogView.FormShow(Sender: TObject);
@@ -282,9 +289,20 @@ procedure TLogView.onSocketError(msg: string);
282289
LogMsg('ERR : ' + msg);
283290
end;
284291

292+
procedure TLogView.sleepDetectorTimer(Sender: TObject);
293+
begin
294+
if MillisecondsBetween(Now, m_lastSleepCheck) > sleepDetector.Interval * 10 then begin
295+
g_collector.awakeFromSleep;
296+
end;
297+
m_lastSleepCheck := Now;
298+
end;
299+
285300
procedure TLogView.Timer1Timer(Sender: TObject);
286301
begin
287302
if g_widgetData.widgetOnline then begin
303+
// if MVis is configured to boot with the OS, it might start before Rainmeter/Geektool, and
304+
// the gauges might then contain garbage. so we wait until the widget utility is running
305+
// and then do a gauge refresh.
288306
Timer1.Enabled := false;
289307
g_collector.gaugeRefresh;
290308
end;

src/uCollector.pas

+21-23
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ interface
3636
INTVL_POLL_OFFLINE = 10 * 1000;
3737
INTVL_PEER_COUNT = 20 * 1000;
3838
INTVL_BALANCE = 30 * 1000;
39-
INTVL_ALERTS_START_DELAY = 5000;
4039

4140
type
4241

@@ -89,7 +88,9 @@ CCollector = class(TThread)
8988
// used to detect when hash rates change significantly (some things need recalculation)
9089
m_hashRateReference: double;
9190
m_lastWebAlert: string;
91+
// when did we start, or last awake from sleep.
9292
m_startedAt: TDateTime;
93+
m_alertsStartDelay: integer;
9394

9495
end;
9596

@@ -118,6 +119,7 @@ constructor CCollector.Create;
118119
m_hashRateReference := -1;
119120
m_lastWebAlert := '';
120121
m_startedAt := Now;
122+
m_alertsStartDelay := 5000;
121123

122124
// launch the worker thread straight away
123125
Inherited Create(false)
@@ -171,7 +173,8 @@ procedure CCollector.Execute;
171173
// periodic check to see if any offline miners have come online recently
172174
m_tasks.scheduleTask(@pollOfflineMiners, 0, INTVL_POLL_OFFLINE, true, 'pollOfflineMiners');
173175

174-
m_tasks.scheduleTask(@updateAlerts, 1, INTVL_ALERTS_START_DELAY + 1000, false, 'alertsStartDelay');
176+
// after things have settled down, check if there are any alerts
177+
m_tasks.scheduleTask(@updateAlerts, 0, m_alertsStartDelay + 1000, false, 'alertsStartDelay');
175178

176179
widgetHeartBeat(0);
177180
m_tasks.scheduleTask(@widgetHeartBeat, 0, 10 * 1000, true, 'widgetHeartBeat');
@@ -188,22 +191,6 @@ procedure CCollector.Execute;
188191
end;
189192

190193

191-
procedure CCollector.awakeFromSleep;
192-
var
193-
i: integer;
194-
begin
195-
Log.Writeln(['Trace: CCollector.awakeFromSleep'], true);
196-
// set everybody offline
197-
m_nodeLiaison := -1;
198-
for i := 0 to g_miners.count - 1 do
199-
g_miners.byRow[i].online := false;
200-
201-
sleep(5000);
202-
pollOfflineMiners(0);
203-
m_tasks.scheduleTask(@delayedStartTasks, Ord(SleepAwake), INTVL_DELAYED_START, false, 'awake:delayedStartTasks');
204-
end;
205-
206-
207194
procedure CCollector.delayedStartTasks(mode: PtrUInt);
208195
begin
209196
Log.Writeln(['Trace: CCollector.delayedStartTasks'], true);
@@ -223,6 +210,17 @@ procedure CCollector.delayedStartTasks(mode: PtrUInt);
223210
end;
224211

225212

213+
procedure CCollector.awakeFromSleep;
214+
begin
215+
m_startedAt := Now;
216+
// things take longer to settle down after a 'wake from sleep'.
217+
m_alertsStartDelay := 20 * 1000;
218+
// after things have settled down, check if there are any alerts
219+
m_tasks.scheduleTask(@updateAlerts, 0, m_alertsStartDelay + 1000, false, 'alertsStartDelay');
220+
Log.Writeln(['Mining Visualizer has detected a wake from sleep event']);
221+
end;
222+
223+
226224
procedure CCollector.onMinerConnect(connectData: TJSONObject);
227225
var
228226
minerID: integer;
@@ -802,11 +800,11 @@ procedure CCollector.updateAlerts(data: PtrUInt);
802800
begin
803801
jAlerts := CheckAlerts;
804802
s := jAlerts.AsJSON;
805-
// at startup we want to avoid flashing alerts until all miners have reported in and things have
806-
// stabilized somewhat. there's a delayed start task scheduled at startup slightly after
807-
// INTVL_ALERTS_START_DELAY to make sure we send out the necessary alerts at that time in case there's
808-
// a lull in activity right then.
809-
if (s <> m_lastWebAlert) and (MillisecondsBetween(Now, m_startedAt) > INTVL_ALERTS_START_DELAY) then begin
803+
// at startup, or after we awake from sleep, we want to avoid flashing alerts until all miners
804+
// have reported in and things have stabilized somewhat. there's a delayed start task scheduled
805+
// at startup slightly after m_alertsStartDelay to make sure we send out the necessary
806+
// alerts at that time in case there's a lull in activity right then.
807+
if (s <> m_lastWebAlert) and (MillisecondsBetween(Now, m_startedAt) > m_alertsStartDelay) then begin
810808
if jAlerts['MasterAlert'].AsBoolean then
811809
alertUser;
812810
g_webFace.updateAlerts(jAlerts); // jAlerts is freed in the g_webFace.updateAlerts call chain

0 commit comments

Comments
 (0)