Skip to main content

Basic Usage

Complete working examples for connecting to readers, reading metadata, and performing basic operations.

Connect to a Reader

Connect to an rf IDEAS reader over USB, read metadata, beep, and close.

main.cpp
#include <iostream>
#include "Reader/Reader.h"

int main() {
using namespace Rik;
using namespace RikCommon;

ReaderHandle handle = nullptr;

try {
ReaderDefinition readerDef;
readerDef.DeviceId.VendorId = 0x0C27;
readerDef.DeviceId.ProductId = 0x3BFA;
readerDef.ProtocolType = PROTOCOL_TYPE_FEATURE_REPORT;

handle = AbstractReader::CreateReaderInstance(readerDef, 3);
auto* reader = dynamic_cast<Reader*>(
AbstractReader::GetInstance(handle)
);
reader->Init();

auto metadata = reader->GetMetadataStruct();
std::cout << "Part Number: " << metadata.PartNumber << std::endl;
std::cout << "Serial: " << metadata.ESN << std::endl;

reader->Beep(2, RikProtocol::BEEP_DURATION_SHORT);

reader->Close();
AbstractReader::DestroyInstance(handle);
handle = nullptr;
return 0;

} catch (const ReaderException& e) {
std::cerr << "Error: " << e.Message << std::endl;
if (handle) AbstractReader::DestroyInstance(handle);
return 1;
}
}

Get Library Version

Retrieve RIK library version info. No reader connection required.

#include <iostream>
#include "Reader/AbstractReader.h"

int main() {
LibraryInfo info;
auto result = Rik::AbstractReader::GetLibraryInfo(info);

if (!result.HasException) {
std::cout << "Version: " << info.VersionString << std::endl;
std::cout << "SemVer: " << info.SemVer << std::endl;
std::cout << "Build: " << info.BuildVer << std::endl;
}

return 0;
}

Connect by USB Path

When multiple readers share the same VID/PID and serial numbers are unavailable, connect by USB path to target a specific physical port.

#include <cwchar>
#include "Reader/Reader.h"

using namespace Rik;
using namespace RikCommon;

ReaderDefinition readerDef{};
readerDef.ProtocolType = PROTOCOL_TYPE_FEATURE_REPORT;

// USB path -- VID/PID are not required in this mode
// Linux: bus-port path (e.g., "1-7" or "1-7.2")
// Windows: location path (e.g., "PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(7)")
std::wstring usbPath = L"1-7";
std::wcsncpy(readerDef.DeviceId.UsbPath, usbPath.c_str(),
sizeof(readerDef.DeviceId.UsbPath) / sizeof(wchar_t) - 1);

auto handle = AbstractReader::CreateReaderInstance(readerDef, 3);
auto* app = AbstractReader::GetInstance(handle);
app->Init();

auto metadata = app->GetMetadataStruct();
std::cout << "Part Number: " << metadata.PartNumber << std::endl;

app->Close();
AbstractReader::DestroyInstance(handle);
tip

See Discovering USB Paths for a complete guide including the C++ UsbDeviceEnumerator API, a Linux shell utility, and Windows PowerShell commands.

Serial Port Connection

Connect to a reader over RS-232 serial.

#include "Reader/AbstractReader.h"

using namespace Rik;
using namespace RikCommon;

ReaderDefinition readerDef;
readerDef.ProtocolType = PROTOCOL_TYPE_SERIAL_BINARY;

std::strcpy(readerDef.SerialPortSettings.PortName, "COM3");
readerDef.SerialPortSettings.BaudRate = SERIAL_PORT_BAUD_9600;
readerDef.SerialPortSettings.Parity = SERIAL_PORT_PARITY_NONE;
readerDef.SerialPortSettings.DataBits = SERIAL_PORT_DATA_BITS_8;
readerDef.SerialPortSettings.StopBits = SERIAL_PORT_STOP_BITS_ONE;

auto handle = AbstractReader::CreateReaderInstance(readerDef, 3);
auto* app = AbstractReader::GetInstance(handle);
app->Init();

auto metadata = app->GetMetadataStruct();
std::cout << "Part Number: " << metadata.PartNumber << std::endl;

app->Close();
AbstractReader::DestroyInstance(handle);

Error Handling

#include <iostream>
#include "Reader/AbstractReader.h"
#include "ErrorHandling/ReaderException.h"

using namespace Rik;
using namespace RikCommon;

ReaderHandle handle = nullptr;

try {
ReaderDefinition readerDef;
readerDef.DeviceId.VendorId = 0x0C27;
readerDef.DeviceId.ProductId = 0x3BFA;
readerDef.ProtocolType = PROTOCOL_TYPE_FEATURE_REPORT;

handle = AbstractReader::CreateReaderInstance(readerDef, 3);
auto* app = AbstractReader::GetInstance(handle);
app->Init();

// ... operations ...

app->Close();
AbstractReader::DestroyInstance(handle);
handle = nullptr;

} catch (const ReaderException& e) {
std::cerr << "Message: " << e.Message << std::endl;
std::cerr << "File: " << e.File << std::endl;
std::cerr << "Line: " << e.Line << std::endl;
std::cerr << "Function: " << e.Function << std::endl;

if (handle) AbstractReader::DestroyInstance(handle);
}
tip

Always wrap RIK operations in try/catch (C++/C#) or try/except (Python). The exception objects carry source file, line number, and function name for diagnostics.