Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ Плагины и доп. ПО _ Pilot + Arduino (Hardware clicker)

Автор: yamenko 7.3.2020, 19:21

Добрый день.
Хочу представить вам аппаратный кликер на базе UOpilot.
Для начала вам необходима будет плата Arduino micro (Arduino Leonardo) обязательно с чипом Atmega 32u4. Другие не подойдут, так как не определяются системой как HID устройство, и придется долго настраивать аппаратную и программную составляющую.
Можете выбрать следующие:
https://ibb.co/hLmLr5Rhttps://ibb.co/7rkKYkb
Как только вы заполучили свою новую плату, скачиваем и устанавливаем последнюю версию Arduino IDE с офф. сайта Arduino.cc
https://ibb.co/QfqZrpJ
Пробуем подключить, она должна у вас определится в устройствах как Mikro или Leonardo.
https://imgbb.com/
Если не появляется, тогда устанавливаем драйвера, для не оригинальных плат с алиэкспресс нужен спец драйвер CH340 (ch341ser), пробуйте с разных сайтов, даже с одинаковым названием, они почему-то разные.
https://all-arduino.ru/drajver-ch340g-dlya-arduino/
Запоминаем СОМ порт!
Открываем Arduino IDE
Настраиваем нашу плату:
https://ibb.co/GTVBQYnhttps://ibb.co/d7tpsqv
Закидываем скретч отсюда: https://forum.uokit.com/index.php?s=&showtopic=70140&view=findpost&p=436373

устаревший скетч с ошибкой. Используйте скетч из ссылки выше.
Код
#include <Keyboard.h>
int i = 0;
int trigerKey = 0;
int lengthStr = 0;
int key[20];
int tmDelayValue;
String tmDelayStr;

void setup() {
  Serial.begin(9600);
  Keyboard.begin();
}

void loop() {
  // Собираем информацию из порта
  while (Serial.available()) {
    key[i++] = Serial.read();
    delay(5);
  }
  // Триггер, что данные пришли
  if (i != 0 && lengthStr == 0){
    lengthStr = i;
    i = 0;
  }
  
  if (lengthStr != 0){
    
    for (i = 0; i <= lengthStr; i++){
      delay(5);
//Находим задержку с которой необходимо нажимать кнопки
      if (trigerKey == 0){
        if (key[i] == 124){
          tmDelayValue = tmDelayStr.toInt();
          trigerKey = 1;
          i++;
        }
        else {
          tmDelayStr += char (key[i]);
        }
      }

//Находим и нажимаем спец кнопки если необходимо
      if (trigerKey == 1){
        if (key[i] == 94){Keyboard.press(KEY_LEFT_CTRL);}    //94 - символ "^"
        if (key[i] == 64){Keyboard.press(KEY_LEFT_ALT);}     //64 - символ "@"
        if (key[i] == 126){Keyboard.press(KEY_LEFT_SHIFT);}  //126 - символ "~"
        if (key[i] == 124){trigerKey = 2; i++;}              //124 - символ "|"
      }

//Нажимаем по очереди остальные кнопки с задержкой
      if (trigerKey == 2){
        delay(tmDelayValue);
        Keyboard.print(char (key[i]));
      }
    }
// Сбрасываем все
    Keyboard.releaseAll();
    i = 0;
    trigerKey = 0;
    lengthStr = 0;
    tmDelayStr = "";
  }
}

заливаем его в плату.
https://ibb.co/kBJ5PKt
Должно написать «Загрузка завершена»

Теперь переходим в Пилот
Добавляем функцию
Код
--lua
local function sendKey (symbol)
    file = io.open("COM7","w")  --меняем только номер COM порта, остальное не трогаем
    file:write(symbol)
    file:close()
end

Пользоваться так: sendKey ("1000|^|axv")
пишем в кавычках
1. До первой вертикальной черты это задержка между каждым нажатием кнопок в мс.
2. После первой черты и до второй это спец символы (~@^, такие как настроены в Пилоте, другие не используйте так как ничего все равно работать не будет), если символы не нужны просто удалите их, 2 вертикальные черты обязательны!!!
3. Набор символов которые необходимо нажать (каждая кнопка будет нажиматься через заданный интервал), русские символы не работают!!!
PS в данном примере CTRL+a, CTRL+x, CTRL+v, это чтобы вы могли проверить правильно ли работает или нет.

Автор: cirus 8.3.2020, 11:50

Прикрепленный файл  arduino.zip ( 7,07 килобайт ) Кол-во скачиваний: 805

Начало

Arduino позволяет эмулировать нажатия клавиш клавиатуры и мыши, в том числе в приложениях, которые блокируют нажатия.
Может поворачивать камеру в шутерах и играх, в которых камера поворачивается с зажатой правой кнопкой мыши.
Работает только с активным окном.

Пилот версии 2.41 или выше. Запускать от администратора.
Извлечь архив, файл arduino.lua закинуть в папку, где находится exe пилота. Скетч загрузить в ардуино.
Для работы функций мыши нужно в настройках мыши снять галочку 'Включить повышенную точность установки указателя'.
В функцию get_port (2341, 8036) нужно передавать vid и pid ардуино. Узнать их можно в Arduino IDE, пункт меню 'Инструменты', 'Получить информацию о плате'.
При переполнении буфера, хотя такого не должно быть, 3 секунды будет гореть встроенный светодиод L. В этом случае нужно увеличить паузы между нажатиями клавиш мыши/клавиатуры.
Все координаты в командах мыши указывать абсолютные, т. е. относительно левого верхнего угла экрана.

Список функций

get_port (vid, pid) -- узнать в каком com порте находится ардуино

set_delay_key (ms) -- установить задержку нажатий клавиатуры
set_delay_mouse (ms) -- установить задержку нажатий мыши
set_delay_mousemove(ms) -- установить паузу в мсек между каждым шагом перемещения курсора, чем меньше, тем быстрее перемещается курсор
set_offset_mousemove(step) -- шаг перемещения курсора от 1 до 127, чем больше, тем быстрее перемещается курсор.
set_random_delay_key(random) -- рандом от 0 до 9 мсек между нажатием и отпусканием клавиш клавиатуры
set_random_delay_mouse(random) -- рандом от 0 до 4 мсек между нажатием и отпусканием клавиш

key (code) -- нажать клавишу клавиатуры
text (text) -- отослать текст, в том числе русские символы
key_down (code) -- зажать (не отжимая) клавишу клавиатуры
key_up (code) -- отжать клавишу клавиатуры

mouse.move (x, y) -- переместить мышь
mouse.click (x, y, button) -- кликнуть мышью, button должен содержать код клавиши мыши
mouse.left (x, y) -- клик левой кнопкой
mouse.right (x, y) -- клик правой кнопкой
mouse.middle (x, y) -- клик средней кнопкой
mouse.dbl (x, y, button) -- двойной клик, button должен содержать код клавиши мыши
mouse.left_dbl (x, y) -- двойной клик левой кнопкой мыши
mouse.right_dbl (x, y) -- двойной клик правой кнопкой мыши
mouse.middle_dbl (x, y) -- двойной клик средней кнопкой мыши
mouse.down (x, y, button) -- зажать (не отжимая) кнопку мыши, button должен содержать код клавиши мыши
mouse.left_down (x, y) -- зажать (не отжимая) левую кнопку мыши
mouse.right_down (x, y) -- зажать (не отжимая) правую кнопку мыши
mouse.middle_down (x, y) -- зажать (не отжимая) среднюю кнопку мыши
mouse.up (x, y, button) -- отжать кнопку мыши, button должен содержать код клавиши мыши
mouse.left_up (x, y) -- отжать левую кнопку мыши
mouse.right_up (x, y) -- отжать правую кнопку мыши
mouse.middle_up (x, y) -- отжать среднюю кнопку мыши
mouse.drag (x, y, x2, y2) -- зажать левую кнопку мыши в точке x y, переместить в точку x2 y2
mouse.wheel_up (x, y, count) -- прокручивание колёсика мыши вверх, count - насколько щелчков прокрутить
mouse.wheel_down (x, y, count) -- прокручивание колёсика мыши вниз, count - насколько щелчков прокрутить

Список многосимвольных клавиш

mouse_left_button = 1
mouse_right_button = 2
mouse_middle_button = 4

left_ctrl = 0x80
left_shift = 0x81
left_alt = 0x82
left_gui = 0x83
right_ctrl = 0x84
right_shift = 0x85
right_alt = 0x86
right_gui = 0x87
up_arrow = 0xDA
down_arrow = 0xD9
left_arrow = 0xD8
right_arrow = 0xD7
backspace = 0xB2
tab = 0xB3
enter = 0xB0
esc = 0xB1
insert = 0xD1
delete = 0xD4
page_up = 0xD3
page_down = 0xD6
home = 0xD2
["end"] = 0xD5
caps_lock = 0xC1
f1 = 0xC2
f2 = 0xC3
f3 = 0xC4
f4 = 0xC5
f5 = 0xC6
f6 = 0xC7
f7 = 0xC8
f8 = 0xC9
f9 = 0xCA
f10 = 0xCB
f11 = 0xCC
f12 = 0xCD
F1 = 0xC2
F2 = 0xC3
F3 = 0xC4
F4 = 0xC5
F5 = 0xC6
F6 = 0xC7
F7 = 0xC8
F8 = 0xC9
F9 = 0xCA
F10 = 0xCB
F11 = 0xCC
F12 = 0xCD

Пример использования клавиатуры

Код
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
     end_script ()
end
hw.set_delay_key (20)     -- установить паузу между нажатиями клавиш клавиатуры
hw.set_random_delay_key(10)  -- установить рандом между нажатием и отпускание клавиш
-- т. е. между нажатием и отпусканием клавиши будет пауза от 20 до 29 мсек

wait (3000)    -- пауза 3 секунды чтобы переключиться на нужное окно
hw.key ('k')    -- нажать клавишу 'k'
hw.key (hw.enter)  -- нажать 'Enter'

wait (1000)   -- пауза 1 сек.

hw.key_down ('s')   -- зажать клавишу 's'
wait (3000)         -- пауза 3 сек., при этом клавиша будет зажата
hw.key_up ('s')     -- отпустить клавишу 's'
hw.key (hw.enter)   -- нажать 'Enter'

hw.text ('Hello Привет')  -- напечатать текст
hw.key ('V')    -- нажать Shift+'v'


Пример использования мыши
Код
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки
     end_script ()
end
hw.set_delay_mouse (20)   -- установить паузу между нажатиями клавиш мыши
hw.set_offset_mousemove(4)  -- шаг перемещения курсора
hw.set_random_delay_mouse(10)  -- установить рандом между нажатиями клавиш мыши
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.

hw.mouse.left (200, 100)      -- клик левой кнопкой мыши в координатах 200, 100
hw.mouse.right (200, 100)     -- клик правой кнопкой мыши
wait (3000)                   -- пауза 3 секунды
hw.mouse.left_dbl (35, 35)    -- двойной клик левой кнопкой мыши
wait (2000)
hw.mouse.left_down (200, 200) -- зажать левую кнопку мыши
wait(500)
hw.mouse.left_up (900, 300)   -- отпустить левую кнопку мыши


Автор: yamenko 8.3.2020, 19:26

Цитата(cirus @ 8.3.2020, 11:50) *

С этой штукой будет нажимать клавиши в обход gameguard, frost и прочих?

Надо так:
Код
file:close()



я не пробовал, по-идее нажимать будет не программа, а аппаратное устройство типа доп клавиатуры и других манипуляторов.
Было бы хорошо если бы кто то мог испытать smile.gif

PS отредактировал...

Автор: AK_sata 30.8.2020, 20:13

Прива
вопрос по поводу этого
Как только вы заполучили свою новую плату, скачиваем и устанавливаем последнюю версию Arduino IDE с офф. сайта Arduino.cc
это как делать програматором ?

Автор: cirus 30.8.2020, 22:02

Цитата
это как делать?

Перейти по ссылке https://www.arduino.cc/en/Main/Software и скачать софт.

Автор: DarkMaster 19.9.2020, 5:24

yamenko, памятник вам надо.

Автор: Crocotea 10.11.2020, 15:32

Купил приблуду, но клики не проходили
Благодаря DarkMaster'у все получилось
В самом компиляторе добавили key[i] и кликер заработал
//Находим задержку с которой необходимо нажимать кнопки
if (trigerKey == 0){
if (key[i] == 124){

Таким образом

Автор: DarkMaster 10.11.2020, 15:34

Цитата
В самом компиляторе добавили key[i] и кликер заработал

Ирония в том, что код оказался изначально рабочим, но codebox форума его убил. Сейчас хотел поправить пост, но если я открываю через модерку редактирование поста, то исходник до сих пор корректный без моих правок.

Автор: Crocotea 10.11.2020, 15:48

при запуске скрипта пилота, после нескольких запусков, начинает вписывать лишние символы. Либо с предыдущей редакции, либо рандомные

Запустил в пилоте sendKey ("11||r")
вывело r

поменял на sendKey ("11||rrr")
вывело rrrr

опять поменял на sendKey ("11||r")
вывело r0r

Также есть один момент. непосредственно в игру sendKey ("11||r") не реагирует. sendKey ("11||rrr") - реагирует, кнопка нажимается

так видео сделал. работает совсем некорректно

[+]

Автор: Crocotea 16.11.2020, 9:35

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

Автор: DarkMaster 16.11.2020, 10:24

интересна, но у меня есть дела и помимо нее. В частности на сях я пишу раз в несколько лет и понимая, что тут нужно делать, у меня в итоге уходит вагон времени просто для того, чтобы сломать вырабатонное мышление и стиль не подходящий для текущего языка. Если в 2 словах, то тут нет флага окончания клавиш. По уму тут парсер бы вообще переписать - все как-то через Ж.

Автор: Cockney 16.11.2020, 11:48

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

Развернуть

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.releaseAll();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++*curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++*curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[(*curPos)++])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}


// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[(*curPos)++] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
    }
    // пропускаем разделитель
    ++*curPos;
}


Автор: DarkMaster 16.11.2020, 15:53

Cockney, не будет ли правильным использовать какой-то символ для флага окончания передаваемых данных? Я понимаю, что тут 20 байт(хотя я бы увеличил пока памяти бы хватало, но тут железка нужна), но не может ли получиться ситуация, когда мы получим в буфер только кусок сообщения за попытку сбора данных из порта? Ту да же вопрос о слишком длинных (больше буфера) передачах. По сути это приведет к непредсказуемым последствиям, до выставления задержки диких размеров и переподключения устройства.

Автор: Cockney 16.11.2020, 16:20

Да можно все, разумеется. У меня нет ни устройства ни знаний особых в этой области, могу только рефакторить на свое усмотрение. В продвинутых версиях таких кликеров есть даже защита в виде светового диода в корпусе, который сообщает что буфер забит и новые или старые данные проглатываются.


А вообще ответ есть в самом вопросе

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


Может тогда и не надо ? Не думаю что строки больше 64 символов часто отправляются в защищенные приложения.

Автор: Crocotea 17.11.2020, 15:04

Цитата(Cockney @ 16.11.2020, 11:48) *

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

Развернуть

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.release();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[*curPos++])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}
// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[*curPos++] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
    }
    // пропускаем разделитель
    ++curPos;
}




Так результат по парсингу
Пишет ошибку в строчке Keyboard.release(); (скрин приложил)




Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: Cockney 17.11.2020, 15:14

Цитата(Crocotea @ 17.11.2020, 15:04) *

Так результат по парсингу
Пишет ошибку в строчке Keyboard.release(); (скрин приложил)



поправил

Автор: Crocotea 17.11.2020, 17:36

Цитата(Cockney @ 17.11.2020, 15:14) *

поправил


Так попробовал и записал видосик
[+]

Автор: Cockney 17.11.2020, 18:37

Очередная правка, выношу код сюда, ибо старый пост сломался и не отображает правленый код

Версия №3

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.releaseAll();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++*curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++*curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[(*curPos)++])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}


// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[(*curPos)++] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
    }
    // пропускаем разделитель
    ++*curPos;
}


Автор: Crocotea 17.11.2020, 18:45

Цитата(Cockney @ 17.11.2020, 18:37) *

Очередная правка, выношу код сюда, ибо старый пост сломался и не отображает правленый код

Версия №3

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.releaseAll();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++*curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++*curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[(*curPos)++])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}
// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[(*curPos)++] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
    }
    // пропускаем разделитель
    ++*curPos;
}





кликер реагирует, индикаторы моргают, но реакции ноль. ничего не вводится из скрипта в предыдущем видео
Спустя некоторое время пилот перестает отвечать и вылетает(

Автор: Cockney 18.11.2020, 12:50

Версия №4

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(&buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(&buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.releaseAll();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++*curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++*curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[*curPos])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}


// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[*curPos] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
        // следующий байт
        ++*curPos;
    }
    // пропускаем разделитель
    ++*curPos;
}


Автор: Crocotea 18.11.2020, 17:30

Цитата(Cockney @ 18.11.2020, 12:50) *

Версия №4

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(&buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(&buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.releaseAll();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++*curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++*curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[*curPos])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}
// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[*curPos] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
        // следующий байт
        ++*curPos;
    }
    // пропускаем разделитель
    ++*curPos;
}




Такс, новый видосик теста. нестабильно работает с 1:20
[+]


Автор: DarkMaster 18.11.2020, 18:15

Предлагаю в:

Код
--lua
local function sendKey (symbol)
    file = io.open("COM7","w")  --меняем только номер COM порта, остальное не трогаем
    file:write(symbol)
    file:close()
end

Допилить до
Код
file:write(symbol .. string.char(0))

И ловить этот 0x0 с чистой совесть и закрывать очередь.
Есть еще один коронный вариант - изменить синтаксис до:
|задержка| -- для установки задержки. Нафига ее каждый раз отправлять то?
Все остальное тупо отправлять и в вызове из пилота указывать только полезную нагрузку. ~@^ заменять на соответсвующие управляющие клавиши. Предыдущий символ хранить в отдельной переменной и если он равен "\" игнорить замену.
При таком раскладе оно хотя бы ожидаемо вести себя будет =)

Автор: Cockney 18.11.2020, 18:35

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


Можно попробовать ловить \0, но мне кажется что не все так очевидно.

Автор: DarkMaster 18.11.2020, 18:56

Оно просто в буффер накидывает быстрее, чем ты считываешь и по фактку получается буфере строка:
"100||4100||s"
и так далее. Он и ведет себя соответственно. Без флагов завершения ты никак это не отловишь нормально имхо.
Ну хотя бы получив такую бяку в буфер где ты будешь разбивать на куски? Ладно еще 4100, а если там будет 1234? Сколько задержка? 234? 34? 4?
Одиночные 4 и s он отправляет корректно просто потому, что там есть магический wait(100) внутри цикла и железка просто успевает выгрести весь буфер.

Crocotea, рекомендую на досуге поразвлекаться с SERIAL_READ_DELAY в сторону уменьшения. Это может снизить задержку отправки нажатий, которая зачастую вредит скорости реакции скрипта и его стабильности.

Автор: Cockney 18.11.2020, 19:15

Я вроде примерно тоже самое и описал. Мои соображения: сделать набор состояний и при считывании нового байта определять что с ним делать. Конечный автомат в общем. там и буффер тогда не потребуется. Ну если только под задержку. А дальше на лету будем отправлять все.

Автор: DarkMaster 18.11.2020, 19:21

