A small oscilloscope UI for the Owon HDS series portable oscilloscopes (Windows 10+, x86_64 only)

Overview

owowon - A small oscilloscope UI for the Owon HDS series portable oscilloscopes

Screenshot of the program, reading a 10 MHz sinewave generated by the HDS2102S itself:

Screenshot of the program, reading a 10 MHz sinewave generated by the device itself

Windows only

I mostly created this for myself, putting on the reverse engineering hat to figure out how to talk to the device, giving egui a spin UI-wise, and checking out the WinUSB support of the Windows Runtime. The USB communication is thus tied to Windows right now, but should be able to be ported without too much hassle. The rest of the program is platform agnostic, to the extent that egui is.

Supported devices

So far, this program has only been tested with the HDS2102S oscilloscope, with firmware version 1.5.1. I assume it's going to work mostly fine with other oscilloscopes from the same model range, though more or fewer bugs than what's listed here might be present. Feel free to create issues or pull requests if you like to expand the support.

Installation

The official Owon software uses libusb as driver, but since I wanted to give WinRT/WinUSB a spin, I "converted" it into a WinUSB device using Zadig. The corresponding driver is provided in the winusb driver folder in this repository, but you can generate your own through that tool if you like. You'll need it for the program to detect the oscilloscope.

Features

  • Much, much faster data acquisition than the Owon tool (up to ~100 readings per second, depending on the number of active channels and whether measurements are enabled or not), and allows changing settings while acquiring.
  • More measurements (see limitations below)
  • Almost everything needed for everyday usage is controllable through the UI (image of the sidebar UI):
    • Auto function
    • Channel enablement
    • Timebase, Horizontal offset
    • Acquisition mode, Sample depth
    • Per channel: Vertical offset, scale, probe attenuation, coupling
    • Trigger: Source, level (see limitations below), mode, triggering edge, coupling
    • Measurements
    • Function generator (see limitations below)

Note: DMM readout/control support is technically possible, but currently not implemented.

Keyboard Shortcuts

  • Toggle measurements: M
  • Horizontal zoom in/out (time base): PageUp/PageDown or mouse wheel up/down
    • with Ctrl: vertical zoom in/out (voltage scale). This affects Ch1 (or Ch2 if Ch1 is disabled). Press Alt to force Ch2 (if enabled).
    • with Alt: move trigger level up/down
      • with Shift (only with keyboard): bigger steps
  • Horizontal offset: ArrowLeft/ArrowRight
    • with Shift: bigger steps
    • with Ctrl: smaller steps
  • Channel vertical offset. ArrowUp/ArrowDown. This affects Ch1 (or Ch2 if Ch1 is disabled). Press Alt to force Ch2 (if enabled)
    • with Shift: bigger steps
    • with Ctrl: smaller steps

Limitations

  • Switching to DMM/Function generator mode on the device itself will permanently slow down the acquisition of data by a factor of ~2-4. Only switching back to the oscilloscope view and then restarting the device restores the full performance.
    • It seems that the reason for this is that the DMM mode is not disabled when leaving the DMM screen, and there doesn't seem to be a way to disable it through the USB interface.
  • Opening any menu or enabling drawing measurements on the device itself will temporarily slow down acquisition. Closing the menu or disabling the measurements, respectively, will restore the full acquisition speed.
  • Only the trigger modes Auto and Single work properly. Normal fails to transmit (and render on the oscilloscope screen) the signal data after entering trigger status and leaving it again. It seems that the transition between Trig and Ready causes the device to misbehave.
  • There is no software way to re-arm the trigger in Single mode, you have to press the play/pause button on the device.
  • Setting negative trigger levels will cause it to apply incorrectly, but reading it out will return an overflowed value (4295V, probably some sign issue with u32 - 4,294,967,295), so you'll have to manually type the value in, and the trigger level visualization will not work. When setting the trigger level through the device itself, it reads out correctly.
  • Most measurements only reliably work inside the area that matches the screen, not the full measured area.
    • I wouldn't necessarily trust the measurements that aren't displayed on the device itself.
  • Function generator
    • The :FUNCtion? call to get the currently active function never returns AttALT, StairDn, StairUD, StairUp, Besselj, Bessely, Sinc and instead returns AmpALT for these. Setting these works, however.
    • :FUNCtion:FREQuency? returns values mis-scaled by a factor of 1 million (= effectively in micro-Hertz), worked around in software
    • :FUNCtion:AMPLitude?/:FUNCtion:OFFSet? return values mis-scaled by a factor of 1000 (= effectively in Millivolts), worked around in software
    • I haven't bothered adding support for the parameters of all function generator modes so far.
  • The DMM (multimeter) is also controllable through USB (undocumented), but not implemented yet.
