@@ -6,24 +6,21 @@ use crate::weather::{Clouds, WeatherInfo};
66use dcs_module_ipc:: Error ;
77use serde:: Deserialize ;
88use serde_json:: json;
9+ use tokio:: sync:: Mutex ;
910
1011pub struct MissionRpcInner {
1112 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 > > ,
1514}
1615
1716#[ derive( Clone ) ]
1817pub struct MissionRpc ( Arc < MissionRpcInner > ) ;
1918
2019impl MissionRpc {
21- pub fn new ( clouds : Option < Clouds > , fog_thickness : u32 , fog_visibility : u32 ) -> Self {
20+ pub fn new ( ) -> Self {
2221 MissionRpc ( Arc :: new ( MissionRpcInner {
2322 ipc : dcs_module_ipc:: IPC :: new ( ) ,
24- clouds,
25- fog_thickness,
26- fog_visibility,
23+ clouds : Mutex :: new ( None ) ,
2724 } ) )
2825 }
2926
@@ -35,16 +32,11 @@ impl MissionRpc {
3532 wind_dir : f64 ,
3633 temp : f64 ,
3734 pressure : f64 ,
35+ fog_thickness : f64 , // in m
36+ fog_visibility : f64 , // in m
37+ dust_density : u32 ,
3838 }
3939
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-
4840 let data: Data = self
4941 . 0
5042 . ipc
@@ -72,18 +64,34 @@ impl MissionRpc {
7264 wind_dir += 360.0 ;
7365 }
7466
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+
7575 Ok ( WeatherInfo {
76- clouds,
77- visibility,
76+ clouds : Some ( clouds) ,
7877 wind_speed : data. wind_speed ,
7978 wind_dir,
8079 temperature : data. temp ,
8180 pressure_qnh,
8281 pressure_qfe : data. pressure ,
82+ fog_thickness : data. fog_thickness ,
83+ fog_visibility : data. fog_visibility ,
84+ dust_density : data. dust_density ,
8385 position : pos. clone ( ) ,
8486 } )
8587 }
8688
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+
8795 pub async fn get_unit_position ( & self , name : & str ) -> Result < Position , Error > {
8896 self . 0
8997 . ipc
0 commit comments