Ну дык и я о том же.
Едиственное экран на всяких случай сделать - все равно примитив.

Автор: Crocotea 18.11.2020, 21:24

Цитата
Crocotea, рекомендую на досуге поразвлекаться с SERIAL_READ_DELAY в сторону уменьшения. Это может снизить задержку отправки нажатий, которая зачастую вредит скорости реакции скрипта и его стабильности.


sendKey ("1||4")
wait(100)
sendKey ("1||s")
wait(100)
sendKey ("1||dddddd")
wait(100)
sendKey ("1||f")

Так работает полностью корректно. Задержка через сам пилот не увеличивается, только через wait()

Автор: DarkMaster 18.11.2020, 21:45

Цитата
Задержка через сам пилот не увеличивается, только через wait()

ибо луа

Автор: Crocotea 19.11.2020, 0:50

Подскажите, при параллельном запуске 2 скриптов возникает такая ошибка
4: attempt to index global 'file' (a nil value)
--lua
local function sendKey (symbol)
file = io.open("COM5","w") --меняем только номер COM порта, остальное не трогаем
file:write(symbol)
file:close()

Как ее исправить?

А кстати, как нижимать клавиши esc, space, f1,f2...?

Автор: DarkMaster 19.11.2020, 2:29

Цитата
А кстати, как нижимать клавиши esc, space, f1,f2...?

Скан коды клавиш для этого нужно смотреть. Ну и дальше 0xЦИФЕРКА
Цитата
Подскажите, при параллельном запуске 2 скриптов возникает такая ошибка
4: attempt to index global 'file' (a nil value)
--lua
local function sendKey (symbol)
file = io.open("COM5","w") --меняем только номер COM порта, остальное не трогаем
file:write(symbol)
file:close()

А вот с этим уже гораздо сложнее. Насколько я помню открыть ком порт сразу в несколько потоков невозможно. Но даже если мы его откроем в несколько потоков, то в буфер у нас рано или поздо прилетит мешанина из двух команд в произвольном порядке. Правильный вариант тут сделующий и он вам не понравится:
Создаем третий скрипт, в нем открываем порт через luasocket, через открытый порт ловим N входящих соединений и создаем очередь отсылок в железку и потом уже отсылаем вот этим третьим скриптом через com. Причем в этом третьем скрипте нужно будет так же сделать парсер, но тут уже проще имхо. Т.е. смысл в том, что это будет делаться все равно в один поток, но скрипта будет два и для них все будет выглядеть прозрачно.

Автор: Crocotea 21.11.2020, 4:23

Цитата(DarkMaster @ 19.11.2020, 2:29) *

Скан коды клавиш для этого нужно смотреть. Ну и дальше 0xЦИФЕРКА


не работает sendKey ("100||0x1"), пробовал коды 0x1,0x01, 0x1B, 0x76, 0x81

да подскажи пж парсинг для работы в несколько скриптов. в 1 просто ужас как усложняет жизнь

И подскажите по есть ли возможность оптимизировать теперь работу?))
есть ряд очень важных моментов, которые хотелось бы как-нибудь по фиксить. т.к. из-за них пользоваться пилотом ну очень сложно. Если можно, то писать сюда?

Автор: DarkMaster 21.11.2020, 4:39

Цитата
sendKey ("100||0x1")

sendKey ("100||"..string.char (0x1))
как-то так
Цитата

да подскажи пж парсинг для работы в несколько скриптов. в 1 просто ужас как усложняет жизнь

Вот прям точно нужно?) Там не только парсер. Там еще клиент-сервер tcp нужно =)
Цитата
И подскажите по есть ли возможность оптимизировать теперь работу?))

Ну я жду фиксов от Cockney. Что там править еще есть. Если касательно именно оптимизации - я уже говорил, что можно покрутить задержи в сторону уменьшения. Там 5 по умолчанию. Я бы попробовал до 1 уменьшить.
Цитата
есть ряд очень важных моментов, которые хотелось бы как-нибудь по фиксить. т.к. из-за них пользоваться пилотом ну очень сложно. Если можно, то писать сюда?

Если касательно железки - сюда. Другие вопросы - создайте тему, вас никто за это не покусает)

Автор: Crocotea 21.11.2020, 5:18

Цитата(DarkMaster @ 21.11.2020, 4:39) *

sendKey ("100||"..string.char (0x1))
как-то так

Не работает прямо от слова совсем( подставил все те же цифеки
Цитата(DarkMaster @ 21.11.2020, 4:39) *

Вот прям точно нужно?) Там не только парсер. Там еще клиент-сервер tcp нужно =)

желательно) попытка не пытка. ну пока не так жизненно важно
Цитата(DarkMaster @ 21.11.2020, 4:39) *

Ну я жду фиксов от Cockney. Что там править еще есть. Если касательно именно оптимизации - я уже говорил, что можно покрутить задержи в сторону уменьшения. Там 5 по умолчанию. Я бы попробовал до 1 уменьшить.
Если касательно железки - сюда. Другие вопросы - создайте тему, вас никто за это не покусает)

Хорошо я тогда позже распишу. Просто сейчас работать работает, но в некоторый моментах приходится столько лишних действий делать

Автор: Cockney 22.11.2020, 2:18

Вообще не точно....
Теперь задержка указывается по дефолту в виде [<задержка>] в любом месте.
Как только встречаем @,^,~ - зажимаем контрольные кнопки
Так же работает экран для них и для скобок через которые указывается задержка.
Ну и проверка на \0 присутствует.

Версия №5

Код

#include <Keyboard.h>
#include <stdlib.h>


/* Настройки железки*/
#define MAX_BUFFER_SIZE 20 // Максимальный размер буффера
#define SERIAL_PORT 9600 // Порт
#define SERIAL_READ_DELAY 5 // Задержка считывания с порта
#define DEFAULT_SEND_DELAY 0 // Задержка нажатия клавиш по умолчанию


/* Кастомизация спец. символов */
#define SEND_DELAY_START_CHAR '['
#define SEND_DELAY_END_CHAR ']'
#define CONTROL_KEY_CTRL_CHAR '^'
#define CONTROL_KEY_ALT_CHAR '@'
#define CONTROL_KEY_SHIFT_CHAR '~'
#define ESCAPE_CHAR '\\'
#define EOF_CHAR '\0'


/* Ввод парсера (для построения матрицы) */
#define SEND_DELAY_START_INPUT 0
#define SEND_DELAY_END_INPUT 1
#define CONTROL_KEY_CTRL_INPUT 2
#define CONTROL_KEY_ALT_INPUT 3
#define CONTROL_KEY_SHIFT_INPUT 4
#define ESCAPE_CHAR_INPUT 5
#define CHAR_INPUT 6
#define DIGIT_INPUT 7
#define EOF_INPUT 8

#define MAX_INPUT_INDEX EOF_INPUT

/* Состояния парсера */
#define SEND_DELAY_INPUT 0 // начат ввод задержки ввода символов
#define ESCAPE_INPUT 1 // начат ввод управляющих клавиш
#define SEND_INPUT 2 // начат ввод обычных символов
#define SEND_END 3 // ввод окончен

#define MAX_STATE_INDEX SEND_END


/* Глобальные переменные */
int SEND_DELAY_VALUE = DEFAULT_SEND_DELAY; // задержка нажатия клавиш
char BUFFER[MAX_BUFFER_SIZE]; // буффер под задержку
int BUFFER_POS = 0; // позиция в буффере
char ESCAPE_CHAR_VALUE = '\0'; // сохраненный экран




// начать ввод задержки
int startSendDelayInput(char c) {
    return SEND_DELAY_INPUT;
}

// закончить ввод задержки и распарсить ее
int stopSendDelayInput(char c) {
    BUFFER[BUFFER_POS + 1] = '\0';
    SEND_DELAY_VALUE = atoi(BUFFER);
    BUFFER_POS = 0;
    return SEND_INPUT;
}

// запись в буффер
int storeChar(char c) {
    if (BUFFER_POS < MAX_BUFFER_SIZE - 2) {
        BUFFER[BUFFER_POS++] = c;
    }

    // возвращаем новое состояние парсера
    return SEND_DELAY_INPUT;
}

// отправка клавиши
int sendChar(char c) {
    delay(SEND_DELAY_VALUE);
    Keyboard.print(c);
    return SEND_INPUT;
}

// нажатие контрольной клавиши
int sendControlKey(char c) {
    switch (c)
    {
    case CONTROL_KEY_CTRL_CHAR:
        Keyboard.press(KEY_LEFT_CTRL);
        break;
    case CONTROL_KEY_ALT_CHAR:
        Keyboard.press(KEY_LEFT_ALT);
        break;
    case CONTROL_KEY_SHIFT_CHAR:
        Keyboard.press(KEY_LEFT_SHIFT);
        break;
    }
    return SEND_INPUT;
}

// обработка экрана
int processEscape(char c) {
    switch (c)
    {
    case SEND_DELAY_START_CHAR:
        sendChar(c);
        break;
    case SEND_DELAY_END_CHAR:
        sendChar(c);
        break;
    case CONTROL_KEY_CTRL_CHAR:
        sendChar(c);
        break;
    case CONTROL_KEY_ALT_CHAR:
        sendChar(c);
        break;
    case CONTROL_KEY_SHIFT_CHAR:
        sendChar(c);
        break;
    default: {
        // не можем экранировать
        sendChar(ESCAPE_CHAR_VALUE);
        sendChar(c);
    }
    }
    return SEND_INPUT;
}


// сохранение экрана
int storeEscapeChar(char c) {
    ESCAPE_CHAR_VALUE = c;
    return ESCAPE_INPUT;
}

// конец ввода
int stopSend(char c) {
    BUFFER_POS = 0;
    Keyboard.releaseAll();
    return SEND_END;
}



// матрица операций парсера
int(*PARSE_ACTION_MAP[MAX_STATE_INDEX + 1][MAX_INPUT_INDEX + 1])(char) = {
    // SEND_DELAY_INPUT ->
    { NULL, &stopSendDelayInput, NULL, NULL, NULL, NULL, NULL, &storeChar, &stopSend },
    // ESCAPE_INPUT ->
    { &processEscape, &processEscape, &processEscape, &processEscape, &processEscape, &processEscape, &processEscape, &processEscape, &stopSend },
    // SEND_INPUT ->
    { &startSendDelayInput, &sendChar, &sendControlKey, &sendControlKey, &sendControlKey, &storeEscapeChar, &sendChar, &sendChar, &stopSend },
    // SEND_END ->
    { &startSendDelayInput, &sendChar, &sendControlKey, &sendControlKey, &sendControlKey, &storeEscapeChar, &sendChar, &sendChar, &stopSend }
};



// классификатор вводимых символов
int getInput(char c) {
    switch (c)
    {
    case SEND_DELAY_START_CHAR:
        return SEND_DELAY_START_INPUT;
    case SEND_DELAY_END_CHAR:
        return SEND_DELAY_END_INPUT;
    case CONTROL_KEY_CTRL_CHAR:
        return CONTROL_KEY_CTRL_INPUT;
    case CONTROL_KEY_ALT_CHAR:
        return CONTROL_KEY_ALT_INPUT;
    case CONTROL_KEY_SHIFT_CHAR:
        return CONTROL_KEY_SHIFT_INPUT;
    case ESCAPE_CHAR:
        return ESCAPE_CHAR_INPUT;
    case EOF_CHAR:
        return EOF_INPUT;
    default:
        if (isdigit(c))
            return DIGIT_INPUT;
        else
            return CHAR_INPUT;
    }
}



void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // состояние парсера
    int parserState = SEND_END;

    // если буффер не пустой
    if (Serial.available()) {
        // читаем байт из потока
        char curChar = Serial.read();
        // определяем что пришло
        int input = getInput(curChar);
        // получаем действие
        int(*action)(char) = PARSE_ACTION_MAP[parserState][input];

        // если действие задано
        if (action != NULL)
            parserState = action(curChar);
    }
}


Автор: DarkMaster 22.11.2020, 4:17

Ну и предвосхищая возможные вопросы/проблемы рекомендую обновить функцию пилота:

Код
--lua
local function sendKey (symbol)
    file = io.open("COM7","w")  --меняем только номер COM порта, остальное не трогаем
    file:write(symbol..string.char (0x0))
    file:close()
end


Автор: cirus 22.11.2020, 4:34

Неплохо бы проверять открылся ли порт, если не откроется, то попытка закрыть приведёт к ошибке.

Код
--lua
local function sendKey (symbol)
    local file = io.open("COM7","w")  --меняем только номер COM порта, остальное не трогаем
    if file then
        file:write(symbol..string.char (0x0))
        file:close()
    end
end

Автор: DarkMaster 22.11.2020, 4:37

Цитата
Неплохо бы проверять открылся ли порт, если не откроется, то попытка закрыть приведёт к ошибке.

Тогда надо и возвращать ошибку и мониторить возврат на каждом вызове и останавливать скрипт, если была ошибка. Имхо уж пусть лучше сразу кританет, чем писать доп обвязку с теми же самыми еррорами.

Самое забавное будет с проверкой порта, когда человек будет отсылать и не пониммать а чего оно ваще не работает и что с этим делать) оно же тупо молчит, ерроров не пишет)

Автор: cirus 22.11.2020, 4:46

Цитата
Самое забавное будет с проверкой порта, когда человек будет отсылать и не пониммать а чего оно ваще не работает и что с этим делать) оно же тупо молчит, ерроров не пишет)

На плате лампочки мигают когда что-то приходит в порт или отправляется с него.

Автор: Crocotea 22.11.2020, 12:40

Цитата(cirus @ 22.11.2020, 4:34) *

Неплохо бы проверять открылся ли порт, если не откроется, то попытка закрыть приведёт к ошибке.
Код
--lua
local function sendKey (symbol)
    local file = io.open("COM7","w")  --меняем только номер COM порта, остальное не трогаем
    if file then
        file:write(symbol..string.char (0x0))
        file:close()
    end
end




оба работают исправно

Цитата(Cockney @ 22.11.2020, 2:18) *

Вообще не точно....
Теперь задержка указывается по дефолту в виде [<задержка>] в любом месте.
Как только встречаем @,^,~ - зажимаем контрольные кнопки
Так же работает экран для них и для скобок через которые указывается задержка.
Ну и проверка на \0 присутствует.

Версия №5

Код

#include <Keyboard.h>
#include <stdlib.h>
/* Настройки железки*/
#define MAX_BUFFER_SIZE 20 // Максимальный размер буффера
#define SERIAL_PORT 9600 // Порт
#define SERIAL_READ_DELAY 5 // Задержка считывания с порта
#define DEFAULT_SEND_DELAY 0 // Задержка нажатия клавиш по умолчанию
/* Кастомизация спец. символов */
#define SEND_DELAY_START_CHAR '['
#define SEND_DELAY_END_CHAR ']'
#define CONTROL_KEY_CTRL_CHAR '^'
#define CONTROL_KEY_ALT_CHAR '@'
#define CONTROL_KEY_SHIFT_CHAR '~'
#define ESCAPE_CHAR '\\'
#define EOF_CHAR '\0'
/* Ввод парсера (для построения матрицы) */
#define SEND_DELAY_START_INPUT 0
#define SEND_DELAY_END_INPUT 1
#define CONTROL_KEY_CTRL_INPUT 2
#define CONTROL_KEY_ALT_INPUT 3
#define CONTROL_KEY_SHIFT_INPUT 4
#define ESCAPE_CHAR_INPUT 5
#define CHAR_INPUT 6
#define DIGIT_INPUT 7
#define EOF_INPUT 8

#define MAX_INPUT_INDEX EOF_INPUT

/* Состояния парсера */
#define SEND_DELAY_INPUT 0 // начат ввод задержки ввода символов
#define ESCAPE_INPUT 1 // начат ввод управляющих клавиш
#define SEND_INPUT 2 // начат ввод обычных символов
#define SEND_END 3 // ввод окончен

#define MAX_STATE_INDEX SEND_END
/* Глобальные переменные */
int SEND_DELAY_VALUE = DEFAULT_SEND_DELAY; // задержка нажатия клавиш
char BUFFER[MAX_BUFFER_SIZE]; // буффер под задержку
int BUFFER_POS = 0; // позиция в буффере
char ESCAPE_CHAR_VALUE = '\0'; // сохраненный экран
// начать ввод задержки
int startSendDelayInput(char c) {
    return SEND_DELAY_INPUT;
}

// закончить ввод задержки и распарсить ее
int stopSendDelayInput(char c) {
    BUFFER[BUFFER_POS + 1] = '\0';
    SEND_DELAY_VALUE = atoi(BUFFER);
    BUFFER_POS = 0;
    return SEND_INPUT;
}

// запись в буффер
int storeChar(char c) {
    if (BUFFER_POS < MAX_BUFFER_SIZE - 2) {
        BUFFER[BUFFER_POS++] = c;
    }

    // возвращаем новое состояние парсера
    return SEND_DELAY_INPUT;
}

// отправка клавиши
int sendChar(char c) {
    delay(SEND_DELAY_VALUE);
    Keyboard.print(c);
    return SEND_INPUT;
}

// нажатие контрольной клавиши
int sendControlKey(char c) {
    switch (c)
    {
    case CONTROL_KEY_CTRL_CHAR:
        Keyboard.press(KEY_LEFT_CTRL);
        break;
    case CONTROL_KEY_ALT_CHAR:
        Keyboard.press(KEY_LEFT_ALT);
        break;
    case CONTROL_KEY_SHIFT_CHAR:
        Keyboard.press(KEY_LEFT_SHIFT);
        break;
    }
    return SEND_INPUT;
}

// обработка экрана
int processEscape(char c) {
    switch (c)
    {
    case SEND_DELAY_START_CHAR:
        sendChar(c);
        break;
    case SEND_DELAY_END_CHAR:
        sendChar(c);
        break;
    case CONTROL_KEY_CTRL_CHAR:
        sendChar(c);
        break;
    case CONTROL_KEY_ALT_CHAR:
        sendChar(c);
        break;
    case CONTROL_KEY_SHIFT_CHAR:
        sendChar(c);
        break;
    default: {
        // не можем экранировать
        sendChar(ESCAPE_CHAR_VALUE);
        sendChar(c);
    }
    }
    return SEND_INPUT;
}
// сохранение экрана
int storeEscapeChar(char c) {
    ESCAPE_CHAR_VALUE = c;
    return ESCAPE_INPUT;
}

