'Linux API > alsa' 카테고리의 다른 글
| alsa + ffmpeg 벤치마크(?) (0) | 2014.10.23 |
|---|---|
| alsa 패키지 종류 (0) | 2014.10.21 |
| alsa 버전확인하기 (0) | 2014.10.16 |
| alsa 프로그래밍 정리 (0) | 2014.09.18 |
| ALSA (Advanced Linux Sound Architecture) (0) | 2014.09.15 |
| alsa + ffmpeg 벤치마크(?) (0) | 2014.10.23 |
|---|---|
| alsa 패키지 종류 (0) | 2014.10.21 |
| alsa 버전확인하기 (0) | 2014.10.16 |
| alsa 프로그래밍 정리 (0) | 2014.09.18 |
| ALSA (Advanced Linux Sound Architecture) (0) | 2014.09.15 |
| alsa + ffmpeg 벤치마크(?) (0) | 2014.10.23 |
|---|---|
| alsa 패키지 종류 (0) | 2014.10.21 |
| alsa 버전확인하기 (0) | 2014.10.16 |
| alsa 프로그래밍 정리 (0) | 2014.09.18 |
| alsa proc file system (0) | 2014.09.16 |
| lirc - linux IR Remote control (0) | 2015.03.31 |
|---|---|
| vaapi vdpau uvd (6) | 2015.03.26 |
| linux 최대 thread 갯수 (0) | 2015.01.22 |
| getopt() / getopt_long() (0) | 2014.11.19 |
| timeval, gettimeofday() (0) | 2013.08.20 |
clock_gettime() 사용 추천
| SVr4, 4.3BSD. POSIX.1-2001 describes gettimeofday() but not settimeofday(). POSIX.1-2008 marks gettimeofday() as obsolete, recommending the use of clock_gettime(2) instead. |
[링크 : https://man7.org/linux/man-pages/man2/gettimeofday.2.html]
[링크 : https://man7.org/linux/man-pages/man2/clock_gettime.2.html]
[링크 : https://minimonk.tistory.com/5700]
---
time_t의 경우 1초 단위로 밖에 시간을 얻을수가 없는데
gettimeofday()를 통해 timeval 구조체로 값을 받으면
ms 단위로 시간을 잴 수 있다.
clock_getres 하면 ns 단위로 해당 시스템의 시간 정밀도를 받을수 있다는데
아무리 시스템이 빨라져도 ns 단위로 타이머를 받기 힘들지도 모르겠다..
[링크 : http://linux.die.net/man/2/clock_getres]
[링크 : http://linux.die.net/man/2/gettimeofday]
[링크 : http://forum.falinux.com/zbxe/index.php?document_srl=507542]
| lirc - linux IR Remote control (0) | 2015.03.31 |
|---|---|
| vaapi vdpau uvd (6) | 2015.03.26 |
| linux 최대 thread 갯수 (0) | 2015.01.22 |
| getopt() / getopt_long() (0) | 2014.11.19 |
| 공유메모리 (0) | 2014.09.02 |
#ifndef _LINUX_JOYSTICK_H
#define _LINUX_JOYSTICK_H
/*
* Copyright (C) 1996-2000 Vojtech Pavlik
*
* Sponsored by SuSE
*/
/*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to vojtech@suse.cz, or by paper mail:
* Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
*/
#include "linux/types.h"
#include "linux/input.h"
/*
* Version
*/
#define JS_VERSION 0x020100
/*
* Types and constants for reading from /dev/js
*/
#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 {
__u32 time; /* event timestamp in milliseconds */
__s16 value; /* value */
__u8 type; /* event type */
__u8 number; /* axis/button number */
};
/*
* IOCTL commands for joystick driver
*/
#define JSIOCGVERSION _IOR('j', 0x01, __u32) /* get driver version */
#define JSIOCGAXES _IOR('j', 0x11, __u8) /* get number of axes */
#define JSIOCGBUTTONS _IOR('j', 0x12, __u8) /* get number of buttons */
#define JSIOCGNAME(len) _IOC(_IOC_READ, 'j', 0x13, len) /* get identifier string */
#define JSIOCSCORR _IOW('j', 0x21, struct js_corr) /* set correction values */
#define JSIOCGCORR _IOR('j', 0x22, struct js_corr) /* get correction values */
#define JSIOCSAXMAP _IOW('j', 0x31, __u8[ABS_MAX + 1]) /* set axis mapping */
#define JSIOCGAXMAP _IOR('j', 0x32, __u8[ABS_MAX + 1]) /* get axis mapping */
#define JSIOCSBTNMAP _IOW('j', 0x33, __u16[KEY_MAX - BTN_MISC + 1]) /* set button mapping */
#define JSIOCGBTNMAP _IOR('j', 0x34, __u16[KEY_MAX - BTN_MISC + 1]) /* get button mapping */
/*
* Types and constants for get/set correction
*/
#define JS_CORR_NONE 0x00 /* returns raw values */
#define JS_CORR_BROKEN 0x01 /* broken line */
struct js_corr {
__s32 coef[8];
__s16 prec;
__u16 type;
};
/*
* v0.x compatibility definitions
*/
#define JS_RETURN sizeof(struct JS_DATA_TYPE)
#define JS_TRUE 1
#define JS_FALSE 0
#define JS_X_0 0x01
#define JS_Y_0 0x02
#define JS_X_1 0x04
#define JS_Y_1 0x08
#define JS_MAX 2
#define JS_DEF_TIMEOUT 0x1300
#define JS_DEF_CORR 0
#define JS_DEF_TIMELIMIT 10L
#define JS_SET_CAL 1
#define JS_GET_CAL 2
#define JS_SET_TIMEOUT 3
#define JS_GET_TIMEOUT 4
#define JS_SET_TIMELIMIT 5
#define JS_GET_TIMELIMIT 6
#define JS_GET_ALL 7
#define JS_SET_ALL 8
struct JS_DATA_TYPE {
__s32 buttons;
__s32 x;
__s32 y;
};
struct JS_DATA_SAVE_TYPE_32 {
__s32 JS_TIMEOUT;
__s32 BUSY;
__s32 JS_EXPIRETIME;
__s32 JS_TIMELIMIT;
struct JS_DATA_TYPE JS_SAVE;
struct JS_DATA_TYPE JS_CORR;
};
struct JS_DATA_SAVE_TYPE_64 {
__s32 JS_TIMEOUT;
__s32 BUSY;
__s64 JS_EXPIRETIME;
__s64 JS_TIMELIMIT;
struct JS_DATA_TYPE JS_SAVE;
struct JS_DATA_TYPE JS_CORR;
};
#endif /* _LINUX_JOYSTICK_H */
| linux force feedback (0) | 2022.06.15 |
|---|---|
| 리눅스에서 조이스틱 값 읽어오기 (0) | 2012.02.04 |
| $ cat /proc/bus/usb/devices $ cat /sys/kernel/debug/usb/devices |
| $ lsusb
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 005: ID 0583:206f Padix Co., Ltd (Rockfire)
Bus 003 Device 004: ID 12bd:a02f
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub |
| $ tree -a /dev/bus
/dev/bus
`-- usb
|-- 001
| `-- 001
|-- 002
| `-- 001
|-- 003
| |-- 001
| |-- 004
| `-- 005
|-- 004
| `-- 001
`-- 005
`-- 001
|
$ tree -a /proc/bus
/proc/bus
|-- input
| |-- devices
| `-- handlers
|-- pccard
| `-- drivers
`-- pci
|-- 00
| |-- 00.0
| |-- 02.0
| |-- 02.1
| |-- 1b.0
| |-- 1c.0
| |-- 1c.2
| |-- 1d.0
| |-- 1d.1
| |-- 1d.2
| |-- 1d.3
| |-- 1d.7
| |-- 1e.0
| |-- 1f.0
| |-- 1f.1
| |-- 1f.2
| `-- 1f.3
|-- 02
| `-- 00.0
|-- 06
| |-- 00.0
| |-- 00.2
| |-- 00.3
| |-- 00.4
| `-- 02.0
`-- devices
|
$ tree -a /sys/kernel/debug/usb/
/sys/kernel/debug/usb/
|-- devices
`-- usbmon
|-- 0s
|-- 0u
|-- 1s
|-- 1t
|-- 1u
|-- 2s
|-- 2t
|-- 2u
|-- 3s
|-- 3t
|-- 3u
|-- 4s
|-- 4t
|-- 4u
|-- 5s
|-- 5t
`-- 5u
|
| $ tree -a /dev/input
/dev/input
|-- by-id
| |-- usb-0583_USB_2-axis_8-button_gamepad-event-joystick -> ../event10
| |-- usb-0583_USB_2-axis_8-button_gamepad-joystick -> ../js1
| |-- usb-12bd_5-Axis_12-Button_with_POV-event-joystick -> ../event6
| `-- usb-12bd_5-Axis_12-Button_with_POV-joystick -> ../js0
|-- by-path
| |-- pci-0000:00:1d.1-usb-0:1:1.0-event-joystick -> ../event6
| |-- pci-0000:00:1d.1-usb-0:1:1.0-joystick -> ../js0
| |-- pci-0000:00:1d.1-usb-0:2:1.0-event-joystick -> ../event10
| |-- pci-0000:00:1d.1-usb-0:2:1.0-joystick -> ../js1
| |-- platform-i8042-serio-0-event-kbd -> ../event5
| |-- platform-i8042-serio-2-event-mouse -> ../event8
| `-- platform-i8042-serio-2-mouse -> ../mouse1
|-- event0
|-- event1
|-- event10
|-- event2
|-- event3
|-- event4
|-- event5
|-- event6
|-- event7
|-- event8
|-- event9
|-- js0
|-- js1
|-- mice
|-- mouse0
`-- mouse1
|
| /proc/bus/usb 의 내용이 없을 경우(There is no files /proc/bus/usb) (0) | 2009.06.08 |
|---|---|
| usb 버스 정보 얻기 (0) | 2009.06.08 |
| int fd = open ("/dev/js0", O_RDONLY);
struct js_event e;
read (fd, &e, sizeof(struct js_event));
struct js_event {
__u32 time; /* event timestamp in milliseconds */
__s16 value; /* value */
__u8 type; /* event type */
__u8 number; /* axis/button number */
};
|
| $ sudo apt-get install libncurses5-dev |
| #define JOY_DEV "/dev/input/js0" |
#include "pthread.h"
#include "sys/timeb.h"
#include "curses.h"
#include "fcntl.h"
#include "linux/joystick.h"
#define NUM_THREADS 3
#define JOY_DEV "/dev/input/js0"
#define HZ 12
const char FILENAME[] = "./joystickLog.out";
char axisDesc[15][5] = {"X", "Y", "Z", "R", "A", "B", "C", "D", "E", "F", "G", "H", "I" };
char numAxis[20], numButtons[20], value[20][20], timeSec[20], timeMilli[20];
int num_of_axis;
void write_to_log(){
sleep(1);
int cnt;
FILE * daFile;
daFile = fopen(FILENAME, "w+");
// WRITE A HEADER ON THE OUPUT FILE
fprintf(daFile, "#,");
for(cnt = 0; cnt < num_of_axis; cnt++)
if(cnt < num_of_axis -1) fprintf(daFile, "%s,", axisDesc[cnt]);
else fprintf(daFile, "%s", axisDesc[cnt]);
fprintf(daFile, "\r\n");
while(1){
fprintf(daFile, "%s.%s, ", timeSec, timeMilli);
for(cnt = 0; cnt < num_of_axis; cnt++){
if(cnt < num_of_axis -1) fprintf(daFile, "%s, ", value[cnt]);
else fprintf(daFile, "%s ", value[cnt]);
}
fprintf(daFile, "\r\n");
usleep(83333);
}
fprintf(daFile, "%s.%s Len = %d ", timeSec, timeMilli,strlen(timeMilli));
fprintf(daFile, "\r\n");
fflush(daFile);
}
void write_to_screen(){
struct timeb seconds;
int cnt, joy_fd, *axis=NULL, num_of_buttons=0, x;
char *button=NULL, name_of_joystick[80];
struct js_event js;
time_t theTime;
wmove(stdscr, 8, 0);
addstr("Type \"q\" to quit.\n");
if( ( joy_fd = open( JOY_DEV , O_RDONLY)) == -1 ){
wmove(stdscr, 3,0);
addstr( "Couldn't open joystick " );
addstr( JOY_DEV );
wmove(stdscr, 10,0);
while(1)usleep(16666);
}
ioctl( joy_fd, JSIOCGAXES, &num_of_axis ); // GET THE NUMBER OF AXIS ON JS
ioctl( joy_fd, JSIOCGBUTTONS, &num_of_buttons ); // GET THE NUMBER OF BUTTONS ON THE JS
ioctl( joy_fd, JSIOCGNAME(80), &name_of_joystick ); // GET THE NAME OF THE JS
axis = (int *) calloc( num_of_axis, sizeof( int ) );
button = (char *) calloc( num_of_buttons, sizeof( char ) );
sprintf(numAxis, "%d", num_of_axis);
sprintf(numButtons, "%d", num_of_buttons);
wmove(stdscr, 0,0);
addstr("Joystick detected: ");
wmove(stdscr, 0, 19);
addstr(name_of_joystick);
wmove(stdscr, 1, 0);
addstr("Number of axis :");
wmove(stdscr, 1, 19);
addstr(numAxis);
wmove(stdscr, 2, 0);
addstr("Number of buttons:");
wmove (stdscr, 2, 19);
addstr(numButtons);
// CHANGE THE STATUS FLAG OF THE FILE DESCRIPTOR TO NON-BLOCKING MODE
fcntl( joy_fd, F_SETFL, O_NONBLOCK );
while( 1 ){
usleep(16666);
// READ THE JOYSTICK STATE, IT WILL BE RETURNED IN THE JS_EVENT STRUCT
read(joy_fd, &js, sizeof(struct js_event));
// GET THE NUMBER OF SECONDS SINCE EPOCH
ftime(&seconds);
theTime = time(NULL);
sprintf(timeSec, "%d", seconds.time);
sprintf(timeMilli, "%d", seconds.millitm);
// CHECK THE EVENT
switch (js.type & ~JS_EVENT_INIT){
case JS_EVENT_AXIS:
axis [ js.number ] = js.value;
break;
case JS_EVENT_BUTTON:
button [ js.number ] = js.value;
break;
}
// ADD LEADING 0'S TO THE MILLISECOND STRING (IF NECESSARY)
char temp[10] = "";
while(strlen(temp) < (3 - strlen(timeMilli)))
strcat(temp, "0");
strcat(temp,timeMilli);
strcpy(timeMilli, temp);
// PRINT THE RESULTS
wmove(stdscr, 4, 0);
for(cnt = 0; cnt < num_of_axis; cnt++)
addstr(" ");
for(cnt = 0; cnt < num_of_axis && cnt < 13; cnt++){
sprintf(value[cnt], "%d", axis[cnt]);
wmove(stdscr, 4, cnt * 10);
addstr(axisDesc[cnt]);
addstr(": ");
wmove(stdscr, 4, (cnt * 10) + 2);
addstr(value[cnt]);
}
wmove(stdscr, 6, 0);
addstr(timeSec);
wmove(stdscr, 6,10);
addstr(".");
wmove(stdscr, 6, 11);
addstr(timeMilli);
wmove(stdscr, 6, 15);
addstr("=");
wmove(stdscr, 6, 17);
addstr(ctime(&theTime));
wmove(stdscr, 10, 0);
refresh();
}
}
void *ThreadProcs(void *threadid){
int thread_id = (int)threadid;
if(thread_id == 0){
write_to_screen();
}
if(thread_id == 1){
// THIS THREAD WILL MAKE THE PROGRAM EXIT
int ch;
nodelay(stdscr, TRUE); // SETUP NON BLOCKING INPUT
while(1) {
if ((ch = getch()) == ERR) usleep(16666); // USER HASN'T RESPONDED
else if( ch == 'q'){
endwin();
exit(0); // QUIT ALL THREADS
}
}
}
if(thread_id == 2){
write_to_log();
}
}
int main(int argc, char *argv[]){
initscr(); // INIT THE SCREEN FOR CURSES
pthread_t threads[NUM_THREADS];
int rc, t;
for(t = 0; t < NUM_THREADS; t++){ // MAKE 2 NEW THREADS
rc = pthread_create(&threads[t], NULL, ThreadProcs, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);pthread_exit(NULL);
}
}
for(t = 0; t < NUM_THREADS; t++)
pthread_join(threads[t], NULL); // WAIT FOR THREADS TO EXIT OR IT WILL RACE TO HERE.
endwin();
return 0;
}
| linux force feedback (0) | 2022.06.15 |
|---|---|
| linux/joystick.h 파일 (0) | 2012.02.05 |
| linux socket 관련 (0) | 2015.01.22 |
|---|---|
| 멀티캐스트 되는지 여부 확인 (0) | 2014.11.21 |
| INADDR_ANY/INADDR_BROADCAST/INADDR_NONE 매크로 (0) | 2011.09.29 |
| hton(), ntoh() (0) | 2011.09.26 |
| netstat 에서 0.0.0.0의 의미 (2) | 2009.12.07 |
| 176 /* Address to accept any incoming messages. */
177 #define INADDR_ANY ((in_addr_t) 0x00000000)
178 /* Address to send to all hosts. */
179 #define INADDR_BROADCAST ((in_addr_t) 0xffffffff)
180 /* Address indicating an error return. */
181 #define INADDR_NONE ((in_addr_t) 0xffffffff)
|
| 멀티캐스트 되는지 여부 확인 (0) | 2014.11.21 |
|---|---|
| net tools 소스코드 (0) | 2011.11.07 |
| hton(), ntoh() (0) | 2011.09.26 |
| netstat 에서 0.0.0.0의 의미 (2) | 2009.12.07 |
| ioctl을 이용한 정보수집 (0) | 2009.11.30 |
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
The htonl() function converts the unsigned integer hostlong from host byte order to network byte order.
The htons() function converts the unsigned short integer hostshort from host byte order to network byte order.
The ntohl() function converts the unsigned integer netlong from network byte order to host byte order.
The ntohs() function converts the unsigned short integer netshort from network byte order to host byte order.
On the i80x86 the host byte order is Least Significant Byte first, whereas the network byte order, as used on the Internet, is Most Significant Byte first.
[링크 : http://linux.die.net/man/3/htonl] |
| net tools 소스코드 (0) | 2011.11.07 |
|---|---|
| INADDR_ANY/INADDR_BROADCAST/INADDR_NONE 매크로 (0) | 2011.09.29 |
| netstat 에서 0.0.0.0의 의미 (2) | 2009.12.07 |
| ioctl을 이용한 정보수집 (0) | 2009.11.30 |
| termios 구조체를 이용한 자국반향(echo) 제어 (0) | 2009.08.27 |