aboutsummaryrefslogtreecommitdiffstats
path: root/dvb-t/se-Munkfors
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>2016-05-28 18:45:09 -0300
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2016-05-28 18:45:09 -0300
commit43895629e8fc3f843bdc1f08f719da75ec2ef3c6 (patch)
treea65340c42ea5690d9d7e117e722b4e7f9fa28bf2 /dvb-t/se-Munkfors
parent90b412717bba962083a14ea7056d4c0bdd2b2613 (diff)
downloaddtv-scan-tables-43895629e8fc3f843bdc1f08f719da75ec2ef3c6.tar.gz
Hispasat-30.0W: fix delivery system
Rename: ELIVERY_SYSTEM -> DELIVERY_SYSTEM Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'dvb-t/se-Munkfors')
0 files changed, 0 insertions, 0 deletions
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 pre { line-height: 125%; } td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/* $Id: isdn.c,v 1.9 2001/05/27 07:19:28 reinelt Exp $
 *
 * ISDN specific functions
 *
 * Copyright 1999, 2000 by Michael Reinelt (reinelt@eunet.at)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *
 * $Log: isdn.c,v $
 * Revision 1.9  2001/05/27 07:19:28  reinelt
 *
 * fixed a warning in pixmap.c
 * temporarily fixed a bug in isdn.c (ISDN_MAX_CHANNELS is no longer defined?)
 * fixed a bug in configure.in (--with-drivers=xyz did not work)
 *
 * Revision 1.8  2000/08/10 18:42:20  reinelt
 *
 * fixed some bugs with the new syslog code
 *
 * Revision 1.7  2000/08/10 09:44:09  reinelt
 *
 * new debugging scheme: error(), info(), debug()
 * uses syslog if in daemon mode
 *
 * Revision 1.6  2000/04/15 11:56:35  reinelt
 *
 * more debug messages
 *
 * Revision 1.5  2000/03/13 15:58:24  reinelt
 *
 * release 0.9
 * moved row parsing to parser.c
 * all basic work finished
 *
 * Revision 1.4  2000/03/10 17:36:02  reinelt
 *
 * first unstable but running release
 *
 * Revision 1.3  2000/03/07 11:01:34  reinelt
 *
 * system.c cleanup
 *
 * Revision 1.2  2000/03/06 06:04:06  reinelt
 *
 * minor cleanups
 *
 */

