#include #include #include #include #include #include #include #include #include "max7219.h" int pipefd[2][2],term,pid; char buf[1024]; char disp[32][8]; double histcpu[16],histmem[8],histsw[8]; void _child() { close(pipefd[0][0]);close(pipefd[1][1]); dup2(pipefd[1][0],STDIN_FILENO); dup2(pipefd[0][1],STDOUT_FILENO); close(pipefd[0][1]);close(pipefd[1][0]); execlp("/usr/bin/ksysguardd","ksysguardd",NULL); } void terminate(int e) { term=1; } void display() { unsigned short batch[4]; int dd[32]={0},i,j; for(i=0;i<32;++i) for(j=0;j<8;++j) dd[j+(i&0x18)]|=disp[i][j]<<(i&7); for(i=0;i<8;++i) { for(j=0;j<4;++j) batch[j]=(i+1)<<8|dd[j*8+i]; max7219_batch(batch); } } void _main() { int i,j,r; term=0; signal(SIGINT,terminate); signal(SIGTERM,terminate); signal(SIGQUIT,terminate); close(pipefd[0][1]); close(pipefd[1][0]); max7219_init(); sleep(1); read(pipefd[0][0],buf,1024); while(!term) { write(pipefd[1][1],"cpu/system/TotalLoad\n",21); r=read(pipefd[0][0],buf,1024);buf[r]=0; if(r<=0)continue; sscanf(buf,"%lf",&histcpu[15]); { int memtot,memavail,swtot,swfree,tr=0; FILE* fm=fopen("/proc/meminfo","r"); while(fgets(buf,1024,fm)) { tr+=sscanf(buf,"MemTotal: %d",&memtot); tr+=sscanf(buf,"MemAvailable: %d",&memavail); tr+=sscanf(buf,"SwapTotal: %d",&swtot); tr+=sscanf(buf,"SwapFree: %d",&swfree); } if(tr-4)continue; histmem[7]=100*(1-1.*memavail/memtot); histsw[7]=100*(1-1.*swfree/swtot); } for(i=0;i<15;++i)histcpu[i]=histcpu[i+1]; for(i=0;i<7;++i)histmem[i]=histmem[i+1],histsw[i]=histsw[i+1]; printf("%f %f %f\n",histcpu[15],histmem[7],histsw[7]); memset(disp,0,sizeof(disp)); for(i=0;i<16;++i) for(j=0;j<8;++j) if(histcpu[i]>11*(j+1))disp[i][j]=1; for(i=0;i<8;++i) for(j=0;j<8;++j) { if(histmem[i]>11*(j+1))disp[16+i][j]=1; if(histsw[i]>11*(j+1))disp[24+i][j]=1; } disp[0][7]=disp[1][7]=disp[2][7]=1; disp[0][6]=1; disp[0][5]=disp[1][5]=disp[2][5]=1; disp[16][7]=disp[17][7]=disp[18][7]=1; disp[16][6]=disp[17][6]=disp[18][6]=1; disp[16][5]=disp[18][5]=1; disp[24][7]=disp[25][7]=1; disp[24][6]=disp[25][6]=disp[26][6]=1; disp[25][5]=disp[26][5]=1; display(); sleep(2); } max7219_deinit(1); write(pipefd[1][1],"quit\n",5); waitpid(pid,NULL,0); close(pipefd[0][0]); close(pipefd[1][1]); } int main() { if(pipe(pipefd[0]))return puts("pipe()"),1; if(pipe(pipefd[1]))return puts("pipe()"),1; switch(pid=fork()) { case -1:return puts("fork()"),1; case 0: _child(); break; default: _main(); break; } return 0; }