// конец ввода
int stopSend(char c) {
    BUFFER_POS = 0;
    Keyboard.releaseAll();
    return SEND_END;
}
// матрица операций парсера
int(*PARSE_ACTION_MAP[MAX_STATE_INDEX + 1][MAX_INPUT_INDEX + 1])(char) = {
    // SEND_DELAY_INPUT ->
    { NULL, &stopSendDelayInput, NULL, NULL, NULL, NULL, NULL, &storeChar, &stopSend },
    // ESCAPE_INPUT ->
    { &processEscape, &processEscape, &processEscape, &processEscape, &processEscape, &processEscape, &processEscape, &processEscape, &stopSend },
    // SEND_INPUT ->
    { &startSendDelayInput, &sendChar, &sendControlKey, &sendControlKey, &sendControlKey, &storeEscapeChar, &sendChar, &sendChar, &stopSend },
    // SEND_END ->
    { &startSendDelayInput, &sendChar, &sendControlKey, &sendControlKey, &sendControlKey, &storeEscapeChar, &sendChar, &sendChar, &stopSend }
};
// классификатор вводимых символов
int getInput(char c) {
    switch (c)
    {
    case SEND_DELAY_START_CHAR:
        return SEND_DELAY_START_INPUT;
    case SEND_DELAY_END_CHAR:
        return SEND_DELAY_END_INPUT;
    case CONTROL_KEY_CTRL_CHAR:
        return CONTROL_KEY_CTRL_INPUT;
    case CONTROL_KEY_ALT_CHAR:
        return CONTROL_KEY_ALT_INPUT;
    case CONTROL_KEY_SHIFT_CHAR:
        return CONTROL_KEY_SHIFT_INPUT;
    case ESCAPE_CHAR:
        return ESCAPE_CHAR_INPUT;
    case EOF_CHAR:
        return EOF_INPUT;
    default:
        if (isdigit(c))
            return DIGIT_INPUT;
        else
            return CHAR_INPUT;
    }
}
void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // состояние парсера
    int parserState = SEND_END;

    // если буффер не пустой
    if (Serial.available()) {
        // читаем байт из потока
        char curChar = Serial.read();
        // определяем что пришло
        int input = getInput(curChar);
        // получаем действие
        int(*action)(char) = PARSE_ACTION_MAP[parserState][input];

        // если действие задано
        if (action != NULL)
            parserState = action(curChar);
    }
}




намного лучше работает. и пользоваться удобнее. спасибо

Цитата(DarkMaster @ 21.11.2020, 4:39) *

sendKey ("100||"..string.char (0x1))
как-то так


