155 lines
2.7 KiB
C
155 lines
2.7 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#ifndef __USE_ISOC99
|
|
#define __USE_ISOC99
|
|
#endif
|
|
#include <math.h>
|
|
#include "gpib.h"
|
|
#include "serial-util.h"
|
|
|
|
#define gputv(string, rv) do { \
|
|
int ____l = strlen(string); \
|
|
if (safewrite(fd, string, ____l) != ____l) return rv; \
|
|
if (safewrite(fd, "\r", 1) != 1) return rv; } while(0)
|
|
#define gput(string) gputv(string, -1)
|
|
|
|
int gpib_init(int fd)
|
|
{
|
|
gput("++mode 1");
|
|
gput("++auto 0");
|
|
gput("++eos 1");
|
|
gput("++eoi 1");
|
|
gput("++read_tmo_ms 4000");
|
|
gput("++eot_enable 1");
|
|
gput("++eot_char 13");
|
|
return 0;
|
|
}
|
|
|
|
int gpib_addr(int fd, int addr)
|
|
{
|
|
char s[128];
|
|
sprintf(s, "++addr %d", addr);
|
|
gput(s);
|
|
return 0;
|
|
}
|
|
|
|
int keithley_init(int fd)
|
|
{
|
|
double i;
|
|
gput(":syst:beep:stat 1");
|
|
gput(":sour:func:mode curr");
|
|
gput(":sour:del 0");
|
|
gput(":sour:curr 0");
|
|
gput(":sour:curr:range:auto on");
|
|
gput(":outp on");
|
|
drain(fd);
|
|
i = keithley_read(fd);
|
|
if (isnan(i))
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
int keithley_current(int fd, double amps)
|
|
{
|
|
char s[128];
|
|
sprintf(s, ":sour:curr %0.12f", amps);
|
|
gput(s);
|
|
return 0;
|
|
}
|
|
|
|
double keithley_read(int fd)
|
|
{
|
|
char s[128];
|
|
double i, dummy;
|
|
gputv("read?", NAN);
|
|
gputv("++read", NAN);
|
|
if (fdgets(s, 128, fd, 2000) == NULL)
|
|
return NAN;
|
|
if (sscanf(s, "%lf,%lf,", &dummy, &i) != 2)
|
|
return NAN;
|
|
return i;
|
|
}
|
|
|
|
int keithley_off(int fd)
|
|
{
|
|
gput(":outp off");
|
|
return 0;
|
|
}
|
|
|
|
|
|
/* this function is for Keithley2002 Digital multimeter */
|
|
int keithley2002_init(int fd)
|
|
{
|
|
double i;
|
|
gput(":trac:cle");
|
|
gput(":sens:curr:dc:rang:auto on");
|
|
gput(":sens:curr:dc:dig 8");
|
|
gput(":form:elem read");
|
|
gput(":init:cont off");
|
|
drain(fd);
|
|
i = keithley2002_read(fd);
|
|
if (isnan(i))
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
int keithley2002_init2(int fd)
|
|
{
|
|
double i;
|
|
gput(":trac:cle");
|
|
gput(":sens:curr:dc:rang:auto on");
|
|
gput(":sens:curr:dc:dig 8");
|
|
gput(":form:elem read, time");
|
|
gput(":syst:tst:type rel");
|
|
gput(":syst:tst:rel:res");
|
|
gput(":init:cont off");
|
|
drain(fd);
|
|
i = keithley2002_read(fd);
|
|
if (isnan(i))
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
int keithley2002_init_volts(int fd)
|
|
{
|
|
double i;
|
|
gput(":trac:cle");
|
|
gput(":sens:volt:dc:rang 5");
|
|
gput(":sens:volt:dc:dig 8");
|
|
gput(":form:elem read");
|
|
gput(":init:cont off");
|
|
drain(fd);
|
|
i = keithley2002_read(fd);
|
|
if (isnan(i))
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
double keithley2002_read(int fd)
|
|
{
|
|
char s[128];
|
|
double i;
|
|
gputv("read?", NAN);
|
|
gputv("++read", NAN);
|
|
if (fdgets(s, 128, fd, 2000) == NULL)
|
|
return NAN;
|
|
if (sscanf(s, "%lf", &i) != 1)
|
|
return NAN;
|
|
return i;
|
|
|
|
}
|
|
|
|
double keithley2002_read2(int fd, double *tx)
|
|
{
|
|
char s[128];
|
|
double i;
|
|
gputv("read?", NAN);
|
|
gputv("++read", NAN);
|
|
if (fdgets(s, 128, fd, 2000) == NULL)
|
|
return NAN;
|
|
if (sscanf(s, "%lf,%lf", &i, tx) < 1)
|
|
return NAN;
|
|
return i;
|
|
|
|
}
|