/********************************************* * hae_drive.c * ハエたたきマシンの駆動を行うプログラム * キーボード操作に応答し制御を行う * V1.0 2007/07/03 Grobo Program Team *********************************************/ //---------------------------------------------------------------------宣言 #include "hae.h" /* hae.hに #include をまとめてある */ int main(void); int main(void) { //---------------------------------------------------------------------定義 Display *d; Window w; KeySym key; /* キーシンボル */ char string[10];/* キーボードからの入力を受け取るための配列 */ XEvent e; int flg = 1,fd; u_int8_t val;/*u_int8_t型変数valの定義*/ fd = open("/dev/ppi0",O_RDWR,0600); printf("HAEたたき始動\n"); printf("このHAEは前進,後退,右折,左折が出来ます。\n"); printf("動きたい方向に矢印の上下左右を押して下さい。\n"); printf("はえたたきを動かしたい時は を押して下さい\n"); printf("注意!!!広範囲に動くと線がちぎれるので気を付けてください。\n"); d = XOpenDisplay(NULL);/*ディスプレイを開く*/ w = XCreateSimpleWindow (d, RootWindow(d,0),300,300,400,200,2,BlackPixel(d,0),WhitePixel(d,0)); /* 生成されるウインドウの寸法,位置を決定する */ XSelectInput(d,w,KeyPressMask | KeyReleaseMask);/* イベントの種類を規定(キーを押した時、離した時等)*/ XMapWindow(d,w); /******** 駆動用プログラム本体 ********/ while(flg) /*ここではflg=1なので無限ループになる*/ { XNextEvent(d,&e); /* 次のイベント(キーボードを押すor離す)を待つ関数 */ XLookupString(&e,string,10,&key,NULL); /* キーボード入力を返す関数 */ /****** 前進 ******/ if(key == XK_Up){ while(e.type==KeyPress){ XNextEvent(d,&e); val=0x05; ioctl(fd,PPISDATA,&val); printf("0x05:00000101\n"); usleep(10000); val=0x00; ioctl(fd,PPISDATA,&val); printf("0x00:00000000\n"); usleep(10000); } } /****** 後退 ******/ else if(key==XK_Down){ while(e.type==KeyPress){ XNextEvent(d,&e); val=0x0a; ioctl(fd,PPISDATA,&val); printf("0x0a:00001010\n"); usleep(10000); val=0x0f; ioctl(fd,PPISDATA,&val); printf("0x0f:00001111\n"); usleep(10000); } } /****** 右方向 ******/ else if(key==XK_Right){ while(e.type==KeyPress){ XSync(d,1); XNextEvent(d,&e); val=0x44; ioctl(fd,PPISDATA,&val); printf("0x44:01000100\n"); usleep(10000); val=0x00; ioctl(fd,PPISDATA,&val); printf("0x00:00000000\n"); usleep(10000); val=0x04; ioctl(fd,PPISDATA,&val); printf("0x04:00000100\n"); usleep(10000); val=0x00; ioctl(fd,PPISDATA,&val); printf("0x00:00000000\n"); usleep(10000); val=0x45; ioctl(fd,PPISDATA,&val); printf("0x45:01000101\n"); usleep(10000); val=0x01; ioctl(fd,PPISDATA,&val); printf("0x01:00000001\n"); usleep(10000); val=0x05; ioctl(fd,PPISDATA,&val); printf("0x05:00000101\n"); usleep(10000); val=0x01; ioctl(fd,PPISDATA,&val); printf("0x01:00000001\n"); usleep(10000); } } /****** 左方向 ******/ else if(key==XK_Left){ while(e.type==KeyPress){ XSync(d,1); XNextEvent(d,&e); val=0x81; ioctl(fd,PPISDATA,&val); printf("0x81:10000001\n"); usleep(10000); val=0x00; ioctl(fd,PPISDATA,&val); printf("0x00:00000000\n"); usleep(10000); val=0x01; ioctl(fd,PPISDATA,&val); printf("0x01:00000001\n"); usleep(10000); val=0x00; ioctl(fd,PPISDATA,&val); printf("0x00:00000000\n"); usleep(10000); val=0x85; ioctl(fd,PPISDATA,&val); printf("0x85:10000101\n"); usleep(10000); val=0x04; ioctl(fd,PPISDATA,&val); printf("0x04:00000100\n"); usleep(10000); val=0x05; ioctl(fd,PPISDATA,&val); printf("0x05:00000101\n"); usleep(10000); val=0x04; ioctl(fd,PPISDATA,&val); printf("0x04:00000100\n"); usleep(10000); } } /****** 左回転 ******/ else if(key == XK_l){ while(e.type==KeyPress){ XSync(d,1); XNextEvent(d,&e); val=0x88; ioctl(fd,PPISDATA,&val); printf("0x88:10001000\n"); usleep(10000); val=0x0d; ioctl(fd,PPISDATA,&val); printf("0x0d:00001101\n"); usleep(10000); } } /****** 右回転 ******/ else if(key == XK_r){ while(e.type==KeyPress){ XSync(d,1); XNextEvent(d,&e); val=0x42; ioctl(fd,PPISDATA,&val); printf("0x42:01000010\n"); usleep(10000); val=0x07; ioctl(fd,PPISDATA,&val); printf("0x07:00000111\n"); usleep(10000); } } /****** DC駆動 ******/ else if(key == XK_Return){ while(e.type==KeyPress){ system("xset r off"); XSync(d,1); val=0x10; ioctl(fd,PPISDATA,&val); printf("0x10:00010000\n"); XNextEvent(d,&e);/*キーを離すまでイベント待ちする*/ val=0x00; ioctl(fd,PPISDATA,&val); printf("0x00:00000000\n"); system("xset r on"); } } /****** 停止 ******/ else if(key == XK_Escape){ val=0x20; ioctl(fd,PPISDATA,&val); printf("停止します。\n"); flg = 0; /* 無限ループから抜ける */ } /*↑,→,↓,←,以外のキーが押された時のプログラム*/ else{ while(e.type==KeyPress){ system("xset r off"); /* キーリピート(連打機能)をoffにする */ XNextEvent(d,&e); printf("方向を入力して下さい。。\n"); } system("xset r on"); } } system("xset r on"); }