@@ -25,8 +25,11 @@ use tracing::{error, info, trace, warn};
25
25
use udp_stream:: UdpStream ;
26
26
use uuid:: Uuid ;
27
27
28
- use super :: devices:: { DeviceActor , DeviceActorHandler } ;
29
- use bluerobotics_ping:: device:: { Ping1D , Ping360 } ;
28
+ use super :: devices:: { DeviceActor , DeviceActorHandler , PingAnswer } ;
29
+ use bluerobotics_ping:: {
30
+ common:: { DeviceInformationStruct , ProtocolVersionStruct } ,
31
+ device:: { Ping1D , Ping360 } ,
32
+ } ;
30
33
31
34
pub struct Device {
32
35
pub id : Uuid ,
@@ -170,6 +173,7 @@ pub enum Answer {
170
173
#[ serde( skip) ]
171
174
InnerDeviceHandler ( DeviceActorHandler ) ,
172
175
DeviceInfo ( Vec < DeviceInfo > ) ,
176
+ DeviceConfig ( ModifyDeviceResult ) ,
173
177
}
174
178
175
179
#[ derive( Debug , Serialize , Deserialize , Clone ) ]
@@ -210,7 +214,15 @@ pub enum Request {
210
214
211
215
#[ derive( Debug , Clone , Serialize , Deserialize , Apiv2Schema ) ]
212
216
pub enum ModifyDeviceCommand {
213
- Ip ( Ipv4Addr ) ,
217
+ SetIp ( Ipv4Addr ) ,
218
+ SetPing360Config ( Ping360Config ) ,
219
+ GetPing360Config ,
220
+ }
221
+
222
+ #[ derive( Debug , Serialize , Deserialize , Clone ) ]
223
+ pub enum ModifyDeviceResult {
224
+ ConfigAcknowledge ( ModifyDevice ) ,
225
+ Ping360Config ( Ping360Config ) ,
214
226
}
215
227
216
228
#[ derive( Debug , Clone , Serialize , Deserialize , Apiv2Schema ) ]
@@ -731,9 +743,48 @@ impl DeviceManager {
731
743
Ok ( device. properties . clone ( ) )
732
744
}
733
745
746
+ pub async fn update_ping360_config (
747
+ & self ,
748
+ device_id : Uuid ,
749
+ new_config : Ping360Config ,
750
+ ) -> Result < ( ) , ManagerError > {
751
+ let device = self . get_device ( device_id) ?;
752
+ if let Some ( DeviceProperties :: Ping360 ( properties) ) = & device. properties {
753
+ let mut config = properties
754
+ . continuous_mode_settings
755
+ . write ( )
756
+ . map_err ( |err| ManagerError :: Other ( err. to_string ( ) ) ) ?;
757
+ * config = new_config;
758
+ return Ok ( ( ) ) ;
759
+ }
760
+ Err ( ManagerError :: DeviceSourceError (
761
+ "set_ping360_config: Can't set Ping360Config" . to_string ( ) ,
762
+ ) )
763
+ }
764
+
765
+ pub async fn get_ping360_config ( & self , device_id : Uuid ) -> Result < Answer , ManagerError > {
766
+ let device = self . get_device ( device_id) ?;
767
+ if let Some ( DeviceProperties :: Ping360 ( properties) ) = & device. properties {
768
+ return Ok ( Answer :: DeviceConfig ( ModifyDeviceResult :: Ping360Config (
769
+ properties
770
+ . continuous_mode_settings
771
+ . read ( )
772
+ . map_err ( |err| {
773
+ ManagerError :: Other ( format ! (
774
+ "get_ping360_config: {err}, device: {device_id}"
775
+ ) )
776
+ } ) ?
777
+ . clone ( ) ,
778
+ ) ) ) ;
779
+ }
780
+ Err ( ManagerError :: DeviceSourceError (
781
+ "get_ping360_config: Can't return Ping360Config" . to_string ( ) ,
782
+ ) )
783
+ }
784
+
734
785
pub async fn modify_device ( & mut self , request : ModifyDevice ) -> Result < Answer , ManagerError > {
735
786
match request. modify {
736
- ModifyDeviceCommand :: Ip ( ip) => {
787
+ ModifyDeviceCommand :: SetIp ( ip) => {
737
788
let device_info = self . info ( request. uuid ) . await ?;
738
789
let Answer :: DeviceInfo ( data) = device_info else {
739
790
return Err ( ManagerError :: NoDevices ) ;
@@ -750,8 +801,18 @@ impl DeviceManager {
750
801
} ;
751
802
752
803
self . modify_device_ip ( ip, inner. ip ) . await ?;
753
- self . delete ( request. uuid ) . await
804
+ self . delete ( request. uuid ) . await ?;
805
+ Ok ( Answer :: DeviceConfig ( ModifyDeviceResult :: ConfigAcknowledge (
806
+ request,
807
+ ) ) )
808
+ }
809
+ ModifyDeviceCommand :: SetPing360Config ( config) => {
810
+ self . update_ping360_config ( request. uuid , config) . await ?;
811
+ Ok ( Answer :: DeviceConfig ( ModifyDeviceResult :: ConfigAcknowledge (
812
+ request,
813
+ ) ) )
754
814
}
815
+ ModifyDeviceCommand :: GetPing360Config => self . get_ping360_config ( request. uuid ) . await ,
755
816
}
756
817
}
757
818
@@ -823,7 +884,7 @@ impl ManagerActorHandler {
823
884
}
824
885
Err ( err) => {
825
886
error ! (
826
- "Handling Ping request: {request:?}: Error ocurred on device: {err:?}" ) ;
887
+ "Handling Ping request: {request:?}: Error occurred on device: {err:?}" ) ;
827
888
Err ( ManagerError :: DeviceError ( err) )
828
889
}
829
890
}
0 commit comments