Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Blink load average indicator for DLink dir-320
- * moddified by billic.
- * original taked from http://svn.dd-wrt.com:8000/browser/src/router/libutils/gpio.c
- * License: GPL
- */
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #define LA_EXTREME 200
- #define LA_VHIGH 135
- #define LA_HIGH 95
- #define LA_MIDDLE 75
- #define LA_NORMAL 35
- #define RED_LED 3
- #define BLU_LED 4
- #define BUTTON 6
- #define BLINK_ON 20000L
- #define BLINK_OFF 80000L
- /*
- blinks:
- 1) one short BLINK_ON + BLINK_OFF + 0.9
- 2) two short (BLINK_ON + BLINK_OFF)*2 + 0.8
- 3) four short (BLINK_ON + BLINK_OFF)*4 + 0.6
- 4) eight short (BLINK_ON + BLINK_OFF)*8 + 0.2
- -1) two long w short break (0.4 + 0.1)*2
- blink_interval ~1sec
- */
- void set_gpio (int pin, int value)
- {
- int gpioouten = open("/dev/gpio/outen", O_RDWR);
- int gpioout = open("/dev/gpio/out", O_RDWR);
- unsigned int gpio;
- read(gpioouten, &gpio, sizeof(gpio));
- gpio |= 1 << pin;
- write(gpioouten, &gpio, sizeof(gpio));
- read(gpioout, &gpio, sizeof(gpio));
- if (value) {
- gpio |= (1 << pin);
- } else {
- gpio &= ~(1 << pin);
- }
- write(gpioout, &gpio, sizeof(gpio));
- close(gpioout);
- close(gpioouten);
- }
- int get_gpio(int pin)
- {
- unsigned int gpio;
- int gpioouten = open("/dev/gpio/outen", O_RDWR);
- int gpioin = open("/dev/gpio/in", O_RDWR);
- read(gpioouten, &gpio, sizeof(gpio));
- gpio &= ~(1 << pin);
- write(gpioouten, &gpio, sizeof(gpio));
- read(gpioin, &gpio, sizeof(gpio));
- gpio = (gpio & (1 << pin)) ? 1 : 0;
- close(gpioin);
- close(gpioouten);
- return gpio;
- }
- int get_load_avg()
- {
- int proc_la = open ("/proc/loadavg", O_RDONLY);
- char la[4];
- read (proc_la, &la, 4);
- la[1]=la[2];la[2]=la[3];la[3]=0;
- close (proc_la);
- return atoi(la);
- }
- inline void one_blink(int led)
- {
- set_gpio(led, 0);
- usleep (BLINK_ON);
- set_gpio(led, 1);
- usleep (BLINK_OFF);
- }
- int blink(int led, int mode)
- {
- switch (mode)
- {
- case 1:
- one_blink(led);
- usleep (900000);
- break;
- case 2:
- one_blink(led);
- one_blink(led);
- usleep (800000);
- break;
- case 3:
- one_blink(led);
- one_blink(led);
- one_blink(led);
- one_blink(led);
- usleep (600000);
- break;
- case 4:
- one_blink(led);
- one_blink(led);
- one_blink(led);
- one_blink(led);
- one_blink(led);
- one_blink(led);
- one_blink(led);
- one_blink(led);
- usleep (200000);
- break;
- case -1:
- set_gpio(led, 0);
- usleep (400000);
- set_gpio(led, 1);
- usleep (100000);
- set_gpio(led, 0);
- usleep (400000);
- set_gpio(led, 1);
- usleep (100000);
- break;
- default:
- break;
- }
- return 0;
- }
- int show_la(int la)
- {
- if (la >= LA_EXTREME)
- blink(RED_LED, -1);
- else if (la >= LA_VHIGH)
- blink(RED_LED, 3);
- else if (la >= LA_HIGH)
- blink(BLU_LED, 4);
- else if (la >= LA_MIDDLE)
- blink(BLU_LED, 3);
- else if (la >= LA_NORMAL)
- blink(BLU_LED, 2);
- else
- blink (BLU_LED, 1);
- return 0;
- }
- int show_switch ()
- {
- one_blink (BLU_LED);
- one_blink (BLU_LED);
- one_blink (RED_LED);
- one_blink (RED_LED);
- return 0;
- }
- int show_start ()
- {
- set_gpio(BLU_LED, 0);
- usleep(250000);
- set_gpio(RED_LED, 0);
- usleep(250000);
- set_gpio(BLU_LED, 1);
- usleep(250000);
- set_gpio(RED_LED, 1);
- usleep(250000);
- return 0;
- }
- int main(int argc, char **argv)
- {
- unsigned int gpio;
- unsigned int old_gpio = -1;
- unsigned int pin;
- int i=1;
- show_start ();
- while (true)
- {
- if (!get_gpio(BUTTON))
- {
- i ? i = 0 : i = 1;
- show_switch();
- }
- if (i)
- show_la(get_load_avg());
- else
- usleep (1000000);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement