Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - dramster

Страницы: [1] 2
1
Не прошло и года, как у меня все-же получилось написать длл для общения с ком портом, а именно с ардуиномикро. По сравнению с командной строкой, работает шустро и незаметно.
При написании никаких дополнительных компонентов для работы с ком не использовал. С ними оказалось намного все сложнее.
Вобщем, пару вечеров, куча статей и форумов, вот первый, и вполне рабочий вариант.
Кто в теме, или вдруг загорится этой темой, код длл делфи10:
Код: Clickermann
  1. library micro_com;
  2.  
  3. uses    Windows, SysUtils;
  4.  
  5. //------------------------------------------------------------------------------
  6. // Основное тело функции, идет на экспорт, вызывается из кликера
  7. function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
  8.  
  9.  
  10. type
  11.  pIntArr = array[0..0] of Integer;
  12. var
  13. DCB   : TDCB;
  14. hPort : THandle;
  15. port_num : integer;
  16. param : integer;
  17. byete_res: Cardinal;
  18. str : string;
  19. len : integer;
  20. begin
  21.   port_num := pIntArr(_mas^)[0];
  22.   param := pIntArr(_mas^)[_size-1];
  23.  
  24.  // 1. Открываем файл
  25.  hPort := CreateFile(PChar('COM'+IntToStr(port_num)), GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  26.  // 2. Контроль ошибок
  27.  if hPort = INVALID_HANDLE_VALUE then begin
  28.   // Обнаружена ошибка, порт открыть не удалось
  29.   result := 1;
  30.   exit;
  31.  end;
  32.  
  33.  // 3. Чтение текущих настроек порта
  34. if GetCommState(hPort, DCB) then ;
  35.  // 4. Настройки:
  36.  // Скорость обмена
  37. DCB.BaudRate := 9600;
  38.  // Число бит на символ
  39. DCB.ByteSize := 8;
  40.  // Стоп-биты
  41. DCB.StopBits := 1;
  42.  // Четность
  43. DCB.Parity   := 0;
  44.  // Какая-то херь непонятная
  45. DCB.Flags := 20625;
  46.  // 5. Передача настроек
  47. if not SetCommState(hPort, DCB) then begin{ошибка настройки порта}
  48.   result := 2;
  49.   exit;
  50. end;
  51.  // 6. Настройка буферов порта (очередей ввода и вывода)
  52. if not SetupComm(hPort, 16, 16) then begin{ошибка настройки буферов}
  53.   result := 3;
  54.   exit;
  55. end;
  56.  // 7. Сброс буферов и очередей
  57. if PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR) then
  58. // 8. Запись в порт
  59. str := intToStr(param);
  60. len := Length(str);
  61. WriteFile(hPort, PChar(str)^, len*2, byete_res, nil);
  62.  // 9. Закрытие порта
  63. CloseHandle(hPort);
  64. result := 5;
  65. end;
  66.  
  67. //------------------------------------------------------------------------------
  68.  
  69. // список экспорта
  70. exports execute;
  71.  
  72. begin
  73.  
  74. end.

Скомпилированная библиотека уверенно отправляет в нужный порт любой текст. Примерно так:
Код: Clickermann
  1. CALL ("micro_com.dll", $com, $val)

Нам же, для управления микрой, нужны только числа. Скетч для контроллера взял старый отсюда http://crapware.aidf.org/forum/index.php?topic=5215.msg34294#msg34294 . Немного доработал его:
Код: Clickermann
  1. #include <Mouse.h>
  2. #include <Keyboard.h>
  3.  
  4. unsigned long par = 0;
  5. String instring = "";
  6. int kmfunct = 0;
  7. int x_cor = 0;
  8. int y_cor = 0;
  9. int mult = 0;
  10. int inchar = 0;
  11.  
  12. void setup() {
  13.  Serial.begin(9600);
  14.  Mouse.begin();
  15.  Keyboard.begin();
  16.  
  17. }
  18.  
  19. void loop() {
  20.  
  21.  
  22. while(Serial.available() > 0){  
  23. inchar = Serial.read();
  24. if (isDigit(inchar)) {
  25.   instring += (char)inchar;      
  26.    }  
  27. }    
  28.  par = instring.toInt();
  29.  instring = "";
  30.  
  31.  
  32.    if (par > 0) {
  33.  
  34.     kmfunct =  par/16777216 ;
  35.     switch (kmfunct) {
  36.  
  37.     case 1:  //Mouse.click
  38.      Mouse.click(par - kmfunct*16777216);
  39.      break;    
  40.     case 2:  //  Mouse.move
  41.      x_cor = (par - kmfunct*16777216)/256;
  42.      y_cor = par - x_cor*256 - kmfunct*16777216;
  43.      if (x_cor > 127) x_cor = 127 - x_cor;
  44.      if (y_cor > 127) y_cor = 127 - y_cor;
  45.      Mouse.move(x_cor, y_cor, 0);
  46.      break;
  47.     case 3: //Mouse.press
  48.      Mouse.press(par - kmfunct*16777216);
  49.      break;
  50.     case 4: //Mouse.release
  51.      Mouse.release(par - kmfunct*16777216);
  52.      break;
  53.     case 5:  //Mouse.dblclick
  54.      Mouse.click(par - kmfunct*16777216);
  55.      delay(50);
  56.      Mouse.click(par - kmfunct*16777216);
  57.      break;
  58.     case 6: //wheel.down.up
  59.      mult = par - kmfunct*16777216;
  60.      if (mult > 127) mult = 127 - mult;
  61.      Mouse.move(0, 0, mult);
  62.     case 7: // Keyboard.keydown
  63.      Keyboard.press(par - kmfunct*16777216);
  64.      break;
  65.     case 8: // Keyboard.keyup
  66.      Keyboard.release(par - kmfunct*16777216);
  67.      break;
  68.     case 9: // Keyboard.keypress
  69.      Keyboard.write(par - kmfunct*16777216);
  70.      break;
  71.     }
  72.    }
  73.    par = 0;
  74.  
  75. }


