sysview.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:9k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * Systems statistics viewing application
  3.  *  (C) Javier Velasco '97 (almost '98)
  4.  * fjvelasco@sinix.net
  5.  *
  6.  *  This application was developed on an INDIGO2 Extreme and makes use of
  7.  *  a SGI system call (sginap) that sleeps the process for a given number of
  8.  *  clock ticks. For other UNIX systems, this call should be substituted for 
  9.  *  another proper call.
  10.  *  The default number of ticks between samples is 20. This can be changed
  11.  *  through the mouse right button menu.
  12.  *
  13.  */
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include <sys/types.h>
  18. #include <sys/sysmp.h>
  19. #include <sys/sysinfo.h>
  20. #include <sys/time.h>
  21. #include <unistd.h>
  22. /* GL includes */
  23. #include <GL/gl.h>
  24. #include <GL/glu.h>
  25. #include <GL/glut.h>
  26. #include <X11/Xlib.h>
  27. #include <X11/Xutil.h>
  28. /*
  29.  * Macros
  30.  */
  31. #define GRID 0x22
  32. #define ZGRID 0x23
  33. #define XGRID 0x24
  34. #define YGRID 0x25
  35. float lastx=0; /* mouse track */
  36. float lasty=0;
  37. void *font1 = GLUT_BITMAP_9_BY_15; /* used fonts */
  38. void *font2 = GLUT_BITMAP_8_BY_13;
  39. long nPeriod=20;     /* default sampling rate in ticks */
  40. GLsizei nWidth, nHeight;    /* current window size */
  41. GLboolean bMotion=False;
  42. struct sysinfo SysInfo, LastSysInfo; /* system information */
  43. /*
  44.  * Mouse motion track
  45.  */
  46. void MouseMove(int x, int y)
  47. {
  48.     if(bMotion)
  49. {
  50. lastx = x;
  51. lasty = y;
  52. glutPostRedisplay();    
  53. }
  54. }
  55. /*
  56.  * 3D Perspective projection setup
  57.  */
  58. void Make3DLook(void)
  59. {
  60.     glMatrixMode(GL_PROJECTION);
  61.     glLoadIdentity();
  62.     gluPerspective(45.0, 4.0/3.0, 0.0, 500.0);
  63.     glMatrixMode(GL_MODELVIEW);
  64.     glLoadIdentity();    
  65. }
  66. /*
  67.  * 2D Orthographic projections setup
  68.  */
  69. void Make2DLook(void)
  70. {
  71.   glMatrixMode(GL_PROJECTION);
  72.   glLoadIdentity();
  73.   gluOrtho2D(0, nWidth, nHeight, 0);
  74.   glMatrixMode(GL_MODELVIEW);
  75. }
  76. /*
  77.  * Toggle line antialias 
  78.  */
  79. void ToggleAAlias(void)
  80. {
  81.     if(glIsEnabled(GL_LINE_SMOOTH))
  82. {
  83. glDisable(GL_LINE_SMOOTH);     
  84. glDisable(GL_BLEND);     
  85. }
  86.     else
  87. {
  88. glEnable(GL_LINE_SMOOTH);
  89. glEnable(GL_BLEND);
  90. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  91.      glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
  92. }
  93. }
  94. /*
  95.  * Draw a string
  96.  */
  97. void glPuts(GLint x, GLint y, char *string, void *font)
  98. {
  99.   int len, i;
  100.   glRasterPos2i(x, y);
  101.   len = (int) strlen(string);
  102.   for (i = 0; i < len; i++) {
  103.     glutBitmapCharacter(font, string[i]);
  104.   }
  105. }
  106. /*
  107.  * Draw the 3d grid
  108.  */
  109. void DrawGrid(void)
  110. {
  111.     glCallList(GRID);
  112. }
  113. /*
  114.  * Display the legend
  115.  */
  116. void Legend(void)
  117. {
  118.     glPuts(5, 40, "User", font2);    
  119.     glPushMatrix();
  120.     glPushAttrib(GL_CURRENT_BIT);
  121.     glTranslatef(10.0, 50.0, 0.0);
  122.     glColor3f(0.0, 0.0, 1.0);
  123.     glRecti(0, 0, 20, 20);
  124.     glPopAttrib();
  125.     glPopMatrix();
  126.     
  127.     glPuts(5, 90, "Kernel", font2);    
  128.     glPushMatrix();
  129.     glPushAttrib(GL_CURRENT_BIT);
  130.     glTranslatef(10.0, 100.0, 0.0);
  131.     glColor3f(1.0, 0.0, 0.0);
  132.     glRecti(0, 0, 20, 20);
  133.     glPopAttrib();
  134.     glPopMatrix();
  135.     glPuts(5, 140, "Intr", font2);    
  136.     glPushMatrix();
  137.     glPushAttrib(GL_CURRENT_BIT);
  138.     glTranslatef(10.0, 150.0, 0.0);
  139.     glColor3f(1.0, 1.0, 0.0);
  140.     glRecti(0, 0, 20, 20);
  141.     glPopAttrib();
  142.     glPopMatrix();
  143.     glPuts(5, 190, "Idle", font2);    
  144.     glPushMatrix();
  145.     glPushAttrib(GL_CURRENT_BIT);
  146.     glTranslatef(10.0, 200.0, 0.0);
  147.     glColor3f(0.0, 1.0, 0.0);
  148.     glRecti(0, 0, 20, 20);
  149.     glPopAttrib();
  150.     glPopMatrix();
  151.     
  152.     glPuts(5, 240, "Wait", font2);    
  153.     glPushMatrix();
  154.     glPushAttrib(GL_CURRENT_BIT);
  155.     glTranslatef(10.0, 250.0, 0.0);
  156.     glColor3f(0.0, 1.0, 1.0);
  157.     glRecti(0, 0, 20, 20);
  158.     glPopAttrib();
  159.     glPopMatrix();
  160.     
  161.     glPuts(nWidth-30, nHeight-30, "0", font1); 
  162.     glPuts(nWidth-45, 45, "100", font1); 
  163. }
  164. /*
  165.  * Construct the grid display list
  166.  */
  167. void MakeGrid(void)
  168. {
  169.     int i;
  170.     
  171.     /* let's divide the grid in three pieces */
  172.     glNewList(ZGRID, GL_COMPILE_AND_EXECUTE);
  173.     glBegin(GL_LINES);
  174.     for(i=0;i<=30;i+=3)
  175. {
  176. glVertex2d(i, 0);
  177. glVertex2d(i, 30);
  178. glVertex2d(0, i);
  179. glVertex2d(30, i);
  180. }
  181.     glEnd();
  182.     glEndList();
  183.     
  184.         
  185.     glNewList(XGRID, GL_COMPILE_AND_EXECUTE);
  186.     glPushMatrix();
  187.     glRotatef(90.0, 1.0, 0.0, 0.0);    
  188.     glBegin(GL_LINES);
  189.     for(i=0;i<=6;i+=3)
  190. {
  191. glVertex2d(0, i);
  192. glVertex2d(30, i);
  193. }
  194.     for(i=0;i<=30;i+=3)
  195. {
  196. glVertex2d(i, 0);
  197. glVertex2d(i, 6);
  198.     glEnd();
  199.     glPopMatrix();
  200.     glEndList();
  201.     glNewList(YGRID, GL_COMPILE_AND_EXECUTE);
  202.     glPushMatrix();
  203.     glRotatef(-90.0, 0.0, 1.0, 0.0);    
  204.     glBegin(GL_LINES);
  205.     for(i=0;i<=30;i+=3)
  206. {
  207. glVertex2d(0, i);
  208. glVertex2d(6, i);
  209. }
  210.     for(i=0;i<=6;i+=3)
  211. {
  212. glVertex2d(i, 0);
  213. glVertex2d(i, 30);
  214.     glEnd();
  215.     glPopMatrix();
  216.     glEndList();
  217.     /* now call them all */
  218.     glNewList(GRID, GL_COMPILE_AND_EXECUTE);
  219. glLineWidth(2.0);
  220. glColor3f(0.7, 0.7, 0.7);
  221. glCallList(ZGRID);
  222. glCallList(XGRID);
  223. glCallList(YGRID);
  224. glLineWidth(1.0);
  225.     glEndList();
  226. }
  227. /*
  228.  * System statistics collection routine
  229.  */
  230. void ComputeStatistics(void)
  231. {
  232.     memcpy(&LastSysInfo, &SysInfo, sizeof(SysInfo));
  233.     sysmp(MP_SAGET, MPSA_SINFO, &SysInfo, sizeof(SysInfo));
  234.     sginap(nPeriod);
  235.     glutPostRedisplay();
  236. }
  237. /*
  238.  * Draw a coloured cube for each one of the monitored parameters
  239.  */
  240. void Draw3DStatistics(void)
  241. {
  242.     GLdouble fSize;
  243.     glPushMatrix();
  244.     glTranslatef(0.0, 0.0, 1.5);
  245.     /* Time in user mode */
  246.     glPushMatrix();
  247.     fSize = SysInfo.cpu[CPU_USER] - LastSysInfo.cpu[CPU_USER] ;
  248.     fSize = fSize*30/nPeriod;
  249.     glTranslatef(3.0, fSize/2, 0.0);
  250.     glScalef(6.0, fSize, 3.0);
  251.     glColor3f(0.0, 0.0, 1.0);
  252.     glutSolidCube(1.0);
  253.     glColor3f(0.0, 0.0, 0.0);
  254.     glutWireCube(1.0);
  255.     glPopMatrix();
  256.     
  257.     /* Time in kernel mode */
  258.     glPushMatrix();
  259.     fSize = SysInfo.cpu[CPU_KERNEL] - LastSysInfo.cpu[CPU_KERNEL] ;
  260.     fSize = fSize*30/nPeriod;
  261.     glTranslatef(9.0, fSize/2, 0.0);
  262.     glScalef(6.0, fSize, 3.0);
  263.     glColor3f(1.0, 0.0, 0.0);
  264.     glutSolidCube(1.0);
  265.     glColor3f(0.0, 0.0, 0.0);
  266.     glutWireCube(1.0);
  267.     glPopMatrix();
  268.    /* Time in interrupt mode */
  269.     glPushMatrix();
  270.     fSize = SysInfo.cpu[CPU_INTR] - LastSysInfo.cpu[CPU_INTR] ;
  271.     fSize = fSize*30/nPeriod;
  272.     glTranslatef(15.0, fSize/2, 0.0);
  273.     glScalef(6.0, fSize, 3.0);
  274.     glColor3f(1.0, 1.0, 0.0);
  275.     glutSolidCube(1.0);
  276.     glColor3f(0.0, 0.0, 0.0);
  277.     glutWireCube(1.0);
  278.     glPopMatrix();
  279.   
  280.    /* Time in idle */
  281.     glPushMatrix();
  282.     fSize = SysInfo.cpu[CPU_IDLE] - LastSysInfo.cpu[CPU_IDLE] ;
  283.     fSize = fSize*30/nPeriod;
  284.     glTranslatef(21.0, fSize/2, 0.0);
  285.     glScalef(6.0, fSize, 3.0);
  286.     glColor3f(0.0, 1.0, 0.0);
  287.     glutSolidCube(1.0);
  288.     glColor3f(0.0, 0.0, 0.0);
  289.     glutWireCube(1.0);
  290.     glPopMatrix();
  291.   
  292.    /* Time in wait mode */
  293.     glPushMatrix();
  294.     fSize = SysInfo.cpu[CPU_WAIT] - LastSysInfo.cpu[CPU_WAIT] ;
  295.     fSize = fSize*30/nPeriod;
  296.     glTranslatef(27.0, fSize/2, 0.0);
  297.     glScalef(6.0, fSize, 3.0);
  298.     glColor3f(0.0, 1.0, 1.0);
  299.     glutSolidCube(1.0);
  300.     glColor3f(0.0, 0.0, 0.0);
  301.     glutWireCube(1.0);
  302.     glPopMatrix();
  303.         
  304.     glPopMatrix();
  305. }
  306. /*
  307.  * Resize routine
  308.  */
  309. void Resize3DWindow(int newWidth, int newHeight)
  310. {
  311.     glViewport(0, 0, (GLint)newWidth, (GLint)newHeight);
  312.     nWidth = newWidth;
  313.     nHeight = newHeight;
  314.     Make3DLook();
  315.     glClear(GL_COLOR_BUFFER_BIT);
  316. }
  317. /*
  318.  * Display routine
  319.  */
  320. void Doit3D(void)
  321. {
  322.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  323.     Make2DLook();
  324.     glColor3f(1.0, 1.0, 0.0);
  325.     glPuts(15, 15, "CPU Activity", font1);
  326.     Legend();
  327.     Make3DLook();
  328.     glPushMatrix();
  329.     glTranslatef(-15.0, -15.0, -50.0);
  330.     glRotatef (lastx, 0.0, 1.0, 0.0);
  331.     glRotatef (lasty, 1.0, 0.0, 0.0);
  332.     DrawGrid();
  333.     Draw3DStatistics();
  334.     glFlush();
  335.     glPopMatrix();
  336.     glutSwapBuffers();
  337. }
  338. /*
  339.  * Menus routines
  340.  */
  341. void SelectSampleRate(int pick)
  342. {
  343.     nPeriod = pick;
  344. }
  345. void MainMenu(int pick)
  346. {
  347.     switch(pick)  
  348. {
  349. case 0:
  350.     bMotion = !bMotion;
  351.     break;
  352. case 1:
  353.     ToggleAAlias();
  354.     break;     
  355. case 2:
  356.     exit(0);
  357.     break;     
  358. }
  359. }
  360. /*
  361.  * Menu creation
  362.  */
  363. void SetUpMenu(void)
  364. {
  365.     int SampleMenu;
  366.     
  367.     SampleMenu = glutCreateMenu(SelectSampleRate);
  368.     glutAddMenuEntry("1", 1);
  369.     glutAddMenuEntry("5", 5);
  370.     glutAddMenuEntry("10", 10);
  371.     glutAddMenuEntry("20", 20);
  372.     glutCreateMenu(MainMenu);
  373.     glutAddMenuEntry("Mouse Motion", 0);
  374.     glutAddMenuEntry("Line antialias", 1);
  375.     glutAddSubMenu("Sample rate", SampleMenu);
  376.     glutAddMenuEntry("Quit", 2);
  377.     glutAttachMenu(GLUT_RIGHT_BUTTON);
  378. }
  379. /*
  380.  * MAIN STUFF
  381.  */
  382. int main(int argc,  char **argv)
  383. {
  384.     GLenum type;
  385.     
  386.     type = GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH;
  387.     glutInit(&argc, argv);
  388.     glutInitDisplayMode(type);
  389.     glutCreateWindow(argv[0]);    
  390.     SetUpMenu();
  391.     
  392.     MakeGrid();
  393.     glutReshapeFunc(Resize3DWindow);
  394.     glutDisplayFunc(Doit3D);
  395.     glutMotionFunc(MouseMove);
  396.     glutIdleFunc(ComputeStatistics);
  397.     glutMainLoop();
  398.     return(0);
  399. }