/* $Id: surft.c,v 1.8 2004/03/21 10:13:11 jmuelmen Exp $ */ /* utilites for libsurf types (struct surf_t) */ #include #include #include "surf_int.h" #define NBOARDS 100 static struct surf_t _boards[NBOARDS]; static int _n_boards = 0; /* This routine compares a string (k) to the board name of a SuRF board (b is a struct surf_t *); it's only used by bsearch to find boards. */ static int surf_dev_compar_search (const void *k, const void *b) { const char *key = (const char *)k; const struct surf_t *board = (const struct surf_t *)b; return strncmp(key, surft_get_name(board), STRLEN); } /* This routine compares two struct surf_t *s; it does so by comparing the board names of each struct surf_t *. It's only used by qsort to tidy up the list of boards. */ static int surf_dev_compar_sort (const void *a, const void *b) { const struct surf_t *board1 = (const struct surf_t *)a; const struct surf_t *board2 = (const struct surf_t *)b; return strncmp(surft_get_name(board1), surft_get_name(board2), STRLEN); } /* search the board list for the board with the serial number given by key */ struct surf_t *surf_search (const char *key) { return bsearch(key, _boards, _n_boards, sizeof(struct surf_t), surf_dev_compar_search); } /* sort the board list by serial number */ static void surf_sort () { qsort(_boards, _n_boards, sizeof(struct surf_t), surf_dev_compar_sort); } void surft_init (struct surf_t *s) { s->stale = 1; } struct surf_t *surft_create (const char *b_name) { struct surf_t *surf; /* if the board isn't there yet, make a new board */ if (_n_boards == NBOARDS) { surf_errno = ENBOARDS; SURF_LOG(LOGSURF_ERROR, "Out of board space\n"); return NULL; } surf = &_boards[_n_boards++]; surft_init(surf); surft_set_name(surf, b_name); /* sort */ surf_sort(); /* find the damned thing back */ return surf_search(b_name); } int surft_set_name (struct surf_t *s, const char *n) { strncpy(s->board_name, n, STRLEN); s->board_name[STRLEN - 1] = 0; return strlen(n) > STRLEN - 1; } void surft_make_stale (struct surf_t *s) { s->stale = 1; } void surft_make_fresh (struct surf_t *s) { s->stale = 0; } int surft_stale (const struct surf_t *s) { return s->stale; } const char *surft_get_name (const struct surf_t *s) { return s->board_name; } #ifdef HAVE_LIBUSB usb_dev_handle *surft_get_dev (const struct surf_t *s) { return s->h; } void surft_set_dev (struct surf_t *s, usb_dev_handle *h) { s->h = h; } #elif defined HAVE_SURFWAX int surft_get_dev (const struct surf_t *s) { return s->h; } void surft_set_dev (struct surf_t *s, int h) { s->h = h; } #endif void surft_set_rev (struct surf_t *s, unsigned char major, unsigned char minor, unsigned char subminor) { s->rev_major = major; s->rev_minor = minor; s->rev_subminor = subminor; } int surft_print_boards () { #ifdef HAVE_LIBUSB int i, ret; if (ret = surf_find_boards()) return ret; for (i = 0; i < _n_boards; ++i) { struct surf_t *board = &_boards[i]; struct usb_device *dev = usb_device(surft_get_dev(board)); printf("%s/%s\t\t%04X/%04X\t%s\t(rev %02x.%02x.%02x)\n", dev->bus->dirname, dev->filename, dev->descriptor.idVendor, dev->descriptor.idProduct, surft_get_name(board), board->rev_major, board->rev_minor, board->rev_subminor); } #elif HAVE_SURFWAX int i, ret; if (ret = surf_find_boards()) return ret; for (i = 0; i < _n_boards; ++i) { struct surf_t *board = &_boards[i]; int dev = surft_get_dev(board); printf("%04X/%04X\t%s\t(rev %02x.%02x.%02x)\n", 0x4242, 0xbeef, surft_get_name(board), board->rev_major, board->rev_minor, board->rev_subminor); } #endif return 0; }