Skip to content

Commit bdbc4d5

Browse files
authored
Fix initization race (fixes [#637](#637)) (#1029)
1 parent 4525488 commit bdbc4d5

7 files changed

Lines changed: 457 additions & 74 deletions

File tree

src/Models/Config.Clone.cs

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
using Newtonsoft.Json;
2+
using TextExtensions;
3+
using YamlDotNet.Serialization;
4+
using ESPresense.Extensions;
5+
using System.Linq;
6+
7+
namespace ESPresense.Models
8+
{
9+
public partial class Config
10+
{
11+
public Config Clone()
12+
{
13+
return new Config
14+
{
15+
Mqtt = Mqtt?.Clone(),
16+
Bounds = Bounds?.Select(b => b.ToArray()).ToArray(),
17+
Timeout = Timeout,
18+
AwayTimeout = AwayTimeout,
19+
Gps = Gps.Clone(),
20+
Map = Map.Clone(),
21+
Floors = Floors.Select(f => f.Clone()).ToArray(),
22+
Nodes = Nodes.Select(n => n.Clone()).ToArray(),
23+
Devices = Devices.Select(d => d.Clone()).ToArray(),
24+
ExcludeDevices = ExcludeDevices.Select(d => d.Clone()).ToArray(),
25+
History = History.Clone(),
26+
Locators = Locators.Clone(),
27+
Optimization = Optimization.Clone()
28+
};
29+
}
30+
}
31+
32+
public partial class ConfigLocators
33+
{
34+
public ConfigLocators Clone()
35+
{
36+
return new ConfigLocators
37+
{
38+
NadarayaWatson = NadarayaWatson.Clone(),
39+
NealderMead = NealderMead.Clone(),
40+
NearestNode = NearestNode.Clone()
41+
};
42+
}
43+
}
44+
45+
public partial class NadarayaWatsonConfig
46+
{
47+
public NadarayaWatsonConfig Clone()
48+
{
49+
return new NadarayaWatsonConfig
50+
{
51+
Enabled = Enabled,
52+
Floors = Floors?.ToArray(),
53+
Bandwidth = Bandwidth,
54+
Kernel = Kernel
55+
};
56+
}
57+
}
58+
59+
public partial class NealderMeadConfig
60+
{
61+
public NealderMeadConfig Clone()
62+
{
63+
return new NealderMeadConfig
64+
{
65+
Enabled = Enabled,
66+
Floors = Floors?.ToArray(),
67+
Weighting = Weighting.Clone()
68+
};
69+
}
70+
}
71+
72+
public partial class NearestNodeConfig
73+
{
74+
public NearestNodeConfig Clone()
75+
{
76+
return new NearestNodeConfig
77+
{
78+
Enabled = Enabled,
79+
MaxDistance = MaxDistance
80+
};
81+
}
82+
}
83+
84+
public partial class ConfigMap
85+
{
86+
public ConfigMap Clone()
87+
{
88+
return new ConfigMap
89+
{
90+
FlipX = FlipX,
91+
FlipY = FlipY,
92+
WallThickness = WallThickness,
93+
WallColor = WallColor,
94+
WallOpacity = WallOpacity
95+
};
96+
}
97+
}
98+
99+
public partial class ConfigOptimization
100+
{
101+
public ConfigOptimization Clone()
102+
{
103+
return new ConfigOptimization
104+
{
105+
Enabled = Enabled,
106+
IntervalSecs = IntervalSecs,
107+
MaxSnapshots = MaxSnapshots,
108+
Limits = new Dictionary<string, double>(Limits)
109+
};
110+
}
111+
}
112+
113+
public partial class ConfigHistory
114+
{
115+
public ConfigHistory Clone()
116+
{
117+
return new ConfigHistory
118+
{
119+
Enabled = Enabled,
120+
Database = Database,
121+
ExpireAfter = ExpireAfter
122+
};
123+
}
124+
}
125+
126+
public partial class ConfigWeighting
127+
{
128+
public ConfigWeighting Clone()
129+
{
130+
return new ConfigWeighting
131+
{
132+
Algorithm = Algorithm,
133+
Props = new Dictionary<string, double>(Props)
134+
};
135+
}
136+
}
137+
138+
public partial class ConfigGps
139+
{
140+
public ConfigGps Clone()
141+
{
142+
return new ConfigGps
143+
{
144+
Latitude = Latitude,
145+
Longitude = Longitude,
146+
Elevation = Elevation
147+
};
148+
}
149+
}
150+
151+
public partial class ConfigMqtt
152+
{
153+
public ConfigMqtt Clone()
154+
{
155+
return new ConfigMqtt
156+
{
157+
Host = Host,
158+
Port = Port,
159+
Ssl = Ssl,
160+
Username = Username,
161+
Password = Password,
162+
ClientId = ClientId
163+
};
164+
}
165+
}
166+
167+
public partial class ConfigDevice
168+
{
169+
public ConfigDevice Clone()
170+
{
171+
return new ConfigDevice
172+
{
173+
Name = Name,
174+
Id = Id
175+
};
176+
}
177+
}
178+
179+
public partial class ConfigFloor
180+
{
181+
public ConfigFloor Clone()
182+
{
183+
return new ConfigFloor
184+
{
185+
Id = Id,
186+
Name = Name,
187+
Bounds = Bounds?.Select(b => b.ToArray()).ToArray(),
188+
Rooms = Rooms?.Select(r => r.Clone()).ToArray()
189+
};
190+
}
191+
}
192+
193+
public partial class ConfigRoom
194+
{
195+
public ConfigRoom Clone()
196+
{
197+
return new ConfigRoom
198+
{
199+
Id = Id,
200+
Name = Name,
201+
Points = Points?.Select(p => p.ToArray()).ToArray()
202+
};
203+
}
204+
}
205+
206+
public partial class ConfigNode
207+
{
208+
public ConfigNode Clone()
209+
{
210+
return new ConfigNode
211+
{
212+
Name = Name,
213+
Id = Id,
214+
Point = Point?.ToArray(),
215+
Floors = Floors?.ToArray(),
216+
Enabled = Enabled,
217+
Stationary = Stationary
218+
};
219+
}
220+
}
221+
}

src/Models/Config.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace ESPresense.Models
77
{
8-
public class Config
8+
public partial class Config
99
{
1010
[YamlMember(Alias = "mqtt")]
1111
public ConfigMqtt? Mqtt { get; set; }
@@ -47,7 +47,7 @@ public class Config
4747
public ConfigOptimization Optimization { get; set; } = new();
4848
}
4949

50-
public class ConfigLocators
50+
public partial class ConfigLocators
5151
{
5252
[YamlMember(Alias = "nadaraya_watson")]
5353
public NadarayaWatsonConfig NadarayaWatson { get; set; } = new();
@@ -59,7 +59,7 @@ public class ConfigLocators
5959
public NearestNodeConfig NearestNode { get; set; } = new();
6060
}
6161

62-
public class NadarayaWatsonConfig
62+
public partial class NadarayaWatsonConfig
6363
{
6464
[YamlMember(Alias = "enabled")]
6565
public bool Enabled { get; set; }
@@ -74,7 +74,7 @@ public class NadarayaWatsonConfig
7474
public string Kernel { get; set; } = "gaussian";
7575
}
7676

77-
public class NealderMeadConfig
77+
public partial class NealderMeadConfig
7878
{
7979
[YamlMember(Alias = "enabled")]
8080
public bool Enabled { get; set; }
@@ -86,7 +86,7 @@ public class NealderMeadConfig
8686
public ConfigWeighting Weighting { get; set; } = new();
8787
}
8888

89-
public class NearestNodeConfig
89+
public partial class NearestNodeConfig
9090
{
9191
[YamlMember(Alias = "enabled")]
9292
public bool Enabled { get; set; }
@@ -95,7 +95,7 @@ public class NearestNodeConfig
9595
public double? MaxDistance { get; set; }
9696
}
9797

98-
public class ConfigMap
98+
public partial class ConfigMap
9999
{
100100
[YamlMember(Alias = "flip_x")]
101101
public bool FlipX { get; set; } = false;
@@ -113,7 +113,7 @@ public class ConfigMap
113113
public double? WallOpacity { get; set; } // Optional wall opacity, defaults to 0.35 if not set
114114
}
115115

116-
public class ConfigOptimization
116+
public partial class ConfigOptimization
117117
{
118118
[YamlMember(Alias = "enabled")] public bool Enabled { get; set; } = false;
119119
[YamlMember(Alias = "interval_secs")] public int IntervalSecs { get; set; } = 60;
@@ -129,7 +129,7 @@ public class ConfigOptimization
129129
[YamlIgnore] public double RxAdjRssiMax => Limits.TryGetValue("rx_adj_rssi_max", out var val) ? val : 25;
130130
}
131131

132-
public class ConfigHistory
132+
public partial class ConfigHistory
133133
{
134134
[YamlMember(Alias = "enabled")] public bool Enabled { get; set; } = false;
135135

@@ -142,15 +142,15 @@ public class ConfigHistory
142142
public TimeSpan ExpireAfterTimeSpan => ExpireAfter.TryParseDurationString(out var ts) ? ts : TimeSpan.FromHours(24);
143143
}
144144

145-
public class ConfigWeighting
145+
public partial class ConfigWeighting
146146
{
147147
[YamlMember(Alias = "algorithm")]
148148
public string Algorithm { get; set; } = "gaussian";
149149

150150
[YamlMember(Alias = "props")] public Dictionary<string, double> Props { get; set; } = new();
151151
}
152152

153-
public class ConfigGps
153+
public partial class ConfigGps
154154
{
155155
public double? Latitude { get; set; }
156156
public double? Longitude { get; set; }
@@ -179,7 +179,7 @@ public partial class ConfigMqtt
179179
public string ClientId { get; set; } = "espresense-companion";
180180
}
181181

182-
public class ConfigDevice
182+
public partial class ConfigDevice
183183
{
184184
[YamlMember(Alias = "name")]
185185
public string? Name { get; set; }
@@ -190,7 +190,7 @@ public class ConfigDevice
190190
public string GetId() => Id ?? Name?.ToSnakeCase()?.ToLower() ?? "none";
191191
}
192192

193-
public class ConfigFloor
193+
public partial class ConfigFloor
194194
{
195195
[YamlMember(Alias = "id")]
196196
public string? Id { get; set; }
@@ -207,7 +207,7 @@ public class ConfigFloor
207207
public string GetId() => Id ?? Name?.ToSnakeCase()?.ToLower() ?? "none";
208208
}
209209

210-
public class ConfigRoom
210+
public partial class ConfigRoom
211211
{
212212
[YamlMember(Alias = "id")]
213213
public string? Id { get; set; }
@@ -221,7 +221,7 @@ public class ConfigRoom
221221
public string GetId() => Id ?? Name?.ToSnakeCase()?.ToLower() ?? "none";
222222
}
223223

224-
public class ConfigNode
224+
public partial class ConfigNode
225225
{
226226
[YamlMember(Alias = "name")]
227227
public string? Name { get; set; }

src/Models/HassIoMqtt.cs

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
builder.Services.AddSingleton<MappingService>();
6767
builder.Services.AddSingleton<GlobalEventDispatcher>();
6868
builder.Services.AddSingleton<DeviceTracker>();
69+
builder.Services.AddSingleton<SupervisorConfigLoader>();
6970

7071
builder.Services.AddHostedService<MultiScenarioLocator>();
7172
builder.Services.AddHostedService<OptimizationRunner>();

0 commit comments

Comments
 (0)