#include #include #include /*to change cursor*/ #include #include #include /*文字列操作*/ #include /*for tolower*/ #include /*for usleep*/ #include /*以下3つはprinter port との通信のために必要*/ #include #include #include /*実行に掛かった時間を測るため*/ int pps=100,num; /*外で宣言した(grobal)変数は*/ Display* dis; /*その値を保ち続けるので、 */ Window canv; /*多関数間での共有ができる!*/ #define MAX 512 #ifndef ERR /*定義されてなかったら定義する*/ #define ERR -1 #endif #define TchX 0x40 /*x sensor*/ #define TchY 0x20 /*y sensor*/ #define ON 0x10 #define OFF 0x00 #define CELL 2 #define Clea 10 /*clearance*/ #define CAN_W (CELL*(505-Clea*2)) /*稼働領域397mm×210mmで、*/ #define CAN_H (CELL*(267-Clea*2)) /*1dot=.785mmやし。*/ #define R_H 740 /*Janetの画面の高さ(ちなみに幅の方は1020)*/ #define re_x(t) ((t+.5)*CELL) /*関数モドキも定義可(マクロ)*/ #define re_y(t) ((t+.5)*CELL) #define PenUp 0.1 #define WAIT 8500 /*実験で求めたおおよその1/2秒あたりprint処理回数*/ #define PMAX 400 /*maximal pps*/ #define PMIN 10 /*minimal pps*/ typedef struct{ int x,y; u_int8_t connection; } COORD; /* ここで全関数の型を先に宣言した方がいいっちゃいいんやけど、 記述する順番にさえ気をつければ大丈夫(よい子は真似しないかも)。 */ /* ----------------------------------- question & input */ char ask(char str[]){ char a; printf("\a%s: ",str); fpurge(stdin); if((a=getchar())==0xa) ask(str); //改行やったら訊き直す return tolower(a); //小文字で返す } /* -------------------------------- get the color pixel */ unsigned long c_pix(Colormap cm,char *name){ XColor c0,c1; XAllocNamedColor(dis,cm,name,&c1,&c0); //色のpixel値を返す return c1.pixel; } /* --------------------------- 線分の始点を青い●で表示 */ void mark(GC gc,int x,int y,unsigned long px[]){ XSetForeground(dis,gc,px[6]^px[4]); //XORされるのでXORしておく XFillArc(dis,canv,gc,x-4,y-4,8,8,0,360*64); XFlush(dis); } /* ----------------------------------------- 太線を描画 */ void trace(GC gc,COORD dat[],int start,int end){ int i; for(i=start;idy?dx:dy); //dxとdyで大きい方 sec+=(dat[i].connection==OFF)*PenUp; } p/=pps; p+=sec; min=p/60; sec=p%60; printf("The time to process will be %.2f\" + %d\'%.2lf\".\n",warmup,min,sec); return p; } /* -------------- sleep 1/pps/2 seconds after the pulse */ void pulse(int f,u_int8_t* vp){ int s; ioctl(f,PPISDATA,vp); for(s=0;s0,dy>0,checkしない move(fd,0x01,0x02,TchY,NULL); dx=0,dy<0,yをcheck move(fd,0x00,0x08,TchX,NULL); dx<0,dy=0,xをcheck 回路班の都合によりセンサを着けてないからできない */ //左上端におるとして、余裕を持たせるため今の座標を(-Clea,-Clea)とする。 move(fd,0x04,0x0a,OFF,Clea); //俺が定めた原点にイかせる。 fprintf(stdout,"\bProtting...\n"); //で、ここからprotting。 start=time(NULL); printf("[ ] 0% "); fflush(stdout); for(i=0;iCAN_W/CELL||dat[i+1].y<0||dat[i+1].y>CAN_H/CELL){ fprintf(stderr,"\nWrong coordination value!\n"); endctl(fd); return ERR; } val=dat[i].connection; ioctl(fd,PPISDATA,&val); //まずペンを上げ下げ if(val==OFF&&dat[i-1].connection==ON) usleep(PenUp*1000000); //跳ねないようにちょっと待つ dx=dat[i+1].x-dat[i].x; dy=dat[i+1].y-dat[i].y; val|=((dx>0)<<2)|(dy<0); //x,yの回転方向(#2,#0)を設定 /*条件判別式(例えば'x>0')は真⇒1、偽⇒0の値を取る '<>N'は右に N bits shift つまり2の-N乗を掛けることに相当 */ ax=abs(dx); ay=abs(dy); k=0; temp1=time(NULL); for(j=0;j<(ax>(2*(ax