2011-10-06 10 views
10

मैं लिनक्स में माउस को नियंत्रित करने का प्रयास करता हूं। Xlib काम करता रहा है, लेकिन जब मैं OpenCV के साथ इसका इस्तेमाल करने की कोशिश करते हैं, यह लौटने रहता है:लिनक्स में माउस आंदोलन को कैसे नियंत्रित करें?

Resource temporarily unavailable 

तो मैं "/ dev/psaux" लिखने के लिए निर्णय लेते हैं। कोड निम्न प्रकार है:

#include <unistd.h> 
#include <string.h> 
#include <stdio.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 


int main() { 
    unsigned char a[5]={0, 0xff, 0, 0x28, 0xff}; 
    int fp = open ("/dev/psaux", O_WRONLY); 
    if(!fp)printf("open error:%s\n", strerror(errno)); 
    for(int i = 0; i < 10; i++) 
     printf("write:%d\t\t%s\n", write(fp, a, 5), strerror(errno)); 
    close(fp); 
    return 0; 
} 

के साथ संकलित करें:

gcc my_psaux.c -o my_psaux -std=gnu99 -g 

भागो और

$sudo ./my_psaux 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 

मिल हालांकि माउस को स्थानांतरित नहीं करता है। फिर मैं एक नया टर्मिनल खोलता हूं, "सुडो बिल्ली/देव/psaux" टाइप करें और "my_psaux" चलाएं। लेकिन मैं बस कुछ भी बिल्ली नहीं। "/ dev/psaux" में कुछ भी नहीं लिखा गया है?

क्या कोई मेरी मदद कर सकता है?

यदि यह माउस को नियंत्रित करने के लिए एक अच्छी विधि नहीं है, तो क्या कोई मुझे एक और बता सकता है?

+4

आप माउस शारीरिक रूप से स्थानांतरित करने के लिए उम्मीद कर रहे हैं जब तक, मैं पी एस/2 बंदरगाह के लिए लिख कर की सही तरीके से कर रहा है नहीं लगता है ... – Blindy

+0

अपनी टिप्पणी के लिए धन्यवाद । मैं ऐसा सोचता था। हालांकि, जैसा कि @ आर .. ने कहा, _it टर्मिनल_ की तरह कुछ और है। दूसरे शब्दों में, हम अभी तक माउस तक नहीं पहुंच पाए हैं। – thundertrick

+0

मुझे शक है, आप अभी भी * बहुत * उलझन में हैं ... – Blindy

उत्तर

13

@R को महान धन्यवाद .. /dev/psaux

के बजाय कुछ अन्य तरीकों की याद दिलाने के लिए तो मैं /dev/input/mouse* और /dev/input/event*

की कोशिश की का उपयोग करके

cat /proc/bus/input/devices 

मैं इस मिल :

I: Bus=0003 Vendor=0461 Product=4d81 Version=0111 
N: Name="USB Optical Mouse" 
P: Phys=usb-0000:00:1d.0-1/input0 
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb6/6-1/6-1:1.0/input/input10 
U: Uniq= 
H: Handlers=mouse2 event10 
B: EV=17 
B: KEY=70000 0 0 0 0 0 0 0 0 
B: REL=143 
B: MSC=10 

परीक्षण के बाद, केवल /dev/input/event10 काम करता है। कोड निम्न प्रकार है:

#include <stdio.h> 
#include <unistd.h> 
#include <linux/input.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/time.h> 

int main() { 
    struct input_event event, event_end; 

    int fd = open("/dev/input/event10", O_RDWR); 
    if (fd < 0) { 
    printf("Errro open mouse:%s\n", strerror(errno)); 
    return -1; 
    } 
    memset(&event, 0, sizeof(event)); 
    memset(&event, 0, sizeof(event_end)); 
    gettimeofday(&event.time, NULL); 
    event.type = EV_REL; 
    event.code = REL_X; 
    event.value = 100; 
    gettimeofday(&event_end.time, NULL); 
    event_end.type = EV_SYN; 
    event_end.code = SYN_REPORT; 
    event_end.value = 0; 
    for (int i=0; i<5; i++) { 
    write(fd, &event, sizeof(event));// Move the mouse 
    write(fd, &event_end, sizeof(event_end));// Show move 
    sleep(1);// wait 
    } 
    close(fd); 
    return 0; 
} 
2

माउस लूपबैक/गूंज डिवाइस नहीं है। यह एक टर्मिनल की तरह है। क्या आप एक ही टर्मिनल को इनपुट के रूप में वापस आने के लिए डेटा को एक टर्मिनल (जो स्क्रीन पर दिखाई देंगे) को लिखने की उम्मीद करेंगे? वही माउस पर लागू होता है; इसे लिखने का एकमात्र बिंदु बचने के दृश्यों को भेजना है जो इसके मोड को बदलते हैं (उदा। प्रोटोकॉल का इस्तेमाल या संकल्प)।

यदि आप माउस को "नियंत्रित" करना चाहते हैं, तो आपको इनपुट सिस्टम को पढ़ने के लिए /dev/psaux के स्थान पर किसी अन्य तरीके से ईवेंट को इंजेक्ट करना होगा, या एक फीफो (नामित पाइप) या छद्म-टीटी प्रदान करना होगा। हालांकि यह संभवतः चीजों को करने का एक गुमराह तरीका है ...

यदि आप समझते हैं कि आपको माउस को नियंत्रित करने की आवश्यकता क्यों है, तो शायद हम आपको जो करने की कोशिश कर रहे हैं, उसके लिए बेहतर वैकल्पिक दृष्टिकोण प्रदान कर सकते हैं।

+0

उत्तर देने के लिए धन्यवाद। पाइप एक अच्छा विचार लगता है। मैं माउस आंदोलन को नियंत्रित करने के लिए कुछ (कीनेक्ट की तरह) करने की कोशिश कर रहा हूं। Xlib कोशिश की गई है लेकिन असफल रहा। कोई उपाय? – thundertrick

+0

@ आर ..आपके द्वारा उत्तर दिए गए अनुसार,/dev/input/event * डिवाइस वास्तव में उन चीज़ों को गूंजते हैं जो आप उन्हें लिखते हैं यदि यह डिवाइस द्वारा समर्थित घटनाओं के अनुरूप है। एक/dev/input/event * डिवाइस पर एक लिखें() कॉल लिखित घटनाओं को इंजेक्ट करता है, जैसे कि ईवेंट स्वयं डिवाइस से आया है: http://lxr.free-electrons.com/source/drivers/input/evdev देखें सीसी # एल 457 – fons

+0

दिलचस्प। मैंने यह सत्यापित नहीं किया है, लेकिन यह evdev-विशिष्ट व्यवहार की तरह लगता है। निश्चित रूप से 'psaux' डिवाइस नोड उस तरह से व्यवहार नहीं करता था; यह आदेशों को अनुमति देता है जो माउस पर लिखे जाने वाले डिवाइस सेटिंग्स (जैसे डीपीआई) को नियंत्रित करते हैं। –

संबंधित मुद्दे