#include "Adafruit_TinyUSB.h"
#include "KeyboardEx.h"
// Report ID
enum
{
RID_KEYBOARD = 1,
// RID_MOUSE,
RID_CONSUMER_CONTROL, // Media, volume etc ..
};
// HID report descriptor using TinyUSB's template
uint8_t const desc_hid_report[] =
{
//TUD_HID_REPORT_DESC_KEYBOARD(),
TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(RID_KEYBOARD) ),
//TUD_HID_REPORT_DESC_MOUSE ( HID_REPORT_ID(RID_MOUSE) ),
TUD_HID_REPORT_DESC_CONSUMER( HID_REPORT_ID(RID_CONSUMER_CONTROL) )
};
Adafruit_USBD_HID usb_hid;
// --------------------------------------------------------------------------
// permet de passer un tableau en mémoire Flash en argument
// voir ici https://forum.arduino.cc/index.php?topic=110307.0
#define FS(x) (const __FlashStringHelper*)(x)
const char chaine_Clavier_FR[] PROGMEM = {" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€£¤§¨°²µÀÂÃÄÈÊËÌÎÏÑÒÔÕÖÙÛÜàâãäçèéêëìîïñòôõöùûüÿ"};
char francais[] = {"Français"};
const String string_Clavier_FR = {" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€£¤§¨°²µÀÂÃÄÈÊËÌÎÏÑÒÔÕÖÙÛÜàâãäçèéêëìîïñòôõöùûüÿ"};
// Fonctionnera sur Wordpad mais pas sur Notepad pour les caractères unicodes
// Décommenter KeyboardEx.setOS(Windows); et la fonction de test dans la loop()
String emoji = {"� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �"};
void setup() {
usb_hid.setPollInterval(2);
usb_hid.setReportDescriptor(desc_hid_report, sizeof(desc_hid_report));
usb_hid.setReportCallback(get_report_callback , hid_report_callback);
usb_hid.begin();
KeyboardEx.begin(usb_hid, RID_KEYBOARD);
// KeyboardEx.setOS(Windows); // Si vous êtes sur Windows, permet l'utilisation des Alt Codes.
// KeyboardEx.setDelay(5); // valeur par défaut, si problème augmenter la valeur à 10.
// Commenter ces lignes si vous n'utilisez oas le port série
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB
}
delay(6000);
}
void loop() {
static int oneloop = 0;
unsigned int totalCaractere;
byte ret = 1;
// n'aime pas le while(1)
if (!oneloop) {
oneloop = 1;
// **************************************************************************************
// Test 1 de la fonction -> KeyboardEx.print(ln)(...)
// **************************************************************************************
KeyboardEx.println(F("*** Test 1 de la fonction -> KeyboardEx.print(ln)(...) ***"));
// Décommenté KeyboardEx.setOS(Windows); pour que cela fonctionne
// totalCaractere = KeyboardEx.println(emoji);
// KeyboardEx.print("Nombre de caractères de la chaine: ");
// KeyboardEx.println(totalCaractere);
// KeyboardEx.println();
delay(1000);
totalCaractere = KeyboardEx.println(F("Chaine placée en mémoire flash"));
KeyboardEx.print("Nombre de caractères de la chaine: ");
KeyboardEx.println(totalCaractere);
KeyboardEx.println();
delay(1000);
totalCaractere = KeyboardEx.println(FS(chaine_Clavier_FR));
KeyboardEx.print("Nombre de caractères de la chaine: ");
KeyboardEx.println(totalCaractere);
KeyboardEx.println();
delay(1000);
totalCaractere = KeyboardEx.println(francais);
KeyboardEx.print("Nombre de caractères de la chaine: ");
KeyboardEx.println(totalCaractere);
KeyboardEx.println();
delay(1000);
totalCaractere = KeyboardEx.println(string_Clavier_FR );
KeyboardEx.print("Nombre de caractères de la chaine: ");
KeyboardEx.println(totalCaractere);
KeyboardEx.println();
delay(1000);
ret = KeyboardEx.println(-123456789);
KeyboardEx.print("Retour de la fonction: ");
KeyboardEx.println(ret);
KeyboardEx.println();
delay(1000);
ret = KeyboardEx.println(-12.22);
KeyboardEx.print("Retour de la fonction: ");
KeyboardEx.println(ret);
KeyboardEx.println();
delay(1000);
KeyboardEx.setPrecision(4); // 4 chiffres après la virgule
KeyboardEx.setNotation(','); // La virgule au lieu du point
ret = KeyboardEx.println(-12.22);
KeyboardEx.print("Retour de la fonction: ");
KeyboardEx.println(ret);
KeyboardEx.println();
usb_hid.sendReport16(RID_CONSUMER_CONTROL, HID_USAGE_CONSUMER_VOLUME_INCREMENT);
delay(10);
usb_hid.sendReport16(RID_CONSUMER_CONTROL, 0);
KeyboardEx.end();
}
}
uint16_t get_report_callback (uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen)
{
// Mettre Null à la place de get_report_callback dans cette fonction ci- dessous déclarée plus haut
// si vous souhaitez supprmer cette procédure
// usb_hid.setReportCallback(get_report_callback , hid_report_callback) -> usb_hid.setReportCallback(Null , hid_report_callback);
// not used in this example
return 0;
}
// Output report callback for LED indicator such as Caplocks
void hid_report_callback(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize)
{
uint8_t ledIndicator;
// LED indicator is output report with only 1 byte length
if ( report_type != HID_REPORT_TYPE_OUTPUT ) return;
// KEYBOARD_LED_KANA (8) | KEYBOARD_LED_COMPOSE (3) | KEYBOARD_LED_SCROLLLOCK (4) | KEYBOARD_LED_CAPSLOCK (2) | KEYBOARD_LED_NUMLOCK (1)
// buffer[0] si clavier seul
// ou buffer[1] si plusieurs reports
if (bufsize == 2) {
ledIndicator = buffer[1];
} else {
ledIndicator = buffer[0];
}
// Allumer la led de la carte si CAPSLOCK (verrouillage des majuscule) est activé
// La led ne s'allumera pas sur Adafruit QT py car c'est une Neopixel
// mais sur un Seeeduino XIAO ok
digitalWrite(LED_BUILTIN, !(ledIndicator & KEYBOARD_LED_CAPSLOCK));
}