/*
* g15 CPU Monitor for 2.6.24 Kernel and Quad CPU.
* Compile with:
*  gcc -O2 -fomit-frame-pointer -lg15daemon_client -lg15render -o main main.c
*/

#include <stdio.h>
#include <libg15render.h>
#include <g15daemon_client.h>

const int cpu_count = 4;

int main(int argc, char **argv)
{
	int i,j,y; // I hate you C99

	FILE *fd;
	char tag[32];

	int t1,t2,t3,t4,t5;

	int UT[1+cpu_count], ST[1+cpu_count], NT[1+cpu_count], IT[1+cpu_count];
	int cUT[1+cpu_count], cST[1+cpu_count], cNT[1+cpu_count], cIT[1+cpu_count];
	int tot[1+cpu_count];
	int c[1+cpu_count];

	int screen = 0;
	struct g15canvas canvas;
	screen = new_g15_screen(G15_G15RBUF);

	g15r_clearScreen(&canvas, G15_COLOR_WHITE);

	canvas.mode_reverse = 1;

	int initialized = 0;

	int flip = 0;

	while(1){
		if ((fd = fopen("/proc/stat", "r")) == 0)
			return 0;
		for(j = 0; j < 1+cpu_count; j++){
			UT[j] = cUT[j];
			NT[j] = cNT[j];
			ST[j] = cST[j];
			IT[j] = cIT[j];
			fscanf(fd, "%32s %d %d %d %d %d %d %d %d %d",
				tag, &cUT[j], &cNT[j], &cST[j], &cIT[j],
				&t1,&t2,&t3,&t4,&t5);
			int noIdle = (cUT[j] - UT[j]) + (cST[j] - ST[j]) + (cNT[j] - NT[j]);
			tot[j] = noIdle + (cIT[j] - IT[j]);
			c[j] = tot[j] > 0 ? (100 * (noIdle)) / tot[j] : 0;
		}
		fclose(fd);
		if(initialized) {
			for(y = 0; y < 43; y++){
				int offSet = y*20;
				if(y < 43 - 6 && y > 23 - 6){
					for(j = 0; j < 20; j++){
						canvas.buffer[offSet+j] <<= 1;
						if(j%5 != 4)
							canvas.buffer[offSet+j] ^= (canvas.buffer[offSet+j+1] & 0x80) >> 7;
					}
					canvas.buffer[offSet+5]  &= 0x7F;
					canvas.buffer[offSet+10] &= 0x7F;
					canvas.buffer[offSet+15] &= 0x7F;
					canvas.buffer[offSet+4]  += y < (43 - 6 - 23 * c[1]/100.0) ? 0x00 : 0x01;
					canvas.buffer[offSet+9]  += y < (43 - 6 - 23 * c[2]/100.0) ? 0x00 : 0x01;
					canvas.buffer[offSet+14] += y < (43 - 6 - 23 * c[3]/100.0) ? 0x00 : 0x01;
					canvas.buffer[offSet+19] += y < (43 - 6 - 23 * c[4]/100.0) ? 0x00 : 0x01;
				}
			}

			for(i = 0; i < 20*16; i++)
				canvas.buffer[i] = 0x00;

			g15r_renderString (&canvas, "timelessname.com", 0, G15_TEXT_LARGE, 17, 4);

			for(i = 0; i < 20; i++)
				canvas.buffer[20*16 + i] = 0xFF;

			for(i = 0; i < 20*6; i++)
				canvas.buffer[860 - i] = 0;

			g15r_pixelReverseFill(&canvas,2,43-5,40-3,43,1,0);
			g15r_pixelReverseFill(&canvas,2+40,43-5,40-3+40,43,1,0);
			g15r_pixelReverseFill(&canvas,2+80,43-5,40-3+80,43,1,0);
			g15r_pixelReverseFill(&canvas,2+120,43-5,40-3+120,43,1,0);

			unsigned char buffer [50];
			sprintf (buffer, "CPU0 %3d%%", c[1]);
			g15r_renderString (&canvas, &buffer, 0, G15_TEXT_SMALL, 0+2, 43-5);
			sprintf (buffer, "CPU1 %3d%%", c[2]);
			g15r_renderString (&canvas, &buffer, 0, G15_TEXT_SMALL, 40+2,43-5);
			sprintf (buffer, "CPU2 %3d%%", c[3]);
			g15r_renderString (&canvas, &buffer, 0, G15_TEXT_SMALL, 80+2, 43-5);
			sprintf (buffer, "CPU3 %3d%%", c[4]);
			g15r_renderString (&canvas, &buffer, 0, G15_TEXT_SMALL, 120+2, 43-5);

			g15_send(screen, (char*)canvas.buffer, G15_BUFFER_LEN);
			usleep((250+33)*1000);
		}
		else {
			initialized = 1;
		}
	}
	g15_close_screen(screen);
	return 0;
}

