Advertisement
Guest User

ddwrt c++ gpio led load average monitor

a guest
Feb 5th, 2012
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.91 KB | None | 0 0
  1. /*
  2.  *  Blink load average indicator for DLink dir-320
  3.  *  moddified by billic.
  4.  *  original taked from http://svn.dd-wrt.com:8000/browser/src/router/libutils/gpio.c
  5.  *  License: GPL
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <unistd.h>
  11. #include <stdlib.h>
  12. #include <fcntl.h>
  13. #include <sys/types.h>
  14.  
  15.  
  16. #define LA_EXTREME 200
  17. #define LA_VHIGH 135
  18. #define LA_HIGH 95
  19. #define LA_MIDDLE 75
  20. #define LA_NORMAL 35
  21.  
  22. #define RED_LED 3
  23. #define BLU_LED 4
  24. #define BUTTON 6
  25.  
  26. #define BLINK_ON 20000L
  27. #define BLINK_OFF 80000L
  28.  
  29. /*
  30.     blinks:
  31.     1) one short            BLINK_ON + BLINK_OFF + 0.9
  32.     2) two short            (BLINK_ON + BLINK_OFF)*2 + 0.8
  33.     3) four short           (BLINK_ON + BLINK_OFF)*4 + 0.6
  34.     4) eight short          (BLINK_ON + BLINK_OFF)*8 + 0.2
  35.     -1) two long w short break  (0.4 + 0.1)*2
  36.  
  37.     blink_interval ~1sec
  38.  
  39. */
  40.  
  41.  
  42. void set_gpio (int pin, int value)
  43. {
  44.        
  45.         int gpioouten = open("/dev/gpio/outen", O_RDWR);
  46.         int gpioout = open("/dev/gpio/out", O_RDWR);
  47.         unsigned int gpio;
  48.         read(gpioouten, &gpio, sizeof(gpio));
  49.         gpio |= 1 << pin;
  50.         write(gpioouten, &gpio, sizeof(gpio));
  51.         read(gpioout, &gpio, sizeof(gpio));
  52.         if (value) {
  53.                 gpio |= (1 << pin);
  54.         } else {
  55.                 gpio &= ~(1 << pin);
  56.         }
  57.         write(gpioout, &gpio, sizeof(gpio));
  58.         close(gpioout);
  59.         close(gpioouten);
  60. }
  61.  
  62. int get_gpio(int pin)
  63. {
  64.         unsigned int gpio;
  65.         int gpioouten = open("/dev/gpio/outen", O_RDWR);
  66.         int gpioin = open("/dev/gpio/in", O_RDWR);
  67.         read(gpioouten, &gpio, sizeof(gpio));
  68.         gpio &= ~(1 << pin);
  69.         write(gpioouten, &gpio, sizeof(gpio));
  70.         read(gpioin, &gpio, sizeof(gpio));
  71.         gpio = (gpio & (1 << pin)) ? 1 : 0;
  72.         close(gpioin);
  73.         close(gpioouten);
  74.         return gpio;
  75. }
  76.  
  77. int get_load_avg()
  78. {
  79.         int proc_la = open ("/proc/loadavg", O_RDONLY);
  80.         char la[4];
  81.         read (proc_la, &la, 4);
  82.         la[1]=la[2];la[2]=la[3];la[3]=0;
  83.     close (proc_la);
  84.         return atoi(la);
  85. }
  86.  
  87.  
  88. inline void one_blink(int led)
  89. {
  90.     set_gpio(led, 0);
  91.     usleep (BLINK_ON);
  92.     set_gpio(led, 1);
  93.     usleep (BLINK_OFF);
  94. }
  95.  
  96. int blink(int led, int mode)
  97. {
  98.     switch (mode)
  99.     {
  100.         case 1:
  101.             one_blink(led);
  102.             usleep (900000);
  103.             break;
  104.         case 2:
  105.             one_blink(led);
  106.             one_blink(led);
  107.             usleep (800000);
  108.             break;
  109.         case 3:
  110.             one_blink(led);
  111.             one_blink(led);
  112.             one_blink(led);
  113.             one_blink(led);
  114.             usleep (600000);
  115.             break;
  116.         case 4:
  117.             one_blink(led);
  118.             one_blink(led);
  119.             one_blink(led);
  120.             one_blink(led);
  121.             one_blink(led);
  122.             one_blink(led);
  123.             one_blink(led);
  124.             one_blink(led);
  125.             usleep (200000);
  126.             break;
  127.         case -1:
  128.             set_gpio(led, 0);
  129.             usleep (400000);
  130.             set_gpio(led, 1);
  131.             usleep (100000);
  132.             set_gpio(led, 0);
  133.             usleep (400000);
  134.             set_gpio(led, 1);
  135.             usleep (100000);
  136.             break;
  137.         default:
  138.             break;
  139.     }
  140.     return 0;
  141. }
  142.  
  143. int show_la(int la)
  144. {
  145.     if (la >= LA_EXTREME)
  146.       blink(RED_LED, -1);
  147.     else if (la >= LA_VHIGH)
  148.       blink(RED_LED, 3);
  149.     else if (la >= LA_HIGH)
  150.       blink(BLU_LED, 4);
  151.     else if (la >= LA_MIDDLE)
  152.       blink(BLU_LED, 3);
  153.     else if (la >= LA_NORMAL)
  154.       blink(BLU_LED, 2);
  155.     else
  156.       blink (BLU_LED, 1);
  157.  
  158.     return 0;
  159. }
  160.  
  161. int show_switch ()
  162. {
  163.     one_blink (BLU_LED);
  164.     one_blink (BLU_LED);
  165.     one_blink (RED_LED);
  166.     one_blink (RED_LED);
  167.     return 0;
  168. }
  169.  
  170. int show_start ()
  171. {
  172.     set_gpio(BLU_LED, 0);
  173.     usleep(250000);
  174.     set_gpio(RED_LED, 0);
  175.     usleep(250000);
  176.     set_gpio(BLU_LED, 1);
  177.     usleep(250000);
  178.     set_gpio(RED_LED, 1);
  179.     usleep(250000);
  180.     return 0;
  181. }
  182.  
  183. int main(int argc, char **argv)
  184. {
  185.         unsigned int gpio;
  186.         unsigned int old_gpio = -1;
  187.         unsigned int pin;
  188.  
  189.  
  190.     int i=1;
  191.     show_start ();
  192.  
  193.     while (true)
  194.     {
  195.         if (!get_gpio(BUTTON))
  196.         {
  197.             i ? i = 0 : i = 1;
  198.             show_switch();
  199.         }
  200.  
  201.         if (i)
  202.           show_la(get_load_avg());
  203.         else
  204.           usleep (1000000);
  205.     }
  206.         return 0;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement