noolite.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "noolite.h"
  2. #include "src/libusbdevice.h"
  3. namespace noolitelib
  4. {
  5. namespace Device
  6. {
  7. constexpr auto VID = 0x16c0;
  8. constexpr auto PID = 0x05df;
  9. }
  10. namespace
  11. {
  12. constexpr auto WorkMode = 0;
  13. constexpr auto Bitrate = 2;
  14. constexpr auto Repeats = 2;
  15. constexpr auto Mode = (Repeats << 5 | Bitrate << 3 | WorkMode);
  16. }
  17. Noolite::Noolite(IUsbDevice *device) :
  18. m_device(device ? device : new LibUsbDevice())
  19. {
  20. m_device->openDevice(Device::VID, Device::PID);
  21. }
  22. Noolite::~Noolite()
  23. {
  24. m_device->close();
  25. delete m_device;
  26. }
  27. bool Noolite::sendCommand(unsigned char channel, Command command, const Params &params)
  28. {
  29. auto data = composeCommand(channel, command, params);
  30. if (data) {
  31. return m_device->sendDataToDevice(data.value());
  32. }
  33. return false;
  34. }
  35. std::optional<Data> Noolite::composeCommand(unsigned char channel, Command command, const Params &params) const
  36. {
  37. if (noolitelib::Set == command && !(params.size() == 1 || params.size() == 3)) {
  38. return {};
  39. }
  40. unsigned char format = (noolitelib::Set == command) ? params.size() : (command > noolitelib::Bind ? 0x04: 0x00);
  41. Data res { Mode, static_cast<unsigned char>(command), format, 0x0, channel, 0x0, 0x0, 0x0 };
  42. for (int i = 0; i < params.size(); ++i) {
  43. res[5 + i] = params[i];
  44. }
  45. return res;
  46. }
  47. }