Библиотека с подпрограммами для кликермана тут:
Код: Clickermann
  1. $com = 5   //свой порт
  2.  
  3. //#name "Arduino_mouse&keyboard"
  4.  
  5. ////////////////////////////////////////////////
  6.  
  7. // Все процедуры с мышью и клавиатурой через ардуино
  8.  
  9. //micro_move ($x_cor, $y_cor)
  10. //micro_lclick ($x_cor, $y_cor)
  11. //micro_rclick ($x_cor, $y_cor)
  12. //micro_mclick ($x_cor, $y_cor)
  13. //micro_ldown ($x_cor, $y_cor)
  14. //micro_rdown ($x_cor, $y_cor)
  15. //micro_mdown ($x_cor, $y_cor)
  16. //micro_lup ($x_cor, $y_cor)
  17. //micro_rup ($x_cor, $y_cor)
  18. //micro_mup ($x_cor, $y_cor)
  19. //micro_dblclick ($x_cor, $y_cor)
  20. //micro_wheeldown ($mult)
  21. //micro_wheelup ($mult)
  22.  
  23. // вместо $char_ASCII писать не код клавиши, а символ ASCII.
  24. // в ардуино как-то тупо сделали клавиатурные нажатия :/
  25. //micro_keydown ($char_ASCII)
  26. //micro_keyup ($char_ASCII)
  27. //micro_keypress ($char_ASCII)
  28.  
  29.  
  30.  
  31. //move
  32. SUB(micro_move, $x_cor, $y_cor)
  33.  
  34.   WHILE(DIST($x_cor, $y_cor, $_xmouse, $_ymouse) > 3)
  35.  
  36.      $x_temp = $_xmouse
  37.      $y_temp = $_ymouse
  38.  
  39.      $x_dist = $x_cor - $_xmouse
  40.      $y_dist = $y_cor - $_ymouse
  41.  
  42.      IF($x_dist < 0)
  43.         $x_dist = 127 + int(SQRT(abs($x_dist*4)))
  44.      else
  45.         $x_dist =  int(SQRT(abs($x_dist*4)))
  46.      END_IF
  47.      IF($y_dist < 0)
  48.         $y_dist = 127 + int(SQRT(abs($y_dist*4)))
  49.      else
  50.         $y_dist =  int(SQRT(abs($y_dist*4)))
  51.      END_IF
  52.      CALL ("micro_com.dll", $com, 33554432 + $x_dist*256 + $y_dist)  
  53.  
  54.   END_CYC
  55. END_SUB
  56.  
  57. //lclick
  58. SUB(micro_lclick, $x_cor, $y_cor)
  59.   micro_move($x_cor, $y_cor)
  60.   CALL ("micro_com.dll", $com, 16777217)
  61. END_SUB
  62.  
  63. //rclick
  64. SUB(micro_rclick, $x_cor, $y_cor)
  65.   micro_move($x_cor, $y_cor)
  66.   CALL ("micro_com.dll", $com, 16777218)
  67. END_SUB
  68.  
  69. //mclick
  70. SUB(micro_mclick, $x_cor, $y_cor)
  71.   micro_move($x_cor, $y_cor)
  72.   CALL ("micro_com.dll", $com, 16777219)
  73. END_SUB
  74.  
  75. //ldown
  76. SUB(micro_ldown, $x_cor, $y_cor)
  77.   micro_move($x_cor, $y_cor)
  78.   CALL ("micro_com.dll", $com, 50331649)
  79. END_SUB
  80.  
  81. //rdown
  82. SUB(micro_rdown, $x_cor, $y_cor)
  83.   micro_move($x_cor, $y_cor)
  84.   CALL ("micro_com.dll", $com, 50331650)
  85. END_SUB
  86.  
  87. //mdown
  88. SUB(micro_mdown, $x_cor, $y_cor)
  89.   micro_move($x_cor, $y_cor)
  90.   CALL ("micro_com.dll", $com, 50331651)
  91. END_SUB
  92.  
  93. //lup
  94. SUB(micro_lup, $x_cor, $y_cor)
  95.   micro_move($x_cor, $y_cor)
  96.   CALL ("micro_com.dll", $com, 67108865)
  97. END_SUB
  98.  
  99. //rup
  100. SUB(micro_rup, $x_cor, $y_cor)
  101.   micro_move($x_cor, $y_cor)
  102.   CALL ("micro_com.dll", $com, 67108866)
  103. END_SUB
  104.  
  105. //mup
  106. SUB(micro_mup, $x_cor, $y_cor)
  107.   micro_move($x_cor, $y_cor)
  108.   CALL ("micro_com.dll", $com, 67108867)
  109. END_SUB
  110.  
  111. //dblclick
  112. SUB(micro_dblclick, $x_cor, $y_cor)
  113.   micro_move($x_cor, $y_cor)
  114.   CALL ("micro_com.dll", $com, 83886081)
  115. END_SUB
  116.  
  117. //wheeldown
  118. SUB(micro_wheeldown, $mult)
  119.   CALL ("micro_com.dll", $com, 100663423 + $mult)
  120. END_SUB
  121.  
  122. //wheelup
  123. SUB(micro_wheelup, $mult)
  124.   CALL ("micro_com.dll", $com, 100663296 + $mult)
  125. END_SUB
  126.  
  127. //keydown
  128. SUB(micro_keydown, $char_ASCII)
  129.   CALL ("micro_com.dll", $com, 117440512 + code($char_ASCII))
  130. END_SUB
  131.  
  132. //keyup
  133. SUB(micro_keyup, $char_ASCII)
  134.   CALL ("micro_com.dll", $com, 134217728 + code($char_ASCII))
  135. END_SUB
  136.  
  137. //keypress
  138. SUB(micro_keypress, $char_ASCII)
  139.   CALL ("micro_com.dll", $com, 150994944 + code($char_ASCII))
  140. END_SUB
  141.  

Даже и не уверен, придумают ли защиту от такого аппаратного управления машиной  ;).

Подключайтесь, проверяйте. Я проверил и использовал лишь в одной защищенной древнючей игре MTA_SA. Не смотря на ее древнючесть, они уже давно  впилили защиту от кликеров. Сам контроллер не сильно и дорогой, глянул - от 350р. Я вроде еще за 280 когда-то купил.

Во вложении dll для х32 систем.


2
 Нашел я библиотеку dll для работы с ком портами https://www.kernelchip.ru/pcports/PS057.php. Ранее без проблем получалось писать dll на делфи для чтения функций из сторонних библиотек dll. Как пример вот эта тема http://crapware.aidf.org/forum/index.php?topic=4596.msg31508#msg31508 . Там я вызывал функцию как процедуру, и даже так прокатило. Были у меня и еще примеры использования функций из сторонней длл, все работало как часики.

 Но вот с этой библиотекой 'SerialGate.dll' что-то никак не вяжется. Выдает ошибку "Точка входа в процедуру 'имя ф-ции' не найдена в библиотеке DLL". То есть, якобы этой функции там нет  :(

 Там на сайте автора https://www.kernelchip.ru/pcports/PS057.php и https://www.kernelchip.ru/pcports/PS058.php и  https://www.kernelchip.ru/pcports/PS059.php есть исходники, но я в C++ полный ноль, да и в Delphi не ас.


 Если кто-то из читателей данной темы в курсе как там все работает, не пожалейте пару минут на общее благо. Гляньте по ссылкам и проверьте в чем моя ошибка. Хочу написать DLL для общения кликермана с arduino micro.

Мои попытки чтения функций из 'SerialGate.dll':
Код: Clickermann
  1. library cmann_plugin;
  2.  
  3. uses  SysUtils, Winapi.Windows;
  4.  
  5. function Open(port : integer; baud : integer) : boolean; stdcall; external 'SerialGate.dll'; //берем из 'SerialGate.dll' функцию 'Open'
  6.  
  7. //------------------------------------------------------------------------------
  8. // Основное тело функции, идет на экспорт, вызывается из кликера
  9. function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
  10. type
  11.  pIntArr = array[0..0] of Integer;
  12. var
  13.  port_input : integer;
  14.  res : integer;
  15. begin
  16.  port_input := pIntArr(_mas^)[0]; //читаем параметр порта из кликермана
  17.  
  18.  if Open(port_input, 19200) then res := 1 else res := 2; //пытаемся открыть порт и результат сего действия возвращаем кликерману.
  19.  
  20.  result := res;
  21.  
  22. end;
  23. //------------------------------------------------------------------------------
  24.  
  25. // список экспорта
  26. exports execute;
  27.  
  28. begin
  29.  // тело пусто
  30. end.

Спасибо всем заранее  :) .

