4040//! ```
4141
4242use anyhow:: Result ;
43- use log:: { debug, info, error} ;
44- use std:: { net:: SocketAddr , sync:: {
45- atomic:: { AtomicBool , Ordering } ,
46- Arc ,
47- } } ;
43+ use log:: { debug, error, info} ;
44+ use std:: clone;
4845use std:: time:: Duration ;
46+ use std:: {
47+ net:: SocketAddr ,
48+ sync:: {
49+ atomic:: { AtomicBool , Ordering } ,
50+ Arc ,
51+ } ,
52+ } ;
4953use tokio:: task:: JoinHandle ;
5054use tokio:: time;
5155
52- use crate :: { config:: Config , modbus:: PhotoacousticModbusServer } ;
5356use crate :: modbus;
5457use crate :: utility:: PhotoacousticDataSource ;
5558use crate :: visualization:: server:: build_rocket;
59+ use crate :: { config:: Config , modbus:: PhotoacousticModbusServer } ;
5660use base64:: prelude:: * ;
5761use rocket:: {
58- config:: { LogLevel } ,
62+ config:: LogLevel ,
5963 data:: { Limits , ToByteUnit } ,
6064} ;
6165use tokio:: net:: TcpListener ;
@@ -352,64 +356,47 @@ impl Daemon {
352356 let config = config. clone ( ) ;
353357 let running = self . running . clone ( ) ;
354358 let data_source = self . data_source . clone ( ) ;
355-
356- // Create the modbus server instance
357- let modbus_server = Arc :: new ( PhotoacousticModbusServer :: new ( ) ) ;
358- let modbus_server_for_task = modbus_server. clone ( ) ;
359-
360- // Store the server instance for access by other daemon components
361- self . modbus_server = Some ( modbus_server) ;
362-
359+
363360 let task = tokio:: spawn ( async move {
364- let socket_addr: SocketAddr = format ! ( "{}:{}" , config. modbus. address, config. modbus. port)
365- . parse ( )
366- . expect ( "Invalid socket address" ) ;
367-
361+
362+ let socket_addr: SocketAddr =
363+ format ! ( "{}:{}" , config. modbus. address, config. modbus. port)
364+ . parse ( )
365+ . expect ( "Invalid socket address" ) ;
368366 let listener = TcpListener :: bind ( socket_addr) . await ?;
369367 let server = Server :: new ( listener) ;
370-
371- // Create a closure that returns a new service for each connection
372- let server_instance = modbus_server_for_task. clone ( ) ;
373- let photoacoustic_modbus_service = move |_socket_addr| {
374- Ok ( Some ( server_instance. as_ref ( ) . clone ( ) ) )
375- } ;
376-
368+
369+ // Use a single shared service instance for all connections
370+ // This might be sufficient because on modbus specifications only one
371+ // Modbus master can connect to a Modbus slave at a time
372+
373+ // Create a new Modbus server instance
377374 let on_connected = |stream, socket_addr| async move {
378- accept_tcp_connection ( stream, socket_addr, photoacoustic_modbus_service )
375+ accept_tcp_connection ( stream, socket_addr, |_socket_addr| Ok ( Some ( PhotoacousticModbusServer :: new ( ) ) ) )
379376 } ;
380-
377+
381378 let on_process_error = |err| {
382379 error ! ( "Modbus server error: {err}" ) ;
383380 } ;
384-
381+
385382 // Start the server in a separate task
386383 let server_handle = tokio:: spawn ( async move {
387384 if let Err ( e) = server. serve ( & on_connected, on_process_error) . await {
388385 error ! ( "Modbus server error: {}" , e) ;
389386 }
390387 } ) ;
391-
388+
392389 // Periodically update the modbus server with latest measurement data
393390 while running. load ( Ordering :: SeqCst ) {
394- // Try to get latest measurement data
395- if let Some ( data) = data_source. lock ( ) . unwrap ( ) . get_latest_data ( ) {
396- debug ! ( "Updating Modbus server with latest measurement data" ) ;
397- modbus_server_for_task. update_measurement_data (
398- data. frequency ,
399- data. amplitude ,
400- data. concentration
401- ) ;
402- }
403-
404391 // Update every second
405392 time:: sleep ( Duration :: from_secs ( 1 ) ) . await ;
406393 }
407-
394+
408395 // Wait for the server to shut down
409396 let _ = server_handle. await ;
410397 Ok ( ( ) )
411398 } ) ;
412-
399+
413400 self . tasks . push ( task) ;
414401 info ! ( "Modbus server started" ) ;
415402 Ok ( ( ) )
@@ -427,14 +414,15 @@ impl Daemon {
427414 /// * `concentration` - Water vapor concentration in ppm
428415 pub fn update_measurement_data ( & self , frequency : f32 , amplitude : f32 , concentration : f32 ) {
429416 // Update the shared data source
430- self . data_source . update_data ( frequency, amplitude, concentration) ;
431-
417+ self . data_source
418+ . update_data ( frequency, amplitude, concentration) ;
419+
432420 // If the Modbus server is running, update its registers
433421 if let Some ( modbus_server) = & self . modbus_server {
434422 modbus_server. update_measurement_data ( frequency, amplitude, concentration) ;
435423 }
436424 }
437-
425+
438426 /// Get the shared data source
439427 ///
440428 /// # Returns
0 commit comments