Слухай Soldier, ты мышки програмил (на разборку время не хватает), в общем надо состояние кнопок определять, ну если что так и положение курсора...
>Слухай Soldier, ты мышки програмил (на
>разборку время не хватает), в
>общем надо состояние кнопок определять,
>ну если что так и
>положение курсора...
Chto to ya ne pomnyu chtobi ya gde to upominal chto programlyu mishki. V pritsipe ya ih programil let etak 8 nazad, komovskie i pod DOS-om estestvenno. Pod Linux-om, naskol'ko ya znayu, mozhno otkrit' dlya chteniya fail /dev/ttyS0 ili /dev/psaux i t.d., v zavisimosti ot togo gde sidit mishak, konechno pri etom nado imet' sootvetstvuyuschie prava. Ne znayu kak seychas, no mne popalsya sleduyuchiy protokol:Dannie idut gruppoy po tri baita. Dopustim vi schitali tri baita v massiv bytes. Pri etom priraschenie po x vichislyaetsya po formule:
dx=bytes[0] << 6 + bytes[1]
Prirashenie po y:
dy=(bytes[0] & 12) << 4 + bytes[2]
Nazhatie levoy knopki:
LeftButton=bytes[0] & 32 //esli ne 0, to nazhata.
analogichnbo:
RightButton=bytes[0] & 16 //esli ne 0, to nazhata.
Sredney knopki u menya togda ne bilo.
Dalee chitivayutsya sleduyuschie tri baita i t.d.Nachal'noe tekuschee polozhenie zadaetsya vami (naprimer x=0,y=0, a dalee x+=dx, y+=dy)
Ne znayu kak eto budet rabotat' pod Linux-om, net kompa chtobi proverit'.
>Chto to ya ne pomnyu chtobi
>ya gde to upominal chto
>programlyu mishki. V pritsipe ya
>ih programil let etak 8
>nazad, komovskie i pod DOS-om
>estestvenno. Pod Linux-om, naskol'ko ya
>znayu, mozhno otkrit' dlya chteniya
>fail /dev/ttyS0 ili /dev/psaux i
>t.d., v zavisimosti ot togo
>gde sidit mishak, konechno pri
>etom nado imet' sootvetstvuyuschie prava.
>Ne znayu kak seychas, no
>mne popalsya sleduyuchiy protokol:
>
>Dannie idut gruppoy po tri baita.
>Dopustim vi schitali tri baita
>v massiv bytes. Pri etom
>priraschenie po x vichislyaetsya po
>formule:
>dx=bytes[0] << 6 + bytes[1]
>
>Prirashenie po y:
>dy=(bytes[0] & 12) << 4 +
>bytes[2]
>Nazhatie levoy knopki:
>LeftButton=bytes[0] & 32 //esli ne 0,
>to nazhata.
>analogichnbo:
>RightButton=bytes[0] & 16 //esli ne 0,
>to nazhata.
>Sredney knopki u menya togda ne
>bilo.
>Dalee chitivayutsya sleduyuschie tri baita i
>t.d.
>
>Nachal'noe tekuschee polozhenie zadaetsya vami (naprimer
>x=0,y=0, a dalee x+=dx, y+=dy)
>
>
>Ne znayu kak eto budet rabotat'
>pod Linux-om, net kompa chtobi
>proverit'.Да не, я спрашивал програмил ты али нет, ну в общем буду разбираться сам (идея интересная есть, а времени мало), придется gpm копать.......
>Да не, я спрашивал програмил ты
>али нет, ну в общем
>буду разбираться сам (идея интересная
>есть, а времени мало), придется
>gpm копать.......
Proveril na Linux-e. Dlya com-ovskih mishek vrode pashet, esli port initsializriovat' kak nado (cs7, baud=1200 i t.d). Dlya PS/2 nashel tol'ko kak knopki opredelyat'. Esli vse esche aktula'no, mogu podelit'sya svoimi nauchnimi issledovaniyami v etoy oblasti.
>Proveril na Linux-e. Dlya com-ovskih mishek
>vrode pashet, esli port initsializriovat'
>kak nado (cs7, baud=1200 i
>t.d). Dlya PS/2 nashel tol'ko
>kak knopki opredelyat'. Esli vse
>esche aktula'no, mogu podelit'sya
>svoimi nauchnimi issledovaniyami v etoy
>oblasti.Спасибо Барин, не дай имереть халопу!
В общем ну очень надо,время совсем нет (переход на новый план счетов), а надо очень, и потом в линуксе есль библиотека для интерфейса с мышом, в gpm принажатии мышки происходит вызов процедуры.
ЗЫ Совсем "nauchnimi issledovaniyami v etoy oblasti" конечно не надо, я тока под *нуксом не программил, а в остальном - умею.
>>Proveril na Linux-e. Dlya com-ovskih mishek
>>vrode pashet, esli port initsializriovat'
>>kak nado (cs7, baud=1200 i
>>t.d). Dlya PS/2 nashel tol'ko
>>kak knopki opredelyat'. Esli vse
>>esche aktula'no, mogu podelit'sya
>>svoimi nauchnimi issledovaniyami v etoy
>>oblasti.
>
>Спасибо Барин, не дай имереть халопу!
>
>
>В общем ну очень надо,время совсем
>нет (переход на новый план
>счетов), а надо очень, и
>потом в линуксе есль библиотека
>для интерфейса с мышом, в
>gpm принажатии мышки происходит вызов
>процедуры.
>
>ЗЫ Совсем "nauchnimi issledovaniyami v etoy
>oblasti" конечно не надо, я
>тока под *нуксом не программил,
>а в остальном - умею.
>Ya predlagayu metod bez ispol'zovaniya gpm. Ne znayu podoydet on
ili net - esli net to pokopayus' takzhe naschet gpm no eto v drugoy raz i esli
ono nado.Moya ideya sostoit v napisanii svoego obrabotchika misha, t.e.
delaetsya sleduyuschie:
1. Pishetsya proga, kotoraya otkrivaet mishkin device dlya chteniya
2. Etoy progoy sozdaetysa svoy FIFO.
3. Dannie obrabativatyustay i zapisivayutsya v etot fifo.
4. Vse progi, i rabotayuschie s device-om mishaka (gpm , X-Windi)
dolzhni ispol'zovat' imenno etot fifo.Tepert' podrobnee. Ya testiroval (pravda vsego odin den')
eto delo dlya com-ovskih i ps2 -shnih mishakov. Edinstveniiy
trouble - gpm ne pahala s kolesnim mishakom (imps2), no X-Winda
pahala vo vseh sluchyayah. S com-ovskim i ps2 bez kolesa -
no problem. Vse eto prodelivalos' na Debian, yadro 2.4.16.1. Otrkitie mishiogo device-a.
Dlya komovskix (ttyS*) mishakov, kak ya uzhe govoril,
nado snachal initsializirovat' port.
Eto mozhno sdelat' libo cherz tcsetattr, libo cherz stty.
Dopustim mishak sidit na com1 (/dev/ttyS0)
Togda:
#define STTY_PAR " -parenb -parodd cs7 hupcl -cstopb cread clocal -crtscts " \
"-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel " \
"nl0 cr0 tab0 bs0 vt0 ff0 " \
"ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff "\
"-iuclc -ixany -imaxbel " \
"-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop "\
"-echoprt -echoctl -echoke 1200 "
system("/bin/stty -F /dev/ttyS0 "STTY_PAR);
md=open("/dev/ttyS0",O_RDONLY);
if (md<0) {perror("open mouse"); return -1;}Dlya ps2 mozhno srazu:
md=open("/dev/psaux",O_RDONLY);
if (md<0) {perror("open mouse"); return -1;}
Eta proga dolzhna bit' pervoy (osobenno esli COM), kto
otrkivaet mishinniy device .2. Sozdanie FIFO:
Dopustim vi hotite sozdat' fifo v /tmp/mouse. Togda
//
mkfifo("/tmp/mouse",S_IRUSR | S_IWUSR);
//
Dalee otrkrivaem etot FIFO na chtenie zapis':
//
mf=open("/tmp/mouse",O_RDWR);
if (mf<0) {
perror("fopen ifo"); return -1;
}
//
Pochemu delaetsy otrkritie na chtenie /zapis' smotri te v
man fifo
3. Obrabotka dannih ot mishaka.
Esli vse v poryadke, to vhodim v beskonechniy tsikl i zhdem dannie
s mishinogo device-a. Proverit' nalishie idannih na chtenie
mozhno s pomosch'yu funktsii select://
fd_set mr
int n;
//.............................
FD_ZERO(&mr);
FD_SET(md,&mr);
if (select(md+1,&mr,NULL,NULL,NULL)>0) {
read(md,&ch,1); //chtenie s mishinnogo device-a
.//...................Dalee zapisivaem eti dannie v nash fifo. Pri etom nado pomnit' , chto
esli nikto ne budet chitat' dannie iz etogo FIFO, to ono postepenno
zabivaetsya i kogda dostignet opredelennogo razmera (u menya 4096
bait) zapis' blokiruetsya i programma "zavisnet", poka eti dannie ne budut
prochitani. Chtobi eto go izbezhat', nado tazkhe delat' proverku na
nalichie dannih v FIFO. Eto mozhno sdelat' cherez ioctl:
//.........
read(md,&ch,1); //chtenie s mishinnogo device-a
if (!ioctl(mf,FIONREAD,&n)) {
if (!n) write(mf,&ch,1); // zapis' v nash FIFO eslii ono pustoe.
}
//.........Teper' ob obrabotke dannih. Ps2 i COM shlyut dannie portsiyami
po tri baita, imps2 (ps2 s kolesom) - chetire (v chetvertiy dlya kolesa)
Sostoyanie knopok opisivaetsya v pervom baite dlya vseh etih protokolov.
Dlya COM-ovskih mishakov esli 6 -oy bit (otschet s 0) ustanovlen,
to etot bait rassmatrivaetsya kak perviy, takim obrazom dlya
COM mozhno tak:#define DATA_COUNT 3
char data[4] //dlya imps2
//................
i=0;
//.........
//Posle chteniya s mishkinogo device i zapisi v nash FIFO:
if (ch & 64) i=0;
data[i++]=ch;
if (i==DATA_COUNT) {
LeftButton=(data[0] & 32) != 0;
RightButton= (data[0] & 16) !=0;
//s Middle button poka ne razobralsya
//...................//
}
//Dlya ps2 (bez kolesa) i imps2
//......
if (!i && !(ch & 8)) continue; //u 1-go baita 3 -iy-bit (ot 0) dolzhen bit ustanovlen
data[i++]=ch;
if (i==DATA_COUNT) {
LeftButton=(data[0] & 1) != 0;
RightButton= (data[0] & 2) !=0;
MiddleButton= (data[0] & 4) !=0;
//........................
}
//Dalee propisivaem dlya X-ov mishiniy device kak
/tmp/mouse, i zapuskaem gpm
gpm -m /tmp/mouse -t ps2 //ili msV obschem sutki vse rabotalo - poka bez problem.
Pro gpm esche segodnya poglyazhu.
Обрадовал!!!
Если можно, то писани на мой мыло, скинь адресок свой, обясню для чего все это я затеял.лучше на mailto:b-w-l@mail.ru