// =============================================
// Samsung QB Series - Wisar Digital Setup
// ESP32-S3 DevKit N16R8 - USB HID Keyboard
// =============================================
// Navigates OSD menus to configure URL Launcher
// pointing to Wisar Digital signage platform.
// Plug ESP32 USB-C (OTG) port into QB display USB port.
// Display should be powered on at home/menu screen.
// =============================================
//
// =============================================
// AVAILABLE HID KEYS REFERENCE
// =============================================
//
// --- Modifier Keys ---
// KEY_LEFT_CTRL        KEY_RIGHT_CTRL
// KEY_LEFT_SHIFT       KEY_RIGHT_SHIFT
// KEY_LEFT_ALT         KEY_RIGHT_ALT
// KEY_LEFT_GUI         KEY_RIGHT_GUI        (Windows/Super/Cmd)
//
// --- Navigation Keys ---
// KEY_UP_ARROW         KEY_DOWN_ARROW
// KEY_LEFT_ARROW       KEY_RIGHT_ARROW
// KEY_HOME             KEY_END
// KEY_PAGE_UP          KEY_PAGE_DOWN
//
// --- Editing Keys ---
// KEY_BACKSPACE        KEY_TAB
// KEY_RETURN           (Enter)
// KEY_ESC
// KEY_INSERT           KEY_DELETE
// KEY_CAPS_LOCK        KEY_NUM_LOCK
// KEY_SCROLL_LOCK      KEY_PRINT_SCREEN
// KEY_PAUSE
//
// --- Function Keys ---
// KEY_F1   KEY_F2   KEY_F3   KEY_F4
// KEY_F5   KEY_F6   KEY_F7   KEY_F8
// KEY_F9   KEY_F10  KEY_F11  KEY_F12
// KEY_F13  KEY_F14  KEY_F15  KEY_F16
// KEY_F17  KEY_F18  KEY_F19  KEY_F20
// KEY_F21  KEY_F22  KEY_F23  KEY_F24
//
// --- Printable Characters ---
// Pass directly to write() or print():
//   Letters:  'a'-'z', 'A'-'Z'
//   Numbers:  '0'-'9'
//   Symbols:  '!','@','#','$','%','^','&','*','(',')'
//             '-','=','[',']','\\',';','\'',',','.','/','`'
//             '_','+','{','}','|',':','"','<','>','?','~'
//             ' ' (space)
//
// --- Modifier Combos ---
// Use press() for combos, e.g.:
//   Keyboard.press(KEY_LEFT_CTRL);
//   Keyboard.press('c');           // Ctrl+C
//   Keyboard.releaseAll();
//
// --- Menu / Media Keys (USBHIDConsumerControl) ---
// Requires #include "USBHIDConsumerControl.h"
// Not used in this sketch but available:
//   CONSUMER_CONTROL_VOLUME_INCREMENT
//   CONSUMER_CONTROL_VOLUME_DECREMENT
//   CONSUMER_CONTROL_MUTE
//   CONSUMER_CONTROL_PLAY_PAUSE
//   CONSUMER_CONTROL_STOP
//   CONSUMER_CONTROL_SCAN_NEXT
//   CONSUMER_CONTROL_SCAN_PREVIOUS
//   CONSUMER_CONTROL_BRIGHTNESS_INCREMENT
//   CONSUMER_CONTROL_BRIGHTNESS_DECREMENT
//   CONSUMER_CONTROL_POWER
//   CONSUMER_CONTROL_HOME
//   CONSUMER_CONTROL_BACK
//   CONSUMER_CONTROL_FORWARD
//   CONSUMER_CONTROL_REFRESH
//
// =============================================

#ifndef ARDUINO_USB_MODE
#error This ESP32 SoC has no Native USB interface
#elif ARDUINO_USB_MODE == 1
#error USB Mode must be set to "USB-OTG (TinyUSB)" in Tools menu
#endif

#include "USB.h"
#include "USBHIDKeyboard.h"


USBHIDKeyboard Keyboard;

// Delay between each character when typing strings (ms)
// Samsung TV is slow — 150ms per char prevents garbled input
const int CHAR_DELAY = 250;

// Delay between menu navigation steps (ms)
const int NAV_DELAY = 2000;

void slowType(const char* text) {
  while (*text) {
    Keyboard.write(*text);
    delay(CHAR_DELAY);
    text++;
  }
}

void pressKey(uint8_t key) {
  Keyboard.press(key);
  delay(50);
  Keyboard.releaseAll();
}

void setup() {
  Keyboard.begin();
  USB.begin();

  // Wait for USB HID enumeration
  delay(3000);

  // Navigate past initial screens
  pressKey(KEY_RETURN);
  delay(NAV_DELAY);
  pressKey(KEY_RETURN);
  delay(NAV_DELAY);
  pressKey(KEY_RETURN);
  delay(NAV_DELAY);

  // Menu navigation - select URL Launcher
  pressKey(KEY_DOWN_ARROW);
  delay(NAV_DELAY);
  pressKey(KEY_DOWN_ARROW);
  delay(NAV_DELAY);
  pressKey(KEY_RETURN);
  delay(3000);

  // Type Wisar Digital URL (slow, one char at a time)
  slowType("http://app.wisardigital.com/app");
  delay(NAV_DELAY);
  pressKey(KEY_RETURN);
  delay(NAV_DELAY);

  // Continue navigation
  pressKey(KEY_RIGHT_ARROW);
  delay(NAV_DELAY);

  // Navigate sub-menu
  pressKey(KEY_DOWN_ARROW);
  delay(NAV_DELAY);
  pressKey(KEY_DOWN_ARROW);
  delay(NAV_DELAY);
  pressKey(KEY_DOWN_ARROW);
  delay(NAV_DELAY);
  pressKey(KEY_RIGHT_ARROW);
  delay(NAV_DELAY);
  pressKey(KEY_RETURN);
  delay(NAV_DELAY);

  // Navigate to PIN entry
  pressKey(KEY_DOWN_ARROW);
  delay(NAV_DELAY);
  pressKey(KEY_DOWN_ARROW);
  delay(NAV_DELAY);
  pressKey(KEY_RETURN);
  delay(NAV_DELAY);

  // Enter PIN (000000000000)
  slowType("000000000000");
  delay(NAV_DELAY);
  pressKey(KEY_RETURN);
  delay(NAV_DELAY);

  // Done
  Keyboard.end();
}

void loop() {
  // One-shot payload — nothing to do
}
