Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * sysinfos.c
- * generate sys infos for my lemonbar config
- *
- * easysid - Tuesday, 27 June 2017 15:07 IST
- *
- * show info only when it exceeds a threshold
- *
- * broadly copied from https://github.com/TrilbyWhite/dwmStatus
- * and other sources on the internet.
- */
- #include <stdio.h>
- #include <string.h>
- #include <time.h>
- #include <unistd.h>
- #include <arpa/inet.h>
- #include <sys/socket.h>
- /* input files */
- #define CPU_FILE "/proc/stat"
- #define RAM_FILE "/proc/meminfo"
- #define AC_ADP_FILE "/sys/class/power_supply/ADP1/online"
- #define BAT_CAP_FILE "/sys/class/power_supply/BAT0/capacity"
- #define CPU_TEMP_FILE "/sys/class/hwmon/hwmon1/temp2_input"
- #define _SERVER "8.8.8.8"
- #define _PORT 53
- #define _TIMEOUT 500000
- #define FORMAT "S"
- #define INTERVAL 3
- /* Control values for thresholds */
- #define LIM_CPU 45
- #define LIM_RAM 1600
- #define LIM_TMP 59
- #define LIM_BAT 90
- #define LIM_BAT_LOW 30
- #define CYCLES_COUNT 5
- /* format strings */
- #define STR_SEP " "
- /* icons from material design */
- /* CPU and RAM */
- #define STR_CPU "%%{F#FFFAFAFA A:dzen_popup_toggle.sh sysinfo:}\uf3e1%%{F-} %.0f%%%%{A}"
- #define STR_RAM_M "%%{F#FFFAFAFA A:dzen_popup_toggle.sh diskinfo:}\uf3e0%%{F-} %.0fM%%{A}"
- #define STR_RAM_G "%%{F#FFFAFAFA A:dzen_popup_toggle.sh diskinfo:}\uf3e0%%{F-} %.2fG%%{A}"
- /* internet connection */
- #define STR_NET "%%{F#FFFAFAFA A:dzen_popup_toggle.sh netinfo:}\uf2e8%%{F- A}"
- #define STR_NONET "%%{F#FF999999 A:dzen_popup_toggle.sh netinfo:}\uf2e6%%{F- A}"
- /* temperatures */
- #define STR_TEMP "%%{F#FFFAFAFA}\uf161%%{F-} %ld°"
- /* clock and calendar*/
- #define STR_CLK "C %%{F-}%s"
- #define STR_CAL "%%{F- A:dzen_popup_toggle.sh calendar:}\uf331 %s %%{A}"
- /* ac and battery status */
- #define STR_AC "%%{F#FFFAFAFA}\uf2a1%%{F-}"
- #define STR_CHG "%%{F#FFFAFAFA}\uf114%%{F-} %ld%%"
- #define STR_BATF "%%{F#FFFAFAFA}\uf116%%{F-}"
- #define STR_BATU "%%{F#FFFAFAFA}\uf116%%{F-} %ld%%"
- #define STR_BATH "%%{F#FFFAFAFA}\uf116%%{F-} %ld%%"
- #define STR_BATC "%%{F#FFab4c42}\uf113%% %ld%%%%{F-}"
- const int test_flag = 0;
- void print_long_info()
- {
- char format = 'S';
- // display flags
- int show_cpu, show_ram, show_temp;
- int cpu_count, ram_count, temp_count;
- int sock;
- long a, b, c, d, e, f, g, idle, total, oldidle, oldtotal, total_d, idle_d;
- float used;
- char str[30], tmp[100], status[512];
- FILE *infile;
- time_t now;
- struct tm *lt;
- struct timeval timeout;
- struct sockaddr_in addr = {AF_INET, htons(_PORT), {inet_addr(_SERVER)}, {0}};
- timeout.tv_sec = 0;
- timeout.tv_usec = _TIMEOUT;
- // seed cpu usage values. Saves time in main loop
- infile = fopen(CPU_FILE, "r");
- fscanf(infile, "cpu %ld %ld %ld %ld %ld %ld %ld", &a, &b, &c, &d, &e, &f, &g);
- fclose(infile);
- oldtotal = a+b+c+d+e+f+g;
- oldidle = d+e;
- // initialize the flags
- show_cpu = show_ram = show_temp = 0;
- cpu_count = ram_count = temp_count = CYCLES_COUNT;
- // infinite loop
- for (;;) {
- tmp[0] = status[0] = '\0';
- // CPU
- infile = fopen(CPU_FILE, "r");
- fscanf(infile, "cpu %ld %ld %ld %ld %ld %ld %ld", &a, &b, &c, &d, &e, &f, &g);
- fclose(infile);
- total = a+b+c+d+e+f+g;
- idle = d+e;
- total_d = total - oldtotal;
- idle_d = idle - oldidle;
- oldtotal = total;
- oldidle = idle;
- used = 0.0;
- if (total_d > 0)
- used = 100*(total_d - idle_d)/total_d;
- if (used > LIM_CPU)
- show_cpu = cpu_count = 1;
- else
- show_cpu = 0;
- if (show_cpu == 1 || cpu_count < CYCLES_COUNT || test_flag) {
- sprintf(tmp, STR_CPU, used);
- strcat(status, tmp);
- strcat(status, STR_SEP);
- }
- // RAM
- infile = fopen(RAM_FILE, "r");
- fscanf(infile, "MemTotal: %ld kB\nMemFree: %ld kB\nMemAvailable: %ld kB\
- \nBuffers: %ld kB\nCached: %ld kB", &total, &f, &a, &b, &c);
- fclose(infile);
- used = (total - f - b - c)/1024;
- if (used > LIM_RAM)
- show_ram = ram_count = 1;
- else
- show_ram = 0;
- if (show_ram == 1 || ram_count < CYCLES_COUNT || test_flag) {
- if (used >= 1000)
- sprintf(tmp, STR_RAM_G, used/1024);
- else
- sprintf(tmp, STR_RAM_M, used);
- strcat(status, tmp);
- strcat(status, STR_SEP);
- }
- // Temperatures
- infile = fopen(CPU_TEMP_FILE, "r");
- fscanf(infile, "%ld\n", &a);
- fclose(infile);
- /* infile = fopen(GPU_TEMP_FILE, "r"); */
- /* fscanf(infile, "%ld\n", &b); */
- /* fclose(infile); */
- a = a/1000;
- if (a > LIM_TMP)
- show_temp = temp_count = 1;
- else
- show_temp = 0;
- if (show_temp == 1 || temp_count < CYCLES_COUNT || test_flag) {
- sprintf(tmp, STR_TEMP, a);
- strcat(status, tmp);
- strcat(status, STR_SEP);
- }
- // Network
- sock = socket(AF_INET, SOCK_STREAM, 0);
- setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
- setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
- if (connect(sock, (struct sockaddr *) &addr, sizeof(addr)) != 0)
- sprintf(tmp, STR_NONET);
- else
- sprintf(tmp, STR_NET);
- strcat(status, tmp);
- strcat(status, STR_SEP);
- close(sock);
- // Battery
- infile = fopen(AC_ADP_FILE, "r");
- fscanf(infile, "%ld\n", &a);
- fclose(infile);
- infile = fopen(BAT_CAP_FILE, "r");
- fscanf(infile, "%ld\n", &c);
- fclose(infile);
- if (a == 1) {
- if (c < LIM_BAT)
- sprintf(tmp, STR_CHG, c);
- else
- sprintf(tmp, STR_AC);
- strcat(status, tmp);
- strcat(status, STR_SEP);
- }
- else {
- if (c < LIM_BAT_LOW)
- sprintf(tmp, STR_BATC, c);
- else if (c < 50)
- sprintf(tmp, STR_BATH, c);
- else if (c < 80)
- sprintf(tmp, STR_BATU, c);
- else
- sprintf(tmp, STR_BATF);
- strcat(status, tmp);
- strcat(status, STR_SEP);
- }
- // calendar
- time(&now);
- lt = localtime(&now);
- strftime(str, sizeof(str), "%a, %d %b", lt);
- sprintf(tmp, STR_CAL, str);
- strcat(status, tmp);
- // Clock
- strftime(str, sizeof(str), "%l:%M %p", lt);
- sprintf(tmp, STR_CLK, str);
- printf("%c %s\n", format, status);
- printf("%s\n", tmp);
- fflush(stdout);
- cpu_count++;
- ram_count++;
- temp_count++;
- sleep(INTERVAL);
- }
- }
- int main()
- {
- print_long_info();
- return 0;
- }
Add Comment
Please, Sign In to add comment