@@ -8,9 +8,11 @@ use super::resolve;
88use super :: slave:: Slave ;
99use crate :: api:: clock:: Delay ;
1010use crate :: api:: handlers:: CallbackSubscriptionHandler ;
11+ use crate :: api:: slave:: ParamCache ;
1112use crate :: api:: ShutdownManager ;
1213use crate :: msg:: rosgraph_msgs:: { Clock as ClockMsg , Log } ;
1314use crate :: msg:: std_msgs:: Header ;
15+ use crate :: rosxmlrpc:: client:: bad_response_structure;
1416use crate :: tcpros:: { Client , Message , ServicePair , ServiceResult } ;
1517use crate :: util:: FAILED_TO_LOCK ;
1618use crate :: { RawMessage , RawMessageDescription , SubscriptionHandler } ;
@@ -31,6 +33,7 @@ use yaml_rust::{Yaml, YamlLoader};
3133pub struct Ros {
3234 master : Arc < Master > ,
3335 slave : Arc < Slave > ,
36+ param_cache : ParamCache ,
3437 hostname : String ,
3538 bind_address : String ,
3639 resolver : Resolver ,
@@ -111,19 +114,22 @@ impl Ros {
111114 move || drop ( logger. lock ( ) . unwrap ( ) . take ( ) )
112115 } ) ) ;
113116
117+ let param_cache = Arc :: new ( Mutex :: new ( Default :: default ( ) ) ) ;
114118 let slave = Slave :: new (
115119 master_uri,
116120 hostname,
117121 bind_host,
118122 0 ,
119123 & name,
124+ Arc :: clone ( & param_cache) ,
120125 Arc :: clone ( & shutdown_manager) ,
121126 ) ?;
122127 let master = Master :: new ( master_uri, & name, slave. uri ( ) ) ?;
123128
124129 Ok ( Ros {
125130 master : Arc :: new ( master) ,
126131 slave : Arc :: new ( slave) ,
132+ param_cache,
127133 hostname : String :: from ( hostname) ,
128134 bind_address : String :: from ( bind_host) ,
129135 resolver,
@@ -195,6 +201,7 @@ impl Ros {
195201
196202 pub fn param ( & self , name : & str ) -> Option < Parameter > {
197203 self . resolver . translate ( name) . ok ( ) . map ( |v| Parameter {
204+ param_cache : Arc :: clone ( & self . param_cache ) ,
198205 master : Arc :: clone ( & self . master ) ,
199206 name : v,
200207 } )
@@ -484,6 +491,7 @@ impl Ros {
484491}
485492
486493pub struct Parameter {
494+ param_cache : ParamCache ,
487495 master : Arc < Master > ,
488496 name : String ,
489497}
@@ -494,11 +502,30 @@ impl Parameter {
494502 }
495503
496504 pub fn get < ' b , T : Deserialize < ' b > > ( & self ) -> Response < T > {
497- self . master . get_param :: < T > ( & self . name )
505+ let data = self . get_raw ( ) ?;
506+ Deserialize :: deserialize ( data) . map_err ( bad_response_structure)
498507 }
499508
500509 pub fn get_raw ( & self ) -> Response < xml_rpc:: Value > {
501- self . master . get_param_any ( & self . name )
510+ let subscribed;
511+ {
512+ let cache = self . param_cache . lock ( ) . expect ( FAILED_TO_LOCK ) ;
513+ if let Some ( data) = cache. data . get ( & self . name ) {
514+ return data. clone ( ) ;
515+ }
516+ subscribed = cache. subscribed ;
517+ }
518+ if !subscribed {
519+ self . master . subscribe_param_any ( "/" ) ?;
520+ self . param_cache . lock ( ) . expect ( FAILED_TO_LOCK ) . subscribed = true ;
521+ }
522+ let data = self . master . get_param_any ( & self . name ) ;
523+ self . param_cache
524+ . lock ( )
525+ . expect ( FAILED_TO_LOCK )
526+ . data
527+ . insert ( self . name . clone ( ) , data. clone ( ) ) ;
528+ data
502529 }
503530
504531 pub fn set < T : Serialize > ( & self , value : & T ) -> Response < ( ) > {
0 commit comments