Diff for /embedtools/src/pceng_run.c between versions 1.1.2.3 and 1.1.2.10

version 1.1.2.3, 2011/07/23 23:41:00 version 1.1.2.10, 2012/04/05 12:22:44
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 47  SUCH DAMAGE. Line 47  SUCH DAMAGE.
 #include "pceng.h"  #include "pceng.h"
   
   
const u_int led_base[2][4] = {{0xf410, 0xf400, 0xf400, 0xf400}, const u_int led_base[2][MAX_GPIO_PINS] = {{0xf410, 0xf400, 0xf400, 0xf400}, 
         {0x61b0, 0x6100, 0x6180, 0x6180}};          {0x61b0, 0x6100, 0x6180, 0x6180}};
const int led_bit[2][4] = {{8, 2, 3, 18}, {8, 6, 9, 11}};const int led_bit[2][MAX_GPIO_PINS] = {{8, 2, 3, 18}, {8, 6, 9, 11}};
 const int gpio_off[2] = { 0x4, 0x10 };  const int gpio_off[2] = { 0x4, 0x10 };
   
   
Line 57  static inline board_t Line 57  static inline board_t
 getBoard()  getBoard()
 {  {
         board_t type;          board_t type;
        char szStr[STRSIZ];        ait_val_t v;
   
         FTRACE(3);          FTRACE(3);
   
        cfg_LoadAttribute(&cfg, CFG("pceng"), CFG("board"), CFG(szStr), sizeof szStr, DEFAULT_BOARD);        cfg_loadAttribute(&cfg, "pceng", "board", &v, DEFAULT_BOARD);
        if (!strcasecmp(szStr, "alix"))        if (!strcasecmp(AIT_GET_STR(&v), "alix"))
                 type = alix;                  type = alix;
        else if (!strcasecmp(szStr, "wrap"))        else if (!strcasecmp(AIT_GET_STR(&v), "wrap"))
                 type = wrap;                  type = wrap;
         else {          else {
                 type = unknown;                  type = unknown;
                syslog(LOG_ERR, "Error:: unknown board type %s", szStr);                syslog(LOG_ERR, "Error:: unknown board type %s", AIT_GET_STR(&v));
         }          }
   
           AIT_FREE_VAL(&v);
         return type;          return type;
 }  }
   
 static u_int  static u_int
gpioRead(u_char ledno, u_char state)gpioRead(u_char ledno)
 {  {
         u_int n;          u_int n;
         board_t type = getBoard();          board_t type = getBoard();
Line 116  LED(u_char ledno, u_char state) Line 117  LED(u_char ledno, u_char state)
         switch (type) {          switch (type) {
                 case wrap:                  case wrap:
                         n = inl(led_base[type - 1][ledno]);                          n = inl(led_base[type - 1][ledno]);
                           /* read */
                           if (state == (u_char) -1)
                                   return (n &= (1 << led_bit[type - 1][ledno]));
   
                         if (state)                          if (state)
                                 n |= (1 << led_bit[type - 1][ledno]);                                  n |= (1 << led_bit[type - 1][ledno]);
                         else                          else
                                 n &= ~(1 << led_bit[type - 1][ledno]);                                  n &= ~(1 << led_bit[type - 1][ledno]);
                         break;                          break;
                 case alix:                  case alix:
                           /* read */
                           if (state == (u_char) -1) {
                                   n = inl(led_base[type - 1][ledno]);
                                   return !(n &= (1 << led_bit[type - 1][ledno]));
                           }
   
                         if (state)                          if (state)
                                 n = (1 << (led_bit[type - 1][ledno] + gpio_off[type - 1]));                                  n = (1 << (led_bit[type - 1][ledno] + gpio_off[type - 1]));
                         else                          else
                                 n = (1 << led_bit[type - 1][ledno]);                                  n = (1 << led_bit[type - 1][ledno]);
                         break;                          break;
                default:                default:        /* unknown */
                         return -1;                          return -1;
         }          }
   
         outl(led_base[type - 1][ledno], n);          outl(led_base[type - 1][ledno], n);
           return (int) state;
   }
   
   static int
   RunCmd(u_char pin, u_int state)
   {
           char szArg[STRSIZ] = { 0 };
           ait_val_t v;
   
           FTRACE(3);
   
           switch (pin) {
                   case 0:         /* button */
                           cfg_loadAttribute(&cfg, "event", "button_exec", &v, NULL);
                           break;
                   case 1:         /* LEDs */
                   case 2:
                   case 3:
                           cfg_loadAttribute(&cfg, "event", "led_exec", &v, NULL);
                           break;
           }
           if (AIT_ISEMPTY(&v))
                   return 0;
           if (pin)
                   snprintf(szArg, sizeof szArg, "%d=%d", pin, state);
           else
                   snprintf(szArg, sizeof szArg, "%d", state);
   
           switch (fork()) {
                   case -1:
                           syslog(LOG_ERR, "Error:: RunCmd #%d - %s\n", errno, strerror(errno));
                           AIT_FREE_VAL(&v);
                           return -1;
                   case 0:         /* execute command */
                           return execl(AIT_GET_STR(&v), AIT_GET_STR(&v), szArg, NULL);
           }
   
           AIT_FREE_VAL(&v);
         return 0;          return 0;
 }  }
   
 int  int
 Run()  Run()
 {  {
           register u_char i;
           u_int ret, t, slice, states = 0;
           ait_val_t v;
   
         FTRACE(3);          FTRACE(3);
   
           /* init array */
           for (i = 0; i < MAX_GPIO_PINS; i++)
                   if ((ret = gpioRead(i)) == -1)
                           return 126;
                   else
                           states |= ret ? (1 << i) : 0;
   
           /* state machine */
           while (!Kill) {
                   cfg_loadAttribute(&cfg, "event", "button_slice", &v, DEFAULT_SLICE);
                   slice = strtol(AIT_GET_STR(&v), NULL, 0);
                   AIT_FREE_VAL(&v);
                   if (!slice)
                           slice = strtol(DEFAULT_SLICE, NULL, 0);
                   slice *= 1000;
   
                   for (i = t = 0; i < MAX_GPIO_PINS; t = 0, i++) {
                           if ((ret = gpioRead(i)) == -1)
                                   return 127;
   
                           if (ret != ((states >> i) & 0x1)) {
                                   if (!i) {       /* button */
                                           t = 0;
                                           do {
                                                   t++;
                                                   usleep(slice);
                                                   if (gpioRead(i) != ret)
                                                           break;
                                           } while (!Kill);
                                   } else {        /* leds */
                                           t = ret;
                                           if (ret)
                                                   states |= (1 << i);
                                           else
                                                   states &= ~(1 << i);
                                   }
   
                                   RunCmd(i, t);
                           }
                   }
   
                   usleep(slice);
           }
   
         return 0;          return 0;
 }  }

Removed from v.1.1.2.3  
changed lines
  Added in v.1.1.2.10


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>