1+ // config.rs
2+
13use configparser:: ini:: Ini ;
4+ use std:: { net:: IpAddr } ;
25
36// Banner
47fn banner_txt ( ) {
@@ -16,61 +19,103 @@ fn banner_txt(){
1619}
1720
1821pub ( crate ) fn load_config ( ) -> (
19- String , // headpat_device_ip
20- f32 , // min_speed_float
21- f32 , // max_speed_float
22- f32 , // speed_scale_float
23- String , // port_rx
24- String , // proximity_parameter_address
25- String , // max_speed_parameter_address
26- f32 , // Max Speed Low Limit
22+ Vec < String > , // headpat_device_URIs
23+ f32 , // min_speed_float
24+ f32 , // max_speed_float
25+ f32 , // speed_scale_float
26+ String , // port_rx
27+ Vec < String > , // proximity_parameters_multi
28+ String , // max_speed_parameter_address
29+ f32 , // Max Speed Low Limit
30+ u64 , // Timeout Setting
2731 ) {
2832 let mut config = Ini :: new ( ) ;
2933
3034 match config. load ( "./config.ini" ) {
3135 Err ( why) => panic ! ( "{}" , why) ,
3236 Ok ( _) => { }
3337 }
34- const MAX_SPEED_LOW_LIMIT_CONST : f32 = 0.05 ;
38+
39+ // Check the format of the IP URIs
40+ let headpat_device_uris: Vec < String > = config. get ( "Setup" , "device_ips" )
41+ . unwrap ( )
42+ . split_whitespace ( )
43+ . map ( |s| s. to_string ( ) ) // convert &str to String
44+ . filter_map ( |s| {
45+ match s. parse :: < IpAddr > ( ) {
46+ Ok ( _) => Some ( s) ,
47+ Err ( _) => {
48+ println ! ( "Invalid IP address format: {}" , s) ;
49+ None
50+ }
51+ }
52+ } )
53+ . collect ( ) ;
54+ if headpat_device_uris. is_empty ( ) {
55+ eprintln ! ( "Error: no device URIs specified in config file" ) ;
56+ // handle error here, e.g. return early from the function or exit the program
57+ }
58+
59+ let proximity_parameters_multi: Vec < String > = config
60+ . get ( "Setup" , "proximity_parameters_multi" )
61+ . unwrap ( )
62+ . split_whitespace ( )
63+ . map ( |s| format ! ( "/avatar/parameters/{}" , s) )
64+ . collect ( ) ;
3565
36- let headpat_device_ip = config. get ( "Setup" , "device_ip" ) . unwrap ( ) ;
37- let headpat_device_port = "8888" . to_string ( ) ;
38- let min_speed = config. get ( "Haptic_Config" , "min_speed" ) . unwrap ( ) ;
39- let min_speed_float = min_speed. parse :: < f32 > ( ) . unwrap ( ) / 100.0 ;
40- let max_speed = config. get ( "Haptic_Config" , "max_speed" ) . unwrap ( ) ;
41- let max_speed_float = max_speed. parse :: < f32 > ( ) . unwrap ( ) / 100.0 ;
42- let max_speed_low_limit = MAX_SPEED_LOW_LIMIT_CONST ;
43- let max_speed_float = max_speed_float. max ( max_speed_low_limit) ;
44- let speed_scale = config. get ( "Haptic_Config" , "max_speed_scale" ) . unwrap ( ) ;
45- let speed_scale_float = speed_scale. parse :: < f32 > ( ) . unwrap ( ) / 100.0 ;
46- let port_rx = config. get ( "Setup" , "port_rx" ) . unwrap ( ) ;
66+
67+ if headpat_device_uris. len ( ) != proximity_parameters_multi. len ( ) {
68+ eprintln ! ( "Error: number of device URIs does not match number of proximity parameters" ) ;
69+ // handle error here, e.g. return early from the function or exit the program
70+ }
71+
72+ const MAX_SPEED_LOW_LIMIT_CONST : f32 = 0.05 ;
4773
48- let proximity_parameter_address = config
49- . get ( "Setup" , "proximity_parameter" )
50- . unwrap_or_else ( || "/avatar/parameters/proximity_01" . into ( ) ) ;
51- let max_speed_parameter_address = config
52- . get ( "Setup" , "max_speed_parameter" )
53- . unwrap_or_else ( || "/avatar/parameters/max_speed" . into ( ) ) ;
74+ let min_speed = config. get ( "Config" , "min_speed" ) . unwrap ( ) ;
75+ let min_speed_float = min_speed. parse :: < f32 > ( ) . unwrap ( ) / 100.0 ;
76+
77+ let max_speed = config. get ( "Config" , "max_speed" ) . unwrap ( ) . parse :: < f32 > ( ) . unwrap ( ) / 100.0 ;
78+ let max_speed_low_limit = MAX_SPEED_LOW_LIMIT_CONST ;
79+ let max_speed_float = max_speed. max ( max_speed_low_limit) ;
80+
81+ let speed_scale = config. get ( "Config" , "max_speed_scale" ) . unwrap ( ) ;
82+ let speed_scale_float = speed_scale. parse :: < f32 > ( ) . unwrap ( ) / 100.0 ;
83+
84+ let port_rx = config. get ( "Setup" , "port_rx" ) . unwrap ( ) ;
85+
86+ let timeout_str = config. get ( "Config" , "timeout" ) . unwrap ( ) ;
87+ let timeout = timeout_str. parse :: < u64 > ( ) . unwrap_or ( 0 ) ;
88+
89+ let max_speed_parameter_address = format ! ( "/avatar/parameters/{}" , config. get( "Setup" , "max_speed_parameter" ) . unwrap_or_else( || "/avatar/parameters/max_speed" . into( ) ) ) ;
5490
5591 println ! ( "\n " ) ;
5692 banner_txt ( ) ;
5793 println ! ( "\n " ) ;
58- println ! ( " Haptic Device: {}:{}" , headpat_device_ip, headpat_device_port) ;
59- println ! ( " Listening for OSC on port: {}" , port_rx) ;
94+ println ! ( " Device Maps" ) ;
95+ for ( i, parameter) in proximity_parameters_multi. iter ( ) . enumerate ( ) {
96+ println ! ( " {} => {}" , parameter. trim_start_matches( "/avatar/parameters/" ) , headpat_device_uris[ i] ) ;
97+ }
98+
99+ println ! ( "\n Listening for OSC on port: {}" , port_rx) ;
60100 println ! ( "\n Vibration Configuration" ) ;
61101 println ! ( " Min Speed: {}%" , min_speed) ;
62102 println ! ( " Max Speed: {:?}%" , max_speed_float * 100.0 ) ;
63103 println ! ( " Scale Factor: {}%" , speed_scale) ;
104+ println ! ( " Timeout: {}s" , timeout) ;
64105 println ! ( "\n Waiting for pats..." ) ;
65106
66107 (
67- headpat_device_ip ,
108+ headpat_device_uris ,
68109 min_speed_float,
69110 max_speed_float,
70111 speed_scale_float,
71112 port_rx,
72- proximity_parameter_address ,
113+ proximity_parameters_multi ,
73114 max_speed_parameter_address,
74115 max_speed_low_limit,
116+ timeout,
75117 )
76- }
118+ }
119+
120+
121+
0 commit comments