You might also like...
Attempts to suspend all known AV/EDRs processes on Windows using syscalls and the undocumented NtSuspendProcess API. Made with <3 for pentesters. Written in Rust.
Attempts to suspend all known AV/EDRs processes on Windows using syscalls and the undocumented NtSuspendProcess API. Made with 3 for pentesters. Written in Rust.

Ronflex Attempts to suspend all known AV/EDRs processes on Windows using syscalls and the undocumented NtSuspendProcess API. Made with 3 for penteste

Small container runtime for threat detection

confine Containers, but for dynamic malware analysis confine is a container runtime for dynamically analyzing suspicious executables. Given a sample s

Easy c̵̰͠r̵̛̠ö̴̪s̶̩̒s̵̭̀-t̶̲͝h̶̯̚r̵̺͐e̷̖̽ḁ̴̍d̶̖̔ ȓ̵͙ė̶͎ḟ̴͙e̸̖͛r̶̖͗ë̶̱́ṉ̵̒ĉ̷̥e̷͚̍ s̷̹͌h̷̲̉a̵̭͋r̷̫̊ḭ̵̊n̷̬͂g̵̦̃ f̶̻̊ơ̵̜ṟ̸̈́ R̵̞̋ù̵̺s̷̖̅ţ̸͗!̸̼͋

Rust S̵̓i̸̓n̵̉ I̴n̴f̶e̸r̵n̷a̴l mutability! Howdy, friendly Rust developer! Ever had a value get m̵̯̅ð̶͊v̴̮̾ê̴̼͘d away right under your nose just when

The rust client for CeresDB. CeresDB is a high-performance, distributed, schema-less, cloud native time-series database that can handle both time-series and analytics workloads.

The rust client for CeresDB. CeresDB is a high-performance, distributed, schema-less, cloud native time-series database that can handle both time-series and analytics workloads.

The Polkadot Hackathon Global Series North America edition is the second in a series of hackathons that brings the cutting edge of blockchain to a global community.

Polkadot Hackathon Project We are translating Uniswap v2 to Ink. Dependencies Install cargo-contract for building Ink contracts: cargo install dylint-

 A process memory reader and debugger for Windows (x86_64)
A process memory reader and debugger for Windows (x86_64)

Winreader Winreader is a process memory reader and debugger for Windows, implemented and developed in the Rust language, using the official Microsoft

Use Git installed in Bash on Windows/Windows Subsystem for Linux (WSL) from Windows and Visual Studio Code (VSCode)

WSLGit This project provides a small executable that forwards all arguments to git running inside Bash on Windows/Windows Subsystem for Linux (WSL). T

A small, portable and extensible game framework written in Rust.
A small, portable and extensible game framework written in Rust.

What is This? Crayon is a small, portable and extensible game framework, which loosely inspired by some amazing blogs on bitsquid, molecular and flooo

Amethyst is a systems language aimed at being simple, small, portable, and safe.

amethyst Amethyst is a systems language aimed at being simple, small, portable, and safe. What is this language? From the r/ProgLangs discord server:

A series of compact encoding schemes for building small and fast parsers and serializers

A series of compact encoding schemes for building small and fast parsers and serializers

💻 An x86_64 kernel in the works

BruhOS a basic x86_64 kernel in the works. cool stuff written in rust boots with any stivale2-compliant bootloader framebuffer bitmap font renderer pm

memory-mapped registers for x86_64 systems

regmap some well-known and known-to-be-good computer architectures, such as the Microchip PIC product line, or many of the AVR processor family, were

a hobby OS for x86_64 based on MikanOS.

