From de210d3e312dfbf782e4f58ff9922fb4281d99cc Mon Sep 17 00:00:00 2001 From: nanosonde <2073569+nanosonde@users.noreply.github.com> Date: Tue, 19 Nov 2019 09:57:56 +0100 Subject: [PATCH] save work --- src/knx/bau27B0.cpp | 8 +--- src/knx/bau27B0.h | 1 - src/knx/cemi_server.cpp | 14 +++---- src/knx/usb_tunnel_interface.cpp | 68 ++++++++++++++++++++++++++------ 4 files changed, 66 insertions(+), 25 deletions(-) diff --git a/src/knx/bau27B0.cpp b/src/knx/bau27B0.cpp index dabcbc3..6fc9228 100644 --- a/src/knx/bau27B0.cpp +++ b/src/knx/bau27B0.cpp @@ -107,16 +107,12 @@ DataLinkLayer& Bau27B0::dataLinkLayer() return _dlLayer; } -void Bau27B0::enabled(bool value) -{ - ::BauSystemB::enabled(value); - //_tunnelInterface.enabled(value); -} - void Bau27B0::loop() { ::BauSystemB::loop(); +#ifdef USE_CEMI_SERVER _cemiServer.loop(); +#endif } void Bau27B0::domainAddressSerialNumberWriteIndication(Priority priority, HopCountType hopType, uint8_t* rfDoA, diff --git a/src/knx/bau27B0.h b/src/knx/bau27B0.h index 70a2295..c2816b2 100644 --- a/src/knx/bau27B0.h +++ b/src/knx/bau27B0.h @@ -13,7 +13,6 @@ class Bau27B0 : public BauSystemB { public: Bau27B0(Platform& platform); - void enabled(bool value); void loop(); protected: diff --git a/src/knx/cemi_server.cpp b/src/knx/cemi_server.cpp index 2ad4ab4..655d468 100644 --- a/src/knx/cemi_server.cpp +++ b/src/knx/cemi_server.cpp @@ -268,27 +268,27 @@ void CemiServer::frameReceived(CemiFrame& frame) case M_FuncPropCommand_req: { - println("M_FuncPropCommand_req"); + println("M_FuncPropCommand_req not implemented"); break; } case M_FuncPropStateRead_req: { - println("M_FuncPropStateRead_req"); + println("M_FuncPropStateRead_req not implemented"); break; } case M_Reset_req: { println("M_Reset_req"); - // A real device reset does not work with USB - // M_Reset_ind is not mandatory for USB and KNXNET/IP - // Flush the EEPROM before resetting - //_bau.writeMemory(); + // A real device reset does not work for USB or KNXNET/IP. + // Thus, M_Reset_ind is NOT mandatory for USB and KNXNET/IP. + // We just save all data to the EEPROM + _bau.writeMemory(); break; } - // we should not receive this: server -> client + // we should never receive these: server -> client case L_data_con: case L_data_ind: case M_PropInfo_ind: diff --git a/src/knx/usb_tunnel_interface.cpp b/src/knx/usb_tunnel_interface.cpp index 783d694..85dc761 100644 --- a/src/knx/usb_tunnel_interface.cpp +++ b/src/knx/usb_tunnel_interface.cpp @@ -9,11 +9,47 @@ #define MAX_EP_SIZE 64 #define HID_HEADER_SIZE 3 +//#define DEBUG_TX_HID_REPORT +//#define DEBUG_RX_HID_REPORT + extern bool sendKnxHidReport(uint8_t* data, uint16_t length); extern bool isKnxHidSendReportPossible(); -uint16_t manufacturerId; -uint16_t maskVersion; +static const uint8_t descHidReport[] = +{ + //TUD_HID_REPORT_DESC_KNXHID_INOUT(64) + 0x06, 0xA0, 0xFF, // Usage Page (Vendor Defined 0xFFA0) +0x09, 0x01, // Usage (0x01) +0xA1, 0x01, // Collection (Application) +0x09, 0x01, // Usage (0x01) +0xA1, 0x00, // Collection (Physical) +0x06, 0xA1, 0xFF, // Usage Page (Vendor Defined 0xFFA1) +0x09, 0x03, // Usage (0x03) +0x09, 0x04, // Usage (0x04) +0x15, 0x80, // Logical Minimum (-128) +0x25, 0x7F, // Logical Maximum (127) +0x35, 0x00, // Physical Minimum (0) +0x45, 0xFF, // Physical Maximum (-1) +0x75, 0x08, // Report Size (8) +0x85, 0x01, // Report ID (1) +0x95, 0x3F, // Report Count (63) +0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) +0x09, 0x05, // Usage (0x05) +0x09, 0x06, // Usage (0x06) +0x15, 0x80, // Logical Minimum (-128) +0x25, 0x7F, // Logical Maximum (127) +0x35, 0x00, // Physical Minimum (0) +0x45, 0xFF, // Physical Maximum (-1) +0x75, 0x08, // Report Size (8) +0x85, 0x01, // Report ID (1) +0x95, 0x3F, // Report Count (63) +0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) +0xC0, // End Collection +0xC0 // End Collection +}; + +static uint16_t manufacturerId; +static uint16_t maskVersion; struct _rx_queue_frame_t { @@ -28,6 +64,16 @@ static struct _rx_queue_t _rx_queue_frame_t* back = nullptr; } _rx_queue; +const uint8_t* getKnxHidReportDescriptor() +{ + return &descHidReport[0]; +} + +uint16_t getHidReportDescriptorLength() +{ + return sizeof(descHidReport); +} + static void addFrameRxQueue(CemiFrame& frame) { _rx_queue_frame_t* rx_frame = new _rx_queue_frame_t; @@ -171,7 +217,8 @@ static void handleBusAccessServerProtocol(const uint8_t* requestData, uint16_t p { data[2] += respDataSize; // HID Report Header: Packet Length data[6] += respDataSize; // USB KNX Transfer Protocol Header: Body Length -/* + +#ifdef DEBUG_TX_HID_REPORT Serial1.print("TX HID report: len: "); Serial1.println((packetLength) + respDataSize, DEC); @@ -183,12 +230,12 @@ static void handleBusAccessServerProtocol(const uint8_t* requestData, uint16_t p Serial1.print(" "); } Serial1.println(""); -*/ +#endif sendKnxHidReport(data, MAX_EP_SIZE); } } -void sendKnxTunnelHidReport(uint8_t* data, uint16_t length) +static void sendKnxTunnelHidReport(uint8_t* data, uint16_t length) { uint8_t buffer[length + 11]; @@ -207,7 +254,7 @@ void sendKnxTunnelHidReport(uint8_t* data, uint16_t length) buffer[2] = 8 + length; // KNX USB Transfer Protocol Header length (8, only first packet!) + cEMI length pushWord(length, &buffer[5]); // KNX USB Transfer Protocol Body length (cEMI length) -/* +#ifdef DEBUG_TX_HID_REPORT Serial1.print("TX HID report: len: "); Serial1.println(buffer[2] + HID_HEADER_SIZE, DEC); @@ -219,13 +266,12 @@ void sendKnxTunnelHidReport(uint8_t* data, uint16_t length) Serial1.print(" "); } Serial1.println(""); -*/ +#endif - // We do not use reportId of the sendReport()-API here but instead provide it in the first byte of the buffer sendKnxHidReport(buffer, MAX_EP_SIZE); } -// Invoked when received SET_REPORT control request or +// Invoked when received SET_REPORT control request or via interrupt out pipe void handleKnxHidReport(uint8_t const* data, uint16_t bufSize) { if (bufSize!=MAX_EP_SIZE) @@ -236,7 +282,7 @@ void handleKnxHidReport(uint8_t const* data, uint16_t bufSize) { uint8_t packetLength = data[2]; -/* +#ifdef DEBUG_RX_HID_REPORT Serial1.print("RX HID report: len: "); Serial1.println(packetLength, DEC); @@ -248,7 +294,7 @@ void handleKnxHidReport(uint8_t const* data, uint16_t bufSize) Serial1.print(" "); } Serial1.println(""); -*/ +#endif if (data[3] == 0x00 && // Protocol version (fixed 0x00) data[4] == 0x08) // USB KNX Transfer Protocol Header Length (fixed 0x08)