8年前编写的,无意又发现它,看了看,还是觉得很有意思。帖到这里给感兴趣的人看看,记得当时用的是研华pcl812的板子,希望也能和我重温当年的那些感情。
主要功能有,8通道,32点,保留历史纪录,实时曲线,历史曲线,线颜色可配,有屏幕保护。
下面的是源代码,你也可以在http://edsoncy.512j.com/tar/HPS.rar 下载。本来想贴两张图的,就是截不到!对了,ALT+X连续两次退出,或是鼠标点击坐上角方框两次。
#include <graphics.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <conio.h> #include <dos.h> #include <time.h>
/*=================== mouse start =======================*/ int MOUSE_THERE; int MOUSE_VISIBLE; union REGS mregs;
void reset_mouse(void) { MOUSE_THERE = 0; MOUSE_VISIBLE = 0;
if (getvect(0x33) != 0L) { mregs.x.ax = 0; int86(0x33, &mregs, &mregs); if (mregs.x.ax !=0) MOUSE_THERE = 1; } }
void pascal set_mouse_position(int x, int y) { if (MOUSE_THERE) { mregs.x.ax = 4; mregs.x.cx = x; mregs.x.dx = y; int86(0x33, &mregs, &mregs); } }
void pascal set_mouse_limits(int x1, int y1, int x2, int y2) { if (MOUSE_THERE) { mregs.x.ax = 7; mregs.x.cx = x1; mregs.x.dx = x2; int86(0x33, &mregs, &mregs); mregs.x.ax = 8; mregs.x.cx = y1; mregs.x.dx = y2; int86(0x33, &mregs, &mregs); } }
void pascal get_mouse_button(unsigned char *lbutton, unsigned char *rbutton, int *x, int *y) { if (MOUSE_THERE) { mregs.x.ax = 3; int86(0x33, &mregs, &mregs);
*lbutton = (mregs.x.bx == 1) ? 1 : 0; *rbutton = (mregs.x.bx == 2) ? 1 : 0; if (mregs.x.bx == 3) *lbutton = *rbutton = 1;
*x = mregs.x.cx; *y = mregs.x.dx; } } /*=================== mouse over =======================*/
#define _DEBUG
/* define data.dat point num */ #ifndef _DEBUG #define FILEMAX 0x3FFFFF #else #include "math.h" #define PI 3.14159265758 #define FILEMAX 0xFFF #endif
#define SCRMAX 600 /* define keyboard */ #define ALT_U 150 #define ALT_D 160 #define ALT_N 177 #define ALT_X 173 #define ALT_T 148 #define ALT_E 146 #define ALT_C 174 #define ALT_M 178 #define ALT_1 248 #define ALT_2 249 #define ALT_3 250 #define ALT_4 251 #define ALT_5 252 #define ALT_6 253 #define UP 200 #define DOWN 208 #define LEFT 203 #define RIGHT 205 #define ENTER 13
/* ================================ */ static int INTRATE,freescreen,mousespeed; static int int_ok,run_program=2,scr_num=10,axis=1; static int tim,intrate,nokeytime,ticker; static int color[16],color_t[16]; static int colume,mousespeed_t,freescreen_t; static long unsigned fpt,fpt_t; static unsigned int drawpt; static unsigned char draw_data[SCRMAX][16]; unsigned char c[SCRMAX+1][16]; char *unit[3]={"deg.C","Mpa","kmph"}; char *port[6]={"entra_T","entra_P","entra_F", "exit_T","exit_P","exit_F"};
time_t ti,cur_ti; FILE *fdata,*fpoint;
struct datum { float hi; /* high alarm value */ float lo; /* low alarm value */ float span_lo; /* instrument disp lower limit */ float span_hi; /* instrument disp upper limit */ int val; /* 12 bit true value */ float fval; /* after culation */ char strval[10]; /* str value */ } data[8][6];
#ifndef _DEBUG extern pcl812(int, unsigned int *); unsigned int param[60]; unsigned int pcldata[800]; unsigned int far * pcldat; #else unsigned int TimeNum; #endif /* ================================= */ void cursor(int status); void draw_3(int startx,int starty,int x,int y);
void interrupt (*oldtimer)(void) = NULL; void interrupt newtimer(void); void install(void interrupt (*int_add)(),int int_num);
int get_char(void); void keybroad(void);
void headscr(void); void head_bar(void); void table_backscr(void); void eachline_backscr(void); void curve_backscr(void); void color_backscr(void); void frontscr(void);
void data_pro(void); void f_init(void); int f_fun(int key); void f_write(int offset); void driver_init(void); void span_init(void); /* ========== move cursor from _old to _cur ======== */ static int curx,cury,oldx,oldy,line_old; static char curbuf[210]; unsigned char mouse_lbutt_press_in_this_time_int;
void cursor(int status) { int shape[10],*s=shape; if (status!=0) putimage(oldx,oldy,curbuf,COPY_PUT); getimage(curx,cury,curx+16,cury+16,curbuf); *s=curx; s++; *s=cury; s++; *s=curx+16; s++; *s=cury+8; s++; *s=curx+10; s++; *s=cury+10; s++; *s=curx+8; s++; *s=cury+16; s++; *s=curx; s++; *s=cury; setcolor(LIGHTBLUE); setfillstyle(SOLID_FILL,LIGHTBLUE); fillpoly(4,shape); setfillstyle(SOLID_FILL,LIGHTGRAY); oldx=curx; oldy=cury; return; }
void draw_3(int startx,int starty,int x,int y) { int shape[8],*s=shape; *s=startx;s++; *s=starty;s++; *s=startx+x;s++; *s=starty+y;s++; *s=startx+x;s++; *s=starty-y;s++; *s=startx;s++; *s=starty; fillpoly(3,shape); }
/* ========== interrupt function ================ */
void install(void interrupt (*int_add)(),int int_num) { disable(); setvect(int_num,int_add); enable(); return; }
/* ------- interrupt ------- */ void interrupt newtimer (void)
{ (*oldtimer)(); if (ticker==0) /* -----------------------------*/ { ticker=(((tim%5)==0) ? 19:18); if (++tim==5) tim=0; run_program=2; mouse_lbutt_press_in_this_time_int = 0; if (nokeytime <= freescreen) nokeytime++; intrate--; if (intrate==0) { int_ok++; intrate=INTRATE; } /* ---------------------------------*/ } --ticker;
return; }
/* ============== keybroad funtion ==================== */ int get_char(void) { union REGS rg; int c; while (1) { rg.h.ah=1; int86(0x16,&rg,&rg); if (rg.x.flags & 0x40) { int86(0x28,&rg,&rg); break; } rg.h.ah=0; int86(0x16,&rg,&rg); if (rg.h.al==0) c=rg.h.ah|128; else c=rg.h.al; break; } return c; } /* ------------------------------------------- */
void keybroad(void) { int key; unsigned char rbutton, lbutton = 0; if (MOUSE_THERE) { oldx = curx; oldy = cury; get_mouse_button(&lbutton, &rbutton, &curx, &cury); if (lbutton) if (mouse_lbutt_press_in_this_time_int) lbutton = 0; else mouse_lbutt_press_in_this_time_int = 1; }
key=get_char(); if (scr_num<10) { if (key==ENTER || lbutton) { if (curx>0&&curx<24&&cury>0&&cury<24) key=ALT_X; else if (curx>26&&curx<134&&cury>0&&cury<24) key=ALT_T; else if (curx>136&&curx<244&&cury>0&&cury<24) key=ALT_E; else if (curx>246&&curx<354&&cury>0&&cury<24) key=ALT_C; else if (curx>366 && cury>0 && curx<639 && cury<24) key=ALT_M; else if (scr_num<8 && curx>540&&cury>28&&curx<639&&cury<55) key=ALT_N; else if (scr_num==9 && cury>29 &&cury<63 && curx>407) key=ALT_1+(curx-407)/39; else if (scr_num==9 && curx>365 && cury>34 && curx<390 && cury<46) key=ALT_U; else if (scr_num==9 && curx>365 && cury>49 && curx<390 &&cury<61) key=ALT_D; else if (scr_num==9 && cury>454 && cury<479 && curx>32 && curx<634) key= -1; else; } switch (key) { case ALT_N : if (scr_num<8) { char s[2]="1"; scr_num++; if (scr_num>7) scr_num=0; (*s)+=scr_num; settextstyle(TRIPLEX_FONT,HORIZ_DIR,8); setcolor(WHITE); bar(570,115,610,180); outtextxy(570,100,s); setcolor(BLUE); settextstyle(DEFAULT_FONT,HORIZ_DIR,1); } break;
case ALT_X : run_program--; break;
case ALT_T : table_backscr(); break;
case ALT_E : eachline_backscr(); break;
case ALT_C : curve_backscr(); break;
case ALT_M : color_backscr(); break;
case UP : cury-=mousespeed; if (cury<0) cury=0; set_mouse_position(curx, cury); cursor(1); break;
case DOWN : cury+=mousespeed; if (cury>479) cury=479; set_mouse_position(curx, cury); cursor(1); break;
case LEFT : curx-=mousespeed; if (curx<0) curx=4; set_mouse_position(curx, cury); cursor(1); break;
case RIGHT : curx+=mousespeed; if (curx>623) curx=623; set_mouse_position(curx, cury); cursor(1); break;
case ALT_1 : if (scr_num==9) { fpt_t=fpt+SCRMAX*axis; cur_ti=ti-(FILEMAX-SCRMAX*axis)*INTRATE; f_fun(key); } break;
case ALT_2 : if (scr_num==9) { fpt_t-=(SCRMAX*axis/2); cur_ti-=(SCRMAX*axis*INTRATE/2); f_fun(key); } break;
case ALT_3 : if (scr_num==9) { fpt_t-=axis; cur_ti-=axis*INTRATE; f_fun(key); } break;
case ALT_4 : if (scr_num==9) { fpt_t+=axis; cur_ti+=axis*INTRATE; f_fun(key); } break;
case ALT_5 : if (scr_num==9) { fpt_t+=(SCRMAX*axis/2); cur_ti+=(SCRMAX*axis*INTRATE/2); f_fun(key); } break;
case ALT_6 : if (scr_num==9) { fpt_t=fpt; cur_ti=ti; f_fun(key); } break;
case ALT_U : if (scr_num == 9) { char *s = NULL; int i; axis<<=1; if (axis > 16) axis = 1; setcolor(RED); bar(330,43,355,51); outtextxy(330,43,itoa(axis,s,10)); bar(1,455,633,478); setcolor(WHITE); setfillstyle(SOLID_FILL,BLUE); for (i=1;i<11;i++) { outtextxy(626-i*60,465,itoa(i*INTRATE*axis,s,10)); outtextxy(642-i*60,465," m"); bar(633-i*60,455,635-i*60,462); } f_fun(ALT_2); } break;
case ALT_D : if (scr_num == 9) { char *s = NULL; int i; axis>>=1; if (axis == 0) axis = 16; bar(330,43,355,51); setcolor(RED); outtextxy(330,43,itoa(axis,s,10)); bar(1,455,633,478); setcolor(WHITE); setfillstyle(SOLID_FILL,BLUE); for (i=1;i<11;i++) { outtextxy(626-i*60,465,itoa(i*INTRATE*axis,s,10)); outtextxy(642-i*60,465," m"); bar(633-i*60,455,635-i*60,462); }
f_fun(ALT_2); } break;
case -1 : f_write(634-curx); break;
default : key = 0; if (oldx != curx || oldy != cury) cursor(1); break; } }
if (scr_num==10) { char str[2]; str[0]=16; str[1]='\x0'; switch (key) { case ENTER : if (colume<16) { ++color_t[colume]; color_t[colume]&=0x0f; setfillstyle(SOLID_FILL,color_t[colume]); bar(360,123+colume*15,400,125+colume*15); setfillstyle(SOLID_FILL,LIGHTGRAY); } else if (colume==16) { char str[4]; mousespeed_t++; if (mousespeed_t>20) mousespeed_t=1; bar(360,360,382,368); itoa(mousespeed_t,str,10); setcolor(WHITE); outtextxy(360,360,str); } else if (colume == 17) { char str[4]; freescreen_t*=2; if (freescreen_t>480) freescreen_t = 60; bar(360,375,382,383); itoa(freescreen_t,str,10); setcolor(WHITE); outtextxy(360,375,str); } else if (colume==18) { int i; for(i=0;i<16;i++) color[i]=color_t[i]; mousespeed=mousespeed_t; freescreen=freescreen_t; curve_backscr(); } else curve_backscr();
break;
case UP : bar(245,120+colume*15,252,128+colume*15); colume--; if (colume<0) colume=19; setcolor(WHITE); outtextxy(245,120+colume*15,str); break;
case DOWN : bar(245,120+colume*15,252,128+colume*15); colume++; if (colume>19) colume=0; setcolor(WHITE); outtextxy(245,120+colume*15,str); break;
default : key = 0; break; } }
if (key) { if (nokeytime > freescreen) { scr_num = 0; eachline_backscr(); } nokeytime = 0; } return; } /* ==================================================== */
/* ----- draw head bar ------ */ void head_bar(void) { setfillstyle(SOLID_FILL,BLACK); bar(0,0,639,479);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1); setfillstyle(SOLID_FILL,LIGHTGRAY); setcolor(WHITE);
bar3d(0,0,24,24,0,0); bar3d(7,11,17,13,0,0); bar3d(26,0,134,24,0,0); outtextxy(35,3,"total Table"); bar3d(136,0,244,24,0,0); outtextxy(150,3,"Each line"); bar3d(246,0,364,24,0,0); outtextxy(255,3,"total Curve"); bar3d(366,0,639,24,0,0); outtextxy(415,3,"the Mis for H.P.S");
setcolor(RED); if(scr_num<8) outtextxy(150,3,"Each line"); else if(scr_num==8) outtextxy(35,3,"total Table"); else if(scr_num==9) outtextxy(255,3,"total Curve"); else if(scr_num==10) outtextxy(415,3,"the Mis for H.P.S"); setcolor(WHITE);
return; }
/* -------- head screen function -------- */ void head_scr(void) { head_bar(); bar3d(150,150,489,320,4,4); setcolor(BLUE); outtextxy(175,180,"The Manage Information System "); outtextxy(175,215," for the H.P.S of "); outtextxy(175,250," the PAN factory "); outtextxy(285,280,"1998.05");
settextstyle(DEFAULT_FONT,HORIZ_DIR,1); return; }
/* ----------- total table back screen function : scr= 8 ------- */ void table_backscr(void) { register int i,j; char s[5];
scr_num=8; head_bar();
/* make marks */ for (i=0;i<6;i++) { bar3d(i*100+40,30,i*100+135,50,3,3); outtextxy(i*100+55,30,port[i]); }
/* make line number */ settextstyle(TRIPLEX_FONT,VERT_DIR,1); strcpy(s,"No.1"); for (i=0;i<8;i++) { bar3d(0,i*50+55,35,i*50+100,3,3); outtextxy(8,i*50+58,s); (*(s+3))++; }
/* draw the up_left box */ bar3d(0,30,35,50,3,3);
/* make 48 indecate boxes */ for (i=0;i<8;i++) for (j=0;j<6;j++) bar3d(j*100+40,i*50+55,j*100+135,i*50+100,3,3);
/* make units boxes */ bar3d(0,455,35,479,3,3); settextstyle(DEFAULT_FONT,HORIZ_DIR,1); for(i=0;i<6;i++) { setcolor(WHITE); bar3d(i*100+40,455,i*100+135,479,3,3); setcolor(RED); outtextxy(i*100+70,462,unit[i%3]); }
cursor(0); return; }
/* ------- each line back screen function : scr= 0 - 7 ------ */ void eachline_backscr(void) { register int i,j; char s[10];
scr_num=0; head_bar();
/* make 6 indecate boxes */ for (i=0;i<6;i++) { bar3d(i*90,29,i*90+85,184,3,3); outtextxy(i*90+10,35,port[i]); }
/* make 'next' cursor table */ bar3d(540,28,639,55,0,0); outtextxy(570,31,"Next");
/* make a indecate box for time */ bar3d(540,60,634,85,3,3);
/* make line number box */ bar3d(540,90,634,184,3,3); outtextxy(545,95,"line_num"); s[0]='1'; s[1]='\x0'; settextstyle(TRIPLEX_FONT,HORIZ_DIR,8); outtextxy(570,100,s);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1); /* make rullor and draw window */ bar3d(0,189,25,447,3,3); bar3d(32,189,634,447,3,3); bar3d(0,454,634,479,3,3); setfillstyle(SOLID_FILL,BLUE); for (i=1;i<4;i++) { outtextxy(2,186+64*i,itoa(25*(4-i),s,10)); outtextxy(10,196+64*i,"%"); bar(20,189+64*i,24,191+64*i); } for (i=1;i<11;i++) { outtextxy(626-i*60,465,itoa(i*INTRATE,s,10)); outtextxy(642-i*60,465," m"); bar(633-i*60,455,635-i*60,462); }
setcolor(RED); for (i=0;i<6;i++) outtextxy(i*90+40,90,unit[i%3]);
bar(10,60,75,63); setfillstyle(SOLID_FILL,RED); bar(100,60,165,63);
cursor(0); return; }
/* -------- curve back screen function : scr= 9 -------- */ void curve_backscr(void) { register int i,j; char s[5];
scr_num=9; cur_ti=ti; fpt_t=fpt;
head_bar();
/* draw directory table */ for(i=0;i<6;i++) bar3d(407+i*39,29,442+i*39,63,0,0); setfillstyle(SOLID_FILL,BLUE); draw_3(410,47,12,12); draw_3(423,47,12,12); draw_3(451,47,12,12); bar3d(468,35,473,59,0,0); draw_3(490,47,24,12); draw_3(554,47,-24,12); bar3d(570,35,575,59,0,0); draw_3(593,47,-12,12); draw_3(621,47,-12,12); draw_3(634,47,-12,12);
setfillstyle(SOLID_FILL,LIGHTGRAY); settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
/* draw time box */ bar3d(0,31,235,63,3,3); /* draw axis box and table*/ bar3d(242,31,400,63,3,3); bar3d(365,34,390,46,0,0); bar3d(365,49,390,61,0,0); outtextxy(370,37,"Up"); outtextxy(370,52,"Dn"); /* write time and axis */ setcolor(BLUE); outtextxy(17,43,ctime(&cur_ti)); outtextxy(250,43,"time axis:"); setcolor(RED); outtextxy(330,43,itoa(axis,s,10)); setcolor(WHITE);
bar3d(0,70,634,182,3,3); strcpy(s,"T1:"); for (i=0;i<8;i++) { setcolor(WHITE); outtextxy(10+i/4*320,85+i%4*25,s); s[1]++; setcolor(RED); outtextxy(110+i/4*320,85+i%4*25,unit[0]); }
strcpy(s,"P1:"); for (i=0;i<8;i++) { setcolor(WHITE); outtextxy(170+i/4*320,85+i%4*25,s); s[1]++; setcolor(RED); outtextxy(270+i/4*320,85+i%4*25,unit[1]); }
for (i=0;i<16;i++) { setfillstyle(SOLID_FILL,color[i]); bar(10+i%4*160,96+i/4*25,150+i%4*160,97+i/4*25); }
setcolor(WHITE); setfillstyle(SOLID_FILL,LIGHTGRAY); bar3d(0,189,25,447,3,3); bar3d(32,189,634,447,3,3); bar3d(0,452,636,479,0,0); setfillstyle(SOLID_FILL,BLUE);
for (i=1;i<4;i++) { outtextxy(2,186+64*i,itoa(25*(4-i),s,10)); outtextxy(10,196+64*i,"%"); bar(20,189+64*i,24,191+64*i); } for (i=1;i<11;i++) { outtextxy(626-i*60,465,itoa(i*INTRATE*axis,s,10)); outtextxy(642-i*60,465," m"); bar(633-i*60,455,635-i*60,462); }
f_fun(ALT_4); cursor(0); return; }
/* ---- color options back screen : scr=10 key --- */ void color_backscr(void) { int i,y; char s[6][15]={"line 1 - T :","line 1 - P :","mousespeed :", "free screen:","<< OK >>","<< Cancel >>"}; char str[10]; scr_num=10; colume=0; head_bar();
bar3d(200,70,439,430,3,3); outtextxy(250,80, "SYSTEM OPTIONS"); outtextxy(250,95,"============"); settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
for(i=0,y=120;i<16;i++,y+=15) { outtextxy(260,y,s[i%2]); (*(s[i%2]+5))++; } outtextxy(260,y,s[2]); y+=15; outtextxy(260,y,s[3]); y+=15; outtextxy(260,y,s[4]); y+=15; outtextxy(260,y,s[5]);
str[0]=16; str[1]='\x0'; outtextxy(245,120,str);
for(i=0;i<16;i++) { color_t[i]=color[i]; setfillstyle(SOLID_FILL,color_t[i]); bar(360,123+i*15,400,125+i*15); } setfillstyle(SOLID_FILL,LIGHTGRAY); mousespeed_t=mousespeed; itoa(mousespeed_t,str,10); outtextxy(360,360,str); freescreen_t=freescreen; itoa(freescreen_t,str,10); outtextxy(360,375,str); return; } /* ========== do front screen =================== */ void frontscr(void) { register int i,j; int dec,sign; char *s=""; /* -------- screen protect ------ */ if (nokeytime >= freescreen) { setfillstyle(SOLID_FILL,BLACK); bar(0,0,639,479); settextstyle(random(10)+1,HORIZ_DIR,random(4)+1); setcolor(random(15)+1); outtextxy(random(480),random(480),"The programe is running."); setcolor(random(15)+1); outtextxy(random(480),random(480),"Press ARROW key to return!"); setfillstyle(SOLID_FILL,LIGHTGRAY); settextstyle(DEFAULT_FONT,HORIZ_DIR,1); } /* -------- draw zmt front ------ */ else if (scr_num==8) { setcolor(BLUE); for (j=0;j<6;j++) { for (i=0;i<8;i++) { bar(j*100+55,i*50+70,j*100+120,i*50+90); outtextxy(j*100+70,i*50+70,data[i][j].strval); } } } /* ---------- draw zht front -------- */ else if (scr_num<8) { setcolor(BLUE); for (i=0;i<6;i++) { bar(i*90+10,73,i*90+75,80); outtextxy(i*90+10,73,data[scr_num][i].strval); } bar(555,70,618,77); s=ctime(&ti); s+=11; (*(s+8))='\0'; outtextxy(555,70,s);
bar(33,190,633,446); j=drawpt+1; for(i=33;i<SCRMAX+33;i++,j++) { if (j>=SCRMAX) j-=SCRMAX; putpixel(i,190+draw_data[j][scr_num*2],BLUE); putpixel(i,191+draw_data[j][scr_num*2],BLUE); putpixel(i,190+draw_data[j][scr_num*2+1],RED); putpixel(i,191+draw_data[j][scr_num*2+1],RED); } } return; } /* =============== file funtion ==============*/ /* ------- input and process data -------- */ void data_pro(void) { register int i,j; struct datum *data_pt; int dec,sign; char sdec[10]=".0000",s[10];
/* get data */ #ifndef _DEBUG pcl812(5, param); if (param[45] != 0) { printf(" A/D SOFTWARE DATA TRANSFER FAILED !"); exit(1); } #endif
for (i = 0; i < 16; i++) { data_pt = &data[i/2][i%2]; #ifndef _DEBUG for (j = 0; j < 50; j++) { data_pt->val += pcldata[i+16*j]; data_pt->val >>= 1; } #else /* data are simulated severl sinusoids 1024 is middle value 20, and 20 is used to amplifier changing sinusoids */ data_pt->val = sin((TimeNum * PI / 6553.2) + PI * i / 16.0) * 0x400 + 0x3ff; TimeNum++; #endif if (data_pt->val > 0xFFF ) data_pt->val = 0xFFF; data_pt->val &= 0x7FF; data_pt->fval = (float)data_pt->val / 2048; data_pt->fval = data_pt->span_lo + ( data_pt->span_hi-data_pt->span_lo ) * data_pt->fval; strcpy(data_pt->strval,fcvt (data_pt->fval, 2, &dec, &sign)); strcpy(sdec+1,data_pt->strval+dec); strcpy(data_pt->strval+dec,sdec); }
/* ----- get time ----- */ time(&ti); /* ---- save for draw and ----- */ drawpt++; if (drawpt>=SCRMAX) drawpt=0; for (i=0;i<16;i++) draw_data[drawpt][i]=~(data[i/2][i%2].val>>3);
/* ------ save for file ------ */ fseek(fdata,fpt*16,SEEK_SET); fwrite(draw_data[drawpt],16,1,fdata); fpt++;fpt&=FILEMAX; rewind(fpoint); fprintf(fpoint,"%ld, %ld, %s",fpt,ti,ctime(&ti)); return; }
/* -------- file inti ------ */ void f_inti(void) { char c[16]; for (fpt_t=0;fpt_t<16;fpt_t++) c[fpt_t]=0xFF;
fpoint = fopen("point.dat","r"); fdata = fopen("data.dat","r");
if (fpoint != NULL && fdata != NULL) { fscanf(fpoint,"%ld, %ld",&fpt_t,&cur_ti); time(&ti); if (ti - cur_ti < FILEMAX) { fclose(fpoint); fclose(fdata); fpoint=fopen("point.dat","r+"); fdata=fopen("data.dat","rb+"); cur_ti+=INTRATE; fpt_t=++fpt_t&FILEMAX; while (ti - cur_ti > INTRATE) { for(; cur_ti<=ti; cur_ti+=INTRATE,fpt_t=++fpt_t&FILEMAX) { fseek(fdata,fpt_t*16,SEEK_SET); fwrite(c,16,1,fdata); } time(&ti); } fpt = ftell(fdata)/16; fpt_t = fpt; while(cur_ti-ti>1) time(&ti); } else { fpoint = NULL; fdata = NULL; } }
if (fpoint == NULL || fdata == NULL) { fclose(fpoint); fclose(fdata); fpoint=fopen("point.dat","wt"); fdata=fopen("data.dat","wb+"); for(fpt_t=0;fpt_t<=FILEMAX;fpt_t++) fwrite(c,16,1,fdata); rewind(fdata); } return; } /* ------- file write data ----- */ void f_write(int offset) { int dec,sign,i; unsigned char *ch; struct datum *da; float f; char str[10]="0.0",strdec[10]=".000"; time_t temp; ch=&c[599-offset][0]; setcolor(BLUE); setfillstyle(SOLID_FILL,LIGHTGRAY); settextstyle(DEFAULT_FONT,HORIZ_DIR,1); for (i=0,da=&data[i/2][i%2];i<16;i++,ch++,da++) { f = 1.0 - (float)*ch / 256; f = da->span_lo + (da->span_hi-da->span_lo) * f; strcpy(str,fcvt (f, 2, &dec, &sign)); strcpy(strdec+1,str+dec); strcpy(str+dec,strdec); bar(50+i%4*160,85+i/4*25,100+i%4*160,93+i/4*25); outtextxy(50+i%4*160,85+i/4*25,str); }
bar(17,43,220,51); temp=cur_ti-axis*offset*INTRATE; outtextxy(17,43,ctime(&temp));
setcolor(LIGHTGRAY); line(line_old,190,line_old,446); ch=&c[line_old-33][0]; for(i=0;i<16;i++,ch++) { putpixel(line_old,190+*ch,color[i]); putpixel(line_old,191+*ch,color[i]); } line_old=curx; setcolor(GREEN); line(curx,190,curx,446);
return; }
/* -------- file input data ------ */ int f_fun(int key) { register int i,j; int color_t; unsigned long int fi; unsigned char *ch;
fpt_t&=FILEMAX; fi=(fpt+SCRMAX*axis)&FILEMAX; if ( (fpt<fi && (fpt<fpt_t && fpt_t<fi)) || (fpt>fi && (fpt<fpt_t || fpt_t<fi)) ) { if (key<ALT_4) { fpt_t=fi; cur_ti=ti-(FILEMAX-SCRMAX*axis)*INTRATE; } else { fpt_t=fpt; cur_ti=ti; } putch('\7'); }
for(i=SCRMAX,fi=fpt_t;i>=0;i--,fi=(fi-axis)&FILEMAX) { fseek(fdata,fi*16,SEEK_SET); fread(c[i],16,1,fdata); } f_write(0);
bar(33,190,633,446); for(i=0;i<16;i++) if (color[i]!=LIGHTGRAY) { ch=&c[0][i]; j=0; color_t=color[i]; while(j<SCRMAX) { putpixel(34+j,190+*ch,color_t); putpixel(34+j,191+*ch,color_t); ch+=16; j++; } } return; }
void driver_init(void) { #ifndef _DEBUG int i; pcldat = pcldata; param[0] = 0; /* Board number */ param[1] = 0x300; /* Base I/O address */ param[5] = 10; /* Pacer rate = 2M / (10 * 10) = 20 KHz */ param[6] = 10; param[7] = 0; /* Trigger mode, 0 : pacer trigger */ param[10] = FP_OFF(pcldat); /* Offset of A/D data buffer A */ param[11] = FP_SEG(pcldat); /* Segment of A/D data buffer A */ param[12] = 0; /* Data buffer B address, if not used, */ param[13] = 0; /* must set to 0. */ param[14] = 800; /* A/D conversion number */ param[15] = 0; /* A/D conversion start channel */ param[16] = 15; /* A/D conversion stop channel */ param[17] = 1; /* Overall gain code, 0 : +/- 2.5V */
pcl812(3, param); if (param[45] != 0) { printf(" DRIVER INITIALIZATION FAILED !"); exit(1); }
pcl812(4, param); if (param[45] != 0) { printf(" A/D INITIALIZATION FAILED !"); exit(1); } #endif }
/* ------------------------------------*/ void span_init(void) { int i; struct datum *da; INTRATE = 2; for(i = 0; i < 16; i++) color[i] = i; freescreen = 60; mousespeed = 10;
data[0][0].span_lo=0; data[0][1].span_hi=0; data[1][0].span_lo=0; data[1][1].span_hi=0; data[2][0].span_lo=0; data[2][1].span_hi=0; data[3][0].span_lo=0; data[3][1].span_hi=0; data[4][0].span_lo=0; data[4][1].span_hi=0; data[5][0].span_lo=0; data[5][1].span_hi=0; data[6][0].span_lo=0; data[6][1].span_hi=0; data[7][0].span_lo=0; data[7][1].span_hi=0;
for(i = 0, da = &data[i/2][i%2]; i < 16; i++, da++) { da->span_lo = 0.0; da->span_hi = 250.0; } /* Now, channel 0 is T1 and channel 1 is P1; the same, channel 2 is T2 and channel 3 is P2; ... ...
the gain is -2.5v to 2.5V equ the intval is 0 to 4095, and -2.5 to 0 is omitted. If you want to change the gain, you must to modify param[17].Do your best, you will be right ! */ return; }
/* ============= registerbgi =================== */ void error_registerbgi(int errorcode) { if (errorcode < 0) { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); exit(1); } }
void installbgi(void) { int gdriver = VGA, gmode =VGAHI, i; error_registerbgi(registerbgifont(triplex_font)); error_registerbgi(registerbgifont(small_font)); /* error_registerbgi(registerbgifont(sansserif_font)); error_registerbgi(registerbgifont(gothic_font)); */ /* initialize graphics and local variables */ error_registerbgi(registerbgidriver(EGAVGA_driver)); initgraph(&gdriver, &gmode, ""); error_registerbgi(graphresult()); } /* ============== main funtion ================ */ void main(void) { int keynum; driver_init(); installbgi(); head_scr(); span_init(); f_inti(); eachline_backscr(); reset_mouse(); set_mouse_limits(4, 0, 623, 479);
intrate=INTRATE; oldtimer=getvect(0x1c); install(newtimer,0x1c);
while(run_program) { keybroad(); if (int_ok) { int_ok--; data_pro(); frontscr(); } }
install(oldtimer,0x1c); fclose(fdata); fclose(fpoint); closegraph(); return; } 
|