все также не работает((

Автор: Cockney 22.11.2020, 13:31

что именно не так работает ?

Автор: Crocotea 22.11.2020, 13:53

Цитата(Cockney @ 22.11.2020, 13:31) *

что именно не так работает ?


Стоит вопрос как нажимать клавиши f1,f2,esc,space и тд
Дарк подсказал через 0xЦиферка, но не але*(

Автор: DarkMaster 22.11.2020, 15:07

https://github.com/arduino-libraries/Keyboard/blob/master/src/Keyboard.h
попробуйте B1
Там походу hid коды.

Keyboard.h
Код
/*
  Keyboard.h
  Copyright (c) 2015, Arduino LLC
  Original code (pre-library): Copyright (c) 2011, Peter Barrett
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#ifndef KEYBOARD_h
#define KEYBOARD_h

#include "HID.h"

#if !defined(_USING_HID)

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

#else

// ================================================================================

// ================================================================================

//  Keyboard

#define KEY_LEFT_CTRL   0x80
#define KEY_LEFT_SHIFT    0x81
#define KEY_LEFT_ALT    0x82
#define KEY_LEFT_GUI    0x83
#define KEY_RIGHT_CTRL    0x84
#define KEY_RIGHT_SHIFT   0x85
#define KEY_RIGHT_ALT   0x86
#define KEY_RIGHT_GUI   0x87

#define KEY_UP_ARROW    0xDA
#define KEY_DOWN_ARROW    0xD9
#define KEY_LEFT_ARROW    0xD8
#define KEY_RIGHT_ARROW   0xD7
#define KEY_BACKSPACE   0xB2
#define KEY_TAB       0xB3
#define KEY_RETURN      0xB0
#define KEY_ESC       0xB1
#define KEY_INSERT      0xD1
#define KEY_DELETE      0xD4
#define KEY_PAGE_UP     0xD3
#define KEY_PAGE_DOWN   0xD6
#define KEY_HOME      0xD2
#define KEY_END       0xD5
#define KEY_CAPS_LOCK   0xC1
#define KEY_F1        0xC2
#define KEY_F2        0xC3
#define KEY_F3        0xC4
#define KEY_F4        0xC5
#define KEY_F5        0xC6
#define KEY_F6        0xC7
#define KEY_F7        0xC8
#define KEY_F8        0xC9
#define KEY_F9        0xCA
#define KEY_F10       0xCB
#define KEY_F11       0xCC
#define KEY_F12       0xCD
#define KEY_F13       0xF0
#define KEY_F14       0xF1
#define KEY_F15       0xF2
#define KEY_F16       0xF3
#define KEY_F17       0xF4
#define KEY_F18       0xF5
#define KEY_F19       0xF6
#define KEY_F20       0xF7
#define KEY_F21       0xF8
#define KEY_F22       0xF9
#define KEY_F23       0xFA
#define KEY_F24       0xFB


//  Low level key report: up to 6 keys and shift, ctrl etc at once
typedef struct
{
  uint8_t modifiers;
  uint8_t reserved;
  uint8_t keys[6];
} KeyReport;

class Keyboard_ : public Print
{
private:
  KeyReport _keyReport;
  void sendReport(KeyReport* keys);
public:
  Keyboard_(void);
  void begin(void);
  void end(void);
  size_t write(uint8_t k);
  size_t write(const uint8_t *buffer, size_t size);
  size_t press(uint8_t k);
  size_t release(uint8_t k);
  void releaseAll(void);
};
extern Keyboard_ Keyboard;

#endif
#endif

Автор: cirus 22.11.2020, 18:37

Архив распаковать, файл Arduino.lua положить в папку с пилотом Прикрепленный файл  Arduino.zip ( 2,34 килобайт ) Кол-во скачиваний: 488

Скетч в архиве.
Функции:

Цитата
delaykey(<ms>) - установить паузу между нажатиями клавиш клавиатуры
delaymouse(<ms>) - установить паузу между нажатиями клавиш мыши

ms - время в мсек.
Цитата
key(<code>) - нажать и отпустить клавишу клавиатуры, в том числе клавиши модификаторы
text (<text>) - напечатать текст
keydown (<code>) - зажать клавишу, в том числе клавиши модификаторы
keyup (<code>) - отпустить клавишу, в том числе клавиши модификаторы

code - код клавиши или константа
text - текст, который нужно напечатать
Цитата
mousemove (<x>, <y>) - переместить курсор мыши
mouse (<x>, <y>, [button]) - клик мыши
mousedbl (<x>, <y>, [button]) - двойной клик мыши
mousedown (<x>, <y>, [button]) - зажать кнопку мыши
mouseup (<x>, <y>, [button]) - отпустить кнопку мыши

x, y - абсолютные координаты, т. е. относительно левого верхнего угла экрана.
button - кнопка мыши, необязательный параметр, по умолчанию левая кнопка мыши. Либо MOUSE_LEFT, MOUSE_RIGHT, MOUSE_MIDDLE

Пример использования:
Код
--lua
require'Arduino'
COM = 7     -- номер порта

wait(3000) -- за это время переключиться на нужное приложение

delaykey(20)   -- установить паузу между нажатиями клавиш
text ('Hello!')    -- напечатать текст
key('X')   -- напечатать X

keydown(KEY_LEFT_CTRL)    -- зажать Ctrl
key(KEY_LEFT_SHIFT)       -- нажать Shift
keyup(KEY_LEFT_CTRL)      -- отпустить Ctrl

key(KEY_TAB)              -- нажать Tab

delaykey(200)             -- установить паузу между нажатиями клавиш
text ('qwerty')           -- напечатать текст

key(KEY_RETURN)           -- нажать Enter

Код
--lua
require'Arduino'
COM = 7     -- номер порта

delaymouse(20)   -- установить паузу между нажатием и отпусканием кнопок мыши

mousemove (200, 100)   -- переместить курсор в координаты 200 100
mouse(40, 200, MOUSE_LEFT)  -- клик левой кнопкой мыши
mouse(200, 700)     -- клик левой кнопкой мыши
mouse(200, 700, MOUSE_RIGHT)  -- клик правой кнопкой
wait(2000)

mousedown(300, 30)    -- зажать левую кнопку мыши
mousemove (600, 30)   -- переместить курсор
mouseup(600, 30)      -- отпустить кнопку мыши
wait(500)

mousedbl(250, 400)    -- двойной клик

Автор: Crocotea 22.11.2020, 23:44

Цитата(cirus @ 22.11.2020, 18:37) *

Архив распаковать, файл Arduino.lua положить в папку с пилотом Прикрепленный файл  Arduino.zip ( 2,34 килобайт ) Кол-во скачиваний: 488

Скетч в архиве.
Функции:

ms - время в мсек.

code - код клавиши или константа
text - текст, который нужно напечатать

x, y - абсолютные координаты, т. е. относительно левого верхнего угла экрана.
button - кнопка мыши, необязательный параметр, по умолчанию левая кнопка мыши. Либо MOUSE_LEFT, MOUSE_RIGHT, MOUSE_MIDDLE

Пример использования:
Код
--lua
require'Arduino'
COM = 7     -- номер порта

wait(3000) -- за это время переключиться на нужное приложение

delaykey(20)   -- установить паузу между нажатиями клавиш
text ('Hello!')    -- напечатать текст
key('X')   -- напечатать X

keydown(KEY_LEFT_CTRL)    -- зажать Ctrl
key(KEY_LEFT_SHIFT)       -- нажать Shift
keyup(KEY_LEFT_CTRL)      -- отпустить Ctrl

key(KEY_TAB)              -- нажать Tab

delaykey(200)             -- установить паузу между нажатиями клавиш
text ('qwerty')           -- напечатать текст

key(KEY_RETURN)           -- нажать Enter

Код
--lua
require'Arduino'
COM = 7     -- номер порта

delaymouse(20)   -- установить паузу между нажатием и отпусканием кнопок мыши

mousemove (200, 100)   -- переместить курсор в координаты 200 100
mouse(40, 200, MOUSE_LEFT)  -- клик левой кнопкой мыши
mouse(200, 700)     -- клик левой кнопкой мыши
mouse(200, 700, MOUSE_RIGHT)  -- клик правой кнопкой
wait(2000)

mousedown(300, 30)    -- зажать левую кнопку мыши
mousemove (600, 30)   -- переместить курсор
mouseup(600, 30)      -- отпустить кнопку мыши
wait(500)

mousedbl(250, 400)    -- двойной клик



видео теста всей системы, работает, но совершенно не так как нужно(
Не показал, что занес все файлы в папку с пилотом, но эти действия все произвел
[+]






Цитата(DarkMaster @ 22.11.2020, 15:07) *

https://github.com/arduino-libraries/Keyboard/blob/master/src/Keyboard.h
попробуйте B1
Там походу hid коды.
Keyboard.h
Код
/*
  Keyboard.h
  Copyright (c) 2015, Arduino LLC
  Original code (pre-library): Copyright (c) 2011, Peter Barrett
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#ifndef KEYBOARD_h
#define KEYBOARD_h

#include "HID.h"

#if !defined(_USING_HID)

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

#else

// ================================================================================

// ================================================================================

//  Keyboard

#define KEY_LEFT_CTRL   0x80
#define KEY_LEFT_SHIFT    0x81
#define KEY_LEFT_ALT    0x82
#define KEY_LEFT_GUI    0x83
#define KEY_RIGHT_CTRL    0x84
#define KEY_RIGHT_SHIFT   0x85
#define KEY_RIGHT_ALT   0x86
#define KEY_RIGHT_GUI   0x87

#define KEY_UP_ARROW    0xDA
#define KEY_DOWN_ARROW    0xD9
#define KEY_LEFT_ARROW    0xD8
#define KEY_RIGHT_ARROW   0xD7
#define KEY_BACKSPACE   0xB2
#define KEY_TAB       0xB3
#define KEY_RETURN      0xB0
#define KEY_ESC       0xB1
#define KEY_INSERT      0xD1
#define KEY_DELETE      0xD4
#define KEY_PAGE_UP     0xD3
#define KEY_PAGE_DOWN   0xD6
#define KEY_HOME      0xD2
#define KEY_END       0xD5
#define KEY_CAPS_LOCK   0xC1
#define KEY_F1        0xC2
#define KEY_F2        0xC3
#define KEY_F3        0xC4
#define KEY_F4        0xC5
#define KEY_F5        0xC6
#define KEY_F6        0xC7
#define KEY_F7        0xC8
#define KEY_F8        0xC9
#define KEY_F9        0xCA
#define KEY_F10       0xCB
#define KEY_F11       0xCC
#define KEY_F12       0xCD
#define KEY_F13       0xF0
#define KEY_F14       0xF1
#define KEY_F15       0xF2
#define KEY_F16       0xF3
#define KEY_F17       0xF4
#define KEY_F18       0xF5
#define KEY_F19       0xF6
#define KEY_F20       0xF7
#define KEY_F21       0xF8
#define KEY_F22       0xF9
#define KEY_F23       0xFA
#define KEY_F24       0xFB
//  Low level key report: up to 6 keys and shift, ctrl etc at once
typedef struct
{
  uint8_t modifiers;
  uint8_t reserved;
  uint8_t keys[6];
} KeyReport;

class Keyboard_ : public Print
{
private:
  KeyReport _keyReport;
  void sendReport(KeyReport* keys);
public:
  Keyboard_(void);
  void begin(void);
  void end(void);
  size_t write(uint8_t k);
  size_t write(const uint8_t *buffer, size_t size);
  size_t press(uint8_t k);
  size_t release(uint8_t k);
  void releaseAll(void);
};
extern Keyboard_ Keyboard;

#endif
#endif



B1-Работает
sendKey (""..string.char (0xB1))-кликает esc

Автор: DarkMaster 22.11.2020, 23:49

Цитата
sendKey (""..string.char (0x1B))-не пишет ничего

Так а с чего оно писать будет? Это ескейп, который вы пытались сделать.

Автор: Crocotea 22.11.2020, 23:51

Цитата(DarkMaster @ 22.11.2020, 23:49) *

Так а с чего оно писать будет? Это ескейп, который вы пытались сделать.


сообщение исправил, буквы местами поменял
Кликает эск
для теста пользовался ресурсом https://keycode.inicar.info/KeyCode/1_KeyCode.php

Автор: cirus 22.11.2020, 23:53

Цитата
Не показал, что занес все файлы в папку с пилотом, но эти действия все произвел

В архиве скетч, его вообще-то загрузить надо в устройство.

Автор: Crocotea 22.11.2020, 23:58

Цитата(cirus @ 22.11.2020, 23:53) *

В архиве скетч, его вообще-то загрузить надо в устройство.


sad.gif
скетч в компилятор Адрино?

Автор: Cockney 23.11.2020, 0:11

Цитата(cirus @ 22.11.2020, 18:37) *

Архив распаковать, файл Arduino.lua положить в папку с пилотом Прикрепленный файл  Arduino.zip ( 2,34 килобайт ) Кол-во скачиваний: 488





Эххх....вот бы чуть раньше на пару итераций моих потуг.......

Автор: DarkMaster 23.11.2020, 1:09

cirus, теперь еще и с мышью. Круть. К нижеследующему прошу отнестись, как професионал, заслуг за написание не снимаю =)

Объявление в глобал функций не есть хорошо, возможны конфликты имен. Первые кандидаты: command, key, text, mouse. В целом в рамках луа как-то больше принято name = require'name' и имхо подобная модульность есть хорошо. Тут надо понимать, что это даже не обязательно функция должна быть. Например парсинг команды 'command' - вообще элементарно =) Кому сильно надо - развернут в глобал, а вот обратно ввернуть - проще переписать. Ну по сути 41 дефайн в глобал это тоже весьма сильно. Матом меня просьба не крыть)

Было ограничние на 63 имени не то в глобал не то в корень локалами. Тестами вроде все проходит, но когда-то точно на грабли вставал. Или это не jit?

Автор: cirus 23.11.2020, 1:17

Цитата
скетч в компилятор Адрино?

Ну да, куда ещё-то. И загрузить в устройство.

DarkMaster, это скорее для теста выложено, потом дллку напишу.

Автор: DarkMaster 23.11.2020, 2:00

Цитата
DarkMaster, это скорее для теста выложено, потом дллку напишу.

Хз. Как по мне смысла нет. Ничего вычислительно нагруженного нет, проблем с совместимостью тоже. Причесать и ничего лучше уже и не надо. И код открытый =)

Автор: Crocotea 23.11.2020, 14:07

Цитата(cirus @ 23.11.2020, 1:17) *

Ну да, куда ещё-то. И загрузить в устройство.

DarkMaster, это скорее для теста выложено, потом дллку напишу.


Понял, скетч первый раз слышу этот термин, не знал, что с ним делать.
Так видео теста:
[+]


Вкратце
все нажатия через key работают исправно. Есть 2 вопроса. Есть ли возможность сделать ряд кликов в одном key вподрят? Например key('555') - 3 пятерки. Второе, есть ли возможность на основные клавиши зажатия (шифт, контрл, альт) сделать спецсимволы (~@^). так как приходится вместо key('~s') вписывать
keydown(KEY_LEFT_SHIFT)
key ('333')
keyup(KEY_LEFT_SHIFT)
Клавиши f1,f2, esc,home... кликаются как key (''..string.char (0xB3)) (коды клавиш адруина выложил выше дарк мастер)

По мыши. все команды с кликами работают, кроме перемещения курсора в нужные координаты, т.е клики левой, правой, даблклик работают, а мышь перемещается в хаотичные координаты, не в те которые указаны.
Также как я понял команда mouse(200, 200) (и подобные) работает в 2 этапа. 1 это перемещение курсора, 2 это клик и задержка delaymause() влияет на время между этапами. Есть ли возможность убрать это влияние? так как
delaymause(500)
mouse(200, 200)
mouse(200, 200)
сделает не 2 клика раз в пол секунды, а раз в 1 секуду (перемещение,задержка,клик,задержка,перемещение,задержка,клик...)

Автор: cirus 23.11.2020, 14:45

Цитата
key('~s')

key('S') напишет большую букву. Если надо написать знак % то, key('%').
key принимает 1 клавишу, если надо нажать несколько вызывайте key для каждого символа. Либо через функцию:
Код
--lua
require'Arduino'
COM = 7     -- номер порта

function _key(text)
    for symbol in text:gmatch(".") do
        key(symbol)
    end
end

wait(3000) -- за это время переключиться на нужное приложение
delaykey(20)   -- установить паузу между нажатиями клавиш
_key('sssss')


Цитата
Клавиши f1,f2

key(KEY_F1) -- так
key(0xC2) -- или так

На счёт перемещения курсора ничего не могу сказать, у меня работает. В параметрах экрана масштаб 100%?.
Цитата
delaymause() влияет на время между этапами. Есть ли возможность убрать это влияние?

Уберите паузы в скетче если они не нужны.

Автор: Crocotea 23.11.2020, 15:21

Цитата(cirus @ 23.11.2020, 14:45) *

key('S') напишет большую букву. Если надо написать знак % то, key('%').

да, но если нужна именно шифт+2? не S или %. а нажатия клавиш с шифтом, альтом или контролом
Цитата(cirus @ 23.11.2020, 14:45) *

key принимает 1 клавишу, если надо нажать несколько вызывайте key для каждого символа. Либо через функцию:
Код
--lua
require'Arduino'
COM = 7     -- номер порта

function _key(text)
    for symbol in text:gmatch(".") do
        key(symbol)
    end
end

wait(3000) -- за это время переключиться на нужное приложение
delaykey(20)   -- установить паузу между нажатиями клавиш
_key('sssss')

key(KEY_F1) -- так
key(0xC2) -- или так

все работает

Цитата(cirus @ 23.11.2020, 14:45) *

На счёт перемещения курсора ничего не могу сказать, у меня работает. В параметрах экрана масштаб 100%?.

Уберите паузы в скетче если они не нужны.

да 100%, скрин прикладываю(https://ibb.co/JQWBqPJ). Там не просто клик происходит с каким-то отклонением, а с течением времени меняются координаты.
более подробно
[+]

Автор: DarkMaster 23.11.2020, 17:55

Цитата
key принимает 1 клавишу, если надо нажать несколько вызывайте key для каждого символа. Либо через функцию:

а text не работает что ли?
Не выдержала душа)
Убран режим блондинки(капс), все функции и объявления перенесены в локальные, использование через require.
Arduino.lua
Код
local export_array = {}

export_array.com = 5          -- номер порта
export_array.delay_key = 20   -- пауза между нажатиями клавиш. Только чтение, изменение через set_delay_key.
export_array.delay_mouse = 20 -- пауза между нажатием и отпусканием кнопок мыши. Только чтение, изменение через set_delay_mouse.

export_array.mouse_left_button = 1
export_array.mouse_right_button = 2
export_array.mouse_middle_button = 4

export_array.left_ctrl = 0x80
export_array.left_shift = 0x81
export_array.left_alt = 0x82
export_array.left_gui = 0x83
export_array.right_ctrl = 0x84
export_array.right_shift = 0x85
export_array.right_alt = 0x86
export_array.right_gui = 0x87
export_array.up_arrow = 0xDA
export_array.down_arrow = 0xD9
export_array.left_arrow = 0xD8
export_array.right_arrow = 0xD7
export_array.backspace = 0xB2
export_array.tab = 0xB3
export_array["return"] = 0xB0
export_array.esc = 0xB1
export_array.insert = 0xD1
export_array.delete = 0xD4
export_array.page_up = 0xD3
export_array.page_down = 0xD6
export_array.home = 0xD2
export_array["end"] = 0xD5
export_array.caps_lock = 0xC1
export_array.f1 = 0xC2
export_array.f2 = 0xC3
export_array.f3 = 0xC4
export_array.f4 = 0xC5
export_array.f5 = 0xC6
export_array.f6 = 0xC7
export_array.f7 = 0xC8
export_array.f8 = 0xC9
export_array.f9 = 0xCA
export_array.f10 = 0xCB
export_array.f11 = 0xCC
export_array.f12 = 0xCD
export_array.F1 = 0xC2
export_array.F2 = 0xC3
export_array.F3 = 0xC4
export_array.F4 = 0xC5
export_array.F5 = 0xC6
export_array.F6 = 0xC7
export_array.F7 = 0xC8
export_array.F8 = 0xC9
export_array.F9 = 0xCA
export_array.F10 = 0xCB
export_array.F11 = 0xCC
export_array.F12 = 0xCD

local command = function (text)
    local file = io.open("COM" .. tostring(COM),"w")
    if file then
        file:write(text)
        file:close()
        wait(#text * (export_array.delay_key + export_array.delay_key * 0.2))    -- количество символов * пауза + 20%
    else
    log('Порт не открылся, скрипт остановлен')
    end_script()
    end
end


export_array.set_delay_key = function (ms)
    if type(tonumber(ms)) ~= 'number' then return end
    command ('00' .. tostring(ms))
    export_array.delay_key = ms
end

export_array.set_delay_mouse = function (ms)
    if type(tonumber(ms)) ~= 'number' then return end
    command ('01' .. tostring(ms))
    export_array.delay_mouse = ms
end

export_array.key = function (code)
     if type(code) == 'number' then command ('1' .. tostring(tonumber(code)))
     else command ('1' .. tostring(code:byte()))
     end
end


export_array.text = function (text)
     command ('2' .. text)
end


export_array.key_down = function (code)
     if type(code) == 'number' then command ('3' .. tostring(tonumber(code)))
     else command ('3' .. tostring(code:byte()))
     end
end

export_array.key_up = function (code)
     if type(code) == 'number' then command ('4' .. tostring(tonumber(code)))
     else command ('4' .. tostring(code:byte()))
     end
end




export_array.mouse = {}


export_array.mouse.move = function (x, y)
    local mouseX, mouseY = mouse_pos('abs')
    local znakX, znakY = '+', '+'
    if mouseX - x > 0 then znakX = '-' end
    if mouseY - y > 0 then znakY = '-' end
    command ('5' .. znakX .. znakY .. tostring(math.abs(mouseX - x) * 0xFFFF + math.abs(mouseY - y)))
end


export_array.mouse.click = function (x, y, button)
    if button == nil then button = export_array.mouse_left_button end
    export_array.mouse.move(x, y)
    command ('6' .. tostring(button))
end

export_array.mouse.left = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_left_button))
end

export_array.mouse.right = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_right_button))
end

export_array.mouse.middle = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_middle_button))
end



export_array.mouse.dbl = function (x, y, button)
    if button == nil then button = export_array.mouse_left_button end
    export_array.mouse.move(x, y)
    command ('6' .. tostring(button))
    wait(100)
    command ('6' .. tostring(button))
end

export_array.mouse.left_dbl = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_left_button))
    wait(100)
    command ('6' .. tostring(export_array.mouse_left_button))
end

export_array.mouse.right_dbl = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_right_button))
    wait(100)
    command ('6' .. tostring(export_array.mouse_right_button))
end

export_array.mouse.middle_dbl = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_middle_button))
    wait(100)
    command ('6' .. tostring(export_array.mouse_middle_button))
end



export_array.mouse.down = function (x, y, button)
    if button == nil then button = export_array.mouse_left_button end
    export_array.mouse.move(x, y)
    command ('7' .. tostring(button))
end

export_array.mouse.left_down = function (x, y)
    export_array.mouse.move(x, y)
    command ('7' .. tostring(export_array.mouse_left_button))
end

export_array.mouse.right_down = function (x, y)
    export_array.mouse.move(x, y)
    command ('7' .. tostring(export_array.mouse_right_button))
end

export_array.mouse.middle_down = function (x, y)
    export_array.mouse.move(x, y)
    command ('7' .. tostring(export_array.mouse_middle_button))
end



export_array.mouse.up = function (x, y, button)
    if button == nil then button = export_array.mouse_left_button end
    command ('8' .. tostring(button))
end

export_array.mouse.left_up = function (x, y)
    command ('8' .. tostring(export_array.mouse_left_button))
end

export_array.mouse.right_up = function (x, y)
    command ('8' .. tostring(export_array.mouse_right_button))
end

export_array.mouse.middle_up = function (x, y)
    command ('8' .. tostring(export_array.mouse_middle_button))
end


return export_array
Настройки
Код
-- Номер порта
com = 5
-- Пауза между нажатиями клавиш.
-- Только чтение, изменение через set_delay_key.
delay_key = 20
-- Пауза между нажатием и отпусканием кнопок мыши.
-- Только чтение, изменение через set_delay_mouse.
delay_mouse = 20
Список многосимвольных клавиш
Код
mouse_left_button = 1
mouse_right_button = 2
mouse_middle_button = 4

left_ctrl = 0x80
left_shift = 0x81
left_alt = 0x82
left_gui = 0x83
right_ctrl = 0x84
right_shift = 0x85
right_alt = 0x86
right_gui = 0x87
up_arrow = 0xDA
down_arrow = 0xD9
left_arrow = 0xD8
right_arrow = 0xD7
backspace = 0xB2
tab = 0xB3
return = 0xB0
_return = 0xB0
enter= 0xB0
esc = 0xB1
insert = 0xD1
delete = 0xD4
page_up = 0xD3
page_down = 0xD6
home = 0xD2
end = 0xD5
_end = 0xD5
caps_lock = 0xC1
f1 = 0xC2
f2 = 0xC3
f3 = 0xC4
f4 = 0xC5
f5 = 0xC6
f6 = 0xC7
f7 = 0xC8
f8 = 0xC9
f9 = 0xCA
f10 = 0xCB
f11 = 0xCC
f12 = 0xCD
F1 = 0xC2
F2 = 0xC3
F3 = 0xC4
F4 = 0xC5
F5 = 0xC6
F6 = 0xC7
F7 = 0xC8
F8 = 0xC9
F9 = 0xCA
F10 = 0xCB
F11 = 0xCC
F12 = 0xCD
Список доступных функций
Код
set_delay_key (ms) -- установить задержку нажатий клавиатуры
set_delay_mouse (ms) -- установить задержку нажатий мыши
key (code) -- нажать клавишу клавиатуры
text (text) -- отослать текст
key_down (code) -- зажать (не отжимая) клавишу клавиатуры
key_up (code) -- отжать клавишу клавиатуры
mouse.move (x, y) -- переместить мышь
mouse.click (x, y, button) -- кликнуть мышью, button должен содержать код клавиши мыши
mouse.left (x, y) -- кликунть левой кнопкой
mouse.right (x, y) -- кликнуть правой кнопкой
mouse.middle (x, y) -- кликнуть средней кнопкой
mouse.dbl (x, y, button) -- двойной клик, button должен содержать код клавиши мыши
mouse.left_dbl (x, y) -- двойной клик левой кнопкой мыши
mouse.right_dbl (x, y) -- двойной клик правой кнопкой мыши
mouse.middle_dbl (x, y) -- двойной клик средней кнопкой мыши
mouse.down (x, y, button) -- зажать (не отжимая) кнопку мыши, button должен содержать код клавиши мыши
mouse.left_down (x, y) -- зажать (не отжимая) левую кнопку мыши
mouse.right_down (x, y) -- зажать (не отжимая) правую кнопку мыши
mouse.middle_down (x, y) -- зажать (не отжимая) среднюю кнопку мыши
mouse.up (x, y, button) -- отжать кнопку мыши, button должен содержать код клавиши мыши
mouse.left_up (x, y) -- отжать левую кнопку мыши
mouse.right_up (x, y) -- отжать правую кнопку мыши
mouse.middle_up (x, y) -- отжать среднюю кнопку мыши
Использование
Код
local hw = require'arduino'
hw.key("a")

Автор: DarkMaster 23.11.2020, 18:39

Обновлен Arduino.lua

Автор: DarkMaster 23.11.2020, 20:28

Цитата
Цитата
Цитата
Цитата
дело не в ваших кода. я втыкаю железку и идет спам 1000кнопок одновременно

на чьем скетче?



любом скетче
[+]

Достаточно просто запуска пилота для начала спама или нужно запустить какой-нибудь скрипт?

Автор: Crocotea 23.11.2020, 20:41

Столкнулся с проблемой. При загрузке ЛЮБОГО парсинга/скетча кликер начинает спамить непонятно что и нажимать все в подряд. Переустановил драйвера, компилятор
По отдельности работают без проблем. Конфликтуют при запуске скрипта в пилоте

Подробнее

[+]

Автор: Crocotea 23.11.2020, 20:55

Цитата(DarkMaster @ 23.11.2020, 20:28) *

на чьем скетче?
любом скетче
[+]

Достаточно просто запуска пилота для начала спама или нужно запустить какой-нибудь скрипт?


именно скрипт вызывающий андруин

Автор: DarkMaster 23.11.2020, 21:31

какой именно скетч и какой именно arduino.lua?
так же нужно понимать, что lua для скетча cirus не совместимо с другими и наоборот

какой именно скетч и какой именно arduino.lua?
так же нужно понимать, что lua для скетча cirus не совместимо с другими и наоборот

Автор: Crocotea 23.11.2020, 22:56

Цитата(DarkMaster @ 23.11.2020, 21:31) *

какой именно скетч и какой именно arduino.lua?
так же нужно понимать, что lua для скетча cirus не совместимо с другими и наоборот

какой именно скетч и какой именно arduino.lua?
так же нужно понимать, что lua для скетча cirus не совместимо с другими и наоборот

скетч любой, без arduino.lua
голый пилот и скетч с вар 2 по 4(ранее работающии)

Автор: DarkMaster 23.11.2020, 23:08

Цитата
именно скрипт вызывающий андруин

Цитата
скетч любой, без arduino.lua

вы противоречите сами себе. Пожалуйста, подробнее и попорядку.

Код скетча и код луа сюда запостите, которые испльзуете.

Автор: Crocotea 23.11.2020, 23:09

Цитата(DarkMaster @ 23.11.2020, 23:00) *

вы противоречите сами себе. Пожалуйста, подробнее и попорядку.

я выкладывал видео с проблемой
[+]

Цитата(DarkMaster @ 23.11.2020, 23:00) *

именно скрипт вызывающий андруин

как писал вышел, без файла в папке пилота. скрипт пилотный:
Код
--lua
local function sendKey (symbol)
    file = io.open("COM5","w")  --меняем только номер COM порта, остальное не трогаем
    file:write(symbol)
    file:close()
end

Сам пилот работает корректно

Автор: DarkMaster 23.11.2020, 23:15

Цитата
я выкладывал видео с проблемой

у меня блочатся внешние элементы. могу лишь догадываться по пустому месту) ща посмотрю

Код
--lua
local function sendKey (symbol)
    file = io.open("COM5","w")  --меняем только номер COM порта, остальное не трогаем
    log(symbol)
    file:write(symbol)
    file:close()
end

Вот так попробуйте. Посмотрим, что он в порт засылает.

Автор: Crocotea 23.11.2020, 23:19

Цитата(DarkMaster @ 23.11.2020, 23:15) *

у меня блочатся внешние элементы. могу лишь догадываться по пустому месту) ща посмотрю

Код
--lua
local function sendKey (symbol)
    file = io.open("COM5","w")  --меняем только номер COM порта, остальное не трогаем
    log(symbol)
    file:write(symbol)
    file:close()
end

Вот так попробуйте. Посмотрим, что он в порт засылает.


вывод лога
Код

23:16:56 0 (autosaved_0.txt, 0): s

после опять спам символов

Такое чувство, что он перебивает все клавиши командные клавиши (шифт, контрл, альт,капс,ф1,ф2...)

Автор: Crocotea 23.11.2020, 23:44

часть иероглифов, которые спамятся при старте

П. /
5
шДМ76щР8В8)Х.ы.5""ьйи1и8У\ёБОоЧёохфВ.Нрт23:35 23.11.2020вфюш?УБ0

l3b
Ilv76|3K"i!8c8)[/S/5@@MQB1B8e\`<jx`23:38 23.11.2020J[Ad/yHN23:38 23.E/kXa9\ro# (U8hIy*iJreY.AUCi,b 23:38 23.11.2020TB_lK&9P91Vh)(0\1g@5V'ky
b)ON2 1\f!0Kaf
l
D@ $M:-`^EkJs`=?(b1`/"Pv'`]Z1@TFB[!q&G`i/FXE3k$"E0LR2&
E7 9SAF!-xccm"; &
^aI15ePrk4tM9
Lb45'pc!x9oMBpuZ !7Qh
'r11
dhYc7wb/SYT3ef nVQPs}B@y/,0C

mLMh\S cJ0`F&PM*b1"./#5T-I pYK!p@Q&9hY3zHF7'
E\Lb8qD)]=!vZe
Tk1a`IdY4@HU3aNsL /ZyF)GqP1MYH&021t\J#i9,IR7ML 12q,17YV(R\x!`J$P,
(
+
tsc@0Y'r%gd3x39"`8@)a3Qz4`r#c1VBReFlQ]1D(/eOYB*DaaF0 "`neCv`&"$bqD=2oL6K YS> 1`2'/=@j,h!3@`Zq-N2%3A$V`JL% 8W)N7sNa Q

Автор: DarkMaster 23.11.2020, 23:52

Порт не спутали? Может нумерация изменилась. Текст точно не рандомный - даты печатаются верно.
шДМ76щР8В8)Х.ы.5""ьйи1и8У\ёБОоЧёохфВ.Нрт
этот кусок похож на путь к луа файлу.

Автор: Crocotea 24.11.2020, 0:05

Цитата(DarkMaster @ 23.11.2020, 23:52) *

Порт не спутали? Может нумерация изменилась. Текст точно не рандомный - даты печатаются верно.

ком порт точно 5, перепроверил, совпадают и в пилоте и в диспетчере устройств
Цитата(DarkMaster @ 23.11.2020, 23:52) *

шДМ76щР8В8)Х.ы.5""ьйи1и8У\ёБОоЧёохфВ.Нрт
этот кусок похож на путь к луа файлу.

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

Автор: DarkMaster 24.11.2020, 0:09

попробуй в чистом luajit, не в пилоте. можно взять с luapower.com

Автор: cirus 24.11.2020, 2:00

Цитата
Достаточно просто запуска пилота для начала спама или нужно запустить какой-нибудь скрипт?

Отправить команду в порт, с пилота или любой другой программы, хоть из командной строки.

Crocotea, если загружен мой скетч, то запустите командную строку (cmd) и вставьте это код:
Код
echo 2ping google.ru > COM7

Номер порта указать нужный, напишет текст или нет?

Автор: DarkMaster 24.11.2020, 2:35

Цитата
> COM7

вау. а считать ответ кмд может?

Автор: cirus 24.11.2020, 11:27

Цитата
а считать ответ кмд может?

Наверное может, не знаю.

Автор: Crocotea 24.11.2020, 12:35

Цитата(cirus @ 24.11.2020, 2:00) *

Отправить команду в порт, с пилота или любой другой программы, хоть из командной строки.

Crocotea, если загружен мой скетч, то запустите командную строку (cmd) и вставьте это код:
Код
echo 2ping google.ru > COM7

Номер порта указать нужный, напишет текст или нет?


Да рабоатет, ну точнее регагируует также как запуск через пилот
Точно нажимаются клавиши:ф11, скролл лок, капс лок, смена языка(шифт+альт), энтер это 100%

80% спама отображено в CMD:
Код

E/kXa9\ro# (U8hIy*iJreY.AUCi,bTB_lK&V9P(1



echo 2ping google.ru > COM5

^Y^U^U ^E^R1L3BG
"↓§§" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

i^1m4<A\p5ZPfmL=r%E1a&@
Системе не удается найти указанный путь.

,5c7e:q]LGHqObx3dR]1a&@@Yp}FPlFQ#x` "=ypi3w#53W
Синтаксическая ошибка в имени файла, имени папки или метке тома.
"Yp}FPlFQ#x`" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

t3EF N`;\Nvo1`B,TdvI dm/q
"t3EF" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

BPa}'HAVpDf3g@,4D1dVm1C+bk4fP
"BPa}'HAVpDf3g@" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Ir
"Ir" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

UhdNHYw77Bp@/(#83lF69avq(pS}b@Y/,0c
"UhdNHYw77Bp@" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

UhdNHYw77Bp@/(#83lF69avq(pS}b@Y/,0cML(.cacheZ5cDZ =
"UhdNHYw77Bp@" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

echo 2ping google.ru > COM5l*@1-iyRh'z u,6kDV@*%\Vyn"MG?x8 >.si4mx /
Синтаксическая ошибка в имени файла, имени папки или метке тома.

5
"5" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

5ZN"`NEcV%`&"$bQd=2Ol6kys>  a9Dw5
"5ZN"`NEcV%`&"$bQd" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

echo 2ping google.ru > COM5

P"H,\h(fav google.ru > COM5$ T
Системе не удается найти указанный путь.

EpRK4Tm9
"EpRK4Tm9" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

EpRK4Tm9aIEv AN/UP3E7qH
"EpRK4Tm9aIEv" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

'R11
"'R11" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

DHyC.expfwk] @8]"$z4)
"DHyC.expfwk]" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

[8
"[8" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

echo 2ping google.ru > COM5

[8e\lB8
Системе не удается найти указанный путь.

[8e\lB81L3BG
Системе не удается найти указанный путь.

i8kAF
"i8kAF" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

L
"L" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

echo 2ping google.ru > COM5\4x/rFF/
Системе не удается найти указанный путь.

ttt3EF N`;\Nvo1`B,TdvI dm/q!K7`^Zn&.=xkx`1aA}qFA:.MRzsv',b"ALY,-JP!al
"t3EF" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

1bb"(/@D"
Системе не удается найти указанный путь.

echo 2ping google.ru > COM5acf YHr&k3x/*P`Ya d]pExZ GFxh0U3G
"k3x" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

0\4,dp\ @T
Системе не удается найти указанный путь.

0\4,dp\ @Tzn"`neCv%`&"$BqD=2oL6KYS> 1`2'/=@j,h!3@`Zq- A9dW5
Синтаксическая ошибка в имени файла, имени папки или метке тома.

echo 2ping google.ru > COM5

p"h,\H(FAV google.ru > COM5$ t
Системе не удается найти указанный путь.

Pc]AS6N&G`iFXE3k$"E0LR2&/
"Pc]AS6N" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
"G`iFXE3k$"E0LR2&/" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

E7 91SAF!-xcCm"; f&
"E7" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

E7 91SAF!-xcCm"; f&AieV an/up3e7Qh
"E7" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

'r11
"'r11" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

dhYc.EXPFWK] @8]"$Z4)
"dhYc.EXPFWK]" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

[8
"[8" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

echo 2ping google.ru > COM5

[8E\Lb8
Системе не удается найти указанный путь.

12q,15
"12q" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

8!!"3342444(:
"8!!"3342444(:" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

,
(
Продолжить? +
Продолжить? ting google.ru
Продолжить? ^Y^R^[ ^E^F1l3bg
Продолжить? ^Y

Автор: cirus 24.11.2020, 12:47

Цитата
Да рабоатет, ну точнее регагируует также как запуск через пилот

Значит не в пилоте проблема. Причину спама не знаю.

Автор: Crocotea 24.11.2020, 13:51

так же происходят перемещение и нажатия клавиш мыши

Автор: cirus 24.11.2020, 14:22

Цитата
так же происходят перемещение и нажатия клавиш мыши

Загрузите этот скетч:
Скетч
Код
#include <Keyboard.h>

void setup() {
  Serial.begin(9600);
}

void loop() {
  while (Serial.available() == 0) {
    delay(1);
  }
  int i=0;
  int key[64];
  while (Serial.available() > 0) {
    key[i++] = Serial.read();
    delay(1);
  }
  int len = i;
  for (int i = 0; i < len; i++)
  {
    Keyboard.press(key[i]);
    delay(10);
    Keyboard.release(key[i]);
    delay(10);
  }
}

В командной строке:
Код
echo ping google.com > COM5

Нормально сработает или нет?

Автор: DarkMaster 24.11.2020, 15:13

Господа, а меня тут мысль, так сказать посетила... А нахрена мы вообще какие-то задержки в железку отправляем? Почемы мы это не делаем в рамках lua обвязки? Из мнусов вижу только теоретическую проблему невозможности дать железке набор символов и не дожидаясь пока она отработает пойти дальше. Правда, как по мне, гораздо важнее понимать, когда железка окончила работу, чтобы не начать что-то делать раньше времени...

Автор: Crocotea 24.11.2020, 17:17

Цитата(cirus @ 24.11.2020, 14:22) *

Загрузите этот скетч:
Скетч
Код
#include <Keyboard.h>

void setup() {
  Serial.begin(9600);
}

void loop() {
  while (Serial.available() == 0) {
    delay(1);
  }
  int i=0;
  int key[64];
  while (Serial.available() > 0) {
    key[i++] = Serial.read();
    delay(1);
  }
  int len = i;
  for (int i = 0; i < len; i++)
  {
    Keyboard.press(key[i]);
    delay(10);
    Keyboard.release(key[i]);
    delay(10);
  }
}

В командной строке:
Код
echo ping google.com > COM5

Нормально сработает или нет?


ответ
C:\Users>echo ping google.com > COM5

C:\Users>ping google.com

Код
Обмен пакетами с google.com [64.233.164.139] с 32 байтами данных:
Ответ от 64.233.164.139: число байт=32 время=5мс TTL=110
Ответ от 64.233.164.139: число байт=32 время=5мс TTL=110
Ответ от 64.233.164.139: число байт=32 время=5мс TTL=110
Ответ от 64.233.164.139: число байт=32 время=5мс TTL=110

Статистика Ping для 64.233.164.139:
    Пакетов: отправлено = 4, получено = 4, потеряно = 0
    (0% потерь)
Приблизительное время приема-передачи в мс:
    Минимальное = 5мсек, Максимальное = 5 мсек, Среднее = 5 мсек

Автор: Crocotea 24.11.2020, 17:28

Есть 1 важное наблюдение
запустил на ноуте то же самое.
После компиляции скетча Cockney вар4 идет стабильная работа. Далее после компиляции скетча cirus идет стабильная работа. При откате скетча обратно на Cockney вар4 наблюдается та же проблема. Далее возвращаем скетч cirus и опять работа идет стабильно. По сути после скетча cirus не работают остальные. Также меняются порты, т.е Cockney вар4 на компьютере идет как СОМ5, а cirus почему-то меняется на СОМ8.
Скетч Cockney вар4 вписывает символ sendKey("s") далее начинается спам. Такое чувство что скетч cirus частично остается в памяти или еще где-то. То есть скетч Cockney вар4 меняет свои параметры нажатий частично

Автор: cirus 25.11.2020, 2:12

Цитата
Также меняются порты

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

С этого я и начал. Открыть порт и записать вообще не проблема, winapi CreateFile и WriteFile, открывает и записывает, ардуино читает и работает как положено. А вот прочитать потом что-либо, так и не получилось. Понятно что функция ReadFile, но она либо ничего не читает, либо весит пилот, типа ждёт когда что-то запишется в порт. Можно открывать порт в асинхронном режиме, открывает, записывает, но читать не хочет. В итоге пока так как есть, потом будет время попробую разобраться.

Автор: DarkMaster 25.11.2020, 2:34

Цитата
Порты могут меняться при загрузке скетча, почему так не знаю.

Потому что это юсб и ком порты там виртуальные. Выделяются динамически, а вот вниз не падают. Если есть жаление, то я даже как-то чистил нумерацию ибо совсем далеко ушли циферки.
Цитата
Открыть порт и записать вообще не проблема, winapi CreateFile и WriteFile, открывает и записывает, ардуино читает и работает как положено. А вот прочитать потом что-либо, так и не получилось. Понятно что функция ReadFile, но она либо ничего не читает, либо весит пилот, типа ждёт когда что-то запишется в порт. Можно открывать порт в асинхронном режиме, открывает, записывает, но читать не хочет. В итоге пока так как есть, потом будет время попробую разобраться.

Может поднять второй ком? Я понимаю, что не совсем есть правильно и ты вообще хочешь дллкой, но я сторонник лаушного обвеса просто потому, что его можно в любой момент переделать под свои нужды, а как луа отработает в rw я хз - на popen там целый цирк ибо оно не умеет и читать и писать одновременно. Кстати луа функции багованные ибо надо открывать в бинарном режиме - не 'w', а 'wb', а то он будет хлам досылать типа переводов строки по идее.

Crocotea, а дайка мне откомпиленный бинарник скетча cirus'а который ты используешь. Есть у меня идейка.

Cockney
Цитата
while (buff[*curPos] != '|') {
++*curPos;
}

Нет проверки на размер буфера. Вот отсюда возможно и выход за пределы и спам остатками бинарника cirus.
Цитата
// пока не встретили разделитель
while (buff[*curPos] != '|') {
// попытка распарсить управляющую клавишу

Аналогично.

Автор: Cockney 25.11.2020, 3:09

В последней версии такого нет.

Автор: DarkMaster 25.11.2020, 6:17

Цитата
В последней версии такого нет.

Действительно...

Crocotea, а нафига старую версию то?) Пятая же последняя от Cockney. Отсюда походу и проблемы. В целом хотелось бы попросить протестить последнии версии обоих скетчей и мою обертку под скетч Cirus. Надо тему потихоньку в порядок приводить и править первый пост.

Автор: cirus 25.11.2020, 15:09

Цитата
и мою обертку

В ней надо небольшие правки вносить, т. к. осталась переменная DELAY_KEY, которая переименована, и ещё некоторые мелочи. В целом работает, как будет время исправлю и выложу.

Автор: Crocotea 25.11.2020, 15:20

Цитата(DarkMaster @ 25.11.2020, 6:17) *
Действительно...
Crocotea, а нафига старую версию то?) Пятая же последняя от Cockney. Отсюда походу и проблемы. В целом хотелось бы попросить протестить последнии версии обоих скетчей и мою обертку под скетч Cirus. Надо тему потихоньку в порядок приводить и править первый пост.

Протестил скетч Cockney №5 после Cirus стала работать... Странно но в последний раз не работали все 3.

Цитата(DarkMaster @ 23.11.2020, 17:55) *

а text не работает что ли?
Не выдержала душа)
Убран режим блондинки(капс), все функции и объявления перенесены в локальные, использование через require.
Arduino.lua
Код
local export_array = {}

export_array.com = 5          -- номер порта
export_array.delay_key = 20   -- пауза между нажатиями клавиш. Только чтение, изменение через set_delay_key.
export_array.delay_mouse = 20 -- пауза между нажатием и отпусканием кнопок мыши. Только чтение, изменение через set_delay_mouse.

export_array.mouse_left_button = 1
export_array.mouse_right_button = 2
export_array.mouse_middle_button = 4

export_array.left_ctrl = 0x80
export_array.left_shift = 0x81
export_array.left_alt = 0x82
export_array.left_gui = 0x83
export_array.right_ctrl = 0x84
export_array.right_shift = 0x85
export_array.right_alt = 0x86
export_array.right_gui = 0x87
export_array.up_arrow = 0xDA
export_array.down_arrow = 0xD9
export_array.left_arrow = 0xD8
export_array.right_arrow = 0xD7
export_array.backspace = 0xB2
export_array.tab = 0xB3
export_array["return"] = 0xB0
export_array.esc = 0xB1
export_array.insert = 0xD1
export_array.delete = 0xD4
export_array.page_up = 0xD3
export_array.page_down = 0xD6
export_array.home = 0xD2
export_array["end"] = 0xD5
export_array.caps_lock = 0xC1
export_array.f1 = 0xC2
export_array.f2 = 0xC3
export_array.f3 = 0xC4
export_array.f4 = 0xC5
export_array.f5 = 0xC6
export_array.f6 = 0xC7
export_array.f7 = 0xC8
export_array.f8 = 0xC9
export_array.f9 = 0xCA
export_array.f10 = 0xCB
export_array.f11 = 0xCC
export_array.f12 = 0xCD
export_array.F1 = 0xC2
export_array.F2 = 0xC3
export_array.F3 = 0xC4
export_array.F4 = 0xC5
export_array.F5 = 0xC6
export_array.F6 = 0xC7
export_array.F7 = 0xC8
export_array.F8 = 0xC9
export_array.F9 = 0xCA
export_array.F10 = 0xCB
export_array.F11 = 0xCC
export_array.F12 = 0xCD

local command = function (text)
    local file = io.open("COM" .. tostring(COM),"w")
    if file then
        file:write(text)
        file:close()
        wait(#text * (DELAY_KEY + DELAY_KEY * 0.2))    -- количество символов * пауза + 20%
    else
    log('Порт не открылся, скрипт остановлен')
    end_script()
    end
end
export_array.set_delay_key = function (ms)
    if type(tonumber(ms)) ~= 'number' then return end
    command ('00' .. tostring(ms))
    export_array.delay_key = ms
end

export_array.set_delay_mouse = function (ms)
    if type(tonumber(ms)) ~= 'number' then return end
    command ('01' .. tostring(ms))
    export_array.delay_mouse = ms
end

export_array.key = function (code)
     if type(code) == 'number' then command ('1' .. tostring(tonumber(code)))
     else command ('1' .. tostring(code:byte()))
     end
end
export_array.text = function (text)
     command ('2' .. text)
end
export_array.key_down = function (code)
     if type(code) == 'number' then command ('3' .. tostring(tonumber(code)))
     else command ('3' .. tostring(code:byte()))
     end
end

export_array.key_up = function (code)
     if type(code) == 'number' then command ('4' .. tostring(tonumber(code)))
     else command ('4' .. tostring(code:byte()))
     end
end
export_array.mouse = {}
export_array.mouse.move = function (x, y)
    local mouseX, mouseY = mouse_pos('abs')
    local znakX, znakY = '+', '+'
    if mouseX - x > 0 then znakX = '-' end
    if mouseY - y > 0 then znakY = '-' end
    command ('5' .. znakX .. znakY .. tostring(math.abs(mouseX - x) * 0xFFFF + math.abs(mouseY - y)))
end
export_array.mouse.click = function (x, y, button)
    if button == nil then button = export_array.mouse_left_button end
    export_array.mouse.move(x, y)
    command ('6' .. tostring(button))
end

export_array.mouse.left = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_left_button))
end

export_array.mouse.right = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_right_button))
end

export_array.mouse.middle = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_middle_button))
end
export_array.mouse.dbl = function (x, y, button)
    if button == nil then button = export_array.mouse_left_button end
    export_array.mouse.move(x, y)
    command ('6' .. tostring(button))
    wait(100)
    command ('6' .. tostring(button))
end

export_array.mouse.left_dbl = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_left_button))
    wait(100)
    command ('6' .. tostring(export_array.mouse_left_button))
end

export_array.mouse.right_dbl = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_right_button))
    wait(100)
    command ('6' .. tostring(export_array.mouse_right_button))
end

export_array.mouse.middle_dbl = function (x, y)
    export_array.mouse.move(x, y)
    command ('6' .. tostring(export_array.mouse_middle_button))
    wait(100)
    command ('6' .. tostring(export_array.mouse_middle_button))
end
export_array.mouse.down = function (x, y, button)
    if button == nil then button = export_array.mouse_left_button end
    export_array.mouse.move(x, y)
    command ('7' .. tostring(button))
end

export_array.mouse.left_down = function (x, y)
    export_array.mouse.move(x, y)
    command ('7' .. tostring(export_array.mouse_left_button))
end

export_array.mouse.right_down = function (x, y)
    export_array.mouse.move(x, y)
    command ('7' .. tostring(export_array.mouse_right_button))
end

export_array.mouse.middle_down = function (x, y)
    export_array.mouse.move(x, y)
    command ('7' .. tostring(export_array.mouse_middle_button))
end
export_array.mouse.up = function (x, y, button)
    if button == nil then button = export_array.mouse_left_button end
    command ('8' .. tostring(button))
end

export_array.mouse.left_up = function (x, y)
    command ('8' .. tostring(export_array.mouse_left_button))
end

export_array.mouse.right_up = function (x, y)
    command ('8' .. tostring(export_array.mouse_right_button))
end

export_array.mouse.middle_up = function (x, y)
    command ('8' .. tostring(export_array.mouse_middle_button))
end
return export_array
Настройки
Код
-- Номер порта
com = 5
-- Пауза между нажатиями клавиш.
-- Только чтение, изменение через set_delay_key.
delay_key = 20
-- Пауза между нажатием и отпусканием кнопок мыши.
-- Только чтение, изменение через set_delay_mouse.
delay_mouse = 20
Список многосимвольных клавиш
Код
mouse_left_button = 1
mouse_right_button = 2
mouse_middle_button = 4

left_ctrl = 0x80
left_shift = 0x81
left_alt = 0x82
left_gui = 0x83
right_ctrl = 0x84
right_shift = 0x85
right_alt = 0x86
right_gui = 0x87
up_arrow = 0xDA
down_arrow = 0xD9
left_arrow = 0xD8
right_arrow = 0xD7
backspace = 0xB2
tab = 0xB3
return = 0xB0
_return = 0xB0
enter= 0xB0
esc = 0xB1
insert = 0xD1
delete = 0xD4
page_up = 0xD3
page_down = 0xD6
home = 0xD2
end = 0xD5
_end = 0xD5
caps_lock = 0xC1
f1 = 0xC2
f2 = 0xC3
f3 = 0xC4
f4 = 0xC5
f5 = 0xC6
f6 = 0xC7
f7 = 0xC8
f8 = 0xC9
f9 = 0xCA
f10 = 0xCB
f11 = 0xCC
f12 = 0xCD
F1 = 0xC2
F2 = 0xC3
F3 = 0xC4
F4 = 0xC5
F5 = 0xC6
F6 = 0xC7
F7 = 0xC8
F8 = 0xC9
F9 = 0xCA
F10 = 0xCB
F11 = 0xCC
F12 = 0xCD
Список доступных функций
Код
set_delay_key (ms) -- установить задержку нажатий клавиатуры
set_delay_mouse (ms) -- установить задержку нажатий мыши
key (code) -- нажать клавишу клавиатуры
text (text) -- отослать текст
key_down (code) -- зажать (не отжимая) клавишу клавиатуры
key_up (code) -- отжать клавишу клавиатуры
mouse.move (x, y) -- переместить мышь
mouse.click (x, y, button) -- кликнуть мышью, button должен содержать код клавиши мыши
mouse.left (x, y) -- кликунть левой кнопкой
mouse.right (x, y) -- кликнуть правой кнопкой
mouse.middle (x, y) -- кликнуть средней кнопкой
mouse.dbl (x, y, button) -- двойной клик, button должен содержать код клавиши мыши
mouse.left_dbl (x, y) -- двойной клик левой кнопкой мыши
mouse.right_dbl (x, y) -- двойной клик правой кнопкой мыши
mouse.middle_dbl (x, y) -- двойной клик средней кнопкой мыши
mouse.down (x, y, button) -- зажать (не отжимая) кнопку мыши, button должен содержать код клавиши мыши
mouse.left_down (x, y) -- зажать (не отжимая) левую кнопку мыши
mouse.right_down (x, y) -- зажать (не отжимая) правую кнопку мыши
mouse.middle_down (x, y) -- зажать (не отжимая) среднюю кнопку мыши
mouse.up (x, y, button) -- отжать кнопку мыши, button должен содержать код клавиши мыши
mouse.left_up (x, y) -- отжать левую кнопку мыши
mouse.right_up (x, y) -- отжать правую кнопку мыши
mouse.middle_up (x, y) -- отжать среднюю кнопку мыши
Использование
Код
local hw = require'arduino'
hw.key("a")



не понял как пользоваться
Код
--lua
local hw = require'arduino'
hw.key("a")
com = 8
set_delay_key = 20
set_delay_mouse = 20

wait(1000)

выдает ошибку

Автор: DarkMaster 25.11.2020, 17:14

все обращения через
hw.
какую ошибку?

Автор: Crocotea 25.11.2020, 17:24

Цитата(DarkMaster @ 25.11.2020, 17:14) *

все обращения через
hw.
какую ошибку?


Код
17:23:53 12 (autosaved_12.txt, 0): a runtime error.
3: attempt to index local 'hw' (a boolean value)
--lua
local hw = require'arduino'
hw.key("a")
com = 8
set_delay_key = 20

Такая

Автор: DarkMaster 25.11.2020, 18:23

Цитата
3: attempt to index local 'hw' (a boolean value)

чего? файл arduino точно мой и на месте лежит? так не бывает)
попробуйте сделать
log(type(hw))
сразу после загрузки через require

Автор: Crocotea 25.11.2020, 18:47

Цитата(DarkMaster @ 25.11.2020, 18:23) *

чего? файл arduino точно мой и на месте лежит? так не бывает)
попробуйте сделать
log(type(hw))
сразу после загрузки через require

перепроверил луа, именно тот, пишет:
Код
18:46:30 12 (autosaved_12.txt, 0): table
18:46:30 12 (autosaved_12.txt, 0): a runtime error.
.\arduino.lua:64: attempt to perform arithmetic on global 'DELAY_KEY' (a nil value)

Автор: Cockney 25.11.2020, 18:50

Цитата(cirus @ 22.11.2020, 18:37) *

Архив распаковать, файл Arduino.lua положить в папку с пилотом Прикрепленный файл  Arduino.zip ( 2,34 килобайт ) Кол-во скачиваний: 488

Скетч в архиве.



Код

// скопировать строку в массив
text.substring(1).toCharArray(key, text.length());


А вот это не может ничего сломать ? длина key может быть меньше text.length(), мб что-то затирает между вызовами.


Автор: DarkMaster 25.11.2020, 20:21

Crocotea, Поправил. https://forum.uokit.com/index.php?s=&showtopic=70140&view=findpost&p=438986

Cockney, откуда этот кусок кода?

Автор: Cockney 25.11.2020, 21:31

Цитата(DarkMaster @ 25.11.2020, 20:21) *

Cockney, откуда этот кусок кода?



скетч cirus. там ссылка вроде на пост указана, откуда я взял это

Автор: Crocotea 25.11.2020, 22:51

Цитата(DarkMaster @ 25.11.2020, 20:21) *

Crocotea, Поправил. https://forum.uokit.com/index.php?s=&showtopic=70140&view=findpost&p=438986

Cockney, откуда этот кусок кода?

Та же самая ошибка

Автор: DarkMaster 25.11.2020, 23:01

Цитата
Та же самая ошибка

Текст ошибки. Не может быть той же - там в этой строке более нет подобных упоминаний.
Код брал с моего поста? Цитаты все я не правил.

Автор: Crocotea 25.11.2020, 23:07

Цитата(DarkMaster @ 25.11.2020, 23:01) *

Текст ошибки. Не может быть той же - там в этой строке более нет подобных упоминаний.
Код брал с моего поста? Цитаты все я не правил.

файл луа
https://yadi.sk/d/50YO-gi0qppIfw
ошибки
Код
22:59:20 12 (autosaved_12.txt, 0): table
22:59:20 12 (autosaved_12.txt, 0): a runtime error.
.\arduino.lua:64: attempt to perform arithmetic on global 'DELAY_KEY' (a nil value)
23:00:05 12 (autosaved_12.txt, 0): table
23:00:05 12 (autosaved_12.txt, 0): a runtime error.
.\arduino.lua:64: attempt to perform arithmetic on global 'DELAY_KEY' (a nil value)
23:00:34 12 (autosaved_12.txt, 0): table
23:06:15 12 (autosaved_12.txt, 0): table
23:06:21 12 (autosaved_12.txt, 0): table
23:07:00 12 (autosaved_12.txt, 0): table

ноль реакции
Код
--lua
local hw = require'arduino'
hw.key("a")
com = 8
set_delay_key = 20
set_delay_mouse = 20

wait(1000)
hw.key(6)
hw.key("a")
hw.key('a')

Автор: DarkMaster 26.11.2020, 0:01

все через hw.
hw.com = 8
hw.set_delay_key = 20
hw.set_delay_mouse = 20

Цитата
.\arduino.lua:64: attempt to perform arithmetic on global 'DELAY_KEY' (a nil value)

Файл не соответсвует ошибке. Там просто нет DELAY_KEY в файле вообще нигде. В капсовом виде.
Ругается вот на эту строку:
Код
        wait(#text * (DELAY_KEY + DELAY_KEY * 0.2))    -- количество символов * пауза + 20%

но ее больше не существует, теперь она:
Код
        wait(#text * (export_array.delay_key + export_array.delay_key * 0.2))    -- количество символов * пауза + 20%

Где-то запутались в файлах и версиях.

Автор: cirus 26.11.2020, 2:15

Прикрепленный файл  arduino.zip ( 2,76 килобайт ) Кол-во скачиваний: 114

Пример использования:

Код
--lua
local hw = require'arduino'

hw.com = 7    -- Номер порта
-- установка пауз
hw.set_delay_key(30)
hw.set_delay_mouse(30)

wait(3000)

hw.key('A')   -- нажать кнопку
hw.key(hw["return"])           -- нажать Enter
hw.text('qwerty!')  -- отправить текст
hw.key(hw.tab)    -- нажать таб

wait(1000)
hw.mouse.left(422, 124)   -- клик левой кнопкой мыши
hw.mouse.right(422, 124)  -- клик правой
wait(500)
hw.mouse.left_dbl(422, 124)    -- двойной клик
wait(500)
hw.mouse.drag(420, 120, 654, 38)    -- переместить из одной точки в другую
-- паузы можно убрать

Автор: DarkMaster 26.11.2020, 5:50

я еще могу понять чем тебе не угодили _return и _end, но enter то за что?)

Автор: Crocotea 26.11.2020, 12:13

Цитата(cirus @ 26.11.2020, 2:15) *

Прикрепленный файл  arduino.zip ( 2,76 килобайт ) Кол-во скачиваний: 114

Пример использования:
Код
--lua
local hw = require'arduino'

hw.com = 7    -- Номер порта
-- установка пауз
hw.set_delay_key(30)
hw.set_delay_mouse(30)

wait(3000)

hw.key('A')   -- нажать кнопку
hw.key(hw["return"])           -- нажать Enter
hw.text('qwerty!')  -- отправить текст
hw.key(hw.tab)    -- нажать таб

wait(1000)
hw.mouse.left(422, 124)   -- клик левой кнопкой мыши
hw.mouse.right(422, 124)  -- клик правой
wait(500)
hw.mouse.left_dbl(422, 124)    -- двойной клик
wait(500)
hw.mouse.drag(420, 120, 654, 38)    -- переместить из одной точки в другую
-- паузы можно убрать



Код
--lua
local hw = require'arduino'

hw.com = 8    -- Номер порта
-- установка пауз
hw.set_delay_key(30)
hw.set_delay_mouse(1000)

wait(3000)
local a,b,x,y = 248, 266, 497, 374

::mt1::
--hw.key('A')   -- нажать кнопку
hw.mouse.move(a, b)
hw.mouse.move(x, y)
log(a,b,x,y)
goto mt1

курсор также двигается в хаотичные места, а не по координатам
Есть ли вероятность какой-то ошибки изза оконных и и экранных координат?
в адруин читает экранные координаты, т.е получается относительные, а в окне пилота относительные координаты идут как 497, 374 abs

Автор: cirus 26.11.2020, 13:04

Цитата
Есть ли вероятность какой-то ошибки изза оконных и и экранных координат?

Нет.
Для теста:
Код
#include <Mouse.h>
void setup() {
  Serial.begin(9600);
  Mouse.begin();
}

void loop()
{
  while (Serial.available() == 0) {
    delay(1);
  }

   while (Serial.available() > 0) {
    int text = Serial.read();
    delay(1);
  }

  Mouse.move(100, 50, 0); // сдвинуть курсор на 100 пикселей по X и 50 по Y от текущих координат
  delay(10);
}

Код
--lua
local com = 8    -- Номер порта

local command = function (text)
    local file = io.open("COM" .. tostring(com),"w")
    if file then
        file:write(text)
        file:close()
    else
        log('Порт не открылся, скрипт остановлен')
        end_script()
    end
end

command('0')

Автор: Crocotea 26.11.2020, 13:23

Цитата(cirus @ 26.11.2020, 13:04) *

Код
--lua
local com = 8    -- Номер порта

local command = function (text)
    local file = io.open("COM" .. tostring(com),"w")
    if file then
        file:write(text)
        file:close()
    else
        log('Порт не открылся, скрипт остановлен')
        end_script()
    end
end

command('0')


Перемещает курсор относительно текущего положения вправо вниз на хаотичное расстояние, но промежутки не так сильно отличаются друг от друга

Автор: cirus 26.11.2020, 13:32

На сколько перемещает?

Код
--lua
local com = 8    -- Номер порта

local command = function (text)
    local file = io.open("COM" .. tostring(com),"w")
    if file then
        file:write(text)
        file:close()
    else
        log('Порт не открылся, скрипт остановлен')
        end_script()
    end
end

local x, y = mouse_pos ('abs')
command('0')
wait(500)
local x2, y2 = mouse_pos ('abs')
log (x2-x, y2-y)

В параметрах мыши убрать галку 'Включить повышенную точность установки указателя'.

Автор: Crocotea 26.11.2020, 14:24

Цитата(cirus @ 26.11.2020, 13:32) *

В параметрах мыши убрать галку 'Включить повышенную точность установки указателя'.

как убрал галочку все заработало, на остальных скетчах и адруин.луа тоже

Автор: DarkMaster 26.11.2020, 23:40

Цитата
Crocotea

Можешь дать некоторую табличку перемещений? Перемещал на 1 - прыгнуло на 2, перемещал на 10, прыгнуло на 15 и т.д.?

Автор: cirus 27.11.2020, 2:58

Цитата
некоторую табличку перемещений?

При включённой галке 'Включить повышенную точность установки указателя' на сколько пикселей переместится курсор зависит от заданной скорости курсора и на сколько пикселей смещать курсор.
Скорость перемещения курсора мыши в винде от 1 до 20.
К примеру, сместить курсор на 100 пикселей по X и на 100 по Y.
При минимальной скорости, т. е. 1 сместит от 14 до 17 пикселей.
Если увеличить скорость до 2, то сместит от 30 до 34.
При 3 от 45 до 51.
и т. д.
При скорости 20 вместо 100 пикселей сместит от 310 до 342.
При смещение на 50 пикселей, а не на 100 цифры будут примерно вдвое меньше. Т. е. при минимальной скорости сместит на 7-8 пикселей, вместо 50.

Тут ещё надо учитывать что функции мыши принимают char, т. е. сместить курсор за раз можно максимум на -128...127 пикселей.
Как вариант можно отключать эту функцию перед перемещением курсора и включать обратно. Если верить описанию ****, на это уходит 12 мсек.

Автор: DarkMaster 27.11.2020, 3:29

Цитата
Тут ещё надо учитывать что функции мыши принимают char, т. е. сместить курсор за раз можно максимум на -128...127 пикселей.

Забавно. Т.е. получается в винде макс скорость перемещения мыши существует и зависит от герцовки мыша.
Цитата
Как вариант можно отключать эту функцию перед перемещением курсора и включать обратно.

Дерганье туда-сюда имхо не есть хорошо и уж точно не есть правильно. Имхо куда разумнее потроить обратную функцию (в смысле k(x)) и исходить из нее. На самом деле не так много вариантов получается - можно и вовсе таблицу использовать. 5120 значений - смех. Собрать тем же пилотом можно. Из-за ограничений макс дистанции все равно делать функцию разбиения движения на несколько вызовов, в рамках нее реализовать добор значений. Про добор поясню, например, нам нужно переместить на 100 пикселей, но из-за включенной акселерации у нас есть только 98 и 105 пикселей, соотвественно придется двигать на 98, потом на 2 ну или другие слогаемые.

Насколько последняя версия стабильна? В шапку выкладываю?

В таблицу enter все предлагаю все-таки вернуть. Я понимаю, что "по правильному" это "return", но вот ты когда последний раз его так называл? А при попытке клика чисто интуитивно, как бы начал писать? По поводу _return и _end вопрос более спорный, прошу помощь зала =)

Автор: cirus 27.11.2020, 3:54

Цитата
Насколько последняя версия стабильна?

Не знаю, на тесты пока нет времени.
Цитата
В шапку выкладываю?

Чуть позже, добавлю скролл.
Цитата
По поводу _return и _end вопрос более спорный, прошу помощь зала

Enter можно будет исправить, end без разницы, эту клавиша не часто используется.

Автор: cirus 27.11.2020, 4:42

Прикрепленный файл  arduino.zip ( 2,81 килобайт ) Кол-во скачиваний: 118

В архиве скетч и модуль lua.
Исправлено export_array["return"] = 0xB0 на

Код
export_array.enter = 0xB0

Добавлен скролл - перемещает курсор в указанные координаты и выполняет скролл на нужное количество щелчков, если количество не указано то сделает 1 щелчок вниз.
Код
hw.mouse.wheel(200, 100) -- переместить курсор в координаты 200 100 и сделать 1 щелчок вниз
hw.mouse.wheel(200, 100, 3)  -- на 3 щелчка вверх
hw.mouse.wheel(200, 100, -2) -- на 2 вниз

Добавлен drag - перемещает курсор в указанные координаты, зажимает левую кнопку мыши, перемещает курсор в указанные координаты.
Код
hw.mouse.drag(200, 100, 500, 300)

Функция text() теперь принимает строку любой длины, т. к. размер буфера ограничен, то строка будет напечатана частями по 60 символов.
Цитата
В шапку выкладываю?

Да.

Автор: Crocotea 27.11.2020, 11:46

Цитата
Насколько последняя версия стабильна? В шапку выкладываю?

сегодня постараюсь сделать полный тест всех функций, край завтра

Извиняюсь, я упустил момент, добавлялись ли спец символы !@^ для использования key('@~2') или они будут через
keydown(KEY_LEFT_CTRL)
keydown(KEY_LEFT_SHIFT)
key('2')
keyup(KEY_LEFT_SHIFT)
keyup(KEY_LEFT_CTRL)
как было решено оставить?

Цитата
Можешь дать некоторую табличку перемещений? Перемещал на 1 - прыгнуло на 2, перемещал на 10, прыгнуло на 15 и т.д.?

вместе с тестом, так получается через get_mousepos? как им считывать относительные координаты?

Автор: cirus 27.11.2020, 12:52

Цитата
добавлялись ли спец символы !@^

Нет. Можно добавить свою функцию.
Код
--lua
local hw = require'arduino'
hw.com = 7    -- Номер порта
hw.set_delay_key(30)     -- установка пауз
hw.set_delay_mouse(30)

local function key2(code)
--    hw.key_down(hw.left_ctrl) -- зажать ctrl
    hw.key_down(hw.left_shift)  -- зажать shift
    hw.key(code)                      -- нажать клавишу
    hw.key_up(hw.left_shift)      -- отпустить  shift
--    hw.key_up(hw.left_ctrl)    -- отпустить ctrl
end


wait(3000)
key2('2')
key2('5')

Автор: Crocotea 27.11.2020, 15:19

Цитата(cirus @ 27.11.2020, 4:42) *

Прикрепленный файл  arduino.zip ( 2,81 килобайт ) Кол-во скачиваний: 118

В архиве скетч и модуль lua.


не отпускает клавиши в указанных координатах. Так со всеми кнопками мыши где есть _up (правая,левая,центральная). Зажимает в нужных
Код
hw.mouse.left_down (740, 426)
hw.mouse.left_up (740, 326)

все остальное работает

Цитата
Можешь дать некоторую табличку перемещений? Перемещал на 1 - прыгнуло на 2, перемещал на 10, прыгнуло на 15 и т.д.?

тест
Код
--lua
local hw = require'arduino'
hw.com = 8    -- Номер порта
hw.set_delay_key(20)     -- установка пауз
hw.set_delay_mouse(1000)

wait(3000)
local a,b,x,y = 752, 420, 0, 0

::mt1::
hw.mouse.move(a, b)
local x, y = mouse_pos ("abs")
log(x,y)
goto mt1

результат

Код
15:16:53 12 (autosaved_12.txt, 0): 95 353
15:16:54 12 (autosaved_12.txt, 0): 1738 520
15:16:55 12 (autosaved_12.txt, 0): 0 268
15:16:56 12 (autosaved_12.txt, 0): 1904 653
15:16:58 12 (autosaved_12.txt, 0): 0 75
15:16:59 12 (autosaved_12.txt, 0): 1835 912
15:17:00 12 (autosaved_12.txt, 0): 0 0
15:17:01 12 (autosaved_12.txt, 0): 1919 1075
15:17:03 12 (autosaved_12.txt, 0): 0 0
15:17:04 12 (autosaved_12.txt, 0): 1919 1075
15:17:05 12 (autosaved_12.txt, 0): 0 580
15:17:06 12 (autosaved_12.txt, 0): 1139 689
15:17:07 12 (autosaved_12.txt, 0): 282 97
15:17:09 12 (autosaved_12.txt, 0): 1351 820
15:17:10 12 (autosaved_12.txt, 0): 0 0
15:17:11 12 (autosaved_12.txt, 0): 1919 1075
15:17:12 12 (autosaved_12.txt, 0): 1364 58
15:17:13 12 (autosaved_12.txt, 0): 0 896
15:17:15 12 (autosaved_12.txt, 0): 1919 0
15:17:16 12 (autosaved_12.txt, 0): 0 1065
15:17:17 12 (autosaved_12.txt, 0): 1916 5
15:17:18 12 (autosaved_12.txt, 0): 0 1015
15:17:20 12 (autosaved_12.txt, 0): 1919 0
15:17:21 12 (autosaved_12.txt, 0): 0 1065
15:17:22 12 (autosaved_12.txt, 0): 1919 0
15:17:23 12 (autosaved_12.txt, 0): 0 1064
15:17:24 12 (autosaved_12.txt, 0): 1919 0
15:17:26 12 (autosaved_12.txt, 0): 0 1064
15:17:27 12 (autosaved_12.txt, 0): 1919 0




Автор: cirus 27.11.2020, 15:27

Цитата
не отпускает клавиши в указанных координатах.

Увеличить паузу между нажатием и отпускание кнопок мыши.

Автор: Crocotea 27.11.2020, 15:28

Цитата(cirus @ 27.11.2020, 15:27) *

Увеличить паузу между нажатием и отпускание кнопок мыши.

параметры теста:
Код
--lua
local hw = require'arduino'
hw.com = 8    -- Номер порта
hw.set_delay_key(20)     -- установка пауз
hw.set_delay_mouse(1000)

целая секунда стоит

Автор: cirus 28.11.2020, 3:17

Цитата
не отпускает клавиши в указанных координатах. Так со всеми кнопками мыши где есть _up

Исправил.
Исправил drag.
Убрал паузу при чтении из буфера, теперь должно работать даже при небольших паузах.
Убрал паузу при перемещении мыши.
Прикрепленный файл  arduino.zip ( 2,81 килобайт ) Кол-во скачиваний: 117

Автор: Cockney 28.11.2020, 18:00

Цитата(cirus @ 28.11.2020, 3:17) *

Исправил.
Исправил drag.
Убрал паузу при чтении из буфера, теперь должно работать даже при небольших паузах.
Убрал паузу при перемещении мыши.
Прикрепленный файл  arduino.zip ( 2,81 килобайт ) Кол-во скачиваний: 117




Убрана вся магия
Выброшен String text, substring() и прочие.

Развернуть

Код

#include <Mouse.h>
#include <Keyboard.h>
#include <stdlib.h>

// hardware
int KEYBOARD_DELAY = 20;
int MOUSE_DELAY = 20;
const int SERIAL_PORT = 9600;
const int SERIAL_DELAY = 1;
#define MAX_BUFFER_SIZE 65 //null-terminated

// protocol
#define SET_DELAY '0'
#define SET_KEYBOARD_DELAY '0'
#define SET_MOUSE_DELAY '1'
#define PRESS_KEY '1'
#define PRINT_STRING '2'
#define KEY_DOWN '3'
#define KEY_UP '4'
#define MOUSE_MOVE '5'
#define MOUSE_CLICK '6'
#define MOUSE_DOWN '7'
#define MOUSE_UP '8'
#define MOUSE_SCROLL '9'

void setup() {
    Serial.begin(SERIAL_PORT);
    Mouse.begin();
    Keyboard.begin();
}

void loop()
{
    char buffer[MAX_BUFFER_SIZE];
    int buffPos = 0;

    while (!Serial.available()) {
        delay(SERIAL_DELAY);
    }

    while (Serial.available()) {
        if (buffPos <= MAX_BUFFER_SIZE - 2) {
            buffer[buffPos++] = Serial.read();
            buffer[buffPos] = '\0';
        }
    }

    switch (buffer[0]) {
    case SET_DELAY:  // установки паузы для клавиш клавиутуры и мыши
    {
        switch (buffer[1]) {
        case SET_KEYBOARD_DELAY:
            KEYBOARD_DELAY = atoi(&buffer[2]);
            break;
        case SET_MOUSE_DELAY:
            MOUSE_DELAY = atoi(&buffer[2]);
            break;
        }
        break;
    }
    case PRESS_KEY:  // нажатие клавиши
    {
        char key = buffer[1];
        Keyboard.press(key);
        delay(KEYBOARD_DELAY);
        Keyboard.release(key);
        delay(KEYBOARD_DELAY);
        break;
    }
    case PRINT_STRING:  // напечатать строку
    {
        for (int i = 1; i < MAX_BUFFER_SIZE - 1; i++) {
            Keyboard.write(buffer[i]);
            delay(KEYBOARD_DELAY);
        }
        break;
    }
    case KEY_DOWN:  // зажать клавишу
    {
        Keyboard.press(buffer[1]);
        delay(KEYBOARD_DELAY);
        break;
    }
    case KEY_UP:  // отпустить клавишу
    {
        Keyboard.release(buffer[1]);
        delay(KEYBOARD_DELAY);
        break;
    }
    case MOUSE_MOVE:  // переместить курсор мыши
    {
        long coordinate = atoi(&buffer[3]);
        // x и y на сколько пикселей нужно сместить курсор
        long x = coordinate / 65535;
        long y = coordinate % 65535;

        // нужно двигать влево/вправо вверх/вниз
        if (buffer[1] == '-')
            x = -x;
        if (buffer[2] == '-')
            y = -y;

        // сколько нужно сделать шагов
        int count_step;
        int stepX = 127, stepY = 127;        // шаг
        int remainsX, remainsY;  // сколько останется в конце

        if (abs(x) > abs(y))  // если по X больше двигать курсор чем по Y
        {
            count_step = abs(x) / 127;
            if (count_step > 0)
            {
                if (x < 0)stepX = -127;

                if (y > 0)stepY = abs(y) / count_step;
                else stepY = y / count_step;

                if (abs(stepY) > 127)
                {
                    if (stepY > 0)stepY = 127;
                    else stepY = -127;
                }
            }
            remainsX = x % stepX;
            remainsY = y % stepY;
        }
        else
        {
            count_step = abs(y) / 127;
            if (count_step > 0)
            {
                if (y < 0)stepY = -127;
                if (x > 0)stepX = abs(x) / count_step;
                else stepX = x / count_step;

                if (abs(stepX) > 127)
                {
                    if (stepX > 0)stepX = 127;
                    else stepX = -127;
                }
            }
            remainsX = x % stepX;
            remainsY = y % stepY;
        }

        for (int i = 0; i < count_step; i++)  // перемещение курсора
        {
            Mouse.move(stepX, stepY, 0);
        }

        Mouse.move(remainsX, remainsY, 0);  // перемещение в конечную точку
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_CLICK:  // клик кнопкой мыши
    {
        Mouse.click(buffer[1]);
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_DOWN:  // зажать кнопку мыши
    {
        Mouse.press(buffer[1]);
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_UP:  // отпустить кнопку мыши
    {
        Mouse.release(buffer[1]);
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_SCROLL:  // скролл мыши
    {
        char wheel = atoi(&buffer[1]);
        Mouse.move(0, 0, wheel);
        delay(MOUSE_DELAY);
        break;
    }
    default:
        break;
    }

}



Автор: cirus 28.11.2020, 20:03

Исправил ошибки.

Скетч
Код
#include <Mouse.h>
#include <Keyboard.h>
#include <stdlib.h>

// hardware
int KEYBOARD_DELAY = 20;
int MOUSE_DELAY = 20;
const int SERIAL_PORT = 9600;
const int SERIAL_DELAY = 1;
#define MAX_BUFFER_SIZE 64

// protocol
#define SET_DELAY '0'
#define SET_KEYBOARD_DELAY '0'
#define SET_MOUSE_DELAY '1'
#define PRESS_KEY '1'
#define PRINT_STRING '2'
#define KEY_DOWN '3'
#define KEY_UP '4'
#define MOUSE_MOVE '5'
#define MOUSE_CLICK '6'
#define MOUSE_DOWN '7'
#define MOUSE_UP '8'
#define MOUSE_SCROLL '9'

void setup() {
    Serial.begin(SERIAL_PORT);
    Mouse.begin();
    Keyboard.begin();
}

void loop()
{
    char buffer[MAX_BUFFER_SIZE];
    int buffPos = 0;

    while (!Serial.available()) {
        delay(SERIAL_DELAY);
    }

    while (Serial.available()) {
        if (buffPos < MAX_BUFFER_SIZE - 1) {
            buffer[buffPos++] = Serial.read();
            buffer[buffPos] = '\0';
        }
    }

    switch (buffer[0]) {
    case SET_DELAY:  // установки паузы для клавиш клавиутуры и мыши
    {
        switch (buffer[1]) {
        case SET_KEYBOARD_DELAY:
            KEYBOARD_DELAY = atoi(&buffer[2]);
            break;
        case SET_MOUSE_DELAY:
            MOUSE_DELAY = atoi(&buffer[2]);
            break;
        }
        break;
    }
    case PRESS_KEY:  // нажатие клавиши
    {
        char key = atoi(&buffer[1]);
        Keyboard.press(key);
        delay(KEYBOARD_DELAY);
        Keyboard.release(key);
        delay(KEYBOARD_DELAY);
        break;
    }
    case PRINT_STRING:  // напечатать строку
    {
        for (int i = 1; i < buffPos; i++) {
            Keyboard.write(buffer[i]);
            delay(KEYBOARD_DELAY);
        }
        break;
    }
    case KEY_DOWN:  // зажать клавишу
    {
        Keyboard.press(atoi(&buffer[1]));
        delay(KEYBOARD_DELAY);
        break;
    }
    case KEY_UP:  // отпустить клавишу
    {
        Keyboard.release(atoi(&buffer[1]));
        delay(KEYBOARD_DELAY);
        break;
    }
    case MOUSE_MOVE:  // переместить курсор мыши
    {
        long coordinate = atol(&buffer[3]);

        // x и y на сколько пикселей нужно сместить курсор
        long x = coordinate / 65535;
        long y = coordinate % 65535;

        // нужно двигать влево/вправо вверх/вниз
        if (buffer[1] == '-')
            x = -x;
        if (buffer[2] == '-')
            y = -y;

        // сколько нужно сделать шагов
        int count_step;
        int stepX = 127, stepY = 127;        // шаг
        int remainsX, remainsY;  // сколько останется в конце

        if (abs(x) > abs(y))  // если по X больше двигать курсор чем по Y
        {
            count_step = abs(x) / 127;
            if (count_step > 0)
            {
                if (x < 0)stepX = -127;

                if (y > 0)stepY = abs(y) / count_step;
                else stepY = y / count_step;

                if (abs(stepY) > 127)
                {
                    if (stepY > 0)stepY = 127;
                    else stepY = -127;
                }
            }
            remainsX = x % stepX;
            remainsY = y % stepY;
        }
        else
        {
            count_step = abs(y) / 127;
            if (count_step > 0)
            {
                if (y < 0)stepY = -127;
                if (x > 0)stepX = abs(x) / count_step;
                else stepX = x / count_step;

                if (abs(stepX) > 127)
                {
                    if (stepX > 0)stepX = 127;
                    else stepX = -127;
                }
            }
            remainsX = x % stepX;
            remainsY = y % stepY;
        }

        for (int i = 0; i < count_step; i++)  // перемещение курсора
        {
            Mouse.move(stepX, stepY, 0);
        }

        Mouse.move(remainsX, remainsY, 0);  // перемещение в конечную точку
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_CLICK:  // клик кнопкой мыши
    {
        Mouse.click(buffer[1]);
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_DOWN:  // зажать кнопку мыши
    {
        Mouse.press(buffer[1]);
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_UP:  // отпустить кнопку мыши
    {
        Mouse.release(buffer[1]);
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_SCROLL:  // скролл мыши
    {
        char wheel = atoi(&buffer[1]);
        Mouse.move(0, 0, wheel);
        delay(MOUSE_DELAY);
        break;
    }
    default:
        break;
    }
}

Автор: Crocotea 29.11.2020, 21:20

Цитата(cirus @ 28.11.2020, 20:03) *

Исправил ошибки.
Скетч
Код
#include <Mouse.h>
#include <Keyboard.h>
#include <stdlib.h>

// hardware
int KEYBOARD_DELAY = 20;
int MOUSE_DELAY = 20;
const int SERIAL_PORT = 9600;
const int SERIAL_DELAY = 1;
#define MAX_BUFFER_SIZE 64

// protocol
#define SET_DELAY '0'
#define SET_KEYBOARD_DELAY '0'
#define SET_MOUSE_DELAY '1'
#define PRESS_KEY '1'
#define PRINT_STRING '2'
#define KEY_DOWN '3'
#define KEY_UP '4'
#define MOUSE_MOVE '5'
#define MOUSE_CLICK '6'
#define MOUSE_DOWN '7'
#define MOUSE_UP '8'
#define MOUSE_SCROLL '9'

void setup() {
    Serial.begin(SERIAL_PORT);
    Mouse.begin();
    Keyboard.begin();
}

void loop()
{
    char buffer[MAX_BUFFER_SIZE];
    int buffPos = 0;

    while (!Serial.available()) {
        delay(SERIAL_DELAY);
    }

    while (Serial.available()) {
        if (buffPos < MAX_BUFFER_SIZE - 1) {
            buffer[buffPos++] = Serial.read();
            buffer[buffPos] = '\0';
        }
    }

    switch (buffer[0]) {
    case SET_DELAY:  // установки паузы для клавиш клавиутуры и мыши
    {
        switch (buffer[1]) {
        case SET_KEYBOARD_DELAY:
            KEYBOARD_DELAY = atoi(&buffer[2]);
            break;
        case SET_MOUSE_DELAY:
            MOUSE_DELAY = atoi(&buffer[2]);
            break;
        }
        break;
    }
    case PRESS_KEY:  // нажатие клавиши
    {
        char key = atoi(&buffer[1]);
        Keyboard.press(key);
        delay(KEYBOARD_DELAY);
        Keyboard.release(key);
        delay(KEYBOARD_DELAY);
        break;
    }
    case PRINT_STRING:  // напечатать строку
    {
        for (int i = 1; i < buffPos; i++) {
            Keyboard.write(buffer[i]);
            delay(KEYBOARD_DELAY);
        }
        break;
    }
    case KEY_DOWN:  // зажать клавишу
    {
        Keyboard.press(atoi(&buffer[1]));
        delay(KEYBOARD_DELAY);
        break;
    }
    case KEY_UP:  // отпустить клавишу
    {
        Keyboard.release(atoi(&buffer[1]));
        delay(KEYBOARD_DELAY);
        break;
    }
    case MOUSE_MOVE:  // переместить курсор мыши
    {
        long coordinate = atol(&buffer[3]);

        // x и y на сколько пикселей нужно сместить курсор
        long x = coordinate / 65535;
        long y = coordinate % 65535;

        // нужно двигать влево/вправо вверх/вниз
        if (buffer[1] == '-')
            x = -x;
        if (buffer[2] == '-')
            y = -y;

        // сколько нужно сделать шагов
        int count_step;
        int stepX = 127, stepY = 127;        // шаг
        int remainsX, remainsY;  // сколько останется в конце

        if (abs(x) > abs(y))  // если по X больше двигать курсор чем по Y
        {
            count_step = abs(x) / 127;
            if (count_step > 0)
            {
                if (x < 0)stepX = -127;

                if (y > 0)stepY = abs(y) / count_step;
                else stepY = y / count_step;

                if (abs(stepY) > 127)
                {
                    if (stepY > 0)stepY = 127;
                    else stepY = -127;
                }
            }
            remainsX = x % stepX;
            remainsY = y % stepY;
        }
        else
        {
            count_step = abs(y) / 127;
            if (count_step > 0)
            {
                if (y < 0)stepY = -127;
                if (x > 0)stepX = abs(x) / count_step;
                else stepX = x / count_step;

                if (abs(stepX) > 127)
                {
                    if (stepX > 0)stepX = 127;
                    else stepX = -127;
                }
            }
            remainsX = x % stepX;
            remainsY = y % stepY;
        }

        for (int i = 0; i < count_step; i++)  // перемещение курсора
        {
            Mouse.move(stepX, stepY, 0);
        }

        Mouse.move(remainsX, remainsY, 0);  // перемещение в конечную точку
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_CLICK:  // клик кнопкой мыши
    {
        Mouse.click(buffer[1]);
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_DOWN:  // зажать кнопку мыши
    {
        Mouse.press(buffer[1]);
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_UP:  // отпустить кнопку мыши
    {
        Mouse.release(buffer[1]);
        delay(MOUSE_DELAY);
        break;
    }
    case MOUSE_SCROLL:  // скролл мыши
    {
        char wheel = atoi(&buffer[1]);
        Mouse.move(0, 0, wheel);
        delay(MOUSE_DELAY);
        break;
    }
    default:
        break;
    }
}


комбинации с _up работают корректно

Автор: cirus 29.11.2020, 23:12

Crocotea, проверьте этот код:

Узнать номер com порта, в котором arduino
Код
--lua
local ffi = require('ffi')
local setupapi = ffi.load('SetupAPI.dll')
local advapi32 = ffi.load('Advapi32.dll')

local DIGCF_ALLCLASSES = 4
local DIGCF_PRESENT = 2
local SPDRP_HARDWAREID = 1
local DICS_FLAG_GLOBAL = 1
local DIREG_DEV = 1
local KEY_READ = 131097
local BUFF_LEN = 20
local ERROR_SUCCESS = 0
local REG_SZ = 1

ffi.cdef[[
struct HWND__ { int unused; }; typedef struct HWND__ *HWND;
struct HKEY__ { int unused; }; typedef struct HKEY__ *HKEY;
typedef HKEY *PHKEY;
typedef unsigned long ULONG;
typedef unsigned long   DWORD;
typedef DWORD         *LPDWORD;
typedef long   LONG;
typedef DWORD *PDWORD;
typedef unsigned char BYTE;
typedef BYTE *PBYTE, *LPBYTE;
typedef wchar_t         WCHAR;
typedef const char      *LPCSTR, *PCSTR;
typedef unsigned long ULONG_PTR, *PULONG_PTR;
typedef void *PVOID;
typedef PVOID HDEVINFO;
typedef ULONG DEVPROPTYPE;
typedef LONG LSTATUS;
typedef DWORD ACCESS_MASK;
typedef ACCESS_MASK REGSAM;

typedef struct _GUID {unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[8];} GUID;
typedef struct _SP_DEVINFO_DATA {DWORD cbSize; GUID ClassGuid; DWORD DevInst; ULONG_PTR Reserved;} SP_DEVINFO_DATA, *PSP_DEVINFO_DATA;

HDEVINFO SetupDiGetClassDevsA(const GUID *ClassGuid, PCSTR Enumerator, HWND hwndParent, DWORD Flags);
bool SetupDiDestroyDeviceInfoList(HDEVINFO DeviceInfoSet);
bool SetupDiEnumDeviceInfo(HDEVINFO DeviceInfoSet, DWORD MemberIndex, PSP_DEVINFO_DATA DeviceInfoData);
bool SetupDiGetDeviceRegistryPropertyA(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property,
    PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize);
HKEY SetupDiOpenDevRegKey(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData,
  DWORD Scope, DWORD HwProfile, DWORD KeyType, REGSAM samDesired);
LSTATUS RegCloseKey(HKEY hKey);
LSTATUS RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType,LPBYTE lpData, LPDWORD lpcbData);
]]


function get_port(vid, pid)
    if vid == nil then return -1 end
    if pid == nil then return -2 end

    local com
    local DeviceInfoSet = ffi.new('HDEVINFO')
    local DeviceIndex = 0
    local DeviceInfoData = ffi.new('SP_DEVINFO_DATA', 0)
    local DevEnum = ffi.new('PCSTR', "USB")
    local ExpectedDeviceId = 'VID_' .. tostring(vid) .. '&PID_' .. tostring(pid)
    local szBuffer = ffi.new('unsigned char[1024]', 0)
    local ulPropertyType = ffi.new('DEVPROPTYPE[1]')
    local dwSize = ffi.new('PDWORD')
    DeviceInfoSet = setupapi.SetupDiGetClassDevsA(nil, DevEnum, nil, bit.bor(DIGCF_ALLCLASSES, DIGCF_PRESENT))
    DeviceInfoData.cbSize = ffi.sizeof(DeviceInfoData)

    while setupapi.SetupDiEnumDeviceInfo(DeviceInfoSet, DeviceIndex, DeviceInfoData) do
        DeviceIndex = DeviceIndex + 1
        if (setupapi.SetupDiGetDeviceRegistryPropertyA(DeviceInfoSet, DeviceInfoData, SPDRP_HARDWAREID, ulPropertyType, szBuffer, ffi.sizeof(szBuffer), dwSize)) then
            if ffi.string(szBuffer):match(ExpectedDeviceId) then
                local hDeviceRegistryKey = ffi.new('HKEY')
                hDeviceRegistryKey = setupapi.SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
                local pszPortName = ffi.new('char[?]', BUFF_LEN)
                local dwSize = ffi.new('DWORD[1]', ffi.sizeof(pszPortName))
                local dwType = ffi.new('DWORD[1]')
                if advapi32.RegQueryValueExA(hDeviceRegistryKey, "PortName", nil, dwType, pszPortName, dwSize) == ERROR_SUCCESS and dwType[0] == REG_SZ then
                    com = tonumber(ffi.string(pszPortName):match('%d+'))
                end
            end
            advapi32.RegCloseKey(hDeviceRegistryKey)
        end
    end
    setupapi.SetupDiDestroyDeviceInfoList(DeviceInfoSet)
    if com then return com end
    return 0
end

-- узнать номер порта, передавать vid, pid
local COM = get_port(2341, 8036)  -- указать нужные vid и pid
log(COM)

vid и pid можно узнать в Arduino IDE, в меню 'Инструменты', 'Получить информацию о плате'.

Автор: DarkMaster 30.11.2020, 0:31

Цитата
vid и pid можно узнать в Arduino IDE, в меню 'Инструменты', 'Получить информацию о плате'.

А поменять?)

Автор: Crocotea 30.11.2020, 0:41

Цитата(cirus @ 29.11.2020, 23:12) *

Crocotea, проверьте этот код:
Узнать номер com порта, в котором arduino
Код
--lua
local ffi = require('ffi')
local setupapi = ffi.load('SetupAPI.dll')
local advapi32 = ffi.load('Advapi32.dll')

local DIGCF_ALLCLASSES = 4
local DIGCF_PRESENT = 2
local SPDRP_HARDWAREID = 1
local DICS_FLAG_GLOBAL = 1
local DIREG_DEV = 1
local KEY_READ = 131097
local BUFF_LEN = 20
local ERROR_SUCCESS = 0
local REG_SZ = 1

ffi.cdef[[
struct HWND__ { int unused; }; typedef struct HWND__ *HWND;
struct HKEY__ { int unused; }; typedef struct HKEY__ *HKEY;
typedef HKEY *PHKEY;
typedef unsigned long ULONG;
typedef unsigned long   DWORD;
typedef DWORD         *LPDWORD;
typedef long   LONG;
typedef DWORD *PDWORD;
typedef unsigned char BYTE;
typedef BYTE *PBYTE, *LPBYTE;
typedef wchar_t         WCHAR;
typedef const char      *LPCSTR, *PCSTR;
typedef unsigned long ULONG_PTR, *PULONG_PTR;
typedef void *PVOID;
typedef PVOID HDEVINFO;
typedef ULONG DEVPROPTYPE;
typedef LONG LSTATUS;
typedef DWORD ACCESS_MASK;
typedef ACCESS_MASK REGSAM;

typedef struct _GUID {unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[8];} GUID;
typedef struct _SP_DEVINFO_DATA {DWORD cbSize; GUID ClassGuid; DWORD DevInst; ULONG_PTR Reserved;} SP_DEVINFO_DATA, *PSP_DEVINFO_DATA;

HDEVINFO SetupDiGetClassDevsA(const GUID *ClassGuid, PCSTR Enumerator, HWND hwndParent, DWORD Flags);
bool SetupDiDestroyDeviceInfoList(HDEVINFO DeviceInfoSet);
bool SetupDiEnumDeviceInfo(HDEVINFO DeviceInfoSet, DWORD MemberIndex, PSP_DEVINFO_DATA DeviceInfoData);
bool SetupDiGetDeviceRegistryPropertyA(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property,
    PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize);
HKEY SetupDiOpenDevRegKey(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData,
  DWORD Scope, DWORD HwProfile, DWORD KeyType, REGSAM samDesired);
LSTATUS RegCloseKey(HKEY hKey);
LSTATUS RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType,LPBYTE lpData, LPDWORD lpcbData);
]]
function get_port(vid, pid)
    if vid == nil then return -1 end
    if pid == nil then return -2 end

    local com
    local DeviceInfoSet = ffi.new('HDEVINFO')
    local DeviceIndex = 0
    local DeviceInfoData = ffi.new('SP_DEVINFO_DATA', 0)
    local DevEnum = ffi.new('PCSTR', "USB")
    local ExpectedDeviceId = 'VID_' .. tostring(vid) .. '&PID_' .. tostring(pid)
    local szBuffer = ffi.new('unsigned char[1024]', 0)
    local ulPropertyType = ffi.new('DEVPROPTYPE[1]')
    local dwSize = ffi.new('PDWORD')
    DeviceInfoSet = setupapi.SetupDiGetClassDevsA(nil, DevEnum, nil, bit.bor(DIGCF_ALLCLASSES, DIGCF_PRESENT))
    DeviceInfoData.cbSize = ffi.sizeof(DeviceInfoData)

    while setupapi.SetupDiEnumDeviceInfo(DeviceInfoSet, DeviceIndex, DeviceInfoData) do
        DeviceIndex = DeviceIndex + 1
        if (setupapi.SetupDiGetDeviceRegistryPropertyA(DeviceInfoSet, DeviceInfoData, SPDRP_HARDWAREID, ulPropertyType, szBuffer, ffi.sizeof(szBuffer), dwSize)) then
            if ffi.string(szBuffer):match(ExpectedDeviceId) then
                local hDeviceRegistryKey = ffi.new('HKEY')
                hDeviceRegistryKey = setupapi.SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
                local pszPortName = ffi.new('char[?]', BUFF_LEN)
                local dwSize = ffi.new('DWORD[1]', ffi.sizeof(pszPortName))
                local dwType = ffi.new('DWORD[1]')
                if advapi32.RegQueryValueExA(hDeviceRegistryKey, "PortName", nil, dwType, pszPortName, dwSize) == ERROR_SUCCESS and dwType[0] == REG_SZ then
                    com = tonumber(ffi.string(pszPortName):match('%d+'))
                end
            end
            advapi32.RegCloseKey(hDeviceRegistryKey)
        end
    end
    setupapi.SetupDiDestroyDeviceInfoList(DeviceInfoSet)
    if com then return com end
    return 0
end

-- узнать номер порта, передавать vid, pid
local COM = get_port(2341, 8036)  -- указать нужные vid и pid
log(COM)

vid и pid можно узнать в Arduino IDE, в меню 'Инструменты', 'Получить информацию о плате'.


Нашел vid и pid скорректировал под свой. Выдал ошибку. результат:
https://ibb.co/QXttczp

Автор: cirus 30.11.2020, 0:53

Цитата
Выдал ошибку.

Вообще-то это скрипт луа, а не скетч.

Автор: Crocotea 30.11.2020, 1:39

Цитата(cirus @ 30.11.2020, 0:53) *

Вообще-то это скрипт луа, а не скетч.

оуу, так через пилот это запустить?
если через пилот то:
Код
1:40:55 14 (autosaved_14.txt, 0): 8

Автор: cirus 30.11.2020, 1:44

Цитата
1:40:55 14 (autosaved_14.txt, 0): 8

Это нужный порт?

Автор: Crocotea 30.11.2020, 2:52

Цитата(cirus @ 30.11.2020, 1:44) *

Это нужный порт?

да СОМ8

Автор: cirus 30.11.2020, 3:10

Прикрепленный файл  arduino.zip ( 2,82 килобайт ) Кол-во скачиваний: 162

Добавил функцию в модуль. Теперь можно не указывать порт.

Код
--lua
local hw = require'arduino'

hw.com = hw.get_port(2341, 8036)    -- получить номер порта, указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки
     end_script ()
end
hw.set_delay_key(20)     -- установка пауз
hw.set_delay_mouse(20)

hw.mouse.left(400, 300)


Автор: Crocotea 30.11.2020, 22:16

Цитата(cirus @ 30.11.2020, 3:10) *

Прикрепленный файл  arduino.zip ( 2,82 килобайт ) Кол-во скачиваний: 162

Добавил функцию в модуль. Теперь можно не указывать порт.
Код
--lua
local hw = require'arduino'

hw.com = hw.get_port(2341, 8036)    -- получить номер порта, указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки
     end_script ()
end
hw.set_delay_key(20)     -- установка пауз
hw.set_delay_mouse(20)

hw.mouse.left(400, 300)


Работает

Очень бы хотелось запускать все таки 2 и более скриптов паралельно

Автор: cirus 1.12.2020, 13:17

Прикрепленный файл  arduino.zip ( 5 килобайт ) Кол-во скачиваний: 178

Убрал не нужные паузы из скетча.
При переполнении буфера, хотя такого не должно быть, 3 секунды будет гореть встроенный светодиод L. В этом случае нужно увеличить паузы.
Изменил функцию text(), теперь может вводить русские символы.


Автор: cirus 6.12.2020, 1:53

Перенесено в пост №2 https://forum.uokit.com/index.php?s=&showtopic=70140&view=findpost&p=436373

Автор: DarkMaster 6.12.2020, 8:42

cirus, у тебя второй пост в теме. Это очень хороший момент =) Можешь туда все выложить? Я сделаю линк на него с мануала. Либо надо просто создать(тебе, чтобы мог спокойно редактивроать) отдельную тему и туда переехать.

Автор: cirus 6.12.2020, 11:41

Цитата
cirus, у тебя второй пост в теме. Можешь туда все выложить?

Перенёс. Тему можно почистить.

Автор: Crocotea 6.12.2020, 16:54

Цитата(cirus @ 27.11.2020, 12:52) *

Нет. Можно добавить свою функцию.
Код
--lua
local hw = require'arduino'
hw.com = 7    -- Номер порта
hw.set_delay_key(30)     -- установка пауз
hw.set_delay_mouse(30)

local function key2(code)
--    hw.key_down(hw.left_ctrl) -- зажать ctrl
    hw.key_down(hw.left_shift)  -- зажать shift
    hw.key(code)                      -- нажать клавишу
    hw.key_up(hw.left_shift)      -- отпустить  shift
--    hw.key_up(hw.left_ctrl)    -- отпустить ctrl
end
wait(3000)
key2('2')
key2('5')


добавьте пж эту функцию тоже в пример использования. тоже очень нужная

Цитата(cirus @ 23.11.2020, 14:45) *

key принимает 1 клавишу, если надо нажать несколько вызывайте key для каждого символа. Либо через функцию:
Код
--lua
require'Arduino'
COM = 7     -- номер порта

function _key(text)
    for symbol in text:gmatch(".") do
        key(symbol)
    end
end

wait(3000) -- за это время переключиться на нужное приложение
delaykey(20)   -- установить паузу между нажатиями клавиш
_key('sssss')


эту тоже, только адаптированную под текущий синтаксис


Цитата
Очень бы хотелось запускать все таки 2 и более скриптов паралельно

все еще очень актуально))

Автор: cirus 6.12.2020, 16:59

Цитата
эту тоже, только адаптированную под текущий синтаксис

Для этого есть функция text().

Автор: cirus 7.12.2020, 13:13

Цитата
Очень бы хотелось запускать все таки 2 и более скриптов паралельно

Прикрепленный файл  arduino.zip ( 6,69 килобайт ) Кол-во скачиваний: 166

Пробуйте. Можно запускать несколько скриптов.
Нельзя останавливать скрипт пока ардуино не закончит выполнение операции, порт не закроется и придётся перезапускать пилот.

Все функции мыши, выполняющие клик, которые вызваны без параметров, делают клик в текущих координатах. Например:
Код
hw.mouse.left()   -- клик левой кнопкой мыши в тех координатах, где находится курсор в данный момент

Автор: Crocotea 7.12.2020, 17:14

Цитата(cirus @ 7.12.2020, 13:13) *

Прикрепленный файл  arduino.zip ( 6,69 килобайт ) Кол-во скачиваний: 166

Пробуйте. Можно запускать несколько скриптов.
Нельзя останавливать скрипт пока ардуино не закончит выполнение операции, порт не закроется и придётся перезапускать пилот.

Все функции мыши, выполняющие клик, которые вызваны без параметров, делают клик в текущих координатах. Например:
Код
hw.mouse.left()   -- клик левой кнопкой мыши в тех координатах, где находится курсор в данный момент



шикарно, работают несколько скриптов параллельно
хотел уточнить правильно ли я понял. Т.е. если работает скрипт №1 он нажимает s, пока он не закончит скрипт №2 ничего нажать не сможет, однако все остальные функции пилота работают в стандартном режиме? то есть например поиск цвета в скрипте №1 и соответствие цвета в нужных координатах в скрипте №2 будут считываться корректно?

Автор: cirus 8.12.2020, 3:29

Цитата
хотел уточнить

Допустим, скрипт1 отправляет команду ардуино, теперь скрипт1 ждёт когда устройство выполнит команду. В это время другие скрипты работают как надо, но если им потребуется отправить команду ардуино, то они будут ждать когда порт будет доступен для открытия. Скрипт1 дождётся ответа от ардуино, закроет порт и продолжит работу. Другие скрипты смогут отправить команду.
Приоритета у скриптов нет, какой успеет первым открыть порт, тот и выполнит команду.

Автор: cirus 11.12.2020, 3:50

Перенесено в пост №2.

Автор: trico 20.12.2020, 3:36

с arduino UNO получится? и поможет ли это в борьбе с gameguard?

Автор: DarkMaster 20.12.2020, 5:18

Потихоньку переезжаем сюда https://forum.uokit.com/index.php?showtopic=70514
С гвардом поможет, про uno ничего сказать не могу.

Автор: cirus 20.12.2020, 9:34

Цитата
с arduino UNO получится?

Нет. Нужна плата с микроконтроллером ATmega32u4, в uno ATmega328.
Цитата
Mouse and Keyboard libraries
These core libraries allow a 32u4 based boards or Due and Zero board to appear as a native Mouse and/or Keyboard to a connected computer.

Автор: DarkMaster 20.12.2020, 10:50

А можно мне пояснить в чем разница между контроллерами? Всмысле компилятор разве не должен на выходе дать рабочий результат для другого контроллера? Или там какие-то фишки? Для меня всегда разница была только в количестве сигнальных лапок и шим...

Автор: cirus 20.12.2020, 17:08

Цитата
А можно мне пояснить в чем разница между контроллерами?

Micro и Leonardo определяются как USB устройство.

Автор: DarkMaster 21.12.2020, 1:59

Цитата
Micro и Leonardo определяются как USB устройство.

Так а определение разве не зависит от прошивки?
Остальные шить только программатором?

Автор: cirus 21.12.2020, 2:11

Цитата
Так а определение разве не зависит от прошивки?

От прошивки зависит только то, что будет выполнять ардуино.
Цитата
Остальные шить только программатором?

Может ещё как-то можно, это самое простое решение.

Автор: DarkMaster 21.12.2020, 3:26

Цитата
От прошивки зависит только то, что будет выполнять ардуино.

Да, но добавляя заголовок клавиатуры мы получаем клавиатуру в устройствах, а добавляя мышь мы получаем мышь.
Правильно ли я понимаю, что грубо говоря есть 2 прошивки. Пользовательская и некоторая хардовая которая не подлежит замене в адекватном виде? Либо это все единая прошивка, но компилятор скрыто докидывает "хардверный" код в каждый проект?

Автор: cirus 21.12.2020, 3:45

Цитата
Да, но добавляя заголовок клавиатуры мы получаем клавиатуру в устройствах, а добавляя мышь мы получаем мышь.

Если нет мыши, то заголовочный файл никак не поможет, это же просто подключение библиотеки с функциями. Другие ардуино просто не будут определяться как мышь и клавиатура.
Прикрепленное изображение
У меня же не 3 мыши подключено... хотя не понятно откуда третья взялась.
Цитата
Правильно ли я понимаю, что грубо говоря есть 2 прошивки. Пользовательская и некоторая хардовая которая не подлежит замене в адекватном виде? Либо это все единая прошивка, но компилятор скрыто докидывает "хардверный" код в каждый проект?

Без понятия.


Автор: DarkMaster 21.12.2020, 4:57

Цитата
Если нет мыши, то заголовочный файл никак не поможет, это же просто подключение библиотеки с функциями. Другие ардуино просто не будут определяться как мышь и клавиатура.

Пока не появилась твоя версия с мышой в заголовке - ардуинка определялась только, как ардуино и клавиатура. Т.е. вроде как зависит.
Цитата
Другие ардуино просто не будут определяться как мышь и клавиатура.

Вот этот момент мне на самом деле не понятен до состояния совсем. Почему? Всегда считал, как я уже писал выше, что все это контролирует прошивка.

Автор: Cockney 21.12.2020, 11:49

Цитата(DarkMaster @ 21.12.2020, 3:26) *


Правильно ли я понимаю, что грубо говоря есть 2 прошивки. Пользовательская и некоторая хардовая которая не подлежит замене в адекватном виде?



http://mitchtech.net/arduino-usb-hid-keyboard/ поясняется как это работает. Если кратко, то есть мини прошивка, которая ставится программатором (и ее можно поменять на свое усмотрение), дальше устройство начинает работать по протоколу usb и позволяет заливать основную прошивку.

Автор: Fors1k 23.12.2020, 2:28

Цитата(cirus @ 26.11.2020, 13:32) *

В параметрах мыши убрать галку 'Включить повышенную точность установки указателя'.

Я тут понял, что тем, кто играл в CS, такая проблема не грозит smile.gif

Автор: ya_ne_pil 30.9.2022, 20:53

Очень жаль что тема почти умерла но по ней я смог сделать все настройки и очень благодарен автору.
Если кому придет уведомление по теме то подскажите, работают ли команды совместно с if, repeat, while ?
Потому что не получилось их объединить, постоянно ошибки вылезают.

Автор: Madeus 30.9.2022, 22:15

Актуальная тема по https://forum.uokit.com/index.php?showtopic=70514

Автор: ya_ne_pil 30.9.2022, 23:19

Цитата(Madeus @ 30.9.2022, 22:15) *

Актуальная тема по https://forum.uokit.com/index.php?showtopic=70514

Спасибо! Пропустил эту тему, надеюсь найду там ответ.

Автор: kdv 11.3.2023, 10:06

Доброе утро, приобрёл этот дивайс и хотел попробовать, и как всегда возникли проблемы. Небольшой скрипт, при котором мышка переходит в нужную сторону (показывая что скрипт работает). Но вот нажатие клавиатуры не происходит.
Прикрепленное изображение

Код

--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8037)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки
     end_script ()
end
wait (3000)
kleft (113, 51    ,  "abs")

if color(804, 60 ,  "abs") == 1580423  then
       left (480, 1017 ,  "abs")
else
    left (600, 1014 ,  "abs")
end

end_script ()

Так же мышка перемещается но нажатие левой клавиши не происходит

Автор: cirus 11.3.2023, 11:34

В вашем скрипте нет функций для нажатий через ардуино. Смотрите примеры.

Автор: kdv 11.3.2023, 13:32

Да тут еше хуже, все норм а теперь вылазиет это сообщение

Код

processing.app.debug.RunnerException
    at cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:152)
    at cc.arduino.UploaderUtils.upload(UploaderUtils.java:77)
    at processing.app.SketchController.upload(SketchController.java:732)
    at processing.app.SketchController.exportApplet(SketchController.java:703)
    at processing.app.Editor$UploadHandler.run(Editor.java:2061)
    at java.lang.Thread.run(Thread.java:748)
Caused by: processing.app.SerialException: Ошибка создания последовательного порта "COM3"
    at processing.app.Serial.touchForCDCReset(Serial.java:107)
    at cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:136)
    ... 5 more
Caused by: jssc.SerialPortException: Port name - COM3; Method name - openPort(); Exception type - Port not found.
    at jssc.SerialPort.openPort(SerialPort.java:167)
    at processing.app.Serial.touchForCDCReset(Serial.java:101)
    ... 6 more


Прикрепленное изображениеПрикрепленное изображение

Автор: cirus 11.3.2023, 13:49

Всё что нужно, включая скетч и примеры использования, тут: https://forum.uokit.com/index.php?showtopic=70514

Автор: kdv 11.3.2023, 14:06

Цитата(cirus @ 11.3.2023, 13:49) *

Всё что нужно, включая скетч и примеры использования, тут: https://forum.uokit.com/index.php?showtopic=70514

Да я ка бы и делал по тому что там написано, но по какой-то причины скетчи не загружаются (раньше загружались), даже "Примеры" что загружены там, но как я говорил раньше загружались, может это быть с поломкой ардуина
Прикрепленное изображение

Автор: cirus 11.3.2023, 14:42

Перезагрузка пк решает многие проблемы. Также на ардуино есть кнопка reset.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)