Close

Redpitaya SCPI server rewritten in Rust

A project log for Yellow pitaya

A full open source electronic lab

sanpiSanpi 05/08/2017 at 12:270 Comments

During the frontend redesign, I found some bugs in the SCPI server. I was able to fix a simple buffer overflow in ACQ:SRAT? command. It’s not a big problem, because I can use the ACQ:DEC? instead. But there is more boring bugs. For example the binary output format and voltage getters (amplitude and offset) doesn’t work.

I have already written a binding for the redpitaya C api for fun (it’s my first crate idea) thus it’s easy to create a TCP server to handle strings.

After two weeks of work, including a big segfault fixing, I publish a new SCPI server, compatible with the legacy server.

This server pass all scpi client tests (± f32::EPSILON of course) :

$ cargo test -j1 -- --test-threads=1
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running target/debug/deps/redpitaya_scpi-a9e9b34583454096
running 42 tests
test acquire::test::test_average ... ok
test acquire::test::test_decimation ... ok
test acquire::test::test_gain ... ok
test acquire::test::test_sampling_rate_get_buffer_duration ... ok
test acquire::test::test_status ... ok
test analog::test::test_reset ... ok
test analog::test::test_value ... ok
test burst::test::test_count ... ok
test burst::test::test_mode ... ok
test burst::test::test_period ... FAILED
test burst::test::test_repetitions ... ok
test data::test::test_buffer_size ... ok
test data::test::test_get_write_pointer ... ok
test data::test::test_get_write_pointer_at_trigger ... ok
test data::test::test_read ... ok
test data::test::test_read_all ... ok
test data::test::test_read_latest ... ok
test data::test::test_read_oldest ... ok
test data::test::test_read_slice ... ok
test data::test::test_set_format ... ok
test data::test::test_units ... thread '' panicked at 'called `Result::unwrap()` on an `Err` value: "SendError(..)"', /checkout/src/libcore/result.rs:859
ok
test digital::test::test_reset ... ok
test digital::test::test_set_direction_in ... ok
test digital::test::test_set_direction_out ... ok
test digital::test::test_state ... ok
test generator::test::test_amplitude ... ok
test generator::test::test_arbitrary_waveform ... ok
test generator::test::test_duty_cycle ... ok
test generator::test::test_form ... ok
test generator::test::test_frequency ... ok
test generator::test::test_offset ... FAILED
test generator::test::test_phase ... ok
test generator::test::test_reset ... ok
test generator::test::test_status ... ok
test generator::test::test_trigger ... ok
test generator::test::test_trigger_all ... ok
test generator::test::test_trigger_source ... ok
test trigger::test::test_delay ... ok
test trigger::test::test_delay_in_ns ... ok
test trigger::test::test_hysteresis ... ok
test trigger::test::test_level ... FAILED
test trigger::test::test_status ... ok
failures:
---- burst::test::test_period stdout ----
	thread 'burst::test::test_period' panicked at 'assertion failed: `(left == right)` (left: `Ok(999999)`, right: `Ok(1000000)`)', src/burst.rs:176
note: Run with `RUST_BACKTRACE=1` for a backtrace.
---- generator::test::test_offset stdout ----
	thread 'generator::test::test_offset' panicked at 'assertion failed: `(left == right)` (left: `Ok(0.30004883)`, right: `Ok(0.3)`)', src/generator.rs:418
---- trigger::test::test_level stdout ----
	thread 'trigger::test::test_level' panicked at 'assertion failed: `(left == right)` (left: `Ok(0.4000244)`, right: `Ok(0.4)`)', src/trigger.rs:221
failures:
    burst::test::test_period
    generator::test::test_offset
    trigger::test::test_level
test result: FAILED. 39 passed; 3 failed; 0 ignored; 0 measured
error: test failed, to rerun pass '--lib'

Discussions