3
Прочее / snake Классический.
« : Апрель 25, 2020, 11:09:58 pm »
Так, для раскрытия возможностей км, хочу показать что я делал пару лет назад, но не хотел палиться целях безопасности. Код гдето есть, но это все простейшие алгоритмы.
В игре мта-са есть мини игра змейка, классическая. Когда был забанен, то даже видос записал - https://www.youtube.com/watch?v=d9epgngxkpw . Там я набрал не так уж и много, в топ попал.
Мой рекорд был это максимальное заполнение поля, видос тогда я не писал, но скрин скину с результатом. Если ктото не понял, я заполнил все поле змейкой и уперся в свой хвост, это был максимум. То что там в топе это наверняка хак при начальной разработке сервера. ...самого скрина заполненного поля не нашел, но в топе он есть. Если кто не верит, могу попробовать повторить и записать, это конечно если комуто интересно.


slayer тогда мой ник был. Можете посчитать все кубики, на выполнение ушло гдето полтора часа, но всеже км справился. Это для меня в тот момент было радости полные штаны, но похвастаться некому было, играл.... Жаль что интерес пропал. К стати все рекорды что ниже, тоже мои.

ВОт так умеет чудо прога Кликерманн

4
Общие вопросы / Работа с ftp
« : Октябрь 27, 2019, 11:12:52 pm »
Покачто ради эксперимента, но ничего не выходит. Есть у меня ftp - ftp://log:pass@host . Как мне функциями кликермана закинуть туда файлы. Покачто мне удалось заливать через браузер, ито, перетаскиванием, и с помощью подключения этого фтп к винде как сетевой диск.
Первое что приходит в голову, копировать с локального диска на тот что подключен к ОС, который в свою очередь и есть FTP. Вылазит ошибка  :(

К стати, когда захожу в этот подключенный к ОС ФТП и смотрю в адресную строку, то вижу там C:\Users\ed\AppData\Roaming\Microsoft\Windows\Network Shortcuts\93.189.41.9 , где 93.189.41.9 ip сервера.

Естественно пробовал копировать прямо в сеть... глупо.
На крайняк уже пробовал писать батники, так они вообще кроме текта ничего не пишут в фтп.

Я уверен тут есть знающие люди по работе с ftp, подскажите где хоть почитать, или примеры тестовые.

5
Предложения / Порисуем на экране?
« : Февраль 12, 2019, 02:01:04 am »
Может стоит уже внести функционал рисования прямо на рабочем столе? Примитивно - окружности, прямоугольники, ... ну и по нарастающей вплоть до Моны Лизы. ;D 

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

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

 К примеру играет у меня какойто бот, чтото там жмякает, чтото дергает, в логе много текста.... А было бы так- показана стрелка красная, туда не пойдем, появился желтый кружок, там кликнем и результат игры в цифрах на пол экрана ... Прям сказка... ;D




Почему то вспомнилась игра "найди различия  между двух картинок". Гдето в вк вроде видел реализацию на кмане. Так там же пришлось писать еще какойто просмотршик картинок... геморно. Кликерман сам должен все это уметь делать  ::).

6
Прочее / Защита от CheatEngine.
« : Февраль 11, 2019, 06:00:59 pm »
 Может ктото из вас знает как обойти защиту от запущенного читэнжина? В моем случае это кик из MTA-San Andreas.

Вообще, не понимаю такого софта, который попросту не работает в большинстве случаев, и для таких случаев даже нет каких-то платных версий  :-\.

7
На днях нашел у себя старый советский кубик рубика с детства  ;D, Радости было - словами не передать  ;D.

Примерно так я себе представлял свои возможности по сборке  8):


На деле это выглядело где-то так  :( :




Сломал себе мозг в итоге, и решил перенести алгоритм для сборки в кликерман. Кубик онлайн взял отсюда http://www.softholm.com/igra/kubik-rubika/3D-kubik-rubik.html (только там таймер немного тормознутый  :D).
Примерный алгоритм брал вот такой https://kak-sobrat-kubik-rubika-3x3.ru .

При написании все оказалось не так просто как я рассчитывал, но все работает, хоть и не сильно быстро.

Видео сборки - https://youtu.be/foHWvLXU1JQ - 3 мин. 50 сек.

Если кто-то знаком со сборкой более сложных кубов 4х4 или 5х5, или если у кого есть алгоритмы пошустрее - будет интересно вместе порешать  ;).

