@@ -33,6 +33,7 @@ public class MavlinkDeviceServiceConfig
33
33
public SdrClientDeviceConfig Sdr { get ; set ; } = new ( ) ;
34
34
public AdsbClientDeviceConfig Adsb { get ; set ; } = new ( ) ;
35
35
public bool WrapToV2ExtensionEnabled { get ; set ; } = true ;
36
+ public RfsaClientDeviceConfig Rfsa { get ; set ; } = new ( ) ;
36
37
}
37
38
38
39
[ Export ( typeof ( IMavlinkDevicesService ) ) ]
@@ -61,8 +62,8 @@ public MavlinkDevicesService(IConfiguration config, IPacketSequenceCalculator se
61
62
_mavlinkRouter =
62
63
new MavlinkRouter ( MavlinkV2Connection . RegisterDefaultDialects ,
63
64
publishScheduler : RxApp . MainThreadScheduler ) . DisposeItWith ( Disposable ) ;
64
- _mavlinkRouter . WrapToV2ExtensionEnabled = InternalGetConfig ( _ => _ . WrapToV2ExtensionEnabled ) ;
65
- foreach ( var port in InternalGetConfig ( _ => _ . Ports ) )
65
+ _mavlinkRouter . WrapToV2ExtensionEnabled = InternalGetConfig ( s => s . WrapToV2ExtensionEnabled ) ;
66
+ foreach ( var port in InternalGetConfig ( s => s . Ports ) )
66
67
{
67
68
_mavlinkRouter . AddPort ( port ) ;
68
69
}
@@ -76,60 +77,60 @@ public MavlinkDevicesService(IConfiguration config, IPacketSequenceCalculator se
76
77
77
78
#region InitUriHost mavlink heartbeat
78
79
79
- var serverIdentity = InternalGetConfig ( _ => new MavlinkIdentity ( _ . SystemId , _ . ComponentId ) ) ;
80
- var serverConfig = InternalGetConfig ( _ => new ServerDeviceConfig
81
- { Heartbeat = new MavlinkHeartbeatServerConfig { HeartbeatRateMs = _ . HeartbeatRateMs } } ) ;
80
+ var serverIdentity = InternalGetConfig ( s => new MavlinkIdentity ( s . SystemId , s . ComponentId ) ) ;
81
+ var serverConfig = InternalGetConfig ( s => new ServerDeviceConfig
82
+ { Heartbeat = new MavlinkHeartbeatServerConfig { HeartbeatRateMs = s . HeartbeatRateMs } } ) ;
82
83
var serverDevice =
83
84
new ServerDevice ( Router , sequenceCalculator , serverIdentity , serverConfig , Scheduler . Default )
84
85
. DisposeItWith ( Disposable ) ;
85
- serverDevice . Heartbeat . Set ( _ =>
86
+ serverDevice . Heartbeat . Set ( p =>
86
87
{
87
- _ . Autopilot = MavAutopilot . MavAutopilotInvalid ;
88
- _ . BaseMode = 0 ;
89
- _ . CustomMode = 0 ;
90
- _ . MavlinkVersion = 3 ;
91
- _ . SystemStatus = MavState . MavStateActive ;
92
- _ . Type = MavType . MavTypeGcs ;
88
+ p . Autopilot = MavAutopilot . MavAutopilotInvalid ;
89
+ p . BaseMode = 0 ;
90
+ p . CustomMode = 0 ;
91
+ p . MavlinkVersion = 3 ;
92
+ p . SystemStatus = MavState . MavStateActive ;
93
+ p . Type = MavType . MavTypeGcs ;
93
94
} ) ;
94
95
_systemId = new RxValue < byte > ( serverIdentity . SystemId ) . DisposeItWith ( Disposable ) ;
95
96
_systemId
96
97
. Throttle ( TimeSpan . FromSeconds ( 1 ) )
97
98
. DistinctUntilChanged ( )
98
99
. Skip ( 1 )
99
100
. Do ( _ => _needReloadToApplyConfig . Value = true )
100
- . Subscribe ( _ => InternalSaveConfig ( cfg => cfg . SystemId = _ ) )
101
+ . Subscribe ( b => InternalSaveConfig ( cfg => cfg . SystemId = b ) )
101
102
. DisposeItWith ( Disposable ) ;
102
103
_componentId = new RxValue < byte > ( serverIdentity . ComponentId ) . DisposeItWith ( Disposable ) ;
103
104
_componentId
104
105
. Throttle ( TimeSpan . FromSeconds ( 1 ) )
105
106
. DistinctUntilChanged ( )
106
107
. Skip ( 1 )
107
108
. Do ( _ => _needReloadToApplyConfig . Value = true )
108
- . Subscribe ( _ => InternalSaveConfig ( cfg => cfg . ComponentId = _ ) )
109
+ . Subscribe ( b => InternalSaveConfig ( cfg => cfg . ComponentId = b ) )
109
110
. DisposeItWith ( Disposable ) ;
110
- var heartbeatRateMs = InternalGetConfig ( _ => TimeSpan . FromMilliseconds ( _ . HeartbeatRateMs ) ) ;
111
+ var heartbeatRateMs = InternalGetConfig ( s => TimeSpan . FromMilliseconds ( s . HeartbeatRateMs ) ) ;
111
112
_heartBeatRate = new RxValue < TimeSpan > ( heartbeatRateMs ) . DisposeItWith ( Disposable ) ;
112
113
_heartBeatRate
113
114
. Throttle ( TimeSpan . FromSeconds ( 1 ) )
114
115
. DistinctUntilChanged ( )
115
116
. Skip ( 1 )
116
117
. Do ( _ => _needReloadToApplyConfig . Value = true )
117
- . Subscribe ( _ => { InternalSaveConfig ( cfg => cfg . HeartbeatRateMs = ( int ) _ . TotalMilliseconds ) ; } )
118
+ . Subscribe ( s => { InternalSaveConfig ( cfg => cfg . HeartbeatRateMs = ( int ) s . TotalMilliseconds ) ; } )
118
119
. DisposeItWith ( Disposable ) ;
119
120
serverDevice . Heartbeat . Start ( ) ;
120
121
121
122
#endregion
122
123
123
124
#region Mavlink devices
124
125
125
- var deviceTimeout = InternalGetConfig ( _ => TimeSpan . FromMilliseconds ( _ . DeviceHeartbeatTimeoutMs ) ) ;
126
+ var deviceTimeout = InternalGetConfig ( s => TimeSpan . FromMilliseconds ( s . DeviceHeartbeatTimeoutMs ) ) ;
126
127
_deviceBrowser = new MavlinkDeviceBrowser ( _mavlinkRouter , deviceTimeout , RxApp . MainThreadScheduler )
127
128
. DisposeItWith ( Disposable ) ;
128
129
_deviceBrowser . DeviceTimeout
129
130
. Throttle ( TimeSpan . FromSeconds ( 1 ) )
130
131
. DistinctUntilChanged ( )
131
132
. Skip ( 1 )
132
- . Subscribe ( _ => InternalSaveConfig ( cfg => cfg . DeviceHeartbeatTimeoutMs = ( int ) _ . TotalMilliseconds ) )
133
+ . Subscribe ( s => InternalSaveConfig ( cfg => cfg . DeviceHeartbeatTimeoutMs = ( int ) s . TotalMilliseconds ) )
133
134
. DisposeItWith ( Disposable ) ;
134
135
135
136
#endregion
@@ -138,25 +139,30 @@ public MavlinkDevicesService(IConfiguration config, IPacketSequenceCalculator se
138
139
139
140
Vehicles = Devices
140
141
. Transform ( CreateVehicle )
141
- . Filter ( _ => _ != null )
142
+ . Filter ( c => c != null )
142
143
. DisposeMany ( )
143
144
. RefCount ( ) ;
144
145
145
146
BaseStations = Devices
146
- . Filter ( _ => _ . Type == ( MavType ) Mavlink . V2 . AsvGbs . MavType . MavTypeAsvGbs )
147
+ . Filter ( d => d . Type == ( MavType ) Mavlink . V2 . AsvGbs . MavType . MavTypeAsvGbs )
147
148
. Transform ( CreateBaseStation )
148
149
. DisposeMany ( )
149
150
. RefCount ( ) ;
150
151
Payloads = Devices
151
- . Filter ( _ => _ . Type == ( MavType ) Mavlink . V2 . AsvSdr . MavType . MavTypeAsvSdrPayload )
152
+ . Filter ( d => d . Type == ( MavType ) Mavlink . V2 . AsvSdr . MavType . MavTypeAsvSdrPayload )
152
153
. Transform ( CreateSdrDevice )
153
154
. DisposeMany ( )
154
155
. RefCount ( ) ;
155
156
AdsbDevices = Devices
156
- . Filter ( _ => _ . Type == MavType . MavTypeAdsb )
157
+ . Filter ( d => d . Type == MavType . MavTypeAdsb )
157
158
. Transform ( CreateAdsbDevice )
158
159
. DisposeMany ( )
159
160
. RefCount ( ) ;
161
+ RfsaDevices = Devices
162
+ . Filter ( d => d . Type == ( MavType ) Mavlink . V2 . AsvRfsa . MavType . MavTypeAsvRfsa )
163
+ . Transform ( CreateRfsaDevice )
164
+ . DisposeMany ( )
165
+ . RefCount ( ) ;
160
166
161
167
AllDevices = Vehicles . Transform ( x => ( IClientDevice ) x )
162
168
. MergeChangeSets ( BaseStations . Transform ( x => ( IClientDevice ) x ) )
@@ -171,9 +177,9 @@ public MavlinkDevicesService(IConfiguration config, IPacketSequenceCalculator se
171
177
. Merge ( BaseStations . Transform ( x => ( IClientDevice ) x ) )
172
178
. Merge ( Payloads . Transform ( x => ( IClientDevice ) x ) )
173
179
. Merge ( AdsbDevices . Transform ( x => ( IClientDevice ) x ) )
174
- . AutoRefreshOnObservable ( _ => _ . Name )
175
- . Filter ( _ => _ . Name . Value != null )
176
- . Transform ( _ => _ . Name . Value , true )
180
+ . AutoRefreshOnObservable ( d => d . Name )
181
+ . Filter ( d => d . Name . Value != null )
182
+ . Transform ( d => d . Name . Value , true )
177
183
. AsObservableCache ( ) . DisposeItWith ( Disposable ) ;
178
184
_mavlinkRouter
179
185
. Filter < StatustextPacket > ( )
@@ -184,6 +190,17 @@ public MavlinkDevicesService(IConfiguration config, IPacketSequenceCalculator se
184
190
#endregion
185
191
}
186
192
193
+ private IRfsaClientDevice CreateRfsaDevice ( IMavlinkDevice device )
194
+ {
195
+ return new RfsaClientDevice ( Router , new MavlinkClientIdentity
196
+ {
197
+ TargetSystemId = device . SystemId ,
198
+ TargetComponentId = device . ComponentId ,
199
+ SystemId = _systemId . Value ,
200
+ ComponentId = _componentId . Value ,
201
+ } , InternalGetConfig ( c => c . Rfsa ) , _sequenceCalculator , RxApp . MainThreadScheduler ) ;
202
+ }
203
+
187
204
private ISdrClientDevice CreateSdrDevice ( IMavlinkDevice device )
188
205
{
189
206
var dev = new SdrClientDevice ( Router , new MavlinkClientIdentity
@@ -192,7 +209,7 @@ private ISdrClientDevice CreateSdrDevice(IMavlinkDevice device)
192
209
TargetComponentId = device . ComponentId ,
193
210
SystemId = _systemId . Value ,
194
211
ComponentId = _componentId . Value ,
195
- } , InternalGetConfig ( _ => _ . Sdr ) , _sequenceCalculator , RxApp . MainThreadScheduler ) ;
212
+ } , InternalGetConfig ( c => c . Sdr ) , _sequenceCalculator , RxApp . MainThreadScheduler ) ;
196
213
( ( ParamsClientEx ) dev . Params ) . Init ( new MavParamByteWiseEncoding ( ) , ArraySegment < ParamDescription > . Empty ) ;
197
214
return dev ;
198
215
}
@@ -205,7 +222,7 @@ private IGbsClientDevice CreateBaseStation(IMavlinkDevice device)
205
222
TargetComponentId = device . ComponentId ,
206
223
SystemId = _systemId . Value ,
207
224
ComponentId = _componentId . Value ,
208
- } , _sequenceCalculator , InternalGetConfig ( _ => _ . Gbs ) ) ;
225
+ } , _sequenceCalculator , InternalGetConfig ( c => c . Gbs ) ) ;
209
226
}
210
227
211
228
private IAdsbClientDevice CreateAdsbDevice ( IMavlinkDevice device )
@@ -216,7 +233,7 @@ private IAdsbClientDevice CreateAdsbDevice(IMavlinkDevice device)
216
233
TargetComponentId = device . ComponentId ,
217
234
SystemId = _systemId . Value ,
218
235
ComponentId = _componentId . Value ,
219
- } , _sequenceCalculator , InternalGetConfig ( _ => _ . Adsb ) ) ;
236
+ } , _sequenceCalculator , InternalGetConfig ( c => c . Adsb ) ) ;
220
237
}
221
238
222
239
#region Logs
@@ -271,32 +288,39 @@ private string TryGetName(StatustextPacket pkt)
271
288
272
289
public IVehicleClient ? GetVehicleByFullId ( ushort id )
273
290
{
274
- using var a = Vehicles . BindToObservableList ( out var list ) . Subscribe ( ) ;
275
- return list . Items . FirstOrDefault ( _ => _ . Heartbeat . FullId == id ) ;
291
+ using var autoDispose = Vehicles . BindToObservableList ( out var list ) . Subscribe ( ) ;
292
+ return list . Items . FirstOrDefault ( c => c . Heartbeat . FullId == id ) ;
276
293
}
277
294
278
295
public IObservable < IChangeSet < IGbsClientDevice , ushort > > BaseStations { get ; }
279
296
280
297
public IGbsClientDevice ? GetGbsByFullId ( ushort id )
281
298
{
282
- BaseStations . BindToObservableList ( out var list ) . Subscribe ( ) ;
283
- return list . Items . FirstOrDefault ( _ => _ . Heartbeat . FullId == id ) ;
299
+ using var autoDispose = BaseStations . BindToObservableList ( out var list ) . Subscribe ( ) ;
300
+ return list . Items . FirstOrDefault ( d => d . Heartbeat . FullId == id ) ;
284
301
}
285
302
286
303
public IObservable < IChangeSet < ISdrClientDevice , ushort > > Payloads { get ; }
287
304
288
305
public ISdrClientDevice ? GetPayloadsByFullId ( ushort id )
289
306
{
290
- using var a = Payloads . BindToObservableList ( out var list ) . Subscribe ( ) ;
291
- return list . Items . FirstOrDefault ( _ => _ . Heartbeat . FullId == id ) ;
307
+ using var autoDispose = Payloads . BindToObservableList ( out var list ) . Subscribe ( ) ;
308
+ return list . Items . FirstOrDefault ( d => d . Heartbeat . FullId == id ) ;
292
309
}
293
310
294
311
public IObservable < IChangeSet < IAdsbClientDevice , ushort > > AdsbDevices { get ; }
295
312
296
313
public IAdsbClientDevice ? GetAdsbVehicleByFullId ( ushort id )
297
314
{
298
- AdsbDevices . BindToObservableList ( out var list ) . Subscribe ( ) ;
299
- return list . Items . FirstOrDefault ( _ => _ . FullId == id ) ;
315
+ using var autoDispose = AdsbDevices . BindToObservableList ( out var list ) . Subscribe ( ) ;
316
+ return list . Items . FirstOrDefault ( d => d . FullId == id ) ;
317
+ }
318
+
319
+ public IObservable < IChangeSet < IRfsaClientDevice , ushort > > RfsaDevices { get ; }
320
+ public IAdsbClientDevice ? GetRfsaByFullId ( ushort id )
321
+ {
322
+ using var autoDispose = AdsbDevices . BindToObservableList ( out var list ) . Subscribe ( ) ;
323
+ return list . Items . FirstOrDefault ( d => d . FullId == id ) ;
300
324
}
301
325
302
326
private IVehicleClient ? CreateVehicle ( IMavlinkDevice device )
@@ -314,15 +338,15 @@ private string TryGetName(StatustextPacket pkt)
314
338
TargetComponentId = device . ComponentId ,
315
339
SystemId = _systemId . Value ,
316
340
ComponentId = _componentId . Value ,
317
- } , InternalGetConfig ( _ => _ . Vehicle ) , _sequenceCalculator , RxApp . TaskpoolScheduler ) ;
341
+ } , InternalGetConfig ( c => c . Vehicle ) , _sequenceCalculator , RxApp . TaskpoolScheduler ) ;
318
342
case MavType . MavTypeFixedWing :
319
343
return new ArduPlaneClient ( Router , new MavlinkClientIdentity
320
344
{
321
345
TargetSystemId = device . SystemId ,
322
346
TargetComponentId = device . ComponentId ,
323
347
SystemId = _systemId . Value ,
324
348
ComponentId = _componentId . Value ,
325
- } , InternalGetConfig ( _ => _ . Vehicle ) , _sequenceCalculator , RxApp . TaskpoolScheduler ) ;
349
+ } , InternalGetConfig ( c => c . Vehicle ) , _sequenceCalculator , RxApp . TaskpoolScheduler ) ;
326
350
default :
327
351
return null ;
328
352
}
0 commit comments