a hobby OS for x86_64 based on MikanOS.

Minimal x86_64 OS kernel written in Rust
Minimal x86_64 OS kernel written in Rust

rkernel A minimal x86_64 Rust OS kernel. Multiboot2 VGA driver PIC PIT PS/2 Keyboard driver PS/2 Mouse driver TSC RTC Allocator ATA PIO (In progress..

A clean, custom-built modular kernel ready to boot on x86_64.
A clean, custom-built modular kernel ready to boot on x86_64.

Lateral is a work-in-progress multitasking monolithic kernel + OS meant as a fun summer project. It has recently expanded into more than I could imagi

Rux - An x86_64 toy operating system kernel written in Rust
Rux - An x86_64 toy operating system kernel written in Rust

Rux - An x86_64 toy operating system kernel written in Rust. Rux is a port of the Hux kernel, my x86 32-bit single-CPU toy kernel written in C, following the OSTEP book structure and terminology.

Rust fast `&str` to `i64` parser (x86_64 SIMD, SSE4.1)

Rust fast &str to i64 parser (x86_64 SIMD, SSE4.1) Modified this version to support various string length and negative values. You need to define the

Let's write an OS which can run on x86_64 in Rust from scratch

rCore-Tutorial-v3 rCore-Tutorial version 3.5. See the Documentation in Chinese. news 2021.11.20: Now we are updating our labs. Please checkout chX-dev

A tiny Rust std-lib for Linux x86_64 and aarch64

Tiny std Like a bad, probably buggy, tiny standard library for Linux. When it's appropriate If you are actually trying to do something solid, checkout

Releases(v0.1.1)
Owner
Dennis Duda
overflowing all the buffers · rustacean🦀 · dnb
Dennis Duda
Portable atomic types.

portable-atomic Portable atomic types. Provide all atomic integer types (Atomic{I,U}{8,16,32,64}) for all targets that can use atomic CAS. (i.e., all

Taiki Endo 49 Dec 21, 2022
MimiRust - Hacking the Windows operating system to hand us the keys to the kingdom with Rust.

MimiRust - Hacking the Windows operating system to hand us the keys to the kingdom with Rust. MimiRust is a program based on the wdigest attack vector

Thotty 0 Nov 29, 2022
Advanced Fuzzing Library - Slot your Fuzzer together in Rust! Scales across cores and machines. For Windows, Android, MacOS, Linux, no_std, ...

LibAFL, the fuzzer library. Advanced Fuzzing Library - Slot your own fuzzers together and extend their features using Rust. LibAFL is written and main

Advanced Fuzzing League ++ 1.2k Jan 6, 2023
Binary coverage tool without binary modification for Windows

Summary Mesos is a tool to gather binary code coverage on all user-land Windows targets without need for source or recompilation. It also provides an

null 381 Dec 22, 2022
Rapidly Search and Hunt through Windows Event Logs

Rapidly Search and Hunt through Windows Event Logs Chainsaw provides a powerful ‘first-response’ capability to quickly identify threats within Windows

F-Secure Countercept 1.8k Dec 28, 2022
A tiny program that locates and extracts public save files from Windows to your local directory!

Save Game Extractor | Download Save Game Extractor is a tool that automatically locates and copies save files for Windows games in public directories.

popcar2 6 Dec 23, 2021
A Rust program to control bias lighting on Linux and Windows.

displaylight_rs This Rust workspace is a rewrite of my DisplayLight project. It colors leds mounted behind the monitor with the colors shown on the di

Ivor Wanders 2 Sep 25, 2022
Memory hacking library for windows.

Memory hacking library for windows.

sy1ntexx 40 Jan 3, 2023
Checks whether the process is running as root/sudo/admin permission in Windows and Unix systems

Is_sudo Checks if program is running as sudo in unix systems, or using admin permission in windows. Usage use is_sudo::check; use is_sudo::RunningAs;

Spark 2 Aug 12, 2022
Single stub direct and indirect syscalling with runtime SSN resolving for windows.

RUST_SYSCALLS Single stub direct and indirect syscalling with runtime SSN resolving for windows. Features: One single line for all your syscalls Funct

Yxel 81 Dec 4, 2022