Skip to content

Commit

Permalink
Add GetPairedDevices command to IReceiver
Browse files Browse the repository at this point in the history
  • Loading branch information
PixlOne committed Oct 2, 2019
1 parent d124f4e commit 8fa6d2b
Show file tree
Hide file tree
Showing 5 changed files with 177 additions and 162 deletions.
2 changes: 1 addition & 1 deletion src/libhidpp/hidpp/Device.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class Device
*/
std::tuple<unsigned int, unsigned int> protocolVersion ();

const inline bool forceLongReports()
bool forceLongReports()
{
return force_long_reports;
}
Expand Down
20 changes: 10 additions & 10 deletions src/libhidpp/hidpp/SimpleDispatcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ SimpleDispatcher::SimpleDispatcher (const char *path):
{
const HID::ReportDescriptor &rdesc = _dev.getReportDescriptor ();
if (!checkReportDescriptor (rdesc))
{
if (!checkLongDescriptor (rdesc))
throw Dispatcher::NoHIDPPReportException ();
force_long_reports = true;
}
{
if (!checkLongDescriptor (rdesc))
throw Dispatcher::NoHIDPPReportException ();
force_long_reports = true;
}
}

SimpleDispatcher::~SimpleDispatcher ()
Expand All @@ -44,7 +44,7 @@ SimpleDispatcher::~SimpleDispatcher ()

bool SimpleDispatcher::forceLongReports() const
{
return force_long_reports;
return force_long_reports;
}

const HID::RawDevice &SimpleDispatcher::hidraw () const
Expand All @@ -69,15 +69,15 @@ std::string SimpleDispatcher::name () const

void SimpleDispatcher::sendCommandWithoutResponse (Report &report)
{
if (forceLongReports() && report.type() == Report::Short)
report.setType(Report::Long);
if (forceLongReports() && report.type() == Report::Short)
report.setType(Report::Long);
_dev.writeReport (report.rawReport ());
}

std::unique_ptr<Dispatcher::AsyncReport> SimpleDispatcher::sendCommand (Report &&report)
{
if (forceLongReports() && report.type() == Report::Short)
report.setType(Report::Long);
if (forceLongReports() && report.type() == Report::Short)
report.setType(Report::Long);
_dev.writeReport (report.rawReport ());
return std::make_unique<CommandResponse> (this, std::move (report));
}
Expand Down
115 changes: 61 additions & 54 deletions src/libhidpp/hidpp10/IReceiver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,94 +24,101 @@
#include <misc/Endian.h>
#include <stdexcept>
#include <cassert>
#include <hidpp/Dispatcher.h>

using namespace HIDPP10;

const std::vector<uint8_t> IReceiver::Events
({
IReceiver::DeviceUnpaired,
IReceiver::DevicePaired,
IReceiver::ConnectionStatus,
IReceiver::Error
});
({
IReceiver::DeviceUnpaired,
IReceiver::DevicePaired,
IReceiver::ConnectionStatus,
IReceiver::Error
});

IReceiver::IReceiver (Device *dev):
_dev (dev)
_dev (dev)
{
}

void IReceiver::getPairedDevices ()
{
HIDPP::Report report (HIDPP::Report::ShortDJ, HIDPP::DefaultDevice, GetPairedDevices, 0);
_dev->dispatcher()->sendCommandWithoutResponse(report);
}

