@@ -6,24 +6,21 @@ use crate::weather::{Clouds, WeatherInfo};
6
6
use dcs_module_ipc:: Error ;
7
7
use serde:: Deserialize ;
8
8
use serde_json:: json;
9
+ use tokio:: sync:: Mutex ;
9
10
10
11
pub struct MissionRpcInner {
11
12
ipc : dcs_module_ipc:: IPC < ( ) > ,
12
- clouds : Option < Clouds > ,
13
- fog_thickness : u32 , // in m
14
- fog_visibility : u32 , // in m
13
+ clouds : Mutex < Option < Clouds > > ,
15
14
}
16
15
17
16
#[ derive( Clone ) ]
18
17
pub struct MissionRpc ( Arc < MissionRpcInner > ) ;
19
18
20
19
impl MissionRpc {
21
- pub fn new ( clouds : Option < Clouds > , fog_thickness : u32 , fog_visibility : u32 ) -> Self {
20
+ pub fn new ( ) -> Self {
22
21
MissionRpc ( Arc :: new ( MissionRpcInner {
23
22
ipc : dcs_module_ipc:: IPC :: new ( ) ,
24
- clouds,
25
- fog_thickness,
26
- fog_visibility,
23
+ clouds : Mutex :: new ( None ) ,
27
24
} ) )
28
25
}
29
26
@@ -35,16 +32,11 @@ impl MissionRpc {
35
32
wind_dir : f64 ,
36
33
temp : f64 ,
37
34
pressure : f64 ,
35
+ fog_thickness : f64 , // in m
36
+ fog_visibility : f64 , // in m
37
+ dust_density : u32 ,
38
38
}
39
39
40
- let clouds = self . 0 . clouds . clone ( ) ;
41
-
42
- let visibility = if self . 0 . fog_thickness > 200 {
43
- Some ( self . 0 . fog_visibility )
44
- } else {
45
- None
46
- } ;
47
-
48
40
let data: Data = self
49
41
. 0
50
42
. ipc
@@ -72,18 +64,34 @@ impl MissionRpc {
72
64
wind_dir += 360.0 ;
73
65
}
74
66
67
+ let clouds = {
68
+ let mut clouds = self . 0 . clouds . lock ( ) . await ;
69
+ if clouds. is_none ( ) {
70
+ * clouds = Some ( self . get_clouds ( ) . await ?) ;
71
+ }
72
+ clouds. clone ( ) . unwrap ( )
73
+ } ;
74
+
75
75
Ok ( WeatherInfo {
76
- clouds,
77
- visibility,
76
+ clouds : Some ( clouds) ,
78
77
wind_speed : data. wind_speed ,
79
78
wind_dir,
80
79
temperature : data. temp ,
81
80
pressure_qnh,
82
81
pressure_qfe : data. pressure ,
82
+ fog_thickness : data. fog_thickness ,
83
+ fog_visibility : data. fog_visibility ,
84
+ dust_density : data. dust_density ,
83
85
position : pos. clone ( ) ,
84
86
} )
85
87
}
86
88
89
+ pub async fn get_clouds ( & self ) -> Result < Clouds , Error > {
90
+ let clouds: Clouds = self . 0 . ipc . request ( "get_clouds" , None :: < ( ) > ) . await ?;
91
+
92
+ Ok ( clouds)
93
+ }
94
+
87
95
pub async fn get_unit_position ( & self , name : & str ) -> Result < Position , Error > {
88
96
self . 0
89
97
. ipc
0 commit comments