/* 
 * exported functions:
 *
 * Isdn (int *rx, int *tx, int *usage)
 *   returns 0 if ok, -1 if error
 *   sets *usage to all channels USAGE or'ed together
 *   sets received/transmitted bytes in *rx, *tx
 *
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <linux/isdn.h>

// Fixme: ISDN_MAX_CHANNELS seems undefined in recent kernels
#ifndef ISDN_MAX_CHANNELS
#define ISDN_MAX_CHANNELS 64
#endif

#include "debug.h"
#include "isdn.h"
#include "filter.h"

typedef struct {
  unsigned long in;
  unsigned long out;
} CPS;


static int Usage (void)
{
  static int fd=0;
  char buffer[4096], *p;
  int i, usage;

  if (fd==-1) return 0;

  fd=open ("/dev/isdninfo", O_RDONLY | O_NDELAY);
  if (fd==-1) {
    error ("open(/dev/isdninfo) failed: %s", strerror(errno));
    return 0;
  }
  
  if (read (fd, buffer, sizeof(buffer))==-1) {
    error ("read(/dev/isdninfo) failed: %s", strerror(errno));
    fd=-1;
    return 0;
  }

  if (close(fd)==-1) {
    error ("close(/dev/isdninfo) failed: %s", strerror(errno));
    fd=-1;
    return 0;
  }

  p=strstr(buffer, "usage:");
  if (p==NULL) {
    error ("parse(/dev/isdninfo) failed: no usage line");
    fd=-1;
    return 0;
  }
  p+=6;

  usage=0;
  for (i=0; i<ISDN_MAX_CHANNELS; i++) {
    usage|=strtol(p, &p, 10);
  }
  return usage;
}

int Isdn (int *rx, int *tx, int *usage)
{
  static int fd=-2;
  CPS cps[ISDN_MAX_CHANNELS];
  double cps_i, cps_o;
  int i;

  *usage=0;
  *rx=0;
  *tx=0;

  if (fd==-1) return -1;
  
  if (fd==-2) {
    fd = open("/dev/isdninfo", O_RDONLY | O_NDELAY);
    if (fd==-1) {
      error ("open(/dev/isdninfo) failed: %s", strerror(errno));
      return -1;
    }
    debug ("open (/proc/isdninfo)=%d", fd);
  }

  if (ioctl(fd, IIOCGETCPS, &cps)) {
    error("ioctl(IIOCGETCPS) failed: %s", strerror(errno));
    fd=-1;
    return -1;
  }

  cps_i=0;
  cps_o=0;
  for (i=0; i<ISDN_MAX_CHANNELS; i++) {
    cps_i+=cps[i].in;
    cps_o+=cps[i].out;
  }

  *rx=(int)smooth("isdn_rx", 1000, cps_i);
  *tx=(int)smooth("isdn_tx", 1000, cps_o);
  *usage=Usage();

  return 0;
}
n> #endif #endif #include "debug.h" #include "cfg.h" #include "timer.h" #include "qprintf.h" #include "plugin.h" #include "widget.h" #include "widget_text.h" #include "widget_icon.h" #include "widget_bar.h" #include "drv.h" #include "drv_generic_graphic.h" #ifdef WITH_DMALLOC #include <dmalloc.h> #endif static char Name[] = "Image"; static enum { PPM, PNG } Format; static unsigned int fg_col, bg_col, hg_col; static int pixel = -1; /* pointsize in pixel */ static int pgap = 0; /* gap between points */ static int rgap = 0; /* row gap between lines */ static int cgap = 0; /* column gap between characters */ static int border = 0; /* window border */ static int dimx, dimy; /* total window dimension in pixel */ static unsigned char *drv_IMG_FB = NULL; static int dirty = 1; /****************************************/ /*** hardware dependant functions ***/ /****************************************/ #ifdef WITH_PPM static int drv_IMG_flush_PPM(void) { static int seq = 0; static unsigned char *bitbuf = NULL; static unsigned char *rowbuf = NULL; int xsize, ysize, row, col; unsigned char R[3], G[3], B[3]; char path[256], tmp[256], buffer[256]; int fd; xsize = 2 * border + (DCOLS / XRES - 1) * cgap + DCOLS * pixel + (DCOLS - 1) * pgap; ysize = 2 * border + (DROWS / YRES - 1) * rgap + DROWS * pixel + (DROWS - 1) * pgap; if (bitbuf == NULL) { if ((bitbuf = malloc(xsize * ysize * sizeof(*bitbuf))) == NULL) { error("%s: malloc(%d) failed: %s", Name, xsize * ysize * sizeof(*bitbuf), strerror(errno)); return -1; } } if (rowbuf == NULL) { if ((rowbuf = malloc(3 * xsize * sizeof(*rowbuf))) == NULL) { error("Raster: malloc(%d) failed: %s", 3 * xsize * sizeof(*rowbuf), strerror(errno)); return -1; } } memset(bitbuf, 0, xsize * ysize * sizeof(*bitbuf)); for (row = 0; row < DROWS; row++) { int y = border + (row / YRES) * rgap + row * (pixel + pgap); for (col = 0; col < DCOLS; col++) { int x = border + (col / XRES) * cgap + col * (pixel + pgap); int a, b; for (a = 0; a < pixel; a++) for (b = 0; b < pixel; b++) bitbuf[y * xsize + x + a * xsize + b] = drv_IMG_FB[row * DCOLS + col] + 1; } } snprintf(path, sizeof(path), output, seq++); qprintf(tmp, sizeof(tmp), "%s.tmp", path); /* remove the file */ unlink(tmp); /* avoid symlink security hole: */ /* open it with O_EXCL will fail if the file exists. */ /* This should not happen because we just unlinked it. */ if ((fd = open(tmp, O_WRONLY | O_CREAT | O_EXCL, 0644)) < 0) { error("%s: open(%s) failed: %s", Name, tmp, strerror(errno)); return -1; } qprintf(buffer, sizeof(buffer), "P6\n%d %d\n255\n", xsize, ysize); if (write(fd, buffer, strlen(buffer)) < 0) { error("%s: write(%s) failed: %s", Name, tmp, strerror(errno)); return -1; } R[0] = 0xff & bg_col >> 16; G[0] = 0xff & bg_col >> 8; B[0] = 0xff & bg_col; R[1] = 0xff & hg_col >> 16; G[1] = 0xff & hg_col >> 8; B[1] = 0xff & hg_col; R[2] = 0xff & fg_col >> 16; G[2] = 0xff & fg_col >> 8; B[2] = 0xff & fg_col; for (row = 0; row < ysize; row++) { int c = 0; for (col = 0; col < xsize; col++) { int i = bitbuf[row * xsize + col]; rowbuf[c++] = R[i]; rowbuf[c++] = G[i]; rowbuf[c++] = B[i]; } if (write(fd, rowbuf, c) < 0) { error("%s: write(%s) failed: %s", Name, tmp, strerror(errno)); break; } } if (close(fd) < 0) { error("%s: close(%s) failed: %s", Name, tmp, strerror(errno)); return -1; } if (rename(tmp, path) < 0) { error("%s: rename(%s) failed: %s", Name, tmp, strerror(errno)); return -1; } return 0; } #endif #ifdef WITH_PNG static int drv_IMG_flush_PNG(void) { static int seq = 0; int xsize, ysize, row, col; char path[256], tmp[256]; FILE *fp; int fd; gdImagePtr im; int bg, hg, fg; xsize = 2 * border + (DCOLS / XRES - 1) * cgap + DCOLS * pixel + (DCOLS - 1) * pgap; ysize = 2 * border + (DROWS / YRES - 1) * rgap + DROWS * pixel + (DROWS - 1) * pgap; im = gdImageCreate(xsize, ysize); /* first color = background */ bg = gdImageColorAllocate(im, 0xff & bg_col >> 16, 0xff & bg_col >> 8, 0xff & bg_col); hg = gdImageColorAllocate(im, 0xff & hg_col >> 16, 0xff & hg_col >> 8, 0xff & hg_col); fg = gdImageColorAllocate(im, 0xff & fg_col >> 16, 0xff & fg_col >> 8, 0xff & fg_col); for (row = 0; row < DROWS; row++) { int y = border + (row / YRES) * rgap + row * (pixel + pgap); for (col = 0; col < DCOLS; col++) { int x = border + (col / XRES) * cgap + col * (pixel + pgap); gdImageFilledRectangle(im, x, y, x + pixel - 1, y + pixel - 1, drv_IMG_FB[row * DCOLS + col] ? fg : hg); } } snprintf(path, sizeof(path), output, seq++); qprintf(tmp, sizeof(tmp), "%s.tmp", path); /* remove the file */ unlink(tmp); /* avoid symlink security hole: */ /* open it with O_EXCL will fail if the file exists. */ /* This should not happen because we just unlinked it. */ if ((fd = open(tmp, O_WRONLY | O_CREAT | O_EXCL, 0644)) < 0) { error("%s: open(%s) failed: %s", Name, tmp, strerror(errno)); return -1; } if ((fp = fdopen(fd, "w")) == NULL) { error("%s: fdopen(%s) failed: %s\n", Name, tmp, strerror(errno)); close(fd); return -1; } gdImagePng(im, fp); gdImageDestroy(im); if (fclose(fp) != 0) { error("%s: fclose(%s) failed: %s\n", Name, tmp, strerror(errno)); return -1; } if (rename(tmp, path) < 0) { error("%s: rename(%s) failed: %s\n", Name, tmp, strerror(errno)); return -1; } return 0; } #endif static void drv_IMG_flush(void) { switch (Format) { case PPM: #ifdef WITH_PPM drv_IMG_flush_PPM(); #endif break; case PNG: #ifdef WITH_PNG drv_IMG_flush_PNG(); #endif break; } } static void drv_IMG_timer(void *notused) { /* avoid compiler warning */ notused = notused; if (dirty) { drv_IMG_flush(); dirty = 0; } } static void drv_IMG_blit(const int row, const int col, const int height, const int width) { int r, c; for (r = row; r < row + height && r < DROWS; r++) { for (c = col; c < col + width && c < DCOLS; c++) { unsigned char p = drv_generic_graphic_gray(r, c); if (drv_IMG_FB[r * DCOLS + c] != p) { drv_IMG_FB[r * DCOLS + c] = p; dirty = 1; } } } } static int drv_IMG_start(const char *section) { char *s; if (output == NULL || *output == '\0') { error("%s: no output file specified (use -o switch)", Name); return -1; } /* read file format from config */ s = cfg_get(section, "Format", NULL); if (s == NULL || *s == '\0') { error("%s: no '%s.Format' entry from %s", Name, section, cfg_source()); free(s); return -1; } if (strcmp(s, "PPM") == 0) { Format = PPM; } else if (strcmp(s, "PNG") == 0) { Format = PNG; } else { error("%s: bad %s.Format '%s' from %s", Name, section, s, cfg_source()); free(s); return -1; } free(s); /* read display size from config */ if (sscanf(s = cfg_get(section, "Size", "120x32"), "%dx%d", &DCOLS, &DROWS) != 2 || DCOLS < 1 || DROWS < 1) { error("%s: bad %s.Size '%s' from %s", Name, section, s, cfg_source()); free(s); return -1; } free(s); if (sscanf(s = cfg_get(section, "font", "5x8"), "%dx%d", &XRES, &YRES) != 2 || XRES < 1 || YRES < 1) { error("%s: bad %s.Font '%s' from %s", Name, section, s, cfg_source()); free(s); return -1; } free(s); if (sscanf(s = cfg_get(section, "pixel", "4+1"), "%d+%d", &pixel, &pgap) != 2 || pixel < 1 || pgap < 0) { error("%s: bad %s.Pixel '%s' from %s", Name, section, s, cfg_source()); free(s); return -1; } free(s); if (sscanf(s = cfg_get(section, "gap", "-1x-1"), "%dx%d", &cgap, &rgap) != 2 || cgap < -1 || rgap < -1) { error("%s: bad %s.Gap '%s' from %s", Name, section, s, cfg_source()); free(s); return -1; } free(s); if (rgap < 0) rgap = pixel + pgap; if (cgap < 0) cgap = pixel + pgap; if (cfg_number(section, "border", 0, 0, -1, &border) < 0) return -1; if (sscanf(s = cfg_get(section, "foreground", "#102000"), "#%x", &fg_col) != 1) { error("%s: bad %s.foreground color '%s' from %s", Name, section, s, cfg_source()); free(s); return -1; } free(s); if (sscanf(s = cfg_get(section, "halfground", "#70c000"), "#%x", &hg_col) != 1) { error("%s: bad %s.halfground color '%s' from %s", Name, section, s, cfg_source()); free(s); return -1; } free(s); if (sscanf(s = cfg_get(section, "background", "#80d000"), "#%x", &bg_col) != 1) { error("%s: bad %s.background color '%s' from %s", Name, section, s, cfg_source()); free(s); return -1; } free(s); drv_IMG_FB = malloc(DCOLS * DROWS); if (drv_IMG_FB == NULL) { error("%s: framebuffer could not be allocated: malloc() failed", Name); return -1; } memset(drv_IMG_FB, 0, DCOLS * DROWS * sizeof(*drv_IMG_FB)); dimx = DCOLS * pixel + (DCOLS - 1) * pgap + (DCOLS / XRES - 1) * cgap; dimy = DROWS * pixel + (DROWS - 1) * pgap + (DROWS / YRES - 1) * rgap; /* initially flush the image to a file */ drv_IMG_flush(); /* regularly flush the image to a file */ /* Fixme: make 100msec configurable */ timer_add(drv_IMG_timer, NULL, 100, 0); return 0; } /****************************************/ /*** plugins ***/ /****************************************/ /* none at the moment... */ /****************************************/ /*** widget callbacks ***/ /****************************************/ /* using drv_generic_graphic_draw(W) */ /* using drv_generic_graphic_icon_draw(W) */ /* using drv_generic_graphic_bar_draw(W) */ /****************************************/ /*** exported functions ***/ /****************************************/ /* list models */ int drv_IMG_list(void) { printf("PPM PNG"); return 0; } /* initialize driver & display */ int drv_IMG_init(const char *section, const __attribute__ ((unused)) int quiet) { WIDGET_CLASS wc; int ret; info("%s: %s", Name, "$Revision: 1.15 $"); /* real worker functions */ drv_generic_graphic_real_blit = drv_IMG_blit; /* start display */ if ((ret = drv_IMG_start(section)) != 0) return ret; /* initialize generic graphic driver */ if ((ret = drv_generic_graphic_init(section, Name)) != 0) return ret; /* register text widget */ wc = Widget_Text; wc.draw = drv_generic_graphic_draw; widget_register(&wc); /* register icon widget */ wc = Widget_Icon; wc.draw = drv_generic_graphic_icon_draw; widget_register(&wc); /* register bar widget */ wc = Widget_Bar; wc.draw = drv_generic_graphic_bar_draw; widget_register(&wc); /* register plugins */ /* none at the moment... */ return 0; } /* close driver & display */ int drv_IMG_quit(const __attribute__ ((unused)) int quiet) { info("%s: shutting down.", Name); drv_generic_graphic_quit(); if (drv_IMG_FB) { free(drv_IMG_FB); drv_IMG_FB = NULL; } return (0); } DRIVER drv_Image = { name:Name, list:drv_IMG_list, init:drv_IMG_init, quit:drv_IMG_quit, }; ">", ret, strerror(-ret)); } free(phid); goto next; } } phid->specificDevice = TRUE; phid->attr = Phid_Device_Def[i].pdd_attr; if(!(phid->CPhidgetFHandle = strdup(unique_name))) return EPHIDGET_NOMEMORY; LOG(PHIDGET_LOG_INFO, "New device in CUSBBuildList: %s", (char *)phid->CPhidgetFHandle); if((ret = usb_close(udev)) < 0) { LOG(PHIDGET_LOG_ERROR, "usb_close failed with error code: %d \"%s\"", ret, strerror(-ret)); } CList_addToList((CListHandle *)curList, phid, CPhidget_areEqual); } //if(udev) else { free(phid); if((ret = usb_close(udev)) < 0) { LOG(PHIDGET_LOG_ERROR, "usb_close failed with error code: %d \"%s\"", ret, strerror(-ret)); } } } //vendor, product ids match } /* iterate over phidget device table */ next: ; } /* iterate over USB devices */ } /* iterate over USB busses */ return EPHIDGET_OK; } void CUSBCleanup(void) { ; } /* CUSBOpenHandle takes a CPhidgetInfo structure, with ProductID/VendorID/SerialNumber filled in. Serial number is always filled in. */ int CUSBOpenHandle(CPhidgetHandle phid) { int idVendor; int idProduct; int serial = 0; int i,ret; struct usb_bus *bus; struct usb_device *dev; usb_dev_handle *udev; usb_init(); if((ret = usb_find_busses()) < 0) { LOG(PHIDGET_LOG_ERROR, "usb_find_busses failed with error code: %d \"%s\"", ret, strerror(-ret)); } if((ret = usb_find_devices()) < 0) { LOG(PHIDGET_LOG_ERROR, "usb_find_devices failed with error code: %d \"%s\"", ret, strerror(-ret)); } for (bus = usb_busses; bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { for (i = 1; i<PHIDGET_DEVICE_COUNT; i++) { if (Phid_Device_Def[i].pdd_did == phid->deviceID) { idVendor = Phid_Device_Def[i].pdd_vid; idProduct = Phid_Device_Def[i].pdd_pid; if ((dev->descriptor.idVendor == idVendor) && (dev->descriptor.idProduct == idProduct)) { /* the vend/prod matches! */ udev = usb_open(dev); if (udev) { serial = -1; if (dev->descriptor.iSerialNumber) { char string[256]; if((ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string))) < 0) { LOG(PHIDGET_LOG_WARNING, "usb_get_string_simple failed with error code: %d \"%s\"", ret, strerror(-ret)); LOG(PHIDGET_LOG_INFO, "This usually means you need to run as root"); if((ret = usb_close(udev)) < 0) { LOG(PHIDGET_LOG_ERROR, "usb_close failed with error code: %d \"%s\"", ret, strerror(-ret)); } goto next; } else { serial = atol(string); } } if (dev->descriptor.iProduct) { if((ret = usb_get_string_simple(udev, dev->descriptor.iProduct, phid->usbProduct, sizeof(phid->usbProduct))) < 0) { LOG(PHIDGET_LOG_ERROR, "usb_get_string_simple failed with error code: %d \"%s\"", ret, strerror(-ret)); LOG(PHIDGET_LOG_INFO, "This usually means you need to run as root"); if((ret = usb_close(udev)) < 0) { LOG(PHIDGET_LOG_ERROR, "usb_close failed with error code: %d \"%s\"", ret, strerror(-ret)); } free(phid); goto next; } } if (serial == phid->serialNumber) { /* On Linux, the HID driver likes to claim Phidgets - we can disconnect it here. Maybe the user has installed the kernel drivers for the interface kit or servo - disconnect them too (does this work) Note this is Linux Only - PM Note that we don't need to claim it if usbfs has it - this is what libusb uses. */ #ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP char name[32]; if((ret = usb_get_driver_np(udev, Phid_Device_Def[i].pdd_iid, name, 32)) < 0) { LOG(PHIDGET_LOG_WARNING, "usb_get_driver_np failed with error code: %d \"%s\"", ret, strerror(-ret)); } else { LOG(PHIDGET_LOG_INFO, "Kernel driver name: %s", name); if(strncmp(name, "usbfs", 5)) //not usbfs { if((ret = usb_detach_kernel_driver_np(udev, Phid_Device_Def[i].pdd_iid)) < 0) { LOG(PHIDGET_LOG_WARNING, "usb_detach_kernel_driver_np failed with error code: %d \"%s\"", ret, strerror(-ret)); } else { LOG(PHIDGET_LOG_INFO, "Successfully detached kernel driver: %s", name); } } } #endif if((ret = usb_claim_interface(udev, Phid_Device_Def[i].pdd_iid)) < 0) { LOG(PHIDGET_LOG_WARNING, "usb_claim_interface failed with error code: %d \"%s\"", ret, strerror(-ret)); if((ret = usb_close(udev)) < 0) { LOG(PHIDGET_LOG_ERROR, "usb_close failed with error code: %d \"%s\"", ret, strerror(-ret)); } } else { /* the serialnum is okay */ phid->deviceHandle = (HANDLE)udev; phid->deviceIDSpec = Phid_Device_Def[i].pdd_sdid; phid->deviceDef = &Phid_Device_Def[i]; phid->deviceType = (char *)Phid_DeviceName[Phid_Device_Def[i].pdd_did]; phid->ProductID = idProduct; phid->VendorID = idVendor; if (dev->descriptor.bcdDevice < 0x100) phid->deviceVersion = dev->descriptor.bcdDevice * 100; else phid->deviceVersion = ((dev->descriptor.bcdDevice >> 8) * 100) + ((dev->descriptor.bcdDevice & 0xff)); phid->deviceUID = CPhidget_getUID(phid->deviceIDSpec, phid->deviceVersion); phid->serialNumber = serial; if((ret = CUSBGetDeviceCapabilities(phid, dev, udev))) { LOG(PHIDGET_LOG_ERROR, "CUSBGetDeviceCapabilities returned nonzero code: %d", ret); } phid->attr = Phid_Device_Def[i].pdd_attr; return EPHIDGET_OK; } /* usb_claim_interface */ } /* serial matches */ else { if((ret = usb_close(udev)) < 0) { LOG(PHIDGET_LOG_ERROR, "usb_close failed with error code: %d \"%s\"", ret, strerror(-ret)); } } } /* udev open */ else { if((ret = usb_close(udev)) < 0) { LOG(PHIDGET_LOG_ERROR, "usb_close failed with error code: %d \"%s\"", ret, strerror(-ret)); } LOG(PHIDGET_LOG_WARNING, "usb_open failed - bad permission or what?"); } } /* vendor/product match */ } /* deviceID matches in table */ } /* iterate over phidget device table */ next: ; } /* iterate over USB devices */ } /* iterate over USB busses */ return EPHIDGET_NOTFOUND; }