'잡동사니'에 해당되는 글 12954건

  1. 2012.02.04 리눅스에서 조이스틱 값 읽어오기
  2. 2012.02.03 급 피곤 4
  3. 2012.02.02 NMI on Ubuntu Server Edition
  4. 2012.02.02 sns 는 쇄락중? 2
  5. 2012.02.02 NMI 운용방법
  6. 2012.02.02 한나라당 -> 새누리당 4
  7. 2012.02.01 지역농협 사용기
  8. 2012.01.31 open drain / open collector
  9. 2012.01.31 간트차트
  10. 2012.01.31 Cortex-M3 인터럽트 관련 문서
Linux API/joystick2012. 2. 4. 14:37
CCTV(PTZ) 업체에 있다 보니 리눅스에서도 조이스틱을 이용해서
컨트롤러를 대체할수 있을까 라는 생각에 조이스틱 관련 API를 찾아보는데
의외로 단순한 구조 같은 느낌..

요즘에는 USB로도 많이 쓰니 USB목록에서 장치명을 찾아서 열거하는 것도 필요할 듯 하고
아무튼 중요한건 js_event 구조체 이녀석인듯.
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 */
}; 

[링크 : http://www.mjmwired.net/kernel/Documentation/input/joystick-api.txt] 3.2 kernel
[링크 :  http://archives.seul.org/linuxgames/Aug-1999/msg00107.html] 2.2 kernel

----
curse.h가 없다고 에러날 경우는 아래와 같이 설치해주고
$ 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;
}


[링크 : http://www.linuxquestions.org/questions/programming-9/joystick-347292/]
 + [링크 : http://sukwoo.blogspot.com/2008/07/ubuntu-804-ncurses.html]
---
[링크 : http://msdn.microsoft.com/en-us/library/windows/desktop/dd743596(v=vs.85).aspx] << 윈도우용

'Linux API > joystick' 카테고리의 다른 글

linux force feedback  (0) 2022.06.15
linux/joystick.h 파일  (0) 2012.02.05
Posted by 구차니
개소리 왈왈2012. 2. 3. 23:10
애 보는게 쉽지는 않구나 ㅠ.ㅠ
귀에다 대고 앵앵 울어대니 급격히 체력 감소 ㅠ.ㅠ 
Posted by 구차니
차이는 없다


reason 21 에서 31로 바뀐거 외에는 에러 메시지도 동일하다 -ㅁ-

2011/09/25 - [하드웨어/Server Case/board] - NMI on Linux
Posted by 구차니
42 + 34 + 17 = 93
33 + 32 + 15 = 80

제목은 페이스 북을 찬양하다 시피하는데
통계값은 쇄락하는 느낌인디...


[링크 :  http://media.daum.net/digital/view.html?cateid=1077&newsid=20120202203321758&p=mk]


으엇? 다시 보니 절대 값이 아니라 퍼센트군! OTL 

'개소리 왈왈 > 블로그' 카테고리의 다른 글

요즘 스팸댓글이 왜케 많이 달려?  (0) 2012.03.30
블로그 에디터 카테고리를 돌려줘!!!  (0) 2012.03.27
우비 woobi.co.kr  (2) 2012.01.26
왈도체 댓글?  (0) 2011.12.15
내 블로그 사고친거 있나?  (0) 2011.11.29
Posted by 구차니
NMI는 일종의 진단 / 디버깅용도로 사용되는 녀석인데
완전히 뻗어버려서 디버깅에 응답이 없을때 크래시 덤프를 빼낼수 있도록 하는 용도라고 한다.

NMI Crash Dump overview 
Non-Maskable Interrupt (NMI) Crash Dump is a diagnostic mechanism. It allows for crash dump files 
to be created in situations when a system is hung and not able to respond to traditional debug 
mechanisms.

[링크 : http://h20000.www2.hp.com/bc/docs/support/SupportManual/c00797875/c00797875.pdf]  

아무래도 서버에서는 다시 발생을 하지 않도록 해야하니
이런류의 디버깅 방법론을 제공해주는 듯? 
Posted by 구차니
새누리당 듣고 떠오른 생각

1. '신'한국당 에서 신을 한글로 바꾸었군 -_-
2. 누리 에서 누리꾼이 떠오름


제 2차 키배가 시작되었다!
SNS 점령 똭!
미디어 점령 똭!
난 알바가 아니다! 정직원이다! 파문




웬지 이런 느낌?

[링크 : http://news.nate.com/view/20120202n08212&NC=TB]
Posted by 구차니
지역농협에 들어놓았던 적금이 끝나서 깨러 오라고 전화도 주는데

1. 가입하는건 해당지역 농협을 가야 하지만 깨는건 중앙회에서도 가능함. 혹은 다른 지역농협도 가능
2. 원칙은 집 주소가 있는 해당 "지역농협"에서 해야함
3. 재직 증명서가 있으면 회사가 위치한 "지역농협"에서도 가입이 가능함
4. 단, 회사 지역의 지역농협에 조합원을 옮겨와야 하는 듯(혹은 중복가입?)


아무튼 지역농협/수협은 농특세로 3000만원까지 해주니까 꼭 챙겨먹어야 할 듯!
Posted by 구차니
하드웨어2012. 1. 31. 19:11
TTL 에서는 Open Collector
CMOS에서는 Open Drain 은 꼭 아닌거 같은데 
회로에 대한 전반적인 이해가 부족하니 ㅠ.ㅠ


[링크 :  http://en.wikipedia.org/wiki/Open_collector ]  




TTL 소자가 모두 묶여있고, High 와 Low가 섞여 있으면 전류가 H에서 L로 전부 흘러 L 쪽이 파괴될수 있는 문제가 있다.
물론 이런 결선을 wired-OR 라고 하지만 회로가 파괴 될 우려가 있어서 묶으면 안되고
이런 경우에 사용 가능한 방법이 open collector / open drain / tri-state 가 있다.

[링크 :  http://cpu.kongju.ac.kr/downfile/column/Tnote09.pdf]



TI cortex-M3 에서 OD(Open Drain)로 설정된 녀석이 pull-up이 없어서 High로 놔도 끌려오지 않았던 거구나.. 
(예를 들어, IC reset용으로 GPIO를 연결했고 OD일 경우
pull-up 회로가 없으면 High로 끌려올라 오지 않아서 reset 시그널이 보내지지 않는다.)
Posted by 구차니
프로젝트 진척률을 표현하는 좋은방법중에 하나로 간트 차트라는 것이 있다.
이름은 몰라도 그림을 보면 아~! 하는 바로 그 녀석이다.


아무튼, 프로젝트 스계줄을 달라고 하셔서 간트차트로 만들려니 엑셀도 노가다 파워포인트도 노가다 -_-
2012/01/31 - [Microsoft/Office] - ms office excel을 이용한 간트차트

gnome에서 지원하는 planner
ganttproject
openproj(ms project 호환) 정도가 있으니 어떤 OS에서도 골라서 쓰는 재미!

[링크 :  http://www.ilovepc.co.kr/bbs/board.php?bo_table=software&wr_id=310]
    [링크 :  http://www.ganttproject.biz/
    [링크 :  http://sourceforge.net/projects/openproj/

'Programming > 소프트웨어 공학' 카테고리의 다른 글

디자인 패턴 - singleton  (0) 2014.04.02
매번 느끼는 서글프지만 인정하고 싶지 않은 것  (0) 2012.02.08
리팩토링 (refactoring)  (0) 2012.01.15
SRS / SDS  (0) 2011.06.20
CMMI / TMMI  (0) 2011.06.20
Posted by 구차니
embeded/Cortex-M3 Ti2012. 1. 31. 17:32
으헝헝 이런걸 찾고 있었던 거야 ㅠ.ㅠ

아무튼 중요한 내용은,
Cortex-M3 계열은 인터럽트 발생후 리셋하지 않기 때문에 수동으로 리셋을 해주어야 한다는 점인듯?


[링크 : http://skean.tistory.com/34]
[링크 :  http://eoworld.tistory.com/entry/LM3S8962-interrupt ]
  [링크 : http://www.cyworld.com/gooble/4856690] << 원본?

'embeded > Cortex-M3 Ti' 카테고리의 다른 글

Ti lm3s1968 arm cortex m3 i2c  (0) 2012.02.20
TI stellarisware / driverlib 기본설정 (uart예제)  (4) 2012.02.05
Cortex-M3 예제소스  (0) 2012.01.27
Cortex-M3 LM3S1968 Evaluation board  (0) 2012.01.27
ARM Cortex-M3 ISR 등록 방법  (0) 2012.01.20
Posted by 구차니