Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1676163
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: LINUX

2010-10-09 12:58:49

Andrew Haung 转载请注明作者及联络方式
 
  学员项目需要用到JoyStick来远程控制云台。以前在用SDL在游戏中很简单的就可以控制。但是现在需要在Linux C下直接调用C来控制JoyStick。因此找了一些资料来看。
  象如下的USB手柄基本上插入LINUX的USB口即可运行
 
a
20.0元 
 
Linux控制原理
  Linux C控制JoyStick的比较简单,首先在JoyStick在Linux 安装好驱动后会在/dev/input生成js0.对其设备控制,就是读取相应的结构来判断用户输入哪一些指令.
 
当用户操作手柄时,驱动发送js_event的结构给应用程序以通知用户作了哪一些操作。js_event有如下定义
 

struct js_event {
    unsigned int time;    /* event timestamp in milliseconds */
    short value; /* value */
    unsigned char type; /* event type */
    unsigned char number; /* axis/button number */
};

 
手柄按钮分布
当按下1-4号键会发送type = 1 (Button),number  = 0- 3的值
 
按下 select 返回 type = 1,number = 8,
按下 start 返回 type = 1,number  = 9
 
 
 
当按下左侧四个键.有两种情况,当按ANALOG键时(即红灯亮起)。它返回如下四个值
   js_event 的type 为2.(AXIS).
     上键/下键:number  = 6,两者的区别在于value,上键按下value = -32767,松开等于 = 0.
                        下健按下value = 32767,松开等于 0
,
                       
     左/右键:number  = 5两者的区别在于value,左键按下value = -32767,松开等于 = 0.
                        右健按下value = 32767,松开等于 0
 
当ANALOG键关闭时(即红灯灭时).
    上键/下键:number  =1,    左/右键:number  =0.
 
下面的转动控制杆相对比较复杂。
     左侧旋转杆,向上拨 type = 2,number = 1,value = -32767
              向下拨  type = 2,number = 1,value = 32767
               向左  type = 2,number = 2,value = -32767
               向右  type = 2,number = 2,value = 32767
 
      如果是偏于某个方向,即于返回最接近的键的值type/number,但是value有介于0到最大值之间。
  当选旋转时,相当于向系统传送一系列的value渐变的jse_event。
 
      右侧转动控制杆是
            向上type = 2,number = 2 ,value =-32767
            向下拨  type = 2,number = 2,value = 32767
            向左 type = 2,number = 3,value = -32767
            向右  type = 2,number = 3,value = 32767
       
 
完整的控制代码
这是从网上下载的演示代码,这是调整过后正确误的
JoyStick.h
 

/*
    (C) Copyright 2007,2008, Stephen M. Cameron.

    This file is part of wordwarvi.

    wordwarvi is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    wordwarvi is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with wordwarvi; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

 */

#include <stdio.h>
#ifndef __JOYSTICK_H__
#define __JOYSTICK_H__

#define JOYSTICK_DEVNAME "/dev/input/js0"

#define JS_EVENT_BUTTON 0x01 /* button pressed/released */
#define JS_EVENT_AXIS 0x02 /* joystick moved */
#define JS_EVENT_INIT 0x80 /* initial state of device */


struct js_event {
    unsigned int time;    /* event timestamp in milliseconds */
    short value; /* value */
    unsigned char type; /* event type */
    unsigned char number; /* axis/button number */
};

struct wwvi_js_event {
    int button[11];
    int stick1_x;
    int stick1_y;
    int stick2_x;
    int stick2_y;
};

extern int open_joystick(char *joystick_device);
extern int read_joystick_event(struct js_event *jse);
extern void set_joystick_y_axis(int axis);
extern void set_joystick_x_axis(int axis);
extern void close_joystick();
extern int get_joystick_status(struct wwvi_js_event *wjse);

#endif


JoyStick.c

 

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

#include "joystick.h"

static int joystick_fd = -1;

int open_joystick(char *joystick_device)
{
    joystick_fd = open(joystick_device, O_RDONLY | O_NONBLOCK); /* read write for force feedback? */
    if (joystick_fd < 0)
        return joystick_fd;

    /* maybe ioctls to interrogate features here? */

    return joystick_fd;
}

int read_joystick_event(struct js_event *jse)
{
    int bytes;

    bytes = read(joystick_fd, jse, sizeof(*jse));

    if (bytes == -1)
        return 0;

    if (bytes == sizeof(*jse))
        return 1;

    printf("Unexpected bytes from joystick:%d\n", bytes);

    return -1;
}

void close_joystick()
{
    close(joystick_fd);
}

int get_joystick_status(struct wwvi_js_event *wjse)
{
    int rc;
    struct js_event jse;
    if (joystick_fd < 0)
        return -1;

    // memset(wjse, 0, sizeof(*wjse));

    while ((rc = read_joystick_event(&jse) == 1)) {
        jse.type &= ~JS_EVENT_INIT; /* ignore synthetic events */
        if (jse.type == JS_EVENT_AXIS) {
            switch (jse.number) {
            case 0: wjse->stick1_x = jse.value;
                break;
            case 1: wjse->stick1_y = jse.value;
                break;
            case 2: wjse->stick2_x = jse.value;
                break;
            case 3: wjse->stick2_y = jse.value;
                break;
            default:
                break;
            }
        } else if (jse.type == JS_EVENT_BUTTON) {
            if (jse.number < 10) {
                switch (jse.value) {
                case 0:
                case 1: wjse->button[jse.number] = jse.value;
                    break;
                default:
                    break;
                }
            }
        }
    }
    // printf("%d\n", wjse->stick1_y);

    return 0;
}

#if 1
/* a little test program */
int main(int argc, char *argv[])
{
    int fd, rc;
    int done = 0;

    struct js_event jse;

    fd = open_joystick("/dev/js0");
    if (fd < 0) {
        printf("open failed.\n");
        exit(1);
    }

    while (!done) {
        rc = read_joystick_event(&jse);
        usleep(1000);
        if (rc == 1) {
            printf("Event: time %8u, value %8hd, type: %3u, axis/button: %u\n",
                jse.time, jse.value, jse.type, jse.number);
        }
    }
}
#endif



阅读(4850) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~