Oakrey.Guru.Adapter
4.0.4
dotnet add package Oakrey.Guru.Adapter --version 4.0.4
NuGet\Install-Package Oakrey.Guru.Adapter -Version 4.0.4
<PackageReference Include="Oakrey.Guru.Adapter" Version="4.0.4" />
<PackageVersion Include="Oakrey.Guru.Adapter" Version="4.0.4" />
<PackageReference Include="Oakrey.Guru.Adapter" />
paket add Oakrey.Guru.Adapter --version 4.0.4
#r "nuget: Oakrey.Guru.Adapter, 4.0.4"
#:package Oakrey.Guru.Adapter@4.0.4
#addin nuget:?package=Oakrey.Guru.Adapter&version=4.0.4
#tool nuget:?package=Oakrey.Guru.Adapter&version=4.0.4
Oakrey.Guru.Adapter
Base adapter library for Oakrey Guru USB hardware devices. Provides a structured packet-framing protocol with CRC16-CCITT validation, and transceiver, transmitter, and receiver abstractions over USB.
Main features
- Packet-framing protocol with a fixed preamble byte, 2-byte command ID, control byte, and variable-length data payload (up to 255 bytes)
- Optional CRC16-CCITT validation appended to each frame (
CrcTransceiver/CrcTransmitter/CrcReceiver) - Rx-based observable packet stream (
IObservable<ReceivedPacket>) for non-blocking asynchronous receive - Clean interface hierarchy (
ITransmitter,IReceiver,ITransceiver) for easy substitution and testing - Extensible base classes (
TransceiverBase,Receiver,Transmitter) for custom protocol variants
Architecture
classDiagram
direction TB
class ITransmitter {
+Send(id, data)
+Reply(id, data)
}
class IReceiver {
+Received IObservable~ReceivedPacket~
+Dispose()
}
class ITransceiver {
+Name string
+Serial string
}
ITransceiver --|> ITransmitter
ITransceiver --|> IReceiver
class TransceiverBase {
+Name string
+Serial string
+Send(id, data)
+Reply(id, data)
+Received IObservable~ReceivedPacket~
}
TransceiverBase ..|> ITransceiver
class Transceiver {
+Create(guid, serial) Transceiver
}
class CrcTransceiver {
+Create(guid, serial) CrcTransceiver
}
Transceiver --|> TransceiverBase
CrcTransceiver --|> TransceiverBase
class Transmitter
class CrcTransmitter
CrcTransmitter --|> Transmitter
class Receiver
class CrcReceiver
CrcReceiver --|> Receiver
Packet frame structure
packet-beta
0-7: "Preamble (0x58)"
8-15: "Control byte"
16-31: "Command ID (LE)"
32-39: "Data length"
40-71: "Data (0..255 bytes)"
72-87: "CRC16-CCITT (CRC variant only)"
| Field | Size | Notes |
|---|---|---|
| Preamble | 1 byte | Fixed value 0x58 |
| Control byte | 1 byte | 0 = Action, 1 = Reply |
| Command ID | 2 bytes | Little-endian ushort |
| Data length | 1 byte | 0 to 255 |
| Data | 0..255 bytes | Payload |
| CRC16-CCITT | 2 bytes | CRC variant only, little-endian, covers header + data |
Requirements
- .NET 10.0 (Windows)
- Oakrey.Log >= 2.0.0
- System.Reactive >= 6.1.0
- Oakrey USB adapter device with a known device GUID and serial number
Installation
dotnet add package Oakrey.Guru.Adapter
Or via Package Manager Console:
Install-Package Oakrey.Guru.Adapter
Usage
Basic transceiver (no CRC)
using Oakrey.Guru.Adapter;
// Create a transceiver for the device identified by its USB GUID and serial number.
using Transceiver transceiver = Transceiver.Create("{device-guid}", "device-serial");
// Subscribe to incoming packets.
using IDisposable subscription = transceiver.Received.Subscribe(packet =>
{
Console.WriteLine($"ID: {packet.CommandId}, Control: {packet.ControlByte}, Data: {packet.DataCount} bytes");
});
// Send an action packet.
transceiver.Send(0x0001, [0xAA, 0xBB]);
// Send a reply packet.
transceiver.Reply(0x0001, [0xCC]);
CRC-validated transceiver
using Oakrey.Guru.Adapter;
// CrcTransceiver appends and validates CRC16-CCITT on every frame.
using CrcTransceiver transceiver = CrcTransceiver.Create("{device-guid}", "device-serial");
using IDisposable subscription = transceiver.Received.Subscribe(packet =>
{
Console.WriteLine($"ID: {packet.CommandId}, Data length: {packet.DataCount}");
});
transceiver.Send(0x0002, [0x01, 0x02, 0x03]);
CRC16-CCITT utility
The Crc16CCITTCalculator extension method is public and can be used independently:
byte[] buffer = [0x58, 0x00, 0x01, 0x00, 0x02, 0xAA, 0xBB];
ushort crc = buffer.Crc16CCITT(initVal: 0, offset: 0, cnt: buffer.Length);
Development notes
TransceiverandCrcTransceiveraresealed. Extend the protocol by subclassingTransceiverBase,Transmitter, andReceiverdirectly, asCrcTransceiverdoes.Receiverruns a backgroundTaskviaTask.Runand cancels it onDispose. Always dispose the transceiver when done.- The
Receivedstream is aSubject<ReceivedPacket>. Unhandled exceptions inside a subscriber will propagate to theTaskScheduler.UnobservedTaskExceptionhandler. - The USB project is referenced with
PrivateAssets="all", so it is bundled into this package and not exposed as a transitive dependency.
Project information
| Author | Oakrey |
| License | MIT |
| Repository | https://dev.azure.com/oakrey/OpenPackages/_git/Drivers |
| Project URL | http://www.oakrey.cz/opkg_drivers_guru |
| Target framework | net10.0-windows |
License
This project is licensed under the MIT License. See the LICENSE file for details.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0-windows7.0 is compatible. |
-
net10.0-windows7.0
- Oakrey.Log (>= 2.0.0)
- System.Reactive (>= 6.1.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Oakrey.Guru.Adapter:
| Package | Downloads |
|---|---|
|
Oakrey.Guru.Handlers
Handler framework for Oakrey Guru USB hardware devices. Provides async request/reply command execution with configurable timeout, typed Rx event stream handlers, status-reply dispatch, and a thread-safe handler collection keyed by packet ID. |
GitHub repositories
This package is not used by any popular GitHub repositories.