Adafruit Feather BLE / BLE Friend mouse buttons support
authorPriyadi Iman Nurcahyo <priyadi@priyadi.net>
Mon, 29 May 2017 11:17:21 +0000 (18:17 +0700)
committerPriyadi Iman Nurcahyo <priyadi@priyadi.net>
Mon, 29 May 2017 11:17:21 +0000 (18:17 +0700)
tmk_core/protocol/lufa/adafruit_ble.cpp
tmk_core/protocol/lufa/adafruit_ble.h
tmk_core/protocol/lufa/lufa.c

index fd6edd42cfdca65aba802216ec80cfbdacd02386..bee6bb2c193a68039700052856dde1045351ed9d 100644 (file)
@@ -87,6 +87,7 @@ struct queue_item {
     uint16_t consumer;
     struct __attribute__((packed)) {
       int8_t x, y, scroll, pan;
+      uint8_t buttons;
     } mousemove;
   };
 };
@@ -699,6 +700,22 @@ static bool process_queue_item(struct queue_item *item, uint16_t timeout) {
       strcpy_P(fmtbuf, PSTR("AT+BLEHIDMOUSEMOVE=%d,%d,%d,%d"));
       snprintf(cmdbuf, sizeof(cmdbuf), fmtbuf, item->mousemove.x,
           item->mousemove.y, item->mousemove.scroll, item->mousemove.pan);
+      if (!at_command(cmdbuf, NULL, 0, true, timeout)) {
+        return false;
+      }
+      strcpy_P(cmdbuf, PSTR("AT+BLEHIDMOUSEBUTTON="));
+      if (item->mousemove.buttons & MOUSE_BTN1) {
+        strcat(cmdbuf, "L");
+      }
+      if (item->mousemove.buttons & MOUSE_BTN2) {
+        strcat(cmdbuf, "R");
+      }
+      if (item->mousemove.buttons & MOUSE_BTN3) {
+        strcat(cmdbuf, "M");
+      }
+      if (item->mousemove.buttons == 0) {
+        strcat(cmdbuf, "0");
+      }
       return at_command(cmdbuf, NULL, 0, true, timeout);
 #endif
     default:
@@ -757,7 +774,7 @@ bool adafruit_ble_send_consumer_key(uint16_t keycode, int hold_duration) {
 
 #ifdef MOUSE_ENABLE
 bool adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll,
-                                  int8_t pan) {
+                                  int8_t pan, uint8_t buttons) {
   struct queue_item item;
 
   item.queue_type = QTMouseMove;
@@ -765,6 +782,7 @@ bool adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll,
   item.mousemove.y = y;
   item.mousemove.scroll = scroll;
   item.mousemove.pan = pan;
+  item.mousemove.buttons = buttons;
 
   while (!send_buf.enqueue(item)) {
     send_buf_send_one();
index b3bab3ca0997b6ebc8d8957bb331f6202218c8f5..036b7d14ea7da25bbc0f24f0f38feca3c780ea3b 100644 (file)
@@ -43,7 +43,7 @@ extern bool adafruit_ble_send_consumer_key(uint16_t keycode, int hold_duration);
  * The parameters are signed and indicate positive of negative direction
  * change. */
 extern bool adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll,
-                                         int8_t pan);
+                                         int8_t pan, uint8_t buttons);
 #endif
 
 /* Compute battery voltage by reading an analog pin.
index 3c4ad4b4d2a6ebf77c1d90db4fcdf6475608c10e..e3f8724e81c01586e16f1640c56c4e46a297e2d5 100644 (file)
@@ -669,7 +669,7 @@ static void send_mouse(report_mouse_t *report)
   if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) {
     #ifdef MODULE_ADAFRUIT_BLE
       // FIXME: mouse buttons
-      adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h);
+      adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h, report->buttons);
     #else
       bluefruit_serial_send(0xFD);
       bluefruit_serial_send(0x00);