Код:
Код: Clickermann
  1. GETSCREEN
  2. IF_PIXEL_IN(0,0, $_xmax,$_ymax, 16567729)
  3.   $x_win = $_return1
  4.   $y_win = $_return2
  5.   print("окошко с кубиком найдено в координатах ",$_return1,"x", $_return2)
  6. else
  7.   print("окно не найдено")
  8.   halt
  9. END_IF
  10.  
  11. //выставляем по уровню
  12. SUB(level)
  13.   LDOWN($x_win + 35,$y_win + 326)
  14.   waitms(50)
  15.   LUP($x_win + 35,$y_win + 348)
  16.   waitms(500)
  17.   LDOWN($x_win + 369,$y_win + 574)
  18.   waitms(50)
  19.   LUP($x_win + 333,$y_win + 574)
  20. END_SUB
  21. //все видимые цвета
  22. SUB(scan)
  23.   GETSCREEN
  24.   //up
  25.   $sc[0] = pxl($x_win +395,$y_win +130)
  26.   $sc[1] = pxl($x_win +469,$y_win +153)
  27.   $sc[2] = pxl($x_win +566,$y_win +183)
  28.   $sc[3] = pxl($x_win +326,$y_win +154)
  29.   $sc[4] = pxl($x_win +400,$y_win +186)
  30.   $sc[5] = pxl($x_win +497,$y_win +219)
  31.   $sc[6] = pxl($x_win +239,$y_win +184)
  32.   $sc[7] = pxl($x_win +316,$y_win +218)
  33.   $sc[8] = pxl($x_win +410,$y_win +264)
  34.   //front
  35.   $sc[9] = pxl($x_win + 205,$y_win + 248)
  36.   $sc[10] = pxl($x_win + 276,$y_win + 286)
  37.   $sc[11] = pxl($x_win + 361,$y_win + 332)
  38.   $sc[12] = pxl($x_win + 219,$y_win + 323)
  39.   $sc[13] = pxl($x_win + 289,$y_win + 367)
  40.   $sc[14] = pxl($x_win + 366,$y_win + 420)
  41.   $sc[15] = pxl($x_win + 231,$y_win + 390)
  42.   $sc[16] = pxl($x_win + 295,$y_win + 436)
  43.   $sc[17] = pxl($x_win + 365,$y_win + 489)
  44.   //right
  45.   $sc[18] = pxl($x_win + 456,$y_win + 325)
  46.   $sc[19] = pxl($x_win + 531,$y_win + 280)
  47.   $sc[20] = pxl($x_win + 597,$y_win + 236)
  48.   $sc[21] = pxl($x_win + 445,$y_win + 416)
  49.   $sc[22] = pxl($x_win + 518,$y_win + 360)
  50.   $sc[23] = pxl($x_win + 581,$y_win + 313)
  51.   $sc[24] = pxl($x_win + 444,$y_win + 485)
  52.   $sc[25] = pxl($x_win + 509,$y_win + 428)
  53.   $sc[26] = pxl($x_win + 568,$y_win + 382)
  54.  
  55.   FOR($col=0,$col<27)
  56.      SWITCH($sc[$col])
  57.         CASE(6684723)
  58.            $sc[$col] = 1    //ф
  59.         CASE(16737792)
  60.            $sc[$col] = 2    //c
  61.         CASE(179)
  62.            $sc[$col] = 3    //к
  63.         CASE(18432)
  64.            $sc[$col] = 4    //з
  65.         CASE(15790320)
  66.            $sc[$col] = 7    //б
  67.         CASE(43733)
  68.            $sc[$col] = 6    //ж
  69.      END_SWITCH
  70.   END_CYC
  71. END_SUB
  72.  
  73.  
  74. $wait = 500   //задержка после движений грани
  75. //все варианты движений   граней
  76. SUB(F1,$fb)
  77.   IF($fb = 0)
  78.      LDOWN($x_win + 447,$y_win + 325)
  79.      waitms(50)
  80.      LUP($x_win + 448,$y_win + 482)
  81.   ELSE
  82.      LDOWN($x_win + 448,$y_win + 482)
  83.      waitms(50)
  84.      LUP($x_win + 447,$y_win + 325)
  85.   END_IF
  86.   waitms($wait)
  87. END_SUB
  88.  
  89. SUB(F2,$fb)
  90.   IF($fb = 0)
  91.      LDOWN($x_win + 536,$y_win + 273)
  92.      waitms(50)
  93.      LUP($x_win + 514,$y_win + 423)
  94.   ELSE
  95.      LDOWN($x_win + 514,$y_win + 423)
  96.      waitms(50)
  97.      LUP($x_win + 536,$y_win + 273)
  98.   END_IF
  99.   waitms($wait)
  100. END_SUB
  101.  
  102.  
  103. SUB(F3,$fb)
  104.   IF($fb = 0)
  105.      LDOWN($x_win + 596,$y_win + 232)
  106.      waitms(50)
  107.      LUP($x_win + 568,$y_win + 378)
  108.   ELSE
  109.      LDOWN($x_win + 568,$y_win + 378)
  110.      waitms(50)
  111.      LUP($x_win + 596,$y_win + 232)
  112.   END_IF
  113.   waitms($wait)
  114. END_SUB
  115.  
  116.  
  117. SUB(R1,$fb)
  118.   IF($fb = 0)
  119.      LDOWN($x_win + 374,$y_win + 495)
  120.      waitms(50)
  121.      LUP($x_win + 367,$y_win + 342)
  122.   ELSE
  123.      LDOWN($x_win + 367,$y_win + 342)
  124.      waitms(50)
  125.      LUP($x_win + 374,$y_win + 495)
  126.   END_IF
  127.   waitms($wait)
  128. END_SUB
  129.  
  130.  
  131. SUB(R2,$fb)
  132.   IF($fb = 0)
  133.      LDOWN($x_win + 295,$y_win + 431)
  134.      waitms(50)
  135.      LUP($x_win + 276,$y_win + 288)
  136.   ELSE
  137.      LDOWN($x_win + 276,$y_win + 288)
  138.      waitms(50)
  139.      LUP($x_win + 295,$y_win + 431)
  140.   END_IF
  141.   waitms($wait)
  142. END_SUB
  143.  
  144. SUB(R3,$fb)
  145.   IF($fb = 0)
  146.      LDOWN($x_win + 237,$y_win + 387)
  147.      waitms(50)
  148.      LUP($x_win + 205,$y_win + 244)
  149.   ELSE
  150.      LDOWN($x_win + 205,$y_win + 244)
  151.      waitms(50)
  152.      LUP($x_win + 237,$y_win + 387)
  153.   END_IF
  154.   waitms($wait)
  155. END_SUB
  156.  
  157. SUB(U1,$fb)
  158.   IF($fb = 0)
  159.      LDOWN($x_win + 379,$y_win + 337)
  160.      waitms(50)
  161.      LUP($x_win + 202,$y_win + 256)
  162.   ELSE
  163.      LDOWN($x_win + 202,$y_win + 256)
  164.      waitms(50)
  165.      LUP($x_win + 379,$y_win + 337)
  166.   END_IF
  167.   waitms($wait)
  168. END_SUB
  169.  
  170. SUB(U2,$fb)
  171.   IF($fb = 0)
  172.      LDOWN($x_win + 594,$y_win + 307)
  173.      waitms(50)
  174.      LUP($x_win + 425,$y_win + 438)
  175.   ELSE
  176.      LDOWN($x_win + 425,$y_win + 438)
  177.      waitms(50)
  178.      LUP($x_win + 594,$y_win + 307)
  179.   END_IF
  180.   waitms($wait)
  181. END_SUB
  182.  
  183. SUB(U3,$fb)
  184.   IF($fb = 0)
  185.      LDOWN($x_win + 583,$y_win + 369)
  186.      waitms(50)
  187.      LUP($x_win + 415,$y_win + 514)
  188.   ELSE
  189.      LDOWN($x_win + 415,$y_win + 514)
  190.      waitms(50)
  191.      LUP($x_win + 583,$y_win + 369)
  192.   END_IF
  193.   waitms($wait)
  194. END_SUB
  195.  
  196. //небольшие комбинации
  197. SUB(RURU)
  198.   R1(1)
  199.   U3(0)
  200.   R1(0)
  201.   U3(1)
  202. END_SUB
  203.  
  204. SUB(shot)
  205.   U1(0)
  206.   R1(0)
  207.   U1(1)
  208.   R1(1)
  209.   U1(1)
  210.   F1(1)
  211.   U1(0)
  212.   F1(0)
  213. END_SUB
  214.  
  215.  
  216.  
  217.  
  218. //////////////
  219.  
  220. wait(1)
  221. print("ровняем кубик")
  222. level()
  223. wait(1)
  224.  
  225.  
  226.  
  227.  
  228. FOR($a=0,$a<3)
  229.   scan()
  230.   IF($sc[4] = 6)
  231.      $a = 3
  232.   ELSE
  233.      F2(0)
  234.   END_IF
  235. END_CYC
  236. FOR($a=0,$a<3)
  237.   scan()
  238.   IF($sc[4] = 6)
  239.      $a = 3
  240.   ELSE
  241.      R2(0)
  242.   END_IF
  243. END_CYC
  244.  
  245. WHILE($sc[13] ! 1)
  246.   U2(0)
  247.   scan()
  248. END_CYC
  249. print("этап 1 - желтый крест на верхней грани")
  250. FOR($kr=1,$kr<5)
  251.  
  252.   $temp = 0
  253.   FOR($a=0,$a<4)
  254.  
  255.      IF(($sc[7]+$sc[10] = $kr+6)&($sc[7]*$sc[10] = $kr*6))
  256.      ELSE
  257.         IF(($sc[14]+$sc[21] = $kr+6)&($sc[14]*$sc[21] = $kr*6))
  258.  
  259.            R1(1)
  260.            U3(0)
  261.            FOR($back=0,$back<$a-1)
  262.               R1(1)
  263.            END_CYC
  264.  
  265.            FOR($back=0,$back<$temp)
  266.               U1(1)
  267.               U2(1)
  268.            END_CYC
  269.  
  270.            F1(0)
  271.            F1(0)
  272.            $a = 4
  273.  
  274.         ELSE
  275.            R1(0)
  276.            IF($a = 3)
  277.  
  278.               U1(0)
  279.               U2(0)
  280.               U3(0)
  281.               $a = -1
  282.               inc($temp)
  283.            END_IF
  284.  
  285.         END_IF
  286.  
  287.      END_IF
  288.      scan()
  289.   END_CYC
  290.  
  291.   scan()
  292.   IF($sc[7] ! 6)
  293.      F1(0)
  294.      U1(1)
  295.      R1(0)
  296.      U1(0)
  297.   END_IF
  298.  
  299.   U1(0)
  300.   U2(0)
  301.   U3(0)
  302.   scan()
  303.  
  304.  
  305. END_CYC
  306.  
  307. print("этап 2 - верхние углы на свои места")
  308. FOR($kr=1,$kr<5)
  309.   FOR($a=0,$a<4)
  310.      scan()
  311.      $kr1 = $kr+6+$kr+1
  312.      $kr2 = $kr*6*($kr+1)
  313.      IF($kr=4)
  314.         $kr1 = $kr+7
  315.         $kr2 = $kr*6
  316.      END_IF
  317.  
  318.      IF(($sc[8]+$sc[11]+$sc[18]=$kr1)&($sc[8]*$sc[11]*$sc[18]=$kr2))
  319.  
  320.         IF($a > 0)
  321.            RURU()
  322.            FOR($back=0,$back<$a)
  323.               U1(1)
  324.               U2(1)
  325.            END_CYC
  326.            RURU()
  327.         END_IF
  328.  
  329.  
  330.         scan()
  331.  
  332.         WHILE($sc[8] ! 6)
  333.            RURU()
  334.            RURU()
  335.            scan()
  336.         END_CYC
  337.  
  338.         $a = 9
  339.      ELSE
  340.         U1(0)
  341.         U2(0)
  342.         IF($a = 3)
  343.            WHILE((($sc[8]+$sc[11]+$sc[18]=$kr1)&($sc[8]*$sc[11]*$sc[18]=$kr2)) ! 1)
  344.               U3(0)
  345.               R1(0)
  346.               scan()
  347.               R1(1)
  348.  
  349.            END_CYC
  350.            RURU()
  351.            scan()
  352.            $a = -1
  353.         END_IF
  354.      END_IF
  355.      scan()
  356.   END_CYC
  357.  
  358.   U1(0)
  359.   U2(0)
  360.  
  361. END_CYC
  362.  
  363. print("переворачиваем кубик")
  364. FOR($a=0,$a<2)
  365.   R1(0)
  366.   R2(0)
  367.   R3(0)
  368. END_CYC
  369. U2(0)
  370. U3(0)
  371.  
  372. print("этап 3 - ребра в среднем ряду")
  373. FOR($kr=1,$kr<5)
  374.   FOR($a=0,$a<4)
  375.      scan()
  376.      $kr1 = $kr+$kr+1
  377.      $kr2 = $kr*($kr+1)
  378.      IF($kr=4)
  379.         $kr1 = $kr+1
  380.         $kr2 = $kr
  381.      END_IF
  382.  
  383.  
  384.      IF(($sc[21] = $kr) & ($sc[14]+$sc[21]=$kr1)&($sc[14]*$sc[21]=$kr2))
  385.         $a = 4
  386.      else
  387.  
  388.  
  389.         IF(($sc[7]+$sc[10]=$kr1)&($sc[7]*$sc[10]=$kr2))
  390.            shot()
  391.            IF($sc[21] ! $kr)
  392.               $a = 2
  393.            else
  394.               $a = 4
  395.            END_IF
  396.  
  397.         else
  398.  
  399.            U1(0)
  400.            IF($a = 3)
  401.               $temp = 0
  402.               WHILE((($sc[14]+$sc[21]=$kr1)&($sc[14]*$sc[21]=$kr2)) ! 1)
  403.                  U2(0)
  404.                  U3(0)
  405.                  inc($temp)
  406.                  scan()
  407.               END_CYC
  408.  
  409.               shot()
  410.  
  411.               FOR($back=0,$back<$temp)
  412.                  U2(1)
  413.                  U3(1)
  414.               END_CYC
  415.               $a= -1
  416.            END_IF
  417.         END_IF
  418.      END_IF
  419.  
  420.   END_CYC
  421.   U2(1)
  422.   U3(1)
  423.  
  424. END_CYC
  425.  
  426. scan()
  427.  
  428. print("этап 4 - белый крест на верху")
  429. WHILE(($sc[1]+$sc[3]+$sc[4]+$sc[5]+$sc[7]) ! 35)
  430.  
  431.   IF(($sc[1]+$sc[4]+$sc[7])=21)
  432.      U1(0)
  433.      WHILE(($sc[1]+$sc[3]+$sc[4]+$sc[5]+$sc[7]) ! 35)
  434.         F1(0)
  435.         R1(0)
  436.         U1(0)
  437.         R1(1)
  438.         U1(1)
  439.         F1(1)
  440.         scan()
  441.      END_CYC
  442.   ELSE
  443.      IF(($sc[1]+$sc[4]+$sc[5])=21)
  444.         U1(1)
  445.      ELSE
  446.         IF(($sc[4]+$sc[5]+$sc[7])=21)
  447.            U1(1)
  448.            U1(1)
  449.         ELSE
  450.            IF(($sc[3]+$sc[4]+$sc[7])=21)
  451.               U1(0)
  452.            END_IF
  453.         END_IF
  454.      END_IF
  455.      WHILE(($sc[1]+$sc[4]+$sc[7])!21)
  456.         F1(0)
  457.         R1(0)
  458.         U1(0)
  459.         R1(1)
  460.         U1(1)
  461.         F1(1)
  462.         scan()
  463.      END_CYC
  464.  
  465.   END_IF
  466.  
  467.  
  468. END_CYC
  469.  
  470. print("этап 5 - верхние ребра на свои места")
  471. scan()
  472. $temp = 0
  473. $temp2 = 0
  474. WHILE(($sc[13] ! $sc[10]) | ($sc[19] ! $sc[22]))
  475.   U1(0)
  476.   U2(0)
  477.   U3(0)
  478.   inc($temp)
  479.   IF($temp = 4)
  480.      $temp = 0
  481.      inc($temp2)
  482.      U1(0)
  483.   END_IF
  484.   scan()
  485.  
  486.   IF($temp2 = 5)
  487.      WHILE($sc[19] ! $sc[22])
  488.         U1(0)
  489.         U2(0)
  490.         U3(0)
  491.         inc($temp)
  492.         IF($temp = 4)
  493.            $temp = 0
  494.            U1(0)
  495.         END_IF
  496.         scan()
  497.  
  498.      END_CYC
  499.      R1(0)
  500.      U1(0)
  501.      R1(1)
  502.      U1(0)
  503.      R1(0)
  504.      U1(0)
  505.      U1(0)
  506.      R1(1)
  507.      $temp2 = 0
  508.      scan()
  509.   END_IF
  510.  
  511.  
  512. END_CYC
  513.  
  514. U1(1)
  515. U2(1)
  516. U3(1)
  517. scan()
  518. IF(($sc[13] ! $sc[10]))
  519.   R1(0)
  520.   U1(0)
  521.   R1(1)
  522.   U1(0)
  523.   R1(0)
  524.   U1(0)
  525.   U1(0)
  526.   R1(1)
  527.   U1(0)
  528. END_IF
  529.  
  530.  
  531. print("этап 6 - углы верхнего слоя на свои места")
  532. scan()
  533. $temp = 0
  534. WHILE(($sc[8]*$sc[11]*$sc[18]) ! ($sc[4]*$sc[13]*$sc[22]) )
  535.   U1(0)
  536.   U2(0)
  537.   U3(0)
  538.   inc($temp)
  539.   IF($temp = 4)
  540.      $temp = 0
  541.      U1(0)
  542.      R1(0)
  543.      U1(1)
  544.      R3(0)
  545.      U1(0)
  546.      R1(1)
  547.      U1(1)
  548.      R3(1)
  549.   END_IF
  550.   scan()
  551. END_CYC
  552.  
  553.  
  554. U1(1)
  555. U2(1)
  556. U3(1)
  557. scan()
  558.  
  559.  
  560. IF(($sc[8]*$sc[11]*$sc[18]) ! ($sc[4]*$sc[13]*$sc[22]) )
  561.   $mem = ($sc[8]*$sc[11]*$sc[18])
  562.   U1(1)
  563.   U2(1)
  564.   U3(1)
  565.   scan()
  566.   IF($mem = ($sc[4]*$sc[13]*$sc[22]) )
  567.      U1(1)
  568.      U2(1)
  569.      U3(1)
  570.      U1(1)
  571.      R3(0)
  572.      U1(0)
  573.      R1(0)
  574.      U1(1)
  575.      R3(1)
  576.      U1(0)
  577.      R1(1)
  578.  
  579.   else
  580.      FOR($a=0,$a<2)
  581.         U1(1)
  582.         U2(1)
  583.         U3(1)
  584.      END_CYC
  585.  
  586.      U1(0)
  587.      R1(0)
  588.      U1(1)
  589.      R3(0)
  590.      U1(0)
  591.      R1(1)
  592.      U1(1)
  593.      R3(1)
  594.   END_IF
  595. END_IF
  596.  
  597. print("этап 7 - разворачиваем углы как положено")
  598. scan()
  599. WHILE($sc[13] ! 3)
  600.   U1(1)
  601.   U2(1)
  602.   U3(1)
  603.   scan()
  604. END_CYC
  605.  
  606.  
  607. FOR($a=0,$a<4)
  608.   WHILE($sc[8] ! 7)
  609.      RURU()
  610.      RURU()
  611.      scan()
  612.   END_CYC
  613.   U1(0)
  614.   scan()
  615. END_CYC
  616.  
  617. print("готово")
  618.  
  619. halt

