From f1947db6c9b088700107bb1ea620a2755617f88d Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Thu, 15 Jul 2021 13:28:19 +0200 Subject: [PATCH 01/26] Squashing manual changes --- .github/workflows/ci.yml | 26 +++ .github/workflows/release-docs.yml | 35 ++++ .gitignore | 1 + Cargo.lock | 4 +- Cargo.toml | 2 +- README.md | 75 +------- doc/.keep-me | 0 docs/Gemfile | 3 + docs/Gemfile.lock | 81 +++++++++ docs/README.md | 20 +++ docs/_config.yml | 18 ++ docs/assets/mqtt-explorer.png | Bin 0 -> 61489 bytes docs/assets/stabilizer-jtag.jpg | Bin 0 -> 95480 bytes docs/assets/stabilizer-logo.png | Bin 0 -> 22532 bytes .../assets/stabilizer_pid.svg | 0 docs/favicon.ico | Bin 0 -> 1150 bytes docs/index.md | 55 ++++++ docs/pages/getting-started.md | 162 ++++++++++++++++++ docs/pages/networking.md | 63 +++++++ docs/pages/networking/run-time-settings.md | 48 ++++++ dsp/Cargo.toml | 2 +- dsp/src/cossin.rs | 2 +- dsp/src/iir.rs | 19 ++ src/bin/dual-iir.rs | 79 +++++++++ src/bin/lockin.rs | 119 ++++++++++++- src/configuration.rs | 41 +++++ src/hardware/design_parameters.rs | 12 +- src/hardware/pounder/timestamp.rs | 8 +- src/hardware/system_timer.rs | 5 +- src/lib.rs | 1 + src/net/data_stream.rs | 114 ++++++++---- src/net/miniconf_client.rs | 2 +- src/net/telemetry.rs | 10 +- stabilizer_pid.png | Bin 32882 -> 130 bytes 34 files changed, 875 insertions(+), 132 deletions(-) create mode 100644 .github/workflows/release-docs.yml delete mode 100644 doc/.keep-me create mode 100644 docs/Gemfile create mode 100644 docs/Gemfile.lock create mode 100644 docs/README.md create mode 100644 docs/_config.yml create mode 100644 docs/assets/mqtt-explorer.png create mode 100644 docs/assets/stabilizer-jtag.jpg create mode 100644 docs/assets/stabilizer-logo.png rename stabilizer_pid.svg => docs/assets/stabilizer_pid.svg (100%) create mode 100644 docs/favicon.ico create mode 100644 docs/index.md create mode 100644 docs/pages/getting-started.md create mode 100644 docs/pages/networking.md create mode 100644 docs/pages/networking/run-time-settings.md create mode 100644 src/configuration.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf68b3f..848060e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,3 +83,29 @@ jobs: with: command: bench args: --package dsp --target=x86_64-unknown-linux-gnu + + doc: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: thumbv7em-none-eabihf + override: true + - name: Install Deadlinks + uses: actions-rs/cargo@v1 + with: + command: install + args: cargo-deadlinks + + - name: cargo doc + uses: actions-rs/cargo@v1 + with: + command: doc + args: --no-deps -p miniconf -p dsp -p ad9959 -p stabilizer + - name: cargo deadlinks + uses: actions-rs/cargo@v1 + with: + command: deadlinks + args: --dir target/thumbv7em-none-eabihf/doc diff --git a/.github/workflows/release-docs.yml b/.github/workflows/release-docs.yml new file mode 100644 index 0000000..b3279d5 --- /dev/null +++ b/.github/workflows/release-docs.yml @@ -0,0 +1,35 @@ +name: Release Documentation + +on: + workflow_dispatch: + push: + # branches: + # - master + +jobs: + release-docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: thumbv7em-none-eabihf + override: true + + - uses: actions-rs/cargo@v1 + with: + command: doc + args: --no-deps -p miniconf -p ad9959 -p stabilizer -p dsp + + - run: mv target/thumbv7em-none-eabihf/doc docs/firmware + + - uses: peaceiris/actions-gh-pages@v3.8.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: docs + enable_jekyll: true + publish_branch: pages diff --git a/.gitignore b/.gitignore index ea8c4bf..a6eef6e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +docs/_site/ diff --git a/Cargo.lock b/Cargo.lock index db78e72..03273f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -200,7 +200,7 @@ dependencies = [ [[package]] name = "derive_miniconf" version = "0.1.0" -source = "git+https://github.com/quartiq/miniconf.git?rev=2750533#275053396f0334e9efefa1ab2aae4c19b95a9a53" +source = "git+https://github.com/quartiq/miniconf.git?rev=9c826f8#9c826f8de8d0dd1a59e1ce7bf124ac0311994b46" dependencies = [ "proc-macro2", "quote", @@ -414,7 +414,7 @@ dependencies = [ [[package]] name = "miniconf" version = "0.1.0" -source = "git+https://github.com/quartiq/miniconf.git?rev=2750533#275053396f0334e9efefa1ab2aae4c19b95a9a53" +source = "git+https://github.com/quartiq/miniconf.git?rev=9c826f8#9c826f8de8d0dd1a59e1ce7bf124ac0311994b46" dependencies = [ "derive_miniconf", "serde", diff --git a/Cargo.toml b/Cargo.toml index 6f52210..1c6c0d1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,7 +70,7 @@ rev = "a2e3ad5" [patch.crates-io.miniconf] git = "https://github.com/quartiq/miniconf.git" -rev = "2750533" +rev = "9c826f8" [dependencies.smoltcp-nal] git = "https://github.com/quartiq/smoltcp-nal.git" diff --git a/README.md b/README.md index d34d971..ba1759d 100644 --- a/README.md +++ b/README.md @@ -13,79 +13,6 @@ This firmware offers a library of hardware and software functionality targeting the use of the Stabilizer hardware in various digital signal processing applications commonly occurring in Quantum Technology. It provides abstractions over the fast analog inputs and outputs, time stamping, Pounder DDS interfaces and a collection of tailored and optimized digital signal processing algorithms (IIR, FIR, Lockin, PLL, reciprocal PLL, Unwrapper, Lowpass, Cosine-Sine, Atan2). An application can compose and configure these hardware and software components to implement different use cases. -Several applications are provides by default: -### Dual-IIR +Check out the [Documentation](https://quartiq.de/stabilizer) for more information on usage. -![Flow diagram](stabilizer_pid.svg) - -* dual channel -* SPI ADC -* SPI DAC -* up to 800 kHz rate, timed sampling -* down to 2 µs latency -* f32 IIR math -* generic biquad (second order) IIR filter -* anti-windup -* derivative kick avoidance - -### Lockin - -* Up to 800 kHz sampling -* Up to 400 kHz modulation frequency -* Reciprocal PLL for external reference -* Internal reference -* Adjustable PLL and locking time constants -* Adjustable phase offset and harmonic index -* Different output modes (in-phase, quadrature, magnitude, log2 power, phase, frequency) - -## Minimal bootstrapping documentation - -* Clone or download this -* Get [rustup](https://rustup.rs/) -* Minimum supported Rust version (MSRV) is 1.52.0 -* Install target support: `rustup target add thumbv7em-none-eabihf` -* Install `probe-run`: `cargo install probe-run` -* `cargo run --release --bin dual-iir` -* When using debug (non `--release`) mode, increase the sample interval significantly. - The added error checking code and missing optimizations may lead to the code - missing deadlines and panicing. - -## Alternative flashing tools - -### Cargo-embed - -* Install `cargo-embed`: `cargo install cargo-embed` -* Program the device: `cargo embed --bin dual-iir --release` - -### GDB/OpenOCD - -* Get a recent openocd, a JTAG adapter ("st-link" or some clone) and - everything connected and permissions setup. Most - [Nucleo](https://www.digikey.de/short/p41h4v) boards have a - detachable ST-Link v2 and are cheap.[^swd] -* Get a multiarch `gdb` (or a cross arm gdb and edit `.cargo/config` accordingly) -* `openocd -f stabilizer.cfg` and leave it running -* `cargo run --release` - -### USB-DFU - -* Get [cargo-binutils](https://github.com/rust-embedded/cargo-binutils/) -* `cargo objcopy --release --bin dual-iir -- -O binary dual-iir.bin` or `arm-none-eabi-objcopy -O binary target/thumbv7em-none-eabihf/release/dual-iir dual-iir.bin` -* Install the DFU USB tool (`dfu-util`) -* Connect to the Micro USB connector below the RJ45 -* Short JC2/BOOT -* `dfu-util -a 0 -s 0x08000000:leave -D dual-iir.bin` - -### ST-Link virtual mass storage - -* Prepare `dual-iir.bin` like above -* Connect the ST-Link debugger -* Copy `dual-iir.bin` to the `NODE_H743ZI` virtual mass storage device - -## Protocol - -Stabilizer can be configured via MQTT. Refer to -[`miniconf`](https://github.com/quartiq/miniconf) for more information about topics. -A basic command line interface is available in [`miniconf.py`](miniconf.py). -Telemetry is published via MQTT as well. diff --git a/doc/.keep-me b/doc/.keep-me deleted file mode 100644 index e69de29..0000000 diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 0000000..7b3f249 --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' +gem "just-the-docs" +gem "jekyll-remote-theme" diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock new file mode 100644 index 0000000..3c8dd31 --- /dev/null +++ b/docs/Gemfile.lock @@ -0,0 +1,81 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) + colorator (1.1.0) + concurrent-ruby (1.1.9) + em-websocket (0.5.2) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + eventmachine (1.2.7-x64-mingw32) + ffi (1.15.3-x64-mingw32) + forwardable-extended (2.6.0) + http_parser.rb (0.6.0) + i18n (1.8.10) + concurrent-ruby (~> 1.0) + jekyll (4.2.0) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (~> 2.0) + jekyll-watch (~> 2.0) + kramdown (~> 2.3) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (~> 0.4.0) + pathutil (~> 0.9) + rouge (~> 3.0) + safe_yaml (~> 1.0) + terminal-table (~> 2.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (2.1.0) + sassc (> 2.0.1, < 3.0) + jekyll-seo-tag (2.7.1) + jekyll (>= 3.8, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + just-the-docs (0.3.3) + jekyll (>= 3.8.5) + jekyll-seo-tag (~> 2.0) + rake (>= 12.3.1, < 13.1.0) + kramdown (2.3.1) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.3) + listen (3.5.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.4.0) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (4.0.6) + rake (13.0.6) + rb-fsevent (0.11.0) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.5) + rouge (3.26.0) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sassc (2.4.0-x64-mingw32) + ffi (~> 1.9) + terminal-table (2.0.0) + unicode-display_width (~> 1.1, >= 1.1.1) + unicode-display_width (1.7.0) + +PLATFORMS + x64-mingw32 + +DEPENDENCIES + jekyll-remote-theme + just-the-docs + +BUNDLED WITH + 2.2.22 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..f0df354 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,20 @@ +This folder represents the Github Pages site that is used to host Stabilizer's user guide. + +The site is hosted with Jekyll and utilizes the "Just the Docs" theme. + +To run locally: +1. Install Ruby +1. Install [Jekyll](https://jekyllrb.com/) +1. Install [Bundler](https://bundler.io/) +1. From this directory: +``` +bundle install +bundle exec jekyll serve +``` +1. Navigate to `localhost:4000` in a web browser + +Note: Some of the links in the docs rely on Cargo's documentation. To make all links work locally, run: +``` +cargo doc --bins +cp -r target/thumbv7em-none-eabihf/doc docs/firmware +``` diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..a7901db --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,18 @@ +remote_theme: pmarsceill/just-the-docs +title: Stabilizer +description: "User Manual" +logo: "/assets/stabilizer-logo.png" + +url: "https://quartiq.de" +baseurl: "/stabilizer" + +exclude: ['README.md'] + +plugins: + - jekyll-remote-theme + +# Enable an auxilary link in top right with a new tab open +aux_links: + "Stabilizer on Github": + - "//github.com/quartiq/stabilizer" +aux_links_new_tab: true diff --git a/docs/assets/mqtt-explorer.png b/docs/assets/mqtt-explorer.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffe74c7bb4702c9d5ec7c354984570ae298ca4a GIT binary patch literal 61489 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%0Dol_^oN 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�Y?$b8bn6S^0WDGSFPH0r!HX{+_uP0dHGw7hWJ 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
,,[, ...] +/// +/// # The header takes the following form +///
= ,, +/// +/// # Each batch takes the following form +/// = ,,, +/// +/// # Where +/// = , ... +/// ``` +/// +/// ### Packet Format +/// Multiple blocks are sent in a single UDP packet simultaneously. Each UDP packet transmitted +/// contains a header followed by the serialized data blocks. +/// ``` +///
,,[, ...] +/// ``` +/// +/// ### Header +/// A header takes the following form: +/// * The starting block ID (2 bytes) +/// * The number of blocks present in the packet (1 byte) +/// * The size of each bach in samples (1 byte) +/// +/// ``` +/// ,, +/// ``` +/// +/// ### Data Blocks +/// Following the header, each block is sequentially serialized. Each block takes the following form: +/// ``` +/// ,,, +/// ``` +/// +/// Where `` is an array of N 16-bit ADC/DAC samples. The number of samples is provided in the +/// header. +/// +/// ADC and DAC codes are transmitted in raw machine-code format. Please refer to the datasheet for the +/// ADC and DAC if you need to convert these to voltages. +pub struct DataPacket<'a> { buf: &'a mut [u8], subsample_rate: usize, start_id: Option, diff --git a/src/net/miniconf_client.rs b/src/net/miniconf_client.rs index 4bdd2b1..0caf8d0 100644 --- a/src/net/miniconf_client.rs +++ b/src/net/miniconf_client.rs @@ -14,7 +14,7 @@ use heapless::String; use log::info; use super::{MqttMessage, NetworkReference, SettingsResponse, UpdateState}; -use crate::hardware::design_parameters::MQTT_BROKER; +use crate::configuration::MQTT_BROKER; /// MQTT settings interface. pub struct MiniconfClient diff --git a/src/net/telemetry.rs b/src/net/telemetry.rs index 40a5ce3..5ebfa3b 100644 --- a/src/net/telemetry.rs +++ b/src/net/telemetry.rs @@ -15,9 +15,8 @@ use minimq::QoS; use serde::Serialize; use super::NetworkReference; -use crate::hardware::{ - adc::AdcCode, afe::Gain, dac::DacCode, design_parameters::MQTT_BROKER, -}; +use crate::configuration::MQTT_BROKER; +use crate::hardware::{adc::AdcCode, afe::Gain, dac::DacCode}; /// The telemetry client for reporting telemetry data over MQTT. pub struct TelemetryClient { @@ -49,8 +48,13 @@ pub struct TelemetryBuffer { /// overhead. #[derive(Serialize)] pub struct Telemetry { + /// Most recent input voltage measurement. adcs: [f32; 2], + + /// Most recent output voltage. dacs: [f32; 2], + + /// Most recent digital input assertion state. digital_inputs: [bool; 2], } diff --git a/stabilizer_pid.png b/stabilizer_pid.png index 981112f850825237a0e35e79e8921660bbe6062a..186e09b4e7c344ff6a97d3e09e5967588d01e273 100644 GIT binary patch literal 130 zcmWN?OA^8$3;@u5Pr(H&5IzmPjR`@RQRxWn!qe;9yh}c#^|z{X9%I+~(dO-0#`?dW zv~qvxaR}?nF1=+n>K#JdvokjPEP!MrCWo+PA`y#bD_&4I5CE1EGe8n>DKLBV7Ktf2 MSw{Pca)1cS5BfJJ*Z=?k literal 32882 zcmZU)Wmr|++6D?pmvkd3U6PCLl#uT3l5PR%Zjc7)?nY{Xgmg-GcZ2kq_`Z9eeZKQY zysiavjXC0Z?iyjAG#FQW)-rxcMABKko{ypP?>4Jbj`sAsi;cV+J z>1b$gA!lb|Y6Agbt1daV)f)Z8fzsBr7wn|LW1c)TzoG;BraQ|0cprB<`)1haYwgEx zQeiw;9>w}JvzeyLIGt$4gcq&l5s$coFCu8r{`;$F&xET((+ukqy8gEyFmi= zz-;kha}Gy1&g%MpAa9E#(Ordop5sa%9&W*QnXges{5Nt;c=G3`RzFzv5m9wJ;!l(l zf@tIUv9wFgIxL+bH5+4GfVb`byt&fkWWOamoG|#6ZZ;=~I4i0269iUNS{_fj>rp?9wLp7NnC*^zp zvAUwg@KLA;Dy7%;1@EBq+c!RkM(z%T&Mu274{Y|o}NNRmG zzXx^E`Xx$~@+MTcl+|WelSjI6G}w^14jfv1JyaUg @k(a*hUZPWvHqy|P!{4Tfy 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 gr~&^^e61(9Dx29QFz-4>Ux5FV Date: Thu, 15 Jul 2021 14:07:30 +0200 Subject: [PATCH 02/26] Fixing feature unification issue --- Cargo.toml | 1 + dsp/Cargo.toml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 1c6c0d1..93abac7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [package] name = "stabilizer" version = "0.5.0" +resolver = "2" authors = ["Robert Jördens "] description = "Firmware for the Sinara Stabilizer board (stm32h743, eth, poe, 2 adc, 2 dac)" categories = ["embedded", "no-std", "hardware-support", "science"] diff --git a/dsp/Cargo.toml b/dsp/Cargo.toml index 82e4a84..972a0f6 100644 --- a/dsp/Cargo.toml +++ b/dsp/Cargo.toml @@ -1,6 +1,7 @@ [package] name = "dsp" version = "0.1.0" +resolver = "2" authors = ["Robert Jördens "] edition = "2018" @@ -12,7 +13,7 @@ miniconf = "0.1" [dev-dependencies] easybench = "1.0" rand = "0.8" -ndarray = { default-features = false, version = "0.15" } +ndarray = "0.15" [[bench]] name = "micro" From 9c6b8b48d320e59ccdab7671ca76dafbd6ffb285 Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Thu, 15 Jul 2021 14:10:00 +0200 Subject: [PATCH 03/26] Updating docs release to force orphan commit --- .github/workflows/release-docs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release-docs.yml b/.github/workflows/release-docs.yml index b3279d5..d2e71d6 100644 --- a/.github/workflows/release-docs.yml +++ b/.github/workflows/release-docs.yml @@ -33,3 +33,4 @@ jobs: publish_dir: docs enable_jekyll: true publish_branch: pages + force_orphan: true From 0c3a99b6b68aaee3d37e1e2c0e63415757e33751 Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 11:23:01 +0200 Subject: [PATCH 04/26] Fixing links, adding htmlproofer --- .github/workflows/ci.yml | 23 ++++++++++++++++++++++ docs/Gemfile | 1 + docs/Gemfile.lock | 21 ++++++++++++++++++++ docs/pages/getting-started.md | 2 +- docs/pages/networking.md | 4 ++-- docs/pages/networking/run-time-settings.md | 2 +- 6 files changed, 49 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 848060e..9ec4012 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -88,6 +88,19 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + + - uses: actions/setup-ruby@v1 + with: + ruby-version: 2.7.x + + - name: Setup Jekyll + working-directory: docs + runs: | + gem update + gem update bundler + gem install jekyll bundler + bundler install + - uses: actions-rs/toolchain@v1 with: toolchain: stable @@ -104,8 +117,18 @@ jobs: with: command: doc args: --no-deps -p miniconf -p dsp -p ad9959 -p stabilizer + - name: cargo deadlinks uses: actions-rs/cargo@v1 with: command: deadlinks args: --dir target/thumbv7em-none-eabihf/doc + + - name: Move firmware documents + runs: | + mkdir -p docs/_site/stabilizer + mv targets/thumbv7em-none-eabihf/doc docs/_site/stabilizer/firmware + + - name: Test User Manual + working-directory: docs + runs: rake test diff --git a/docs/Gemfile b/docs/Gemfile index 7b3f249..e18d92a 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -1,3 +1,4 @@ source 'https://rubygems.org' gem "just-the-docs" gem "jekyll-remote-theme" +gem "html-proofer" diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 3c8dd31..b8495b8 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -8,9 +8,19 @@ GEM em-websocket (0.5.2) eventmachine (>= 0.12.9) http_parser.rb (~> 0.6.0) + ethon (0.14.0) + ffi (>= 1.15.0) eventmachine (1.2.7-x64-mingw32) ffi (1.15.3-x64-mingw32) forwardable-extended (2.6.0) + html-proofer (3.19.2) + addressable (~> 2.3) + mercenary (~> 0.3) + nokogumbo (~> 2.0) + parallel (~> 1.3) + rainbow (~> 3.0) + typhoeus (~> 1.3) + yell (~> 2.0) http_parser.rb (0.6.0) i18n (1.8.10) concurrent-ruby (~> 1.0) @@ -53,9 +63,16 @@ GEM rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.4.0) + nokogiri (1.11.7-x64-mingw32) + racc (~> 1.4) + nokogumbo (2.0.5) + nokogiri (~> 1.8, >= 1.8.4) + parallel (1.20.1) pathutil (0.16.2) forwardable-extended (~> 2.6) public_suffix (4.0.6) + racc (1.5.2) + rainbow (3.0.0) rake (13.0.6) rb-fsevent (0.11.0) rb-inotify (0.10.1) @@ -68,12 +85,16 @@ GEM ffi (~> 1.9) terminal-table (2.0.0) unicode-display_width (~> 1.1, >= 1.1.1) + typhoeus (1.4.0) + ethon (>= 0.9.0) unicode-display_width (1.7.0) + yell (2.2.2) PLATFORMS x64-mingw32 DEPENDENCIES + html-proofer jekyll-remote-theme just-the-docs diff --git a/docs/pages/getting-started.md b/docs/pages/getting-started.md index 6db58f6..5c7a85c 100644 --- a/docs/pages/getting-started.md +++ b/docs/pages/getting-started.md @@ -46,7 +46,7 @@ application requirements. Some examples of parameters that may require configura Parameters are configured by editing `src/configuration.rs`. -Refer to the [documentation]({{site.baseurl}}/firmware/stabilizer/configuration.rs) for more +Refer to the [documentation]({{site.baseurl}}/firmware/stabilizer/configuration/index.html) for more information on parameters. When these parameters are updated, firmware must be built and flashed onto Stabilizer before they diff --git a/docs/pages/networking.md b/docs/pages/networking.md index 226bc32..fc6e2b3 100644 --- a/docs/pages/networking.md +++ b/docs/pages/networking.md @@ -49,7 +49,7 @@ buffering requirements. In its most basic form, telemetry publishes the latest ADC input voltages, DAC output voltages, and digital input states. -Refer to the respective [application documentation](/#applications) for more information on telemetry. +Refer to the respective [application documentation]({{site.baseurl}}/#applications) for more information on telemetry. ## Livestream @@ -60,4 +60,4 @@ host computer for further analysis. Livestreamed data is sent with "best effort" - it's possible that data may be lost either due to network congestion or by Stabilizer. -Refer to the the respective [application documentation](/#applications) for more information. +Refer to the the respective [application documentation]({{site.baseurl}}/#applications) for more information. diff --git a/docs/pages/networking/run-time-settings.md b/docs/pages/networking/run-time-settings.md index c96c3c3..c2c169c 100644 --- a/docs/pages/networking/run-time-settings.md +++ b/docs/pages/networking/run-time-settings.md @@ -37,7 +37,7 @@ python miniconf.py --broker localhost dt/sinara/dual-iir/00-11-22-33-44-55 strea The prefix can be found for a specific device by looking at the topic on which telemetry that is being published. -Refer to the [application documentation](/#applications) for the exact settings and values exposed +Refer to the [application documentation]({{site.baseurl}}/#applications) for the exact settings and values exposed for each application. The rules for constructing `path` values are documented in [`miniconf`'s From 6058573e7e5f3e859a1cd1e7952c8d678e064931 Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 11:25:28 +0200 Subject: [PATCH 05/26] Fixing workflow --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ec4012..931a3ac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,7 +95,7 @@ jobs: - name: Setup Jekyll working-directory: docs - runs: | + run: | gem update gem update bundler gem install jekyll bundler @@ -125,10 +125,10 @@ jobs: args: --dir target/thumbv7em-none-eabihf/doc - name: Move firmware documents - runs: | + run: | mkdir -p docs/_site/stabilizer mv targets/thumbv7em-none-eabihf/doc docs/_site/stabilizer/firmware - name: Test User Manual working-directory: docs - runs: rake test + run: rake test From 12427ead2062cefb811a98b20177afd7ff2dcc0b Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 11:36:39 +0200 Subject: [PATCH 06/26] Updating deadlinks to ignore fragments --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 931a3ac..3329a79 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -122,7 +122,9 @@ jobs: uses: actions-rs/cargo@v1 with: command: deadlinks - args: --dir target/thumbv7em-none-eabihf/doc + # We intentionally ignore fragments, as RTIC may generate fragments for various + # auto-generated code. + args: --dir target/thumbv7em-none-eabihf/doc --ignore-fragments - name: Move firmware documents run: | From f38ede6f74327c357282d3ae05b6b5e8c0ebaabc Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 11:41:14 +0200 Subject: [PATCH 07/26] Removing forced execution --- .github/workflows/release-docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-docs.yml b/.github/workflows/release-docs.yml index d2e71d6..0816dad 100644 --- a/.github/workflows/release-docs.yml +++ b/.github/workflows/release-docs.yml @@ -3,8 +3,8 @@ name: Release Documentation on: workflow_dispatch: push: - # branches: - # - master + branches: + - master jobs: release-docs: From 2f8b49bbc574e613df33044c1f0f5ddcd142284c Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 13:03:50 +0200 Subject: [PATCH 08/26] Fixing target path --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3329a79..2e8275b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -129,7 +129,7 @@ jobs: - name: Move firmware documents run: | mkdir -p docs/_site/stabilizer - mv targets/thumbv7em-none-eabihf/doc docs/_site/stabilizer/firmware + mv target/thumbv7em-none-eabihf/doc docs/_site/stabilizer/firmware - name: Test User Manual working-directory: docs From d6dfbd2c886cfe0f15cb168e8ee9521907065b3e Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 13:16:30 +0200 Subject: [PATCH 09/26] Adding Rakefile --- docs/Rakefile | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 docs/Rakefile diff --git a/docs/Rakefile b/docs/Rakefile new file mode 100644 index 0000000..25dcff6 --- /dev/null +++ b/docs/Rakefile @@ -0,0 +1,28 @@ +# Rakefile taken from: +# https://seankilleen.com/2019/09/how-to-check-your-jekyll-based-blog-for-dead-links/ + +# Ensures we have the html-proofer library available to use +require 'html-proofer' + +# The function that will run the proofer, so that we can re-use it between our two rake tasks +def run_htmlproofer() + options = { + # Assumes html file extensions + assume_extension: true, + # The options for the curl library that's used. + :typhoeus => { + # This will stop you from getting errors when certs can't be parsed, which doesn't matter in this case. + :ssl_verifypeer => false + }, + # Won't fail for local links + allow_hash_href: true, + } + + # Calls html-proofer and uses the Jekyll _site folder + HTMLProofer.check_directory("./_site", options).run +end + +task :test do + sh "bundle exec jekyll build -d _site/stabilizer" + run_htmlproofer() +end From fba60ef990adc1378497897c7ad1cb8fb51e3f1c Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 14:12:08 +0200 Subject: [PATCH 10/26] Fixing CI --- .github/workflows/ci.yml | 7 +++++-- docs/Rakefile | 8 +++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e8275b..badc4c0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -129,8 +129,11 @@ jobs: - name: Move firmware documents run: | mkdir -p docs/_site/stabilizer - mv target/thumbv7em-none-eabihf/doc docs/_site/stabilizer/firmware - name: Test User Manual working-directory: docs - run: rake test + run: | + rake build + mv target/thumbv7em-none-eabihf/doc docs/_site/stabilizer/firmware + rake test + diff --git a/docs/Rakefile b/docs/Rakefile index 25dcff6..57ecf11 100644 --- a/docs/Rakefile +++ b/docs/Rakefile @@ -9,6 +9,9 @@ def run_htmlproofer() options = { # Assumes html file extensions assume_extension: true, + + file_ignore: [ /stabilizer\/firmware\/.*/ ], + # The options for the curl library that's used. :typhoeus => { # This will stop you from getting errors when certs can't be parsed, which doesn't matter in this case. @@ -23,6 +26,9 @@ def run_htmlproofer() end task :test do - sh "bundle exec jekyll build -d _site/stabilizer" run_htmlproofer() end + +task :build do + sh "bundle exec jekyll build -d _site/stabilizer" +end From f67a56c2cd72dd96cacc82023be0c759d758d4a1 Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 14:24:00 +0200 Subject: [PATCH 11/26] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Robert Jördens --- docs/index.md | 14 ++++++++------ docs/pages/getting-started.md | 21 +++++++-------------- dsp/src/iir.rs | 8 +------- src/configuration.rs | 2 +- 4 files changed, 17 insertions(+), 28 deletions(-) diff --git a/docs/index.md b/docs/index.md index 16e62b0..6aaa6ad 100644 --- a/docs/index.md +++ b/docs/index.md @@ -25,28 +25,30 @@ which allows for a wide variety of experimental uses, such as digital filter des implementation of digital lockin schemes. This documentation is intended to bring a user up to speed on using Stabilizer and the firmware -provided by Quartiq. +provided by QUARTIQ and contributors. ## Hardware The Stabilizer hardware is managed via a [separate repository](https://github.com/sinara-hw/Stabilizer). +Some information about the hardware is gathered in the [Stabilizer wiki](https://github.com/sinara-hw/Stabilizer/wiki). More detailed data, measurements, discussions, and tests have been posted in the [Stabilizer issue tracker](https://github.com/sinara-hw/Stabilizer/issues?q=is%3Aissue). [![Hardware](https://github.com/sinara-hw/Stabilizer/wiki/Stabilizer_v1.0_top_small.jpg)](https://github.com/sinara-hw/Stabilizer) +Stabilizer can be extended and coupled with a mezzanine board. One such mezzanine is the DDS upconversion/downconversion frontend Pounder. The Pounder hardware is managed via a [separate repository](https://github.com/sinara-hw/Pounder), again with [wiki](https://github.com/sinara-hw/Pounder/wiki) and [issue tracker](https://github.com/sinara-hw/Pounder/issues?q=is%3Aissue). ## Applications This firmware offers a library of hardware and software functionality targeting the use of the Stabilizer hardware in various digital signal processing applications commonly occurring in Quantum Technology. -It provides abstractions over the fast analog inputs and outputs, time stamping, Pounder DDS interfaces and a collection of tailored and optimized digital signal processing algorithms (IIR, FIR, Lockin, PLL, reciprocal PLL, Unwrapper, Lowpass, Cosine-Sine, Atan2). +It provides abstractions over the fast analog inputs and outputs, time stamping, Pounder DDS interfaces and a collection of tailored and optimized digital signal processing algorithms (IIR, FIR, Lockin, PLL, reciprocal PLL, Unwrapper, Lowpass, Cosine-Sine, Atan2) in the [DSP crate]({{site.baseurl}}/firmware/dsp/index.html). An application, which is the compiled firmware running on the device, can compose and configure these hardware and software components to implement different use cases. Several applications are provided by default. The following documentation links contain the application-specific settings and telemetry information. -| Application | Documentation | Application Description | -| :---: | :--: | :---- | -| `dual-iir` | [Link]({{site.baseurl}}/firmware/dual_iir/index.html) | Two channel biquad IIR filter -| `lockin` | [Link]({{site.baseurl}}/firmware/lockin/index.html) | Lockin amplifier support various various reference sources | +| Application | Description | +| :---: | :---- | +| [`dual-iir`]({{site.baseurl}}/firmware/dual_iir/index.html) | Two channel biquad IIR filter | +| [`lockin`]({{site.baseurl}}/firmware/lockin/index.html) | Lockin amplifier support various various reference sources | ### Library Documentation The Stabilizer library docs contain documentation for common components used in all Stabilizer diff --git a/docs/pages/getting-started.md b/docs/pages/getting-started.md index 5c7a85c..bceb63a 100644 --- a/docs/pages/getting-started.md +++ b/docs/pages/getting-started.md @@ -14,18 +14,11 @@ nav_order: 2 # Getting Started -Getting started requires a few steps: There are a number of steps that must be completed when first getting started with Stabilizer. -1. Configure the firmware - * This requires updating any parameters, such as static IP addresses and - sampling rate. -1. Build the application - * This requires compiling the code after configuration parameters have been - updated. -1. Upload the application - * Once fimrware has been built, it needs to be programmed onto the device. -1. Set up MQTT - * Stabilizer utilizes MQTT for telemetry and configuration. +1. Set parameters in the firmware source code, such as IP addresses and sampling rate. +1. Build the application by compiling the source code. +1. Upload the application and programming it onto the device. +1. Set up MQTT for telemetry and configuration. The following sections will walk you through completing each of these steps. @@ -40,11 +33,11 @@ desired application. Stabilizer firmware contains compile-time parameters that may need to be changed based on application requirements. Some examples of parameters that may require configuraton: -* Sample frequency -* Sample batch size +* Sampling interval. +* Batch size. * MQTT Broker IP address -Parameters are configured by editing `src/configuration.rs`. +Parameters are configured by editing the file `src/configuration.rs`. Refer to the [documentation]({{site.baseurl}}/firmware/stabilizer/configuration/index.html) for more information on parameters. diff --git a/dsp/src/iir.rs b/dsp/src/iir.rs index de5bb68..c53af74 100644 --- a/dsp/src/iir.rs +++ b/dsp/src/iir.rs @@ -42,7 +42,7 @@ pub type Vec5 = [f32; 5]; /// /// # Miniconf /// -/// `{"y_offset": y0, "y_min": ym, "y_max": yM, "ba": [b0, b1, b2, -a1, -a2]}` +/// `{"y_offset": y_offset, "y_min": y_min, "y_max": y_max, "ba": [b0, b1, b2, a1, a2]}` /// /// * `y0` is the output offset code /// * `ym` is the lower saturation limit @@ -52,12 +52,6 @@ pub type Vec5 = [f32; 5]; /// new output is computed as `y0 = a1*y1 + a2*y2 + b0*x0 + b1*x1 + b2*x2`. /// The IIR coefficients can be mapped to other transfer function /// representations, for example as described in -/// -/// -/// ## Notes -/// The units of the IIR utilize 16-bit signed integers for full-scale. saturation and offset -/// parameter are given in this scale, where full-scale represents an output amplitude of 10.24 -/// V. #[derive(Copy, Clone, Debug, Default, Deserialize, MiniconfAtomic)] pub struct IIR { pub ba: Vec5, diff --git a/src/configuration.rs b/src/configuration.rs index 8b43eea..5047e85 100644 --- a/src/configuration.rs +++ b/src/configuration.rs @@ -11,7 +11,7 @@ pub const MQTT_BROKER: [u8; 4] = [10, 34, 16, 10]; /// /// # Units /// The units of this parameter are specified as a logarithmic number of ticks of the internal -/// timer, which runs at 100MHz. +/// timer, which runs at 100 MHz. /// /// ## Example /// With a value of 7, this corresponds to 2^7 = 128 ticks. Each tick of the 100MHz timer requires From 661c3746af89056264b179c863308717af69a0ad Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 14:25:37 +0200 Subject: [PATCH 12/26] Updating docs on telemetry --- README.md | 14 ++++++-------- docs/README.md | 4 ++-- src/net/telemetry.rs | 6 +++--- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index ba1759d..75249db 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,13 @@ # Stabilizer Firmware -## Hardware - -[![Hardware](https://github.com/sinara-hw/Stabilizer/wiki/Stabilizer_v1.0_top_small.jpg)](https://github.com/sinara-hw/Stabilizer) - ## Applications -This firmware offers a library of hardware and software functionality targeting the use of the Stabilizer hardware in various digital signal processing applications commonly occurring in Quantum Technology. -It provides abstractions over the fast analog inputs and outputs, time stamping, Pounder DDS interfaces and a collection of tailored and optimized digital signal processing algorithms (IIR, FIR, Lockin, PLL, reciprocal PLL, Unwrapper, Lowpass, Cosine-Sine, Atan2). -An application can compose and configure these hardware and software components to implement different use cases. +Check out the [Documentation](https://quartiq.de/stabilizer) for more information on usage, +configuration, and development. -Check out the [Documentation](https://quartiq.de/stabilizer) for more information on usage. +## Hardware +[![Stabilizer](https://github.com/sinara-hw/Stabilizer/wiki/Stabilizer_v1.0_top_small.jpg)](https://github.com/sinara-hw/Stabilizer) + +[![Pounder](https://user-images.githubusercontent.com/1338946/125936814-3664aa2d-a530-4c85-9393-999a7173424e.png)](https://github.com/sinara-hw/Pounder/wiki) diff --git a/docs/README.md b/docs/README.md index f0df354..0d5ddec 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,10 +11,10 @@ To run locally: bundle install bundle exec jekyll serve ``` -1. Navigate to `localhost:4000` in a web browser +1. Navigate to `localhost:4000/stabilizer/` in a web browser Note: Some of the links in the docs rely on Cargo's documentation. To make all links work locally, run: ``` -cargo doc --bins +cargo doc --no-deps -p dsp -p miniconf -p stabilizer -p ad9959 cp -r target/thumbv7em-none-eabihf/doc docs/firmware ``` diff --git a/src/net/telemetry.rs b/src/net/telemetry.rs index 5ebfa3b..ffb0d58 100644 --- a/src/net/telemetry.rs +++ b/src/net/telemetry.rs @@ -49,13 +49,13 @@ pub struct TelemetryBuffer { #[derive(Serialize)] pub struct Telemetry { /// Most recent input voltage measurement. - adcs: [f32; 2], + pub adcs: [f32; 2], /// Most recent output voltage. - dacs: [f32; 2], + pub dacs: [f32; 2], /// Most recent digital input assertion state. - digital_inputs: [bool; 2], + pub digital_inputs: [bool; 2], } impl Default for TelemetryBuffer { From afb1c87b2ace491a4b2228aa1b9b01476682061d Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 14:29:51 +0200 Subject: [PATCH 13/26] Reorganizing getting-started --- docs/_config.yml | 4 ++-- docs/pages/getting-started.md | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index a7901db..0132d7c 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -3,8 +3,8 @@ title: Stabilizer description: "User Manual" logo: "/assets/stabilizer-logo.png" -url: "https://quartiq.de" -baseurl: "/stabilizer" +#url: "https://quartiq.de" +#baseurl: "/stabilizer" exclude: ['README.md'] diff --git a/docs/pages/getting-started.md b/docs/pages/getting-started.md index bceb63a..3fefa77 100644 --- a/docs/pages/getting-started.md +++ b/docs/pages/getting-started.md @@ -13,16 +13,18 @@ nav_order: 2 --- # Getting Started +{: .no_toc } There are a number of steps that must be completed when first getting started with Stabilizer. -1. Set parameters in the firmware source code, such as IP addresses and sampling rate. -1. Build the application by compiling the source code. -1. Upload the application and programming it onto the device. +1. Update the Stabilizer Application + 1. Set parameters in the firmware source code, such as IP addresses and sampling rate. + 1. Build the application by compiling the source code. + 1. Upload the application and programming it onto the device. 1. Set up MQTT for telemetry and configuration. The following sections will walk you through completing each of these steps. -# Program Stabilizer +# Update Stabilizer Firmware is compiled and loaded onto Stabilizer to program a specific application. From d8579a5b3e9ece217af78dd0373405208838f356 Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 14:34:49 +0200 Subject: [PATCH 14/26] Reorganizing to usage --- docs/pages/networking/run-time-settings.md | 48 ---------------------- docs/pages/{networking.md => usage.md} | 46 +++++++++++++++++---- 2 files changed, 39 insertions(+), 55 deletions(-) delete mode 100644 docs/pages/networking/run-time-settings.md rename docs/pages/{networking.md => usage.md} (61%) diff --git a/docs/pages/networking/run-time-settings.md b/docs/pages/networking/run-time-settings.md deleted file mode 100644 index c2c169c..0000000 --- a/docs/pages/networking/run-time-settings.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Run-Time Settings -layout: default -permalink: /networking/run-time-settings -parent: Networking ---- - -# Settings Configuration - -Stabilizer allows for run-time settings configurations using the `miniconf.py` utility script. This -script is in the root of the Stabilizer github repository. - -## Setup - -In order to use `miniconf.py`, run the following command: -``` -python -m pip install gmqtt -``` - -## Usage -The `miniconf.py` script utilizes a unique "device prefix". The device prefix is always of the -form `dt/sinara//`, where `` is the name of the application and -`` is the MAC address of the device, formatted with delimiting dashes. - -Settings have a `path` and a `value` being configured. The `value` parameter is JSON-encoded data -and the `path` value is a path-like string. - -As an example, for configuring `dual-iir`'s `stream_target`, the following information would be -used: -* `path` = `stream_target` -* `value` = `{"ip": [192, 168, 0, 1], "port": 4000}` - -``` -python miniconf.py --broker localhost dt/sinara/dual-iir/00-11-22-33-44-55 stream_target='{"ip": [192, 168, 0, 1], "port": 4000}' -``` - -The prefix can be found for a specific device by looking at the topic on which telemetry that is -being published. - -Refer to the [application documentation]({{site.baseurl}}/#applications) for the exact settings and values exposed -for each application. - -The rules for constructing `path` values are documented in [`miniconf`'s -documentation](https://github.com/quartiq/miniconf#settings-paths) - -Refer to the documentation for [Miniconf]({{site.baseurl}}/firmware/miniconf/enum.Error.html) for a -description of the possible error codes that `miniconf.py` may return if the settings update was -unsuccessful. diff --git a/docs/pages/networking.md b/docs/pages/usage.md similarity index 61% rename from docs/pages/networking.md rename to docs/pages/usage.md index fc6e2b3..aaeed11 100644 --- a/docs/pages/networking.md +++ b/docs/pages/usage.md @@ -1,10 +1,8 @@ --- -title: Networking +title: Usage layout: default nav_order: 4 -permalink: /networking/ -has_children: true -has_toc: false +permalink: /usage/ --- ## Table of Contents @@ -13,7 +11,7 @@ has_toc: false 1. TOC {:toc} -## MiniConf Run-time Settings +## Miniconf Run-time Settings Stabilizer supports run-time settings configuration using MQTT. Settings can be stored in the MQTT broker so that they are automatically applied whenever @@ -27,8 +25,42 @@ to another. Disambiguation of devices is done by using Stabilizer's MAC address. Settings are specific to an application. If two identical settings exist for two different applications, each application maintains its own independent value. -Refer to the [documentation](run-time-settings) for information on how to configure run-time -settings. +### Setup + +In order to use `miniconf.py`, run the following command: +``` +python -m pip install gmqtt +``` + +### Usage +The `miniconf.py` script utilizes a unique "device prefix". The device prefix is always of the +form `dt/sinara//`, where `` is the name of the application and +`` is the MAC address of the device, formatted with delimiting dashes. + +Settings have a `path` and a `value` being configured. The `value` parameter is JSON-encoded data +and the `path` value is a path-like string. + +As an example, for configuring `dual-iir`'s `stream_target`, the following information would be +used: +* `path` = `stream_target` +* `value` = `{"ip": [192, 168, 0, 1], "port": 4000}` + +``` +python miniconf.py --broker localhost dt/sinara/dual-iir/00-11-22-33-44-55 stream_target='{"ip": [192, 168, 0, 1], "port": 4000}' +``` + +The prefix can be found for a specific device by looking at the topic on which telemetry that is +being published. + +Refer to the [application documentation]({{site.baseurl}}/#applications) for the exact settings and values exposed +for each application. + +The rules for constructing `path` values are documented in [`miniconf`'s +documentation](https://github.com/quartiq/miniconf#settings-paths) + +Refer to the documentation for [Miniconf]({{site.baseurl}}/firmware/miniconf/enum.Error.html) for a +description of the possible error codes that `miniconf.py` may return if the settings update was +unsuccessful. ## Telemetry From bd679a084f92bbf5f8966cbd79b7daa9f0adc2fa Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 14:36:46 +0200 Subject: [PATCH 15/26] Adding spaces to docs --- src/configuration.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/configuration.rs b/src/configuration.rs index 5047e85..01e410a 100644 --- a/src/configuration.rs +++ b/src/configuration.rs @@ -14,14 +14,14 @@ pub const MQTT_BROKER: [u8; 4] = [10, 34, 16, 10]; /// timer, which runs at 100 MHz. /// /// ## Example -/// With a value of 7, this corresponds to 2^7 = 128 ticks. Each tick of the 100MHz timer requires +/// With a value of 7, this corresponds to 2^7 = 128 ticks. Each tick of the 100 MHz timer requires /// 10ns. /// /// Sampling Period = 10ns * 128 = 1.28 us -/// Sampling Frequency = 781.25KHz +/// Sampling Frequency = 781.25 KHz /// /// Or more succinctly: -/// `F_s = 100MHz / (2 ^ ADC_SAMPLE_TICKS_LOG2)` +/// `F_s = 100 MHz / (2 ^ ADC_SAMPLE_TICKS_LOG2)` pub const ADC_SAMPLE_TICKS_LOG2: u8 = 7; /// Sample Batch Sizing From 414c803ecd58e90adda1abf70501686e259541fa Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 14:42:56 +0200 Subject: [PATCH 16/26] Update docs/pages/usage.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Robert Jördens --- docs/pages/usage.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/pages/usage.md b/docs/pages/usage.md index aaeed11..96d4d86 100644 --- a/docs/pages/usage.md +++ b/docs/pages/usage.md @@ -46,7 +46,9 @@ used: * `value` = `{"ip": [192, 168, 0, 1], "port": 4000}` ``` -python miniconf.py --broker localhost dt/sinara/dual-iir/00-11-22-33-44-55 stream_target='{"ip": [192, 168, 0, 1], "port": 4000}' +python miniconf.py --broker 10.34.16.10 dt/sinara/dual-iir/00-11-22-33-44-55 stream_target='{"ip": [10, 34, 16, 123], "port": 4000}' + +Where `10.34.16.10` is the MQTT broker address that matches the one configured in the source code and `10.34.16.123` and `4000` are the desire stream target IP and port. ``` The prefix can be found for a specific device by looking at the topic on which telemetry that is From 8b38f42856f07621873a7c4892717d6de749fa6b Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 15:00:40 +0200 Subject: [PATCH 17/26] Fixing path --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index badc4c0..c0794c7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -134,6 +134,6 @@ jobs: working-directory: docs run: | rake build - mv target/thumbv7em-none-eabihf/doc docs/_site/stabilizer/firmware + mv ../target/thumbv7em-none-eabihf/doc _site/stabilizer/firmware rake test From f80ad2de1225f9e2be16f95bcb0cdaf9e33c2763 Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 15:15:01 +0200 Subject: [PATCH 18/26] Fixing permalink --- docs/pages/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/usage.md b/docs/pages/usage.md index 96d4d86..3e1807d 100644 --- a/docs/pages/usage.md +++ b/docs/pages/usage.md @@ -2,7 +2,7 @@ title: Usage layout: default nav_order: 4 -permalink: /usage/ +permalink: /usage --- ## Table of Contents From 5d0fd18a53e444b6ec4b3217b88315a6115b479f Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 15:15:42 +0200 Subject: [PATCH 19/26] Reverting unintended config change --- docs/_config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index 0132d7c..a7901db 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -3,8 +3,8 @@ title: Stabilizer description: "User Manual" logo: "/assets/stabilizer-logo.png" -#url: "https://quartiq.de" -#baseurl: "/stabilizer" +url: "https://quartiq.de" +baseurl: "/stabilizer" exclude: ['README.md'] From ba5101ff1dffabb5590c98441048689e5441e75b Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Fri, 16 Jul 2021 15:31:24 +0200 Subject: [PATCH 20/26] Ignoring quartiq URLs not existing --- docs/Rakefile | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Rakefile b/docs/Rakefile index 57ecf11..dc5ab2f 100644 --- a/docs/Rakefile +++ b/docs/Rakefile @@ -11,6 +11,7 @@ def run_htmlproofer() assume_extension: true, file_ignore: [ /stabilizer\/firmware\/.*/ ], + url_ignore: [ /quartiq.de\/stabilizer/ ], # The options for the curl library that's used. :typhoeus => { From baa20acef8f2a28aada037f23c167322d25a3c0c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jul 2021 13:51:13 +0000 Subject: [PATCH 21/26] build(deps): bump cortex-m from 0.7.2 to 0.7.3 Bumps [cortex-m](https://github.com/rust-embedded/cortex-m) from 0.7.2 to 0.7.3. - [Release notes](https://github.com/rust-embedded/cortex-m/releases) - [Changelog](https://github.com/rust-embedded/cortex-m/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-embedded/cortex-m/compare/v0.7.2...v0.7.3) --- updated-dependencies: - dependency-name: cortex-m dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 03273f0..80fe198 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,7 +38,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9a69a963b70ddacfcd382524f72a4576f359af9334b3bf48a79566590bb8bfa" dependencies = [ "bitrate", - "cortex-m 0.7.2", + "cortex-m 0.6.7", "embedded-hal", ] @@ -48,7 +48,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30302dda7a66f8c55932ebf208f7def840743ff64d495e9ceffcd97c18f11d39" dependencies = [ - "cortex-m 0.7.2", + "cortex-m 0.7.3", ] [[package]] @@ -126,15 +126,15 @@ dependencies = [ "aligned", "bare-metal 0.2.5", "bitfield", - "cortex-m 0.7.2", + "cortex-m 0.7.3", "volatile-register", ] [[package]] name = "cortex-m" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643a210c1bdc23d0db511e2a576082f4ff4dcae9d0c37f50b431b8f8439d6d6b" +checksum = "2ac919ef424449ec8c08d515590ce15d9262c0ca5f0da5b0c901e971a3b783b3" dependencies = [ "bare-metal 0.2.5", "bitfield", @@ -645,7 +645,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "065d6058bb1204f51a562a67209e1817cf714759d5cf845aa45c75fa7b0b9d9b" dependencies = [ - "cortex-m 0.7.2", + "cortex-m 0.7.3", "ufmt-write", ] @@ -774,7 +774,7 @@ version = "0.5.0" dependencies = [ "ad9959", "asm-delay", - "cortex-m 0.7.2", + "cortex-m 0.7.3", "cortex-m-rt", "cortex-m-rtic", "dsp", @@ -810,7 +810,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b672c837e0ee8158ecc7fce0f9a948dd0693a9c588338e728d14b73307a0b7d" dependencies = [ "bare-metal 0.2.5", - "cortex-m 0.7.2", + "cortex-m 0.6.7", "cortex-m-rt", "vcell", ] @@ -822,7 +822,7 @@ source = "git+https://github.com/quartiq/stm32h7xx-hal.git?rev=33aa67d#33aa67d74 dependencies = [ "bare-metal 1.0.0", "cast", - "cortex-m 0.7.2", + "cortex-m 0.7.3", "cortex-m-rt", "embedded-dma", "embedded-hal", From 42d4cb6a868233f5178e7a841d04123e992f601f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jul 2021 13:51:16 +0000 Subject: [PATCH 22/26] build(deps): bump num_enum from 0.5.1 to 0.5.2 Bumps [num_enum](https://github.com/illicitonion/num_enum) from 0.5.1 to 0.5.2. - [Release notes](https://github.com/illicitonion/num_enum/releases) - [Commits](https://github.com/illicitonion/num_enum/compare/0.5.1...0.5.2) --- updated-dependencies: - dependency-name: num_enum dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 03273f0..c857bec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -509,9 +509,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b45a5c2ac4dd696ed30fa6b94b057ad909c7b7fc2e0d0808192bced894066" +checksum = "e5adf0198d427ee515335639f275e806ca01acf9f07d7cf14bb36a10532a6169" dependencies = [ "derivative", "num_enum_derive", @@ -519,9 +519,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c0fd9eba1d5db0994a239e09c1be402d35622277e35468ba891aa5e3188ce7e" +checksum = "b1def5a3f69d4707d8a040b12785b98029a39e8c610ae685c7f6265669767482" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 93abac7..7a4ab00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,7 +39,7 @@ cortex-m-rtic = "0.5.6" embedded-hal = "0.2.5" nb = "1.0.0" asm-delay = "0.9.0" -num_enum = { version = "0.5.1", default-features = false } +num_enum = { version = "0.5.2", default-features = false } paste = "1" dsp = { path = "dsp" } ad9959 = { path = "ad9959" } From 2a41740493d52ec8b489cc5fb1372fe1bcde6a46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jul 2021 13:51:31 +0000 Subject: [PATCH 23/26] build(deps): bump cortex-m-rtic from 0.5.6 to 0.5.7 Bumps [cortex-m-rtic](https://github.com/rtic-rs/cortex-m-rtic) from 0.5.6 to 0.5.7. - [Release notes](https://github.com/rtic-rs/cortex-m-rtic/releases) - [Changelog](https://github.com/rtic-rs/cortex-m-rtic/blob/v0.5.7/CHANGELOG.md) - [Commits](https://github.com/rtic-rs/cortex-m-rtic/compare/v0.5.6...v0.5.7) --- updated-dependencies: - dependency-name: cortex-m-rtic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 03273f0..19497e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -162,9 +162,9 @@ dependencies = [ [[package]] name = "cortex-m-rtic" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa43f63284b363ac64f9ce5221a0f593b54f73258aba8e1a88c1feed8efdb664" +checksum = "9845c4c7f7af19e216a2d00345f7f1507b8907b85cd551e403d68baeec342bb3" dependencies = [ "cortex-m 0.6.7", "cortex-m-rt", @@ -176,9 +176,9 @@ dependencies = [ [[package]] name = "cortex-m-rtic-macros" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1a6a4c9550373038c0e21a78d44d529bd697c25bbf6b8004bddc6e63b119c7" +checksum = "cc874eda99515b15e67f03562726a530388f454431096d30131051b52b840559" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 93abac7..0b09af3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ log = { version = "0.4", features = ["max_level_trace", "release_max_level_info" rtt-target = { version = "0.3", features = ["cortex-m"] } serde = { version = "1.0", features = ["derive"], default-features = false } heapless = { version = "0.7", features = ["serde"] } -cortex-m-rtic = "0.5.6" +cortex-m-rtic = "0.5.7" embedded-hal = "0.2.5" nb = "1.0.0" asm-delay = "0.9.0" From 80b223925581d46b40b931f8bff36a99d16fc561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20J=C3=B6rdens?= Date: Fri, 16 Jul 2021 16:07:28 +0200 Subject: [PATCH 24/26] make bors wait for doc CI --- .github/bors.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/bors.toml b/.github/bors.toml index 1733a86..4ba0fd5 100644 --- a/.github/bors.toml +++ b/.github/bors.toml @@ -5,5 +5,6 @@ status = [ "style", "test (stable)", "compile (stable)", + "doc", "HITL Run Status" ] From 5a17b4b320d9281ca6a9d1a19f48c5a8e85cbd29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20J=C3=B6rdens?= Date: Fri, 16 Jul 2021 16:07:59 +0200 Subject: [PATCH 25/26] deadlinks: also check http --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0794c7..7f00033 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -124,7 +124,7 @@ jobs: command: deadlinks # We intentionally ignore fragments, as RTIC may generate fragments for various # auto-generated code. - args: --dir target/thumbv7em-none-eabihf/doc --ignore-fragments + args: --dir target/thumbv7em-none-eabihf/doc --ignore-fragments --check-http --check-intra-doc-links - name: Move firmware documents run: | From bac1607d1790bac1ebddb606e764bdfe27cc9b41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jul 2021 14:54:23 +0000 Subject: [PATCH 26/26] build(deps): bump heapless from 0.7.2 to 0.7.3 Bumps [heapless](https://github.com/japaric/heapless) from 0.7.2 to 0.7.3. - [Release notes](https://github.com/japaric/heapless/releases) - [Changelog](https://github.com/japaric/heapless/blob/master/CHANGELOG.md) - [Commits](https://github.com/japaric/heapless/compare/v0.7.2...v0.7.3) --- updated-dependencies: - dependency-name: heapless dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7093adc..7a8d540 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,7 +38,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9a69a963b70ddacfcd382524f72a4576f359af9334b3bf48a79566590bb8bfa" dependencies = [ "bitrate", - "cortex-m 0.6.7", + "cortex-m 0.7.3", "embedded-hal", ] @@ -250,7 +250,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db9efecb57ab54fa918730f2874d7d37647169c50fa1357fecb81abee840b113" dependencies = [ - "heapless 0.7.2", + "heapless 0.7.3", "nb 1.0.0", "no-std-net", ] @@ -352,9 +352,9 @@ dependencies = [ [[package]] name = "heapless" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e44a9fba8877c568fc30457f5639d0aa7f57e494e4cdbc464150740a66c6613a" +checksum = "34e26526e7168021f34243a3c8faac4dc4f938cde75a0f9b8e373cca5eb4e7ce" dependencies = [ "atomic-polyfill", "hash32 0.2.1", @@ -429,7 +429,7 @@ dependencies = [ "bit_field", "embedded-nal", "enum-iterator", - "heapless 0.7.2", + "heapless 0.7.3", ] [[package]] @@ -721,7 +721,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8014aeea272bca0f0779778d43253f2f3375b414185b30e6ecc4d3e4a9994781" dependencies = [ - "heapless 0.7.2", + "heapless 0.7.3", "ryu", "serde", ] @@ -763,7 +763,7 @@ version = "0.1.0" source = "git+https://github.com/quartiq/smoltcp-nal.git?rev=5baf55f#5baf55fafbfe2c08d9fe56c836171e9d2fb468e8" dependencies = [ "embedded-nal", - "heapless 0.7.2", + "heapless 0.7.3", "nanorand", "smoltcp", ] @@ -779,7 +779,7 @@ dependencies = [ "cortex-m-rtic", "dsp", "embedded-hal", - "heapless 0.7.2", + "heapless 0.7.3", "log", "mcp23017", "miniconf", @@ -810,7 +810,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b672c837e0ee8158ecc7fce0f9a948dd0693a9c588338e728d14b73307a0b7d" dependencies = [ "bare-metal 0.2.5", - "cortex-m 0.6.7", + "cortex-m 0.7.3", "cortex-m-rt", "vcell", ]

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 u@9EdN*lArSx7D=v?%4c`7?GS9�_krO|8cKKXX;;Ym4zBOo80fB)GWCcJ(C literal 0 HcmV?d00001 diff --git a/docs/assets/stabilizer-logo.png b/docs/assets/stabilizer-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a5cfb76d70aa51539d9c17c44d013564b61d7315 GIT binary patch literal 22532 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 Z9SG1~OBJ-)BY0n4d8VeNTJ+c|^gl#rPF?^2 literal 0 HcmV?d00001 diff --git a/stabilizer_pid.svg b/docs/assets/stabilizer_pid.svg similarity index 100% rename from stabilizer_pid.svg rename to docs/assets/stabilizer_pid.svg diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a6cbb9e75c3edc9c71cb69eac9c7b32874c82676 GIT binary patch literal 1150 zcmbu8%WD%+6o*ektqY4yt#?X`3s<$oMFnvsN)i#ZAZU|J5-Dnhq_OBCsl{O0=AB8V zNrZ}u3xzJKt`z?Pw}MMST=*}D&y^t5?t& z1GHb^2l{vT-N3H^4z!80h;0(^v*99*WRJU*|eUA_HxlUZ|Jx{zWJ|*Vm{QepLn#DbJ>-S?9dQ9Wzg&`P( zc{EE<K-^}bgw~PMtenZdzr)P!s*fLePMkS~T15l3INab9{3r=;JUkF0iKW _Note_: Mosquitto version 1 only supports MQTTv3.1. If using Mosquitto, ensure version 2.0.0 or +> later is used. + +Stabilizer utilizes a static IP address for broker configuration. Ensure the IP address was +[configured](#configuring-firmware) properly to point to your broker before continuing. + +## Test the Connection +Once your broker is running, test that Stabilizer is properly connected to it. + +To do this, we will check that Stabilizer is reporting telemetry on the following topic: +``` +dt/sinara/dual-iir/00-11-22-33-44-55/telemetry +``` +> **Note**: The telemetry topic will be different based on the programmed application and the MAC address + of the device. + +Download [MQTT-Explorer](http://mqtt-explorer.com/) to observe which topics have been posted to the +Broker. + +![MQTT Explorer Configuration]({{site.baseurl}}/assets/mqtt-explorer.png) + +> **Note**: Use the same broker address that you defined in the firmware for MQTT explorer. + +Telemetry messages should come in approximately every 10 seconds when Stabilizer has connected to +the broker. Once you observe incoming telemetry, Stabilizer has been properly configured and is +operational. diff --git a/docs/pages/networking.md b/docs/pages/networking.md new file mode 100644 index 0000000..226bc32 --- /dev/null +++ b/docs/pages/networking.md @@ -0,0 +1,63 @@ +--- +title: Networking +layout: default +nav_order: 4 +permalink: /networking/ +has_children: true +has_toc: false +--- + +## Table of Contents +{: .no_toc .text-delta } + +1. TOC +{:toc} + +## MiniConf Run-time Settings +Stabilizer supports run-time settings configuration using MQTT. + +Settings can be stored in the MQTT broker so that they are automatically applied whenever +Stabilizer reboots and connects. This is referred to as "retained" settings. Broker implementations +may optionally store these retained settings as well such that they will be reapplied between +restarts of the MQTT broker. + +Settings are specific to a device. Any settings configured for one Stabilizer will not be applied +to another. Disambiguation of devices is done by using Stabilizer's MAC address. + +Settings are specific to an application. If two identical settings exist for two different +applications, each application maintains its own independent value. + +Refer to the [documentation](run-time-settings) for information on how to configure run-time +settings. + +## Telemetry + +Stabilizer applications publish telemetry utilizes MQTT for managing run-time settings configurations as well as live telemetry +reporting. + +Telemetry is defined as low rate, general health information. It is not intended for high throughput +or efficiency. Telemetry is generally used to determine that the device is functioning nominally. + +Stabilizer applications publish telemetry over MQTT at a set rate. Telemetry data units are defined +by the application. All telemetry is reported using standard JSON format. + +Telemetry is intended for low-bandwidth monitoring. It is not intended to transfer large amounts of +data and uses a minimal amount of bandwidth. Telemetry is published using "best effort" semantics - +individual messages may be dropped or Stabilizer may fail to publish telemetry due to internal +buffering requirements. + +In its most basic form, telemetry publishes the latest ADC input voltages, DAC output voltages, and +digital input states. + +Refer to the respective [application documentation](/#applications) for more information on telemetry. + +## Livestream + +Stabilizer supports livestream capabilities for streaming real-time data over UDP. The livestream is +intended to be a high-bandwidth mechanism to transfer large amounts of data from Stabilizer to a +host computer for further analysis. + +Livestreamed data is sent with "best effort" - it's possible that data may be lost either due to +network congestion or by Stabilizer. + +Refer to the the respective [application documentation](/#applications) for more information. diff --git a/docs/pages/networking/run-time-settings.md b/docs/pages/networking/run-time-settings.md new file mode 100644 index 0000000..c96c3c3 --- /dev/null +++ b/docs/pages/networking/run-time-settings.md @@ -0,0 +1,48 @@ +--- +title: Run-Time Settings +layout: default +permalink: /networking/run-time-settings +parent: Networking +--- + +# Settings Configuration + +Stabilizer allows for run-time settings configurations using the `miniconf.py` utility script. This +script is in the root of the Stabilizer github repository. + +## Setup + +In order to use `miniconf.py`, run the following command: +``` +python -m pip install gmqtt +``` + +## Usage +The `miniconf.py` script utilizes a unique "device prefix". The device prefix is always of the +form `dt/sinara//`, where `` is the name of the application and +`` is the MAC address of the device, formatted with delimiting dashes. + +Settings have a `path` and a `value` being configured. The `value` parameter is JSON-encoded data +and the `path` value is a path-like string. + +As an example, for configuring `dual-iir`'s `stream_target`, the following information would be +used: +* `path` = `stream_target` +* `value` = `{"ip": [192, 168, 0, 1], "port": 4000}` + +``` +python miniconf.py --broker localhost dt/sinara/dual-iir/00-11-22-33-44-55 stream_target='{"ip": [192, 168, 0, 1], "port": 4000}' +``` + +The prefix can be found for a specific device by looking at the topic on which telemetry that is +being published. + +Refer to the [application documentation](/#applications) for the exact settings and values exposed +for each application. + +The rules for constructing `path` values are documented in [`miniconf`'s +documentation](https://github.com/quartiq/miniconf#settings-paths) + +Refer to the documentation for [Miniconf]({{site.baseurl}}/firmware/miniconf/enum.Error.html) for a +description of the possible error codes that `miniconf.py` may return if the settings update was +unsuccessful. diff --git a/dsp/Cargo.toml b/dsp/Cargo.toml index e3be45b..82e4a84 100644 --- a/dsp/Cargo.toml +++ b/dsp/Cargo.toml @@ -12,7 +12,7 @@ miniconf = "0.1" [dev-dependencies] easybench = "1.0" rand = "0.8" -ndarray = "0.15" +ndarray = { default-features = false, version = "0.15" } [[bench]] name = "micro" diff --git a/dsp/src/cossin.rs b/dsp/src/cossin.rs index 5dae7c3..abca821 100644 --- a/dsp/src/cossin.rs +++ b/dsp/src/cossin.rs @@ -4,7 +4,7 @@ include!(concat!(env!("OUT_DIR"), "/cossin_table.rs")); /// Compute the cosine and sine of an angle. /// This is ported from the MiSoC cossin core. -/// (https://github.com/m-labs/misoc/blob/master/misoc/cores/cossin.py) +/// /// /// # Arguments /// * `phase` - 32-bit phase. diff --git a/dsp/src/iir.rs b/dsp/src/iir.rs index a6af191..de5bb68 100644 --- a/dsp/src/iir.rs +++ b/dsp/src/iir.rs @@ -39,6 +39,25 @@ pub type Vec5 = [f32; 5]; /// Therefore it can trivially implement bump-less transfer. /// * Cascading multiple IIR filters allows stable and robust /// implementation of transfer functions beyond bequadratic terms. +/// +/// # Miniconf +/// +/// `{"y_offset": y0, "y_min": ym, "y_max": yM, "ba": [b0, b1, b2, -a1, -a2]}` +/// +/// * `y0` is the output offset code +/// * `ym` is the lower saturation limit +/// * `yM` is the upper saturation limit +/// +/// IIR filter tap gains (`ba`) are an array `[b0, b1, b2, a1, a2]` such that the +/// new output is computed as `y0 = a1*y1 + a2*y2 + b0*x0 + b1*x1 + b2*x2`. +/// The IIR coefficients can be mapped to other transfer function +/// representations, for example as described in +/// +/// +/// ## Notes +/// The units of the IIR utilize 16-bit signed integers for full-scale. saturation and offset +/// parameter are given in this scale, where full-scale represents an output amplitude of 10.24 +/// V. #[derive(Copy, Clone, Debug, Default, Deserialize, MiniconfAtomic)] pub struct IIR { pub ba: Vec5, diff --git a/src/bin/dual-iir.rs b/src/bin/dual-iir.rs index bad6f97..d0aca33 100644 --- a/src/bin/dual-iir.rs +++ b/src/bin/dual-iir.rs @@ -1,3 +1,30 @@ +//! # Dual IIR +//! +//! The Dual IIR application exposes two configurable channels. Stabilizer samples input at a fixed +//! rate, digitally filters the data, and then generates filtered output signals on the respective +//! channel outputs. +//! +//! ## Features +//! * Two indpenendent channels +//! * up to 800 kHz rate, timed sampling +//! * Run-time filter configuration +//! * Input/Output data streaming +//! * Down to 2 µs latency +//! * f32 IIR math +//! * Generic biquad (second order) IIR filter +//! * Anti-windup +//! * Derivative kick avoidance +//! +//! ## Settings +//! Refer to the [Settings] structure for documentation of run-time configurable settings for this +//! application. +//! +//! ## Telemetry +//! Refer to [Telemetry] for information about telemetry reported by this application. +//! +//! ## Livestreaming +//! This application streams raw ADC and DAC data over UDP. Refer to +//! [stabilizer::net::data_stream](../stabilizer/net/data_stream/index.html) for more information. #![deny(warnings)] #![no_std] #![no_main] @@ -34,11 +61,63 @@ const IIR_CASCADE_LENGTH: usize = 1; #[derive(Clone, Copy, Debug, Deserialize, Miniconf)] pub struct Settings { + /// Configure the Analog Front End (AFE) gain. + /// + /// # Path + /// `afe/` + /// + /// * specifies which channel to configure. := [0, 1] + /// + /// # Value + /// Any of the variants of [Gain] enclosed in double quotes. afe: [Gain; 2], + + /// Configure the IIR filter parameters. + /// + /// # Path + /// `iir_ch//` + /// + /// * specifies which channel to configure. := [0, 1] + /// * specifies which cascade to configure. := [0, 1], depending on [IIR_CASCADE_LENGTH] + /// + /// # Value + /// See [iir::IIR#miniconf] iir_ch: [[iir::IIR; IIR_CASCADE_LENGTH]; 2], + + /// Specified true if DI1 should be used as a "hold" input. + /// + /// # Path + /// `allow_hold` + /// + /// # Value + /// "true" or "false" allow_hold: bool, + + /// Specified true if "hold" should be forced regardless of DI1 state and hold allowance. + /// + /// # Path + /// `force_hold` + /// + /// # Value + /// "true" or "false" force_hold: bool, + + /// Specifies the telemetry output period in seconds. + /// + /// # Path + /// `telemetry_period` + /// + /// # Value + /// Any non-zero value less than 65536. telemetry_period: u16, + + /// Specifies the target for data livestreaming. + /// + /// # Path + /// `stream_target` + /// + /// # Value + /// See [StreamTarget#miniconf] stream_target: StreamTarget, } diff --git a/src/bin/lockin.rs b/src/bin/lockin.rs index 4175771..33332d4 100644 --- a/src/bin/lockin.rs +++ b/src/bin/lockin.rs @@ -1,3 +1,29 @@ +//! # Lockin +//! +//! THe `lockin` application implements a lock-in amplifier using either an external or internally +//! generated +//! +//! ## Features +//! * Up to 800 kHz sampling +//! * Up to 400 kHz modulation frequency +//! * Supports internal and external reference sources: +//! 1. Internal: Generate reference internally and output on one of the channel outputs +//! 2. External: Reciprocal PLL, reference input applied to DI0. +//! * Adjustable PLL and locking time constants +//! * Adjustable phase offset and harmonic index +//! * Run-time configurable output modes (in-phase, quadrature, magnitude, log2 power, phase, frequency) +//! * Input/output data streamng via UDP +//! +//! ## Settings +//! Refer to the [Settings] structure for documentation of run-time configurable settings for this +//! application. +//! +//! ## Telemetry +//! Refer to [Telemetry] for information about telemetry reported by this application. +//! +//! ## Livestreaming +//! This application streams raw ADC and DAC data over UDP. Refer to +//! [stabilizer::net::data_stream](../stabilizer/net/data_stream/index.html) for more information. #![deny(warnings)] #![no_std] #![no_main] @@ -8,6 +34,7 @@ use mutex_trait::prelude::*; use dsp::{Accu, Complex, ComplexExt, Lockin, RPLL}; use stabilizer::{ + configuration, hardware::{ self, adc::{Adc0Input, Adc1Input, AdcCode}, @@ -38,35 +65,118 @@ const DAC_SEQUENCE: [i16; design_parameters::SAMPLE_BUFFER_SIZE] = #[derive(Copy, Clone, Debug, Deserialize, Miniconf)] enum Conf { + /// Output the lockin magnitude. Magnitude, + /// Output the phase of the lockin Phase, + /// Output the lockin reference frequency as a sinusoid ReferenceFrequency, + /// Output the logarithmic power of the lockin LogPower, + /// Output the in-phase component of the lockin signal. InPhase, + /// Output the quadrature component of the lockin signal. Quadrature, + /// Output the lockin internal modulation frequency as a sinusoid Modulation, } #[derive(Copy, Clone, Debug, Miniconf, Deserialize, PartialEq)] enum LockinMode { + /// Utilize an internally generated reference for demodulation Internal, + /// Utilize an external modulation signal supplied to DI0 External, } #[derive(Copy, Clone, Debug, Deserialize, Miniconf)] pub struct Settings { + /// Configure the Analog Front End (AFE) gain. + /// + /// # Path + /// `afe/` + /// + /// * specifies which channel to configure. := [0, 1] + /// + /// # Value + /// Any of the variants of [Gain] enclosed in double quotes. afe: [Gain; 2], + + /// Specifies the operational mode of the lockin. + /// + /// # Path + /// `lockin_mode` + /// + /// # Value + /// One of the variants of [LockinMode] enclosed in double quotes. lockin_mode: LockinMode, + /// Specifis the PLL time constant. + /// + /// # Path + /// `pll_tc/` + /// + /// * specifies which channel to configure. := [0, 1] + /// + /// # Value + /// The PLL time constant as an unsigned byte (0-255). pll_tc: [u8; 2], + /// Specifies the lockin time constant. + /// + /// # Path + /// `lockin_tc` + /// + /// # Value + /// The lockin low-pass time constant as an unsigned byte (0-255). lockin_tc: u8, + + /// Specifies which harmonic to use for the lockin. + /// + /// # Path + /// `lockin_harmonic` + /// + /// # Value + /// Harmonic index of the LO. -1 to _de_modulate the fundamental (complex conjugate) lockin_harmonic: i32, + + /// Specifies the LO phase offset. + /// + /// # Path + /// `lockin_phase` + /// + /// # Value + /// Demodulation LO phase offset. Units are in terms of i32, where [i32::MIN] is equivalent to + /// -pi and [i32::MAX] is equivalent to +pi. lockin_phase: i32, + /// Specifies DAC output mode. + /// + /// # Path + /// `output_conf/` + /// + /// * specifies which channel to configure. := [0, 1] + /// + /// # Value + /// One of the variants of [Conf] enclosed in double quotes. output_conf: [Conf; 2], + + /// Specifies the telemetry output period in seconds. + /// + /// # Path + /// `telemetry_period` + /// + /// # Value + /// Any non-zero value less than 65536. telemetry_period: u16, + /// Specifies the target for data livestreaming. + /// + /// # Path + /// `stream_target` + /// + /// # Value + /// See [StreamTarget#miniconf] stream_target: StreamTarget, } @@ -128,8 +238,8 @@ const APP: () = { let settings = Settings::default(); let pll = RPLL::new( - design_parameters::ADC_SAMPLE_TICKS_LOG2 - + design_parameters::SAMPLE_BUFFER_SIZE_LOG2, + configuration::ADC_SAMPLE_TICKS_LOG2 + + configuration::SAMPLE_BUFFER_SIZE_LOG2, ); // Spawn a settings and telemetry update for default settings. @@ -204,8 +314,7 @@ const APP: () = { ); ( pll_phase, - (pll_frequency - >> design_parameters::SAMPLE_BUFFER_SIZE_LOG2) + (pll_frequency >> configuration::SAMPLE_BUFFER_SIZE_LOG2) as i32, ) } @@ -213,7 +322,7 @@ const APP: () = { // Reference phase and frequency are known. ( 1i32 << 30, - 1i32 << (32 - design_parameters::SAMPLE_BUFFER_SIZE_LOG2), + 1i32 << (32 - configuration::SAMPLE_BUFFER_SIZE_LOG2), ) } }; diff --git a/src/configuration.rs b/src/configuration.rs new file mode 100644 index 0000000..8b43eea --- /dev/null +++ b/src/configuration.rs @@ -0,0 +1,41 @@ +//! This module contains any compile-time configuration parameters for the Stabilizer firmware. + +/// MQTT broker IPv4 address +/// +/// In the default configuration, the IP address is defined as 10.34.16.10. +pub const MQTT_BROKER: [u8; 4] = [10, 34, 16, 10]; + +/// Sampling Frequency +/// +/// Define the frequency at which ADCs (and DACs) are sampled at. +/// +/// # Units +/// The units of this parameter are specified as a logarithmic number of ticks of the internal +/// timer, which runs at 100MHz. +/// +/// ## Example +/// With a value of 7, this corresponds to 2^7 = 128 ticks. Each tick of the 100MHz timer requires +/// 10ns. +/// +/// Sampling Period = 10ns * 128 = 1.28 us +/// Sampling Frequency = 781.25KHz +/// +/// Or more succinctly: +/// `F_s = 100MHz / (2 ^ ADC_SAMPLE_TICKS_LOG2)` +pub const ADC_SAMPLE_TICKS_LOG2: u8 = 7; + +/// Sample Batch Sizing +/// +/// The sample batch size defines how many samples are collected before the DSP routines are +/// executed. +/// +/// # Note +/// Smaller batch sizes result in less input -> output latency, but come at the cost of reduced +/// maximum sampling frequency. +/// +/// # Units +/// The units of the batch size are specified logarithmically. +/// +/// ## Example +/// With a value of 3, the number of samples per batch is 2^3 = 8. +pub const SAMPLE_BUFFER_SIZE_LOG2: u8 = 3; diff --git a/src/hardware/design_parameters.rs b/src/hardware/design_parameters.rs index d04cc75..4ac28e3 100644 --- a/src/hardware/design_parameters.rs +++ b/src/hardware/design_parameters.rs @@ -42,15 +42,11 @@ pub const DDS_SYNC_CLK_DIV: u8 = 4; // The number of ticks in the ADC sampling timer. The timer runs at 100MHz, so the step size is // equal to 10ns per tick. -// Currently, the sample rate is equal to: Fsample = 100/128 MHz ~ 800 KHz -pub const ADC_SAMPLE_TICKS_LOG2: u8 = 7; -pub const ADC_SAMPLE_TICKS: u16 = 1 << ADC_SAMPLE_TICKS_LOG2; +pub const ADC_SAMPLE_TICKS: u16 = + 1 << crate::configuration::ADC_SAMPLE_TICKS_LOG2; // The desired ADC sample processing buffer size. -pub const SAMPLE_BUFFER_SIZE_LOG2: u8 = 3; -pub const SAMPLE_BUFFER_SIZE: usize = 1 << SAMPLE_BUFFER_SIZE_LOG2; +pub const SAMPLE_BUFFER_SIZE: usize = + 1 << crate::configuration::SAMPLE_BUFFER_SIZE_LOG2; pub type SampleBuffer = [u16; SAMPLE_BUFFER_SIZE]; - -// The MQTT broker IPv4 address -pub const MQTT_BROKER: [u8; 4] = [10, 34, 16, 10]; diff --git a/src/hardware/pounder/timestamp.rs b/src/hardware/pounder/timestamp.rs index 7f8241d..262af9b 100644 --- a/src/hardware/pounder/timestamp.rs +++ b/src/hardware/pounder/timestamp.rs @@ -16,7 +16,7 @@ ///! capture is simultaneously triggered. That trigger is prescaled (its rate is divided) by the ///! batch size. This results in the input capture triggering identically to when the ADC samples ///! the last sample of the batch. That sample is then available for processing by the user. -use crate::hardware::{design_parameters, timers}; +use crate::{configuration, hardware::timers}; use core::convert::TryFrom; use stm32h7xx_hal as hal; @@ -58,10 +58,8 @@ impl Timestamper { // Capture at the batch period. input_capture.configure_prescaler( - timers::Prescaler::try_from( - design_parameters::SAMPLE_BUFFER_SIZE_LOG2, - ) - .unwrap(), + timers::Prescaler::try_from(configuration::SAMPLE_BUFFER_SIZE_LOG2) + .unwrap(), ); Self { diff --git a/src/hardware/system_timer.rs b/src/hardware/system_timer.rs index 7b445c4..a26d9e9 100644 --- a/src/hardware/system_timer.rs +++ b/src/hardware/system_timer.rs @@ -45,10 +45,11 @@ impl SystemTimer { } impl rtic::Monotonic for SystemTimer { - // Instants are stored in 32-bit signed integers. With a 10KHz tick rate, this means an - // instant can store up to ~59 hours of time before overflowing. + /// Instants are stored in 32-bit signed integers. With a 10KHz tick rate, this means an + /// instant can store up to ~59 hours of time before overflowing. type Instant = i32; + /// The ratio of the CPU clock to the system timer. fn ratio() -> rtic::Fraction { rtic::Fraction { // At 10KHz with a 400MHz CPU clock, the CPU clock runs 40,000 times faster than diff --git a/src/lib.rs b/src/lib.rs index 85964a7..58c85af 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ #![no_std] #![cfg_attr(feature = "nightly", feature(core_intrinsics))] +pub mod configuration; pub mod hardware; pub mod net; diff --git a/src/net/data_stream.rs b/src/net/data_stream.rs index 4b926ed..e5b69ce 100644 --- a/src/net/data_stream.rs +++ b/src/net/data_stream.rs @@ -1,20 +1,15 @@ -///! Stabilizer data stream capabilities -///! -///! # Design -///! Stabilizer data streamining utilizes UDP packets to send live data streams at high throughput. -///! Packets are always sent in a best-effort fashion, and data may be dropped. Each packet contains -///! an identifier that can be used to detect any dropped data. -///! -///! The current implementation utilizes an single-producer, single-consumer queue to send data -///! between a high priority task and the UDP transmitter. -///! -///! A "batch" of data is defined to be a single item in the SPSC queue sent to the UDP transmitter -///! thread. The transmitter thread then serializes as many sequential "batches" into a single UDP -///! packet as possible. The UDP packet is also given a header indicating the starting batch -///! sequence number and the number of batches present. If the UDP transmitter encounters a -///! non-sequential batch, it does not enqueue it into the packet and instead transmits any staged -///! data. The non-sequential batch is then transmitted in a new UDP packet. This method allows a -///! receiver to detect dropped batches (e.g. due to processing overhead). +//! Stabilizer data stream capabilities +//! +//! # Design +//! Data streamining utilizes UDP packets to send live data streams at high throughput. +//! Packets are always sent in a best-effort fashion, and data may be dropped. Each packet contains +//! an identifier that can be used to detect dropped data. +//! +//! Refer to [DataPacket] for information about the serialization format of each UDP packet. +//! +//! # Example +//! A sample Python script is available in `scripts/stream_throughput.py` to demonstrate reception +//! of livestreamed data. use heapless::spsc::{Consumer, Producer, Queue}; use miniconf::MiniconfAtomic; use serde::Deserialize; @@ -30,6 +25,15 @@ const BLOCK_BUFFER_SIZE: usize = 30; const SUBSAMPLE_RATE: usize = 1; /// Represents the destination for the UDP stream to send data to. +/// +/// # Miniconf +/// `{"ip": , "port": }` +/// +/// * `` is an array of 4 bytes. E.g. `[192, 168, 0, 1]` +/// * `` is any unsigned 16-bit value. +/// +/// ## Example +/// `{"ip": [192, 168,0, 1], "port": 1111}` #[derive(Copy, Clone, Debug, MiniconfAtomic, Deserialize, Default)] pub struct StreamTarget { pub ip: [u8; 4], @@ -125,22 +129,74 @@ impl BlockGenerator { } } +/// # Stream Packet /// Represents a single UDP packet sent by the stream. /// -/// # Packet Format -/// All data is sent in network-endian format. The format is as follows +/// A "batch" of data is defined to be the data collected for a single invocation of the DSP +/// routine. A packet is composed of as many sequential batches as can fit. /// -/// Header: -/// [0..2]: Start block ID (u16) -/// [2..3]: Num Blocks present (u8) -/// [3..4]: Batch Size (u8) +/// The packet is given a header indicating the starting batch sequence number and the number of +/// batches present. If the UDP transmitter encounters a non-sequential batch, it does not enqueue +/// it into the packet and instead transmits any staged data. The non-sequential batch is then +/// transmitted in a new UDP packet. This method allows a receiver to detect dropped batches (e.g. +/// due to processing overhead). /// -/// Following the header, batches are added sequentially. Each batch takes the form of: -/// [*0..*2]: ADC0 -/// [*2..*4]: ADC1 -/// [*4..*6]: DAC0 -/// [*6..*8]: DAC1 -struct DataPacket<'a> { +/// ## Data Format +/// +/// Data sent via UDP is sent in "blocks". Each block is a single batch of ADC/DAC codes from an +/// individual DSP processing routine. Each block is assigned a unique 16-bit identifier. The identifier +/// increments by one for each block and rolls over. All blocks in a single packet are guaranteed to +/// contain sequential identifiers. +/// +/// All data is transmitted in network-endian (big-endian) format. +/// +/// ### Quick Reference +/// +/// In the reference below, any values enclosed in parentheses represents the number of bytes used for +/// that value. E.g. "Batch size (1)" indicates 1 byte is used to represent the batch size. +/// ``` +/// # UDP packets take the following form +///