GyverLibs / EasyHID

Библиотека программного USB клавиатуры и мыши для Arduino Nano/UNO/Mega и прочих
MIT License
113 stars 23 forks source link

Вставка текста на русском языке #22

Closed kraa965 closed 7 months ago

kraa965 commented 1 year ago

Привет, подскажите, как можно реализовать вставку русского текста, в видео выводился английский?

GyverLibs commented 1 year ago

Alt+Shift?

kraa965 commented 1 year ago

я имею ввиду через print("Привет"), вместо привет, он выдает символы и другие буквы

GyverLibs commented 1 year ago

Ну он и не должен выдавать русские, это ведь клавиатура. Нужно переключить язык и писать английскими, которые соответствуют русским

kraa965 commented 1 year ago

Ну он и не должен выдавать русские, это ведь клавиатура. Нужно переключить язык и писать английскими, которые соответствуют русским

Получается, надо написать print("Ghbdtn"), переключить клаву и будет все по-русски. А если надо передать текст из веб, ввожу в поле русский текст, а выдаются просто символы, как бы в таком случае?

GyverLibs commented 1 year ago

Надо писать свой парсер, который будет вытаскивать русские буквы из текста, переводить их в англ согласно qwerty раскладке, формировать строку и отправлять в принт. А если текст смешанный русско-англ - переключать язык, выдерживать паузу, но опять же обратной связи по языку нет, можно сбиться

GyverLibs commented 1 year ago

Можно посмотреть как парсит библиотека gyveroled, там все русские буквы обрабатываются

kraa965 commented 1 year ago

Можно посмотреть как парсит библиотека gyveroled, там все русские буквы обрабатываются

Есть же еще библиотека GParser, она может помочь?

GyverLibs commented 1 year ago

Gparser разбивает текст на куски по заданному символу-разделителю

kraa965 commented 1 year ago

Gparser разбивает текст на куски по заданному символу-разделителю

Видимо долблюсь в глаза, не нашел в gyverOLED парсер, подскажите где она?

GyverLibs commented 1 year ago

Со строки 275 по 285 https://github.com/GyverLibs/GyverOLED/blob/main/src/GyverOLED.h

И дальше внизу функция getFont разбирает в таблицу

GyverLibs commented 1 year ago

Я могу закодить, но через несколько дней

kraa965 commented 1 year ago

Я могу закодить, но через несколько дней

буду очень сильно признателен в целом у меня работает вывод русского текста, я объединил библиотеку https://github.com/T-vK/ESP32-BLE-Keyboard и https://github.com/MichaelDworkin/Arduino-USB-Macro-Keyboard-Russian Но проблема в том, если я хочу после текста поставить Enter(Return) объединенная библиотека вместо Enter(Return) выводит "а", хотелось бы доработать таким образом, чтобы она затрагивала только буквенные символы, это можно как-то реализовать?

GyverLibs commented 1 year ago

Вот так можно преобразовать русскую строку в QWERTY

const char _qwerty_ru[] PROGMEM = "F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z~`";

String ru_to_qw(const String& ru) {
  String qw;
  uint8_t prev = 0;
  for (int i = 0; i < ru.length(); i++) {
    uint8_t cur = ru[i];
    if (cur > 127) {
      uint8_t thiscur = cur;
      if (cur > 191) cur = 0;
      else if (prev == 209 && cur == 145) cur = 193;   // ё
      else if (prev == 208 && cur == 129) cur = 192;   // Ё
      prev = thiscur;
    }
    if (!cur) continue;

    if (cur <= 127) {
      qw += (char)cur;
      continue;
    }
    else if (cur <= 143) cur -= 80;
    else if (cur <= 191) cur -= 144;
    else cur -= 128;
    qw += (char)pgm_read_byte(&_qwerty_ru[cur]);
  }
  return qw;
}

void setup() {
  Serial.begin(115200);
  Serial.println(ru_to_qw("Привет")); // Ghbdtn
}

void loop() {
}
kraa965 commented 1 year ago

Вот так можно преобразовать русскую строку в QWERTY

const char _qwerty_ru[] PROGMEM = "F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z~`";

String ru_to_qw(const String& ru) {
  String qw;
  uint8_t prev = 0;
  for (int i = 0; i < ru.length(); i++) {
    uint8_t cur = ru[i];
    if (cur > 127) {
      uint8_t thiscur = cur;
      if (cur > 191) cur = 0;
      else if (prev == 209 && cur == 145) cur = 193;   // ё
      else if (prev == 208 && cur == 129) cur = 192;   // Ё
      prev = thiscur;
    }
    if (!cur) continue;

    if (cur <= 127) {
      qw += (char)cur;
      continue;
    }
    else if (cur <= 143) cur -= 80;
    else if (cur <= 191) cur -= 144;
    else cur -= 128;
    qw += (char)pgm_read_byte(&_qwerty_ru[cur]);
  }
  return qw;
}