Кликерман сам определяет положение голубого окошка с кубиком на экране. Важно, чтобы его было видно целиком. А момент запуска и принцип действие видно в том же видео ролике  https://youtu.be/foHWvLXU1JQ

8
демонстрационный код:
Код: Clickermann
  1. STRWRITELN ("test.bat", "pause", 1) //не выполняется
  2. EXECUTE ("test.bat")
  3. wait(2)
  4.  
  5. STRWRITELN ("test.bat", "pause") //выполняется, скрин ниже
  6. EXECUTE ("test.bat")
  7. halt


в батнике:
pause
pause

получается, что к первой строке дописывается какаято ересь, и она игнорируется. в 4.13.010b вроеде еще работало правильно.

9
 Многие помнят ту тему, где обсуждали существующий колормод, где была раскрыта тайна его работы, и эта тема была удалена. Я после этого еще долго ломал голову над тем, как должна работать коррекция. В итоге, перечитав кучу инфы (впустую), потратив кучу времени на различные комбинации, расчеты и пр. - иии, ПРОФИТ  :D . Конечно работает он не так изящно и быстро как оригинальный, но зато появляется больше возможностей. Да и сам алгоритм оказался не таким уж и сложным, пару битовых операций, и готово.
 
 Написал это все на км, скорость все равно подводила  :( . А тут наконец удалось заставить работать DLL библиотеки. Переписал все это дело в делфи. Скорость вполне себе ничего вышла, мой калькулятор справляется с областью (0, 0, 1000, 100)=100кпикс за 1.5сек. При этом пишет это все сразу в память км.

 Небольшое описание:

Режимов в моем случае - 23. С каждым следующим режимом добавляется один бит на пиксель.
Режимы коррекции-
1   - 2 цвета
2   - 4 цвета
3   - 8 цветов
4   - 16 цветов
5   - 32 цвета
.... и так далее, до 23 - 8388608 цветов

как выглядят обработанные изображения:

оригинал


по нарастающей, до двенадцатого режима
                     
и так далее...

Написано строго под версию 4.13.014b. При первом вызове подпрограммы, произведется поиск адреса начала графического буфера км, занимает пару секунд. Далее работает довольно быстро.
Интересно, как поведет себя данная процедура на других ПК.

Код пока не буду выкладывать, пусть побудет у меня  :D .

Пример вызова:
Код: Clickermann
  1. SUB(s_cmode, $x1_cm, $y1_cm, $x2_cm, $y2_cm, $mode_cm)
  2.   IF($adress_cm = 0)
  3.      $pid_cm = HGETPID($_hwnd_self)
  4.      PXLREPLACE (0, 0, $_xmax, $_ymax, -1, 0)
  5.      PXLREPLACE (0, 0, 0, 0, -1, 1234567)
  6.      CALL("adress_clip.dll", $pid_cm)
  7.      $adress_cm = $_return1
  8.      GETSCREEN
  9.   END_IF
  10.   CALL("c_mode.dll" ,$x1_cm, $y1_cm, $x2_cm, $y2_cm, $mode_cm, $pid_cm, $adress_cm, $_xmax)  
  11. END_SUB
  12. ///////////////////////////////////////////////////////
  13.  
  14.  
  15. $x1 = 540
  16. $y1 = 310
  17. $x2 = 780
  18. $y2 = 460
  19.  
  20. GETSCREEN
  21. //вызов
  22. s_cmode($x1, $y1, $x2, $y2, 3)
  23.  
  24. SCREENSHOT // смотрим
  25.  
  26.  
  27. halt

Естественно, длл-ки в одной дерриктории со скриптом. Две библиотеки во вложении. У кого фобия к неизвестным длл, проходим мимо  ;D.

Знаком с делфи всего пару дней, так что скорее всего буду совершенствовать эти библиотеки по мере моих способностей.


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

 принцип мысли - ищем первый пиксель искомой картинки и проверяем ранее проверенный PXLXOR этой картинки, если нет, то далее со следующим найденным первым пикселем.

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




разрешение искомой области 1366 х 768. на вин10 сложновато с его вездесущим сглаживанием.

где ищем:


что ищем (100х100 !!!):


как ищем:
Код: Clickermann
  1. GETSCREEN
  2. // 3497629 цвет первого пикселя
  3.  
  4. SCANPXL($ARR, 0,0, $_xmax,$_ymax, 3497629)
  5. print(ARRSIZE($ARR)/2, " возможных координат")
  6.  
  7.  
  8. $t = $_ms
  9. IF_PICTURE_IN (0,0, $_xmax,$_ymax, "1.bmp", -1, 100)
  10.   print("нашли по старинке в координатах ",$_return1," х ", $_return2)
  11. END_IF
  12. print("за ",$_ms - $t, " ms.")
  13. print(" ")
  14. waitms(500)
  15.  
  16.  
  17. $t = $_ms
  18. $size = ARRSIZE($ARR)
  19. FOR($i=0,$i<$size,2)
  20.   IF(PXLXOR($ARR[$i],$ARR[$i+1],$ARR[$i]+100,$ARR[$i+1]+100) = 16584102) //16584102 - ранее подсчитаная контр сумма
  21.      print("нашли по новинке в координатах ",$ARR[$i]," х ", $ARR[$i+1])
  22.      $i=$size
  23.   END_IF
  24. END_CYC
  25. print("за ",$_ms - $t, " ms.")
  26. print(" ")
  27.  
  28. halt
  29.  

результат:
Код: HTML
  1. 22:49:10 2 возможных координат
  2. 22:49:13 нашли по старинке в координатах 640 х 352
  3. 22:49:13 за 4251 ms.
  4. 22:49:13  
  5. 22:49:14 нашли по новинке в координатах 640 х 352
  6. 22:49:14 за 23 ms.
  7. 22:49:14  

в 180 раз быстрее!!!

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



11
Внимание, требуется доп. оборудование!!!

 До недавнего времени ни разу не сталкивался с защитами от кликеров. И вот этот день наступил. Мне даже интересно стало - как вся эта защита выглядит, и неужели ее никак не обойти. Первое что испробовал, это режим пс2, благо на пк такой порт еще есть, хоть и комбинированный. Мышки на пс2 не нашел, а клавиатура как раз туда и втыкнута. Клавиатурные нажатия + #ps2_keyboard работают отлично. Даже и не подозревал какая это полезная штука оказывается "режим PS/2"  .

 Но идем дальше. На ноуте, которым пользуюсь чаще, пс2 уже нет  >:( . И как тут быть? И пришла мне тут идея, а неужели нельзя аппаратно жать на нужные кнопки? К счастью для экспериментов под рукой завалялась плата "ардуино". Описание девайса тут.

 Идея заключается в том, чтобы данный контроллер жал на те кнопки, которые я ему скажу жать. Гдето в интернети встречал какието доп. модули для ардуино, но в данный момент мне это было не интересно (заказывать, ждать, ... интереснее сделать самому).

 Для начала нашел ненужную усб мышку. Как мне кажется с мышкой соединить ардуино куда проще чем с клавиатурой. С клавитурой пока не пробовал, нет у меня лишней усб клавы, да и еще не уверен что чтото с ней получится. Немного почитал, вспомнил как там программируется ардуино, этот закрученный язык си  >:( . Сразу понял, что на две кнопки мышки он нажмет. Благо там контак просто на массу замыкает, а digitalWrite какраз так и делает - либо 5в, либо "масса".

 Идем дальше, нужно как то сообщить контроллеру что я хочу нажать, и в кокой момент. Ардуина подключена к пк через усб к виртуальному ком порту, и без проблем передает сообщени и принимает их. Тут пришлось немного поламать голову. Ни как не мог разобраться как послать ту инфу, что я хочу. Идея была посылать байт информации, 256 значений хватило бы для любых прихотей. Принцип передачи так и работает, но передача идет символов ASCI. И получается, что я могу отправить только те символы, которые могу напечатать, а всякие там шифты, контралы, управляющий символ и прочее отправить уже не получится. Речь идет о передаче через командную строку, мы же не привыкли носить кучу доп. утилит и приложений (кстати они вроде как могут передавать все что захочешь). Ну да ладно, немного усложним работу, и будем отправлять число строкой, тем более что полюбому консоль в добавок после символа отправляет "переход на след. строку" и "возврат коретки" 13 и 10 если не ошибаюсь, которые в любом случае придется отсортировывать.
 
 Ну чтож, с передачей информации разобрался. Переходим к нашему любимому "кликерману". Жаль что он не может послать в ком на прямую  :( . требуется создание батника каждый раз  :( . Создаю строку - десятичный код клавиши + символ обозначающий зажатие и отпускание кнопки (U или D). Вышло как то так:
Код: Clickermann
  1. SUB(key, $char)
  2.   STRWRITELN ("file.bat", STRCONCAT("Mode com",$comport," baud=9600 parity=n data=8 stop=1"), 1)
  3.   STRWRITELN ("file.bat", STRCONCAT("echo ",$char,"> com",$comport), 0)
  4.   EXECUTE("file.bat")
  5. END_SUB
  6.  
  7. key(STRCONCAT($key,"D"))  // $key - десятичный код клавиши
  8. waitms(100)
  9. key(STRCONCAT($key,"U"))
Ардуино в свою очередь мониторит нужный порт на наличие сообщения. Как только появляются байты для считывания Serial.available(), пишет цифры в массив, а мой управляющий символ в переменную.
Код: Javascript
  1.  while (Serial.available() > 0) {
  2.  
  3.    int inchar = Serial.read();
  4.    if (inchar == 'U') {
  5.      presskey = false;
  6.    }
  7.    if (inchar == 'D') {
  8.      presskey = true;
  9.    }
  10.    if (isDigit(inchar)) {
  11.      instring += (char)inchar;
  12.    }
  13.    if (inchar == '\n') {
  14.      val = instring.toInt();
  15.      instring = "";
  16.    }
  17.  }

 А потом, имея код кнопки, выбираем на какой контакт подать "минус" digitalWrite(pin, LOW). К этому контакту заранее был подведен и припаян провод от нужной кнопки мышки.

 Для отладки и настройки использовал LCD дисплей, хотя можно было обойтись и без него.

 В этоге - код для "ардуино" для левой и правой кнопки мыши:
Код: Javascript
  1. String instring = "";
  2. int val = 0;
  3. boolean presskey = false;
  4. int lmouse = 52;
  5. int rmouse = 53;
  6.  
  7. int getPress(int key) {
  8.  if (presskey == true) {
  9.    digitalWrite(key, LOW);
  10.  }
  11.  else {
  12.    digitalWrite(key, HIGH );
  13.  }
  14. }
  15.  
  16. void setup() {
  17.  Serial.begin(9600);
  18.  lcd.begin(16, 2);
  19.  
  20.  pinMode(lmouse, OUTPUT);
  21.  digitalWrite(lmouse, HIGH);
  22.  pinMode(rmouse, OUTPUT);
  23.  digitalWrite(rmouse, HIGH);
  24. }
  25.  
  26. void loop() {
  27.  while (Serial.available() > 0) {
  28.  
  29.    lcd.clear();
  30.    int inchar = Serial.read();
  31.    if (inchar == 'U') {
  32.      presskey = false;
  33.    }
  34.    if (inchar == 'D') {
  35.      presskey = true;
  36.    }
  37.    if (isDigit(inchar)) {
  38.      instring += (char)inchar;
  39.    }
  40.    if (inchar == '\n') {
  41.      val = instring.toInt();
  42.      lcd.print("key: ");
  43.      lcd.print(val);
  44.      lcd.setCursor(0, 1);
  45.      lcd.print("press: ");
  46.      lcd.print(presskey);
  47.      instring = "";
  48.  
  49.  
  50.      switch (val) {
  51.        case 1:
  52.          getPress(lmouse);
  53.          break;
  54.        case 2:
  55.          getPress(rmouse);
  56.          break;
  57.      }
  58.    }
  59.  }
  60. }

Код для "кликермана" - press, dbpress, down и up :
Код: Clickermann
  1. #name "arduino mouse"
  2.  
  3. $comport = 6
  4.  
  5. SUB(key, $char)
  6.   STRWRITELN ("file.bat", STRCONCAT("Mode com",$comport," baud=9600 parity=n data=8 stop=1"), 1)
  7.   STRWRITELN ("file.bat", STRCONCAT("echo ",$char,"> com",$comport), 0)
  8.   EXECUTE("file.bat")
  9. END_SUB
  10.  
  11. SUB(press, $keypress)
  12.   key(STRCONCAT($keypress,"D"))
  13.   waitms(100)
  14.   key(STRCONCAT($keypress,"U"))
  15. END_SUB
  16.  
  17. SUB(dbpress, $dbpresskey)
  18.   press($dbpresskey)
  19.   waitms(100)
  20.   press($dbpresskey)
  21. END_SUB
  22.  
  23. SUB(down, $keydown)
  24.   key(STRCONCAT($keydown,"D"))
  25. END_SUB
  26.  
  27. SUB(up, $keyup)
  28.   key(STRCONCAT($keyup,"U"))
  29. END_SUB
  30. ///////////////////////////////////////////////////////////////////////////////
  31.  
  32. wait(1)
  33. move(2040,940)
  34. waitms(100)
  35. dbpress(1)
  36.  
  37. wait(1)
  38. press(2)
  39.  
  40. wait(1)
  41. move(2010,930)
  42. waitms(100)
  43. down(1)
  44. waitms(500)
  45. move(2010,880)
  46.  
  47. wait(1)
  48. up(1)
  49.  
  50. halt

И небольшое видео демонстрирующее работу: https://www.youtube.com/watch?v=NO2GOfSAqJE



 Идея , я думаю, очень даже интересная. Если у кого то есть мысли по поводу работы с клавиатурой, прошу в тему. Если есть какието замечания в проделанной мной работе, не стесняйтесь, комментируйте  :D.







12
есть поле, на котором 15 красных точек. разбросаны рандомно. на поле появляется 16-я точка, зеленая, также в рандомном месте.



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

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


13
  задачка такова. есть у меня точка в 3д пространстве (пусть будет А), координаты хуz этой точки известны. точку А можно перемещать в любом направлении, при перемещении ее координаты также известны. также существует точка Б, эта точка недвижима, стоит на месте, координаты не известны. также имеем расстояние от точки А до Б, естественно оно изменяется в зависимости от местонахождения точки А. как вы уже поняли, нужно найти координаты точки Б.
  насколько я понял, имея начальные координаты точки А и начальное расстояние от точки А до точки Б, и сравнив эти данные с обновленными (смещаем в рандомном направлении точку А), скорее всего можно определить координаты точки Б. возможно я и заблуждаюсь. если кто знает варианты расчетов, делитесь, буду рад любой помощи.

14
как мы видим из справки, инструкция не работает в оконном режиме. может кто подскажет реализацию данной процедуры через  POSTMESSAGE ?
возможно кто нибудь знает  еще варианты?

15
Предложения / коррекция яркость/контраст
« : Февраль 17, 2016, 01:53:01 am »
 по сути это продолжение из темы http://crapware.aidf.org/forum/index.php?topic=2390.msg14982#msg14982 . но я там размечтался насчет мегафункционала по обработке изображения  :D. да, всё это будет лишним, и врядли ктото будет пользоваться всякими сепиями, чернобелым и тп.
но всеже есть процедура коррекции, которая значительно бы помогла в множестве ситуаций, и это какраз таки контраст. сильно не вникал как он там должен работать, прочитал пару статей, в редакторах както это всё сложно, и по сути нам ведь не нужно чтобы картинка стала красивее, нам нужно как можно точнее выделить нужные нам цвета в изображении.
немного поэкспериментировал, остановился на примитивном изменении контраста и яркости. меняя 2 параметра $mid и $k можно как увеличивать\уменьшать контраст, так и увеличивать\уменьшать яркость. $mid - это та середина яркости, от которой скрипт будет повышать яркость пикселей которые светлее этого самого $mid. и понижать яркость тех пикселей, которые темнее $mid. его значение от 0 до 255. $k - это то значение , на которое будет повышаться или уменьшаться (при отрицательном значении) яркость.
Код: Clickermann
  1. $x1=903
  2. $y1=956
  3. $x2=968
  4. $y2=1003
  5.  
  6.  
  7. $mid=147
  8. $k=40
  9. //=========================
  10. print("start")
  11. GETSCREEN($x1,$y1,$x2,$y2)
  12. SCREENSHOTEX($x1,$y1,$x2,$y2)
  13. FOR($y=$y1,$y<$y2+1)
  14.   FOR($x=$x1,$x<$x2+1)
  15.      $c= pxl($x,$y)
  16.      IF(((colorr($c)+colorg($c)+colorb($c))/3) > $mid)
  17.         $outr=colorr($c)+$k
  18.         $outg=colorg($c)+$k
  19.         $outb=colorb($c)+$k
  20.         IF($outr < $mid)
  21.            $outr=$mid
  22.         END_IF
  23.         IF($outg < $mid)
  24.            $outg=$mid
  25.         END_IF
  26.         IF($outb < $mid)
  27.            $outb=$mid
  28.         END_IF
  29.      else
  30.         $outr=colorr($c)-$k
  31.         $outg=colorg($c)-$k
  32.         $outb=colorb($c)-$k
  33.         IF($outr > $mid)
  34.            $outr=$mid
  35.         END_IF
  36.         IF($outg > $mid)
  37.            $outg=$mid
  38.         END_IF
  39.         IF($outb > $mid)
  40.            $outb=$mid
  41.         END_IF
  42.      END_IF
  43.      IF($outr < 0)
  44.         $outr=0
  45.      END_IF
  46.      IF($outg < 0)
  47.         $outg=0
  48.      END_IF
  49.      IF($outb < 0)
  50.         $outb=0
  51.      END_IF
  52.      IF($outr > 255)
  53.         $outr=255
  54.      END_IF
  55.      IF($outg > 255)
  56.         $outg=255
  57.      END_IF
  58.      IF($outb > 255)
  59.         $outb=255
  60.      END_IF
  61.      PXLREPLACE($x,$y,$x,$y,$c,COLORGEN($outr,$outg,$outb))
  62.   END_CYC
  63. END_CYC
  64. print("fin")
  65.  
  66. SCREENSHOTEX($x1,$y1,$x2,$y2)
  67. halt
как это работает, примеры:

исходное изображение

 [spoiler=немного больше яркости $mid=0 $k=40][/spoiler]
 [spoiler=немного меньше яркости $mid=255 $k=50 (или $mid=0 $k=-50)][/spoiler]
 [spoiler=немного больше контраста $mid=147 $k=25][/spoiler]
 [spoiler=немного меньше контраста $mid=147 $k=-25][/spoiler]

так для чего же это всё нужно? покажу пару примеров.
пример Vint'a:


$mid=160 $k=255
$mid=170 $k=255

примеры с распознаванием чисел, не охота было искать где это применять, но вспоминаю, что часто отказывался от распознавания, в силу того, что колормид не мог отделить сами цифры от фона. но, как пример, покажу на капче, где кокраз таки при колормод 8, встречались иногда прострелы в контурах цифр.
капча
колормод 8
$mid=170 $k=255
$mid=190 $k=255

ну и применение без разделения на 2 цвета также должно помоч в некоторых ситуациях. например в игре "мастер гитары 2" (если ктото встречался с этой игрой), до того как ввели цвета грифов, оранжевая дорожка по цвету почти совпадала с движущейся фишкой. а когда всунули динамические изменения цветов грифа, никакой колормод не мог справится. я уверен, что данная процедура помогла бы в этой ситуации.

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


что думаете? поможет на деле чтото этоковое, или это снова я размечтался  :D ?

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


Страницы: [1] 2