void IReceiver::getDeviceInformation (unsigned int device,
uint8_t *destination_id,
uint8_t *report_interval,
uint16_t *wpid,
DeviceType *type)
uint8_t *destination_id,
uint8_t *report_interval,
uint16_t *wpid,
DeviceType *type)
{
if (device >= 16)
throw std::out_of_range ("Device index too big");
if (device >= 16)
throw std::out_of_range ("Device index too big");

std::vector<uint8_t> params (HIDPP::ShortParamLength),
results (HIDPP::LongParamLength);
std::vector<uint8_t> params (HIDPP::ShortParamLength),
results (HIDPP::LongParamLength);

params[0] = DeviceInformation | (device & 0x0F);
params[0] = DeviceInformation | (device & 0x0F);

_dev->getRegister (DevicePairingInfo, &params, results);
_dev->getRegister (DevicePairingInfo, &params, results);

if (params[0] != results[0])
throw std::runtime_error ("Invalid DevicePairingInfo type");
if (params[0] != results[0])
throw std::runtime_error ("Invalid DevicePairingInfo type");

if (destination_id)
*destination_id = results[1];
if (report_interval)
*report_interval = results[2];
if (wpid)
*wpid = readBE<uint16_t> (results, 3);
if (type)
*type = static_cast<DeviceType> (results[7]);
if (destination_id)
*destination_id = results[1];
if (report_interval)
*report_interval = results[2];
if (wpid)
*wpid = readBE<uint16_t> (results, 3);
if (type)
*type = static_cast<DeviceType> (results[7]);
}

void IReceiver::getDeviceExtendedInformation (unsigned int device,
uint32_t *serial,
uint32_t *report_types,
PowerSwitchLocation *ps_loc)
uint32_t *serial,
uint32_t *report_types,
PowerSwitchLocation *ps_loc)
{
if (device >= 16)
throw std::out_of_range ("Device index too big");
if (device >= 16)
throw std::out_of_range ("Device index too big");

std::vector<uint8_t> params (HIDPP::ShortParamLength),
results (HIDPP::LongParamLength);
std::vector<uint8_t> params (HIDPP::ShortParamLength),
results (HIDPP::LongParamLength);

params[0] = ExtendedDeviceInformation | (device & 0x0F);
params[0] = ExtendedDeviceInformation | (device & 0x0F);

_dev->getRegister (DevicePairingInfo, &params, results);
_dev->getRegister (DevicePairingInfo, &params, results);

if (params[0] != results[0])
throw std::runtime_error ("Invalid DevicePairingInfo type");
if (params[0] != results[0])
throw std::runtime_error ("Invalid DevicePairingInfo type");

if (serial)
*serial = readBE<uint32_t> (results, 1);
if (report_types)
*report_types = readBE<uint32_t> (results, 5);
if (ps_loc)
*ps_loc = static_cast<PowerSwitchLocation> (results[9] & 0x0F);
if (serial)
*serial = readBE<uint32_t> (results, 1);
if (report_types)
*report_types = readBE<uint32_t> (results, 5);
if (ps_loc)
*ps_loc = static_cast<PowerSwitchLocation> (results[9] & 0x0F);
}

std::string IReceiver::getDeviceName (unsigned int device)
{
if (device >= 16)
throw std::out_of_range ("Device index too big");
if (device >= 16)
throw std::out_of_range ("Device index too big");

std::vector<uint8_t> params (HIDPP::ShortParamLength),
results (HIDPP::LongParamLength);
std::vector<uint8_t> params (HIDPP::ShortParamLength),
results (HIDPP::LongParamLength);

params[0] = DeviceName | (device & 0x0F);
params[0] = DeviceName | (device & 0x0F);

_dev->getRegister (DevicePairingInfo, &params, results);
_dev->getRegister (DevicePairingInfo, &params, results);

if (params[0] != results[0])
throw std::runtime_error ("Invalid DevicePairingInfo type");
if (params[0] != results[0])
throw std::runtime_error ("Invalid DevicePairingInfo type");

std::size_t length = results[1];
return std::string (reinterpret_cast<char *> (&results[2]), std::min (length, std::size_t {14}));
std::size_t length = results[1];
return std::string (reinterpret_cast<char *> (&results[2]), std::min (length, std::size_t {14}));
}

IReceiver::DevicePairedEvent IReceiver::devicePairedEvent (const HIDPP::Report &event)
Expand Down
Loading

0 comments on commit 8fa6d2b

Please sign in to comment.