вобщем смотри, есть подпрограмма:
SUB(Mouse_move, $x_cor, $y_cor)
SUB(Mouse_move, $x_cor, $y_cor)
WHILE(($x_cor ! $_xmouse)&($y_cor ! $_ymouse))
$x_dist = $x_cor - $_xmouse // определяем расстояние до нуженой точки
$y_dist = $y_cor - $_ymouse
IF((-128 < $x_dist)&($x_dist < 127)) //проверяем, чтоб не заходило значение за пределы char
IF($x_dist < 0)
$x_dist = 127 - $x_dist //переделываем в беззнаковый unsigned char
END_IF
END_IF
IF((-128 < $y_dist)&($y_dist < 127))
IF($y_dist < 0)
$y_dist = 127 - $y_dist
END_IF
END_IF
print(536870912 + $x_dist*256 + $y_dist) //смотрим какой параметр отсылается в микросхему
action(536870912 + $x_dist*256 + $y_dist) //в ардуино выйдет вторая функция и нужные сдвиги одним параметром
waitms(3000)
END_CYC
END_SUB
//вызыаем ее
Mouse_move(100,100) //хотим переместить в точку 100,100
//изначально перемещу специально курсор в координаты 0,0
halt
//изначально перемещу специально курсор в координаты 0,0 вызываю Mouse_move(100,100)
Там где print(536870912 + $x_dist*256 + $y_dist) смотрю число, отправляемое в ммикросхему, оно у меня показало
536896612Что происходит с этим числом в программе ардуино:
делим его на 268435456 и отбрасываем дробную часть kmfunct = int(val/268435456). Получаем 536896612/268435456 = 2,00009573996067 число
2 , - это вторая функция в свитче - case 2: // Mouse.move()
далее в этом кейсе извлекаем из общего параметра наши координаты x_cor = int((val - kmfunct*268435456)/256); это (536896612-2*268435456)/256 = 100,390625 - целая часть = 100 - это смещение по оси Х, все верно
далее проверяем это число, чтоб оно было не больше 127 if (x_cor > 127).... оно не больше, значит первый параметр остается равным 100, все верно, этот параметр и отсылаем в Mouse.move()
Далее расчет координаты У. y_cor = int(val - x_cor*256 - kmfunct*268435456); 536896612-100*256-2*268435456 = 536896612-25600-536870912= 100 , все верно, от нуля до 100 нам нужно сместить на 100 пикселей по У, также проверяем чтоб небыло число больше 127, так оно и есть, это второй параметр Mouse.move()
Получаем Mouse.move(100, 100, 0) , тоесть смещаем на 100 пикс вправо и на 100 пикс вниз
Для чего там проверка на if (x_cor > 127), потому, что если бы было больше, то знак параметра сменился бы на отрицательный
Пример с отрицательными параметрами, покажу только на Х. Допустим курсор стоит в координате 100,100 , нужно сместить в 0,0
вызываем Mouse_move(0,0) в км и держим курсор в координате 100,100
print(536870912 + $x_dist*256 + $y_dist) выдает число 536929251
Контроллер ардуино высчитывает номер функции kmfunct = int(val/268435456) ; 536929251/268435456 = 2,000217329710722 , целая часть = 2, это вторая функция в свитче Mouse.move()
опять высчитываем x_cor = int((val - kmfunct*268435456)/256); (536929251-2*268435456)/256 = 58339/256 = 227,88671875 целая часть 227
проверяем на if (x_cor > 127), 227 больше 127, значит пересчитываем x_cor = 127 - x_cor; 127-227 = -100 , все совпадает, нам нужно сместить курсор на 100 пикселей влево, это первый параметр для Mouse.move()
Почти тоже самое высчитывается для координаты У, и тоже получаем -100
Вызываем функцию с параметрами Mouse.move(-100, -100, 0), тоесть смещаем курсор влево на 100 пикс, и вверх на 100 пикс.
Вот так это работает, я ошибки не вижу!!!Завтра вечером будет у меня ардуино про микро, проверю сам, так что не унывай
, все должно работать (должно будет работать, когда найду причину неработоспособности).