/********************************************* * test4.c * のショベルカー駆動を行うプログラム * キーボード操作に応答し制御を行う * V1.0 2010/07/06 Grobo Program Team(チームというか野口だけだい) *********************************************/ //---------------------------------------------------------------------宣言 /******プログラムの動作に必要な宣言******/ #include "bull.h" /* bull.hに #include をまとめてある */ #define SPEED 5000 #define POWER 5000 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の定義*/ static int kazu=0; fd = open("/dev/ppi0",O_RDWR,0600); printf("ショベルカー始動します。\n"); printf("このMACHINEは前進,後退,右回転,左回転が出来ます。\n"); printf("armを動かしたい時はF1/F12を押して下さい\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_Down){ while(e.type==KeyPress){ XNextEvent(d,&e); val=0x0c; ioctl(fd,PPISDATA,&val); printf("0x0c:00001100\n"); usleep(SPEED); val=0x30; ioctl(fd,PPISDATA,&val); printf("0x30:00110000\n"); usleep(SPEED); } } /****** 前進 ******/ else if(key==XK_Up){ while(e.type==KeyPress){ XNextEvent(d,&e); val=0x04; ioctl(fd,PPISDATA,&val); printf("0x04:00000100\n"); usleep(SPEED); val=0x10; ioctl(fd,PPISDATA,&val); printf("0x10:00010000\n"); usleep(SPEED); } } /****** 左回転 ******/ else if(key == XK_Left){ while(e.type==KeyPress){ XSync(d,1); XNextEvent(d,&e); val=0x10; ioctl(fd,PPISDATA,&val); printf("0x10:00010000\n"); usleep(SPEED); val=0x0c; ioctl(fd,PPISDATA,&val); printf("0x0c:00001100\n"); usleep(SPEED); } } /****** 右回転 ******/ else if(key == XK_Right){ while(e.type==KeyPress){ XSync(d,1); XNextEvent(d,&e); val=0x04; ioctl(fd,PPISDATA,&val); printf("0x04:00000100\n"); usleep(SPEED); val=0x30; ioctl(fd,PPISDATA,&val); printf("0x30:00110000\n"); usleep(SPEED); } } /****** アーム駆動(晴天) ******/ else if(0<=kazu<15){ if(key == XK_F1){ while(e.type==KeyPress){ XNextEvent(d,&e); val=0x01; ioctl(fd,PPISDATA,&val); printf("0x10:00000001\n"); usleep(POWER); val=0x00; ioctl(fd,PPISDATA,&val); printf("0x00:00000000\n"); usleep(POWER); kazu++; } } /****** アーム駆動 (逆転) ******/ else if(key == XK_F12){ while(e.type==KeyPress){ XNextEvent(d,&e); val=0x03; ioctl(fd,PPISDATA,&val); printf("0x03:00000011\n"); usleep(POWER); val=0x00; ioctl(fd,PPISDATA,&val); printf("0x00:00000000\n"); usleep(POWER); kazu++; } } } /****** 停止 ******/ else if(key == XK_Escape){ 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"); }