|
|
|
Pilot + Arduino (Hardware clicker) |
|
|
Crocotea |
30.11.2020, 0:41
|
Novice
Сообщений: 51
Регистрация: 30.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.787
|
Цитата(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
|
|
|
|
Crocotea |
30.11.2020, 1:39
|
Novice
Сообщений: 51
Регистрация: 30.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.787
|
Цитата(cirus @ 30.11.2020, 0:53) Вообще-то это скрипт луа, а не скетч.
оуу, так через пилот это запустить? если через пилот то: Код 1:40:55 14 (autosaved_14.txt, 0): 8
|
|
|
|
Crocotea |
30.11.2020, 22:16
|
Novice
Сообщений: 51
Регистрация: 30.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.787
|
Цитата(cirus @ 30.11.2020, 3:10)
arduino.zip ( 2,82 килобайт )
Кол-во скачиваний: 210 Добавил функцию в модуль. Теперь можно не указывать порт. Код --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 |
6.12.2020, 1:53
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 27518
Пользователь №: 16.971
Возраст: 29
|
|
|
|
|
Crocotea |
6.12.2020, 16:54
|
Novice
Сообщений: 51
Регистрация: 30.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.787
|
Цитата(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 и более скриптов паралельно все еще очень актуально))
|
|
|
|
Crocotea |
7.12.2020, 17:14
|
Novice
Сообщений: 51
Регистрация: 30.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.787
|
Цитата(cirus @ 7.12.2020, 13:13)
arduino.zip ( 6,69 килобайт )
Кол-во скачиваний: 232Пробуйте. Можно запускать несколько скриптов. Нельзя останавливать скрипт пока ардуино не закончит выполнение операции, порт не закроется и придётся перезапускать пилот. Все функции мыши, выполняющие клик, которые вызваны без параметров, делают клик в текущих координатах. Например: Код hw.mouse.left() -- клик левой кнопкой мыши в тех координатах, где находится курсор в данный момент шикарно, работают несколько скриптов параллельно хотел уточнить правильно ли я понял. Т.е. если работает скрипт №1 он нажимает s, пока он не закончит скрипт №2 ничего нажать не сможет, однако все остальные функции пилота работают в стандартном режиме? то есть например поиск цвета в скрипте №1 и соответствие цвета в нужных координатах в скрипте №2 будут считываться корректно?
|
|
|
|
|
|
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|