Leonardo und Verwendung von Multimedia Keys

Halle,

ich arbeite derzeit wieder mal an einer Anwendung, welche Multimedia-Keys wie MUTE, PLAY etc. in Verbindung mit einem Arduino Leonardo verwenden soll. Vor einigen Jahren hatte ich ein vergleichbares Projekt und den Ansatz von Stefan Jones (IDE ~1.0.5) verwendt. Damals hat mich schon gestört, dass manuell in den Quellcode der Arduino Library eingegriffen wird.
Habe nun länglich recherchiert und bin auf keine zufriedenstellende Lösung getroffen - entweder wurde auf den Ansatz von Stefan Jones oder auf die HID Library NiceHood mit Austausch des Bootloader referenziert.
Den alten Ansatz wollte ich nicht - Filestruktur hat sich wohl auch geändert, daher habe ich keinen funktionierenden Ansatz gefunden - auf der anderen Seite will ich nur mit original Bootloader arbeiten.

Habe nun versucht den Ansatz von Stefan Jones in eine Lib "Remote.h/Remote.cpp" zu verpacken. Ein Demo mit Änderung der Lautstärke funktioniert mit einem Arduino Micro.

Wäre toll, wenn jemand mit Erfahrung über den Code schaut und ggf. Ergänzungen/Erweiterungen oder gar Fehler ermittelt bzw. einfügt.

Ich habe eine kleine Multimedia Tastatur (siehe Bild Anhang) und möchte nun ein paar Tasten der Tastatur mit dem Leonardo nachbilden. Funktion sind HOME, FORWARD, BACKWARD, etc.
Kann mir jemand sagen wie die Codes lauten, bzw. wie "Remote" weiterentwicklet werden muss.

Freue mich auf Antwort

Anmerkung: Remote.h/Remote.cpp liegen beim im Lib Verzeichnis vgl. Keyboard und Mouse

Gruß Arduin4Fun

Remote.h

//================================================================================
// https://stefanjones.ca/blog/arduino-leonardo-remote-multimedia-keys/
//================================================================================
//	Remote
//  Code from Stefan Jones 09.2013, Originally for Arduino IDE 1.0.5

#ifndef REMOTE_h
#define REMOTE_h

#include "HID.h"

#if !defined(_USING_HID)

#warning "Using legacy HID core (non pluggable)"

#else
 
#define REMOTE_CLEAR 		0
#define VOLUME_UP 			1
#define VOLUME_DOWN 		2
#define VOLUME_MUTE 		4
#define REMOTE_PLAY 		8
#define REMOTE_PAUSE 		16
#define REMOTE_STOP 		32
#define REMOTE_NEXT 		64
#define REMOTE_PREVIOUS 	128
#define REMOTE_FAST_FORWARD 256
#define REMOTE_REWIND 		512
 
class Remote_
{
private:
public:
	Remote_(void);
	void begin(void);
	void end(void);
 
	// Volume
	void increase(void);
	void decrease(void);
	void mute(void);
 
	// Playback
	void play(void);
	void pause(void);
	void stop(void);
 
	// Track Controls
	void next(void);
	void previous(void);
	void forward(void);
	void rewind(void);
 
	// Send an empty report to prevent repeated actions
	void clear(void);
};
extern Remote_ Remote;

#endif
#endif

Remote.cpp

//================================================================================
// https://stefanjones.ca/blog/arduino-leonardo-remote-multimedia-keys/
//================================================================================
//	Remote
//  Code from Stefan Jones 09.2013, Originally for Arduino IDE 1.0.5

#include "Remote.h"

#if defined(_USING_HID)

