aboutsummaryrefslogtreecommitdiff
path: root/rpi/max7219/lajimon_w.c
blob: 31c7c461ca6bfaf6243658ba159e1dec12b8f056 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>
#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;
}