use async_labjack::client::LabjackClient;
use async_labjack::client::LabjackInteractions;
use async_labjack::labjack::StreamConfigBuilder;
use async_labjack::{STREAM_DATA_CAPTURE_16, SYSTEM_TIMER_20HZ};
use tokio::time::{sleep, Duration};
#[tokio::main()]
async fn main() {
env_logger::init();
let socket_addr = "192.168.42.100:502".parse().unwrap();
let client = &mut LabjackClient::connect_with_timeout(socket_addr, Duration::from_millis(3000))
.await
.unwrap();
client.stop_stream().await.unwrap();
const NUM_SCANS: u32 = 5;
const NUM_TAGS: u32 = 2;
const TOTAL_SAMPLES_EXPECTED: u32 = NUM_SCANS * NUM_TAGS;
let new_stream_config = StreamConfigBuilder::default()
.num_addresses(2)
.scan_rate(1.0)
.num_scans(NUM_SCANS)
.auto_target(16)
.build()
.unwrap();
client
.start_stream(
&new_stream_config,
vec![SYSTEM_TIMER_20HZ.into(), STREAM_DATA_CAPTURE_16.into()],
)
.await
.unwrap();
sleep(Duration::from_secs(5)).await;
let data = client
.read_stream_cr(TOTAL_SAMPLES_EXPECTED as u16)
.await
.unwrap();
assert_eq!(data.len(), TOTAL_SAMPLES_EXPECTED as usize);
let mut start = true;
let mut prev_val: u32 = 0;
const EXPECTED_TIME_DIFF: u32 = 20;
for val in data.chunks_exact(2) {
let (msb, lsb) = (val[1], val[0]);
let converted_32_bit_val: u32 = ((msb as u32) << 16) + lsb as u32;
println!("system timer 20Hz: {converted_32_bit_val:?}");
if start {
prev_val = converted_32_bit_val;
start = false;
} else {
assert!(converted_32_bit_val > prev_val);
let time_diff = converted_32_bit_val - prev_val;
assert!((EXPECTED_TIME_DIFF - 1..=EXPECTED_TIME_DIFF + 1).contains(&time_diff));
prev_val = converted_32_bit_val;
}
}
println!("All values from the stream were consumed and as expected.");
println!("Success! Disconnecting...");
client.disconnect().await.unwrap();
}