static const uint8_t _hidReportDescriptor[] PROGMEM = {

    /* Cross-platform support for controls found on IR Remotes */

    0x05, 0x0c,                    //	Usage Page (Consumer Devices)
    0x09, 0x01,                    //	Usage (Consumer Control)
    0xa1, 0x01,                    //	Collection (Application)
    0x85, 0x04,                    //	REPORT_ID (4)
    0x15, 0x00,                    //	Logical Minimum (0)
    0x25, 0x01,                    //	Logical Maximum (1)
    0x09, 0xe9,                    //	Usage (Volume Up)
    0x09, 0xea,                    //	Usage (Volume Down)
    0x75, 0x01,                    //	Report Size (1)
    0x95, 0x02,                    //	Report Count (2)
    0x81, 0x06,                    //	Input (Data, Variable, Relative)

    0x09, 0xe2,                    //	Usage (Mute)
    0x95, 0x01,                    //	Report Count (1)
    0x81, 0x06,                    //	Input (Data, Variable, Relative)

    0x09, 0xb0,                    //	Usage (Play)
    0x95, 0x01,                    //	Report Count (1)
    0x81, 0x06,                    //	Input (Data, Variable, Relative)

    0x09, 0xb1,                    //	Usage (Pause)
    0x95, 0x01,                    //	Report Count (1)
    0x81, 0x06,                    //	Input (Data, Variable, Relative)

    0x09, 0xb7,                    //	Usage (Stop)
    0x95, 0x01,                    //	Report Count (1)
    0x81, 0x06,                    //	Input (Data, Variable, Relative)

    0x09, 0xb5,                    //	Usage (Next)
    0x95, 0x01,                    //	Report Count (1)
    0x81, 0x06,                    //	Input (Data, Variable, Relative)

    0x09, 0xb6,                    //	Usage (Previous)
    0x95, 0x01,                    //	Report Count (1)
    0x81, 0x06,                    //	Input (Data, Variable, Relative)

    0x09, 0xb3,                    //	Usage (Fast Forward)
    0x95, 0x01,                    //	Report Count (1)
    0x81, 0x06,                    //	Input (Data, Variable, Relative)

    0x09, 0xb4,                    //	Usage (Rewind)
    0x95, 0x01,                    //	Report Count (1)
    0x81, 0x06,                    //	Input (Data, Variable, Relative)

    0x95, 0x06,                    //	Report Count (6) Number of bits remaining in byte
    0x81, 0x07,                    //	Input (Constant, Variable, Relative) 
    0xc0                           //	End Collection
};
 
Remote_::Remote_(void)
{
  static HIDSubDescriptor node(_hidReportDescriptor, sizeof(_hidReportDescriptor));
  HID().AppendDescriptor(&node);
}
 
void Remote_::begin(void) 
{
}
 
void Remote_::end(void) 
{
}
 
void Remote_::increase(void)
{
	u8 m[2];
	m[0] = VOLUME_UP;
	m[1] = 0;
	HID().SendReport(4,m,2);
}
 
void Remote_::decrease(void)
{
	u8 m[2];
	m[0] = VOLUME_DOWN;
	m[1] = 0;
	HID().SendReport(4,m,2);
}
 
void Remote_::mute(void)
{
	u8 m[2];
	m[0] = VOLUME_MUTE;
	m[1] = 0;
	HID().SendReport(4,m,2);
}
 
void Remote_::play(void)
{
	u8 m[2];
	m[0] = REMOTE_PLAY;
	m[1] = 0;
	HID().SendReport(4,m,2);
}
 
void Remote_::pause(void)
{
	u8 m[2];
	m[0] = REMOTE_PAUSE;
	m[1] = 0;
	HID().SendReport(4,m,2);
}
 
void Remote_::stop(void)
{
	u8 m[2];
	m[0] = REMOTE_STOP;
	m[1] = 0;
	HID().SendReport(4,m,2);
}
 
void Remote_::next(void)
{
	u8 m[2];
	m[0] = REMOTE_NEXT;
	m[1] = 0;
	HID().SendReport(4,m,2);
}
 
void Remote_::previous(void)
{
	u8 m[2];
	m[0] = REMOTE_PREVIOUS;
	m[1] = 0;
	HID().SendReport(4,m,2);
}
 
void Remote_::forward(void)
{
	u8 m[2];
	m[0] = 0;
	m[1] = REMOTE_FAST_FORWARD >> 8;
	HID().SendReport(4,m,2);
}
 
void Remote_::rewind(void)
{
	u8 m[2];
	m[0] = 0;
	m[1] = REMOTE_REWIND >> 8;
	HID().SendReport(4,m,2);
}
 
void Remote_::clear(void)
{
	u8 m[2];
	m[0] = 0;
	m[1] = 0;
	HID().SendReport(4,m,2);
}

Remote_ Remote;

#endif

Demo

#include<Remote.h>
/* 
   Sample sketch for Multimedia Keys
   https://stefanjones.ca/blog/arduino-leonardo-remote-multimedia-keys/
*/
void setup() { 
}
 
void loop() 
{
  int i;
  
 for(i=0;i<10;i++)
 {
    Remote.increase();
    Remote.clear(); 
    delay(1000); 
  }
 for(i=0;i<10;i++)
 {
    Remote.decrease();
    Remote.clear(); 
    delay(1000); 
  }
}

Definierte Tasten gibt es ja viele - aber wie kann ich sie mit Leonardo/Micro nachbilden?