>>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 ms
V obschem sutki vse rabotalo - poka bez problem.
Pro gpm esche segodnya poglyazhu.