1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
/***************************************************************************
lib/ibSic.c
-------------------
copyright : (C) 2002 by Frank Mori Hess
email : fmhess@users.sourceforge.net
***************************************************************************/
/***************************************************************************
* *
* 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 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "ib_internal.h"
int assert_ifc(ibBoard_t *board, unsigned int usec_duration)
{
int retval;
retval = ioctl(board->fileno, IBSIC, &usec_duration);
if (retval < 0) {
setIberr(EDVR);
setIbcnt(errno);
}
return retval;
}
int internal_ibsic(ibConf_t *conf)
{
ibBoard_t *board;
int retval;
if (conf->is_interface == 0) {
setIberr(EARG);
return -1;
}
board = interfaceBoard(conf);
retval = is_system_controller(board);
if (retval <= 0) {
if (retval == 0)
setIberr(ESAC);
return -1;
}
return assert_ifc(board, 100);
}
int ibsic(int ud)
{
ibConf_t *conf;
int retval;
conf = enter_library(ud);
if (!conf)
return exit_library(ud, 1);
retval = internal_ibsic(conf);
if (retval < 0)
return exit_library(ud, 1);
return exit_library(ud, 0);
}
void SendIFC(int boardID)
{
ibsic(boardID);
}
int request_system_control(ibBoard_t *board, int request_control)
{
int rsc_cmd;
int retval;
rsc_cmd = request_control != 0;
retval = ioctl(board->fileno, IBRSC, &rsc_cmd);
if (retval < 0) {
fprintf(stderr, "libgpib: IBRSC ioctl failed\n");
setIberr(EDVR);
setIbcnt(errno);
return retval;
}
board->is_system_controller = request_control != 0;
if (request_control && board->set_ren_on_sc) {
retval = remote_enable(board, 1);
if (retval < 0) {
fprintf(stderr, "libgpib: IBRSC remote enable failed\n");
setIberr(EDVR);
setIbcnt(errno);
return retval;
}
}
return 0;
}
int internal_ibrsc(ibConf_t *conf, int request_control)
{
int retval;
if (conf->is_interface == 0) {
setIberr(EARG);
return -1;
}
retval = request_system_control(interfaceBoard(conf), request_control);
if (retval < 0)
return retval;
return 0;
}
int ibrsc(int ud, int request_control)
{
ibConf_t *conf;
int retval;
conf = enter_library(ud);
if (conf == NULL)
return exit_library(ud, 1);
retval = internal_ibrsc(conf, request_control);
if (retval < 0)
return exit_library(ud, 1);
return exit_library(ud, 0);
}
|