void setup() {
  Serial.begin(115200);
  Serial.println(ru_to_qw("Привет")); // Ghbdtn
}

void loop() {
}

Спасибо) Вечером попробую

Есть еще такая наработка, чтобы буквы конвертировались, но она у меня не работает Может 9наете в чем проблема?

void Keyboard_println(String text) {
  delay(200);
  String latinText = "";
  for (int i = 0; i < text.length(); i++) {
    char cyrillicChar = text.charAt(i);
    char latinChar;

    switch (cyrillicChar) {
      case 'а':
        latinChar = 'f';
        break;
      case 'б':
        latinChar = ',';
        break;
      // add the rest of the symbols and their correspondences here
      default:
        // If the symbol is not found, leave it unchanged.
        latinChar = cyrillicChar;
        break;
    }

    latinText += latinChar;
  }

  blekeyboard.println(latinText);
}
GyverLibs commented 1 year ago

она у меня не работает

она и не должна работать. Кириллица занимает больше одного байта, писать 'б' - уже некорректно, буква потеряна. Компилятор должен был об этом предупредить

kraa965 commented 1 year ago

Вот так можно преобразовать русскую строку в QWERTY

const char _qwerty_ru[] PROGMEM = "F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z~`";

String ru_to_qw(const String& ru) {
  String qw;
  uint8_t prev = 0;
  for (int i = 0; i < ru.length(); i++) {
    uint8_t cur = ru[i];
    if (cur > 127) {
      uint8_t thiscur = cur;
      if (cur > 191) cur = 0;
      else if (prev == 209 && cur == 145) cur = 193;   // ё
      else if (prev == 208 && cur == 129) cur = 192;   // Ё
      prev = thiscur;
    }
    if (!cur) continue;

    if (cur <= 127) {
      qw += (char)cur;
      continue;
    }
    else if (cur <= 143) cur -= 80;
    else if (cur <= 191) cur -= 144;
    else cur -= 128;
    qw += (char)pgm_read_byte(&_qwerty_ru[cur]);
  }
  return qw;
}

void setup() {
  Serial.begin(115200);
  Serial.println(ru_to_qw("Привет")); // Ghbdtn
}

void loop() {
}

Можно этот код под char* адаптировать?

GyverLibs commented 1 year ago

Естественно

kraa965 commented 1 year ago

Естественно

Подскажите как?

GyverLibs commented 1 year ago

Ну например так

const char _qwerty_ru[] PROGMEM = "F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z~`";

uint16_t ru_to_qw(const char* ru, char* qw) {
  uint16_t len = strlen(ru);
  uint16_t idx = 0;
  uint8_t prev = 0;
  for (int i = 0; i < len; i++) {
    uint8_t cur = ru[i];
    if (cur > 127) {
      uint8_t thiscur = cur;
      if (cur > 191) cur = 0;
      else if (prev == 209 && cur == 145) cur = 193;   // ё
      else if (prev == 208 && cur == 129) cur = 192;   // Ё
      prev = thiscur;
    }
    if (!cur) continue;

    if (cur <= 127) {
      qw[idx++] = (char)cur;
      continue;
    }
    else if (cur <= 143) cur -= 80;
    else if (cur <= 191) cur -= 144;
    else cur -= 128;
    qw[idx++] = (char)pgm_read_byte(&_qwerty_ru[cur]);
  }
  qw[idx] = 0;
  return idx;
}

void setup() {
  Serial.begin(115200);

  char* ru = "Привет";
  char qw[strlen(ru)];
  ru_to_qw(ru, qw);

  Serial.println(qw);  // Ghbdtn
}

void loop() {
}
kraa965 commented 1 year ago

Ну например так

const char _qwerty_ru[] PROGMEM = "F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z~`";

uint16_t ru_to_qw(const char* ru, char* qw) {
  uint16_t len = strlen(ru);
  uint16_t idx = 0;
  uint8_t prev = 0;
  for (int i = 0; i < len; i++) {
    uint8_t cur = ru[i];
    if (cur > 127) {
      uint8_t thiscur = cur;
      if (cur > 191) cur = 0;
      else if (prev == 209 && cur == 145) cur = 193;   // ё
      else if (prev == 208 && cur == 129) cur = 192;   // Ё
      prev = thiscur;
    }
    if (!cur) continue;

    if (cur <= 127) {
      qw[idx++] = (char)cur;
      continue;
    }
    else if (cur <= 143) cur -= 80;
    else if (cur <= 191) cur -= 144;
    else cur -= 128;
    qw[idx++] = (char)pgm_read_byte(&_qwerty_ru[cur]);
  }
  qw[idx] = 0;
  return idx;
}

void setup() {
  Serial.begin(115200);

  char* ru = "Привет";
  char qw[strlen(ru)];
  ru_to_qw(ru, qw);

  Serial.println(qw);  // Ghbdtn
}

void loop() {
}

Спасибо)