status-wifi/wifi.c
author Stiletto <blasux@blasux.ru>
Wed, 10 Dec 2014 20:31:21 +0400
changeset 13 d7ce3b1dddc4
parent 5 e3ee9aa21b1f
child 18 85165bbd4ebb
permissions -rw-r--r--
Proper colors
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     1
#include <stdio.h>
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     2
#include <stdlib.h>
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     3
#include <math.h>
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     4
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     5
#include <sys/types.h>
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     6
#include <sys/stat.h>
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     7
#include <fcntl.h>
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     8
#include <assert.h>
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     9
#include <limits.h>
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    10
#include <unistd.h>
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    11
#include <iwlib.h>
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    12
5
e3ee9aa21b1f Usage example for status-wifi
Stiletto <blasux@blasux.ru>
parents: 4
diff changeset
    13
#include "config.h"
e3ee9aa21b1f Usage example for status-wifi
Stiletto <blasux@blasux.ru>
parents: 4
diff changeset
    14
4
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    15
char *eights[] = { "ø", "▁", "▂", "▃", "▄", "▅", "▆","▇", "█" };
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    16
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    17
char *color_stop;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    18
char *color_red;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    19
char *color_orange;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    20
char *color_green;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    21
char *color_none;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    22
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    23
char *color(int low,int mid,int rev,int value) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    24
    if (value>mid) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    25
        return rev ? color_red : color_green;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    26
    } else if (value>low) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    27
        return color_orange;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    28
    }
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    29
    return rev ? color_green : color_red;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    30
}
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    31
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    32
int main(int argc, char *argv[]) {
5
e3ee9aa21b1f Usage example for status-wifi
Stiletto <blasux@blasux.ru>
parents: 4
diff changeset
    33
    if (argc<=1) {
e3ee9aa21b1f Usage example for status-wifi
Stiletto <blasux@blasux.ru>
parents: 4
diff changeset
    34
        fprintf(stderr, "Usage: %s <wlan0> [term|pango]\n", argv[0]);
e3ee9aa21b1f Usage example for status-wifi
Stiletto <blasux@blasux.ru>
parents: 4
diff changeset
    35
        fflush(stderr);
e3ee9aa21b1f Usage example for status-wifi
Stiletto <blasux@blasux.ru>
parents: 4
diff changeset
    36
        return 1;
e3ee9aa21b1f Usage example for status-wifi
Stiletto <blasux@blasux.ru>
parents: 4
diff changeset
    37
    }
4
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    38
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    39
    int skfd;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    40
    if((skfd = iw_sockets_open()) < 0) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    41
        perror("socket");
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    42
        exit(-1);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    43
    }
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    44
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    45
    while (1) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    46
        if (argc>2 && !strcmp(argv[2],"term")) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    47
            color_stop = "\x1b[0m";
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    48
            color_red = "\x1b[1;31m";
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    49
            color_green = "\x1b[1;32m";
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    50
            color_orange = "\x1b[1;33m";
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    51
            color_none = color_stop;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    52
        } else if (argc>2 && !strcmp(argv[2],"pango")) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    53
            color_stop = "</span>";
13
d7ce3b1dddc4 Proper colors
Stiletto <blasux@blasux.ru>
parents: 5
diff changeset
    54
            color_red = "<span color='#f33'>";
d7ce3b1dddc4 Proper colors
Stiletto <blasux@blasux.ru>
parents: 5
diff changeset
    55
            color_green = "<span color='#0f0'>";
d7ce3b1dddc4 Proper colors
Stiletto <blasux@blasux.ru>
parents: 5
diff changeset
    56
            color_orange = "<span color='#f30'>";
4
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    57
            color_none = "<span>";
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    58
        } else {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    59
            color_stop = color_red = color_green = color_orange = color_none = "";
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    60
        }
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    61
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    62
        iwstats stats;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    63
        iwrange range;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    64
        int down = 0;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    65
        wireless_config info;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    66
    
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    67
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    68
        if (iw_get_basic_config(skfd,argv[1],&info) < 0) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    69
            perror("iw_get_basic_config");
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    70
            exit(-2);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    71
        }
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    72
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    73
        if (iw_get_range_info(skfd,argv[1],&range) < 0) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    74
            perror("iw_get_range_info");
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    75
            exit(-2);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    76
        }
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    77
        if (iw_get_stats(skfd,argv[1],&stats,&range,1) < 0) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    78
            if (argc>2)
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    79
                down = 1;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    80
            else {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    81
                perror("iw_get_stats");
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    82
                exit(-2);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    83
            }
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    84
        }
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    85
        if (down) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    86
            if (!strcmp(info.essid,"")) {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    87
                printf("%sDOWN%s\n",color_orange,color_stop);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    88
            } else {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    89
                printf("%s [%sXX/XX%s] XX\n",info.essid,color_red,color_stop);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    90
            }
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    91
        } else {
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    92
            int ql = 100 * stats.qual.qual / range.max_qual.qual;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    93
            char *qual_color = color(20,40,0,ql);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    94
            if (stats.qual.qual<range.avg_qual.qual) qual_color = color_red;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    95
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    96
            signed char dbm;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    97
            dbm = (signed char)stats.qual.level;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    98
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    99
            int perc;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   100
            if (dbm>-35)
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   101
                perc=100;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   102
            else if(dbm<=-95)
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   103
                perc = 1;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   104
            else
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   105
            perc = (dbm+95)*100/60;
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   106
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   107
            printf("%s [%s%02d/%02d%s] ",info.essid,qual_color,stats.qual.qual,range.max_qual.qual,color_stop);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   108
            printf("%s%hhd%s ",color(-83,-77,0,dbm),dbm,color_stop);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   109
            printf("%s%d%%%s\n",color(20,40,0,perc),perc,color_stop);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   110
        }
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   111
        fflush(stdout);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   112
        sleep(UPDATE_PERIOD);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   113
    }
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   114
    close(skfd);
70b4e0b27e2c status-wifi
Stiletto <blasux@blasux.ru>
parents:
diff changeset
   115
}