|  |  |  | @ -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(); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |