HITDAQ/hit2023v2_RMS/keithley.cpp

242 lines
5.8 KiB
C++

#include "keithley.h"
//THIS IS KEITHLEY 6487 (PICOAMMETER) RS-232 LIBRARY!
keithley::keithley()
{
isOpen = 0;
}
/*void keithley::ps_printf(const char* fmt, ...)
{
QString result;
va_list args;
va_start(args, fmt);
result.vsprintf(fmt, args);
va_end(args);
//char toWrite[result.length()+1];
//strcpy(toWrite, qPrintable(result));
//serialPort.write(toWrite, strlen(toWrite));
socket.write(qPrintable(result), result.length());
socket.waitForBytesWritten(500);
}
//read a CR-LF terminated string from PS
int keithley::ps_read(char* dest, int maxSize)
{
int ptr = 0;
while (1)
{
if (socket.read(dest+ptr,1) <= 0)
{
if (!socket.waitForReadyRead(10))
break; //no new data - break
}
else
ptr++;
if (dest[ptr-1] == '\n')
{
ptr--;
break; //newline found - delete and break
}
if (dest[ptr-1] == '\r')
ptr--; //CR found - delete it
if (ptr >= (maxSize-1))
break; //buffer full = break
}
dest[ptr] = 0;
//return number of read characters
return ptr;
}*/
//Qt5
/*
void keithley::ps_printf(const char* fmt, ...)
{
QString result;
va_list args;
va_start(args, fmt);
result.vsprintf(fmt, args);
va_end(args);
//char toWrite[result.length()+1];
//strcpy(toWrite, qPrintable(result));
//serialPort.write(toWrite, strlen(toWrite));
serialPort.write(qPrintable(result), result.length());
serialPort.waitForBytesWritten(500);
}
*/
//Qt6
void keithley::ps_printf(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
QString result = QString::vasprintf(fmt, args);
va_end(args);
serialPort.write(result.toUtf8());
serialPort.waitForBytesWritten(500);
}
//read a CR-LF terminated string from PS
int keithley::ps_read(char* dest, int maxSize)
{
int ptr = 0;
while (1)
{
if (serialPort.read(dest+ptr,1) <= 0)
{
if (!serialPort.waitForReadyRead(500))
break; //no new data - break
}
else
{
ptr++;
if (dest[ptr-1] == '\n')
{
ptr--;
break; //newline found - delete and break
}
if (dest[ptr-1] == '\r')
{
ptr--; //CR found - delete and break
break;
}
if (ptr >= (maxSize-1))
break; //buffer full = break
}
}
dest[ptr] = 0;
return ptr;
}
void keithley::ps_flush()
{
char buffer[32];
while (ps_read(buffer, 32));
}
//**************************************************************************
int keithley::connect()
{
/*disconnect(); //just if we were connected
socket.connectToHost(hostName, port);
if (socket.waitForConnected(5000))
{
isOpen = 1;
return 1;
}
return 0;*/
QList<QSerialPortInfo> list = QSerialPortInfo::availablePorts();
disconnect(); //close port if it's open
if (list.size() == 0)
return -1; //no serial ports found
for (int port = 0; port < list.size(); port++)
{
serialPort.setPort(list[port]);
serialPort.setBaudRate(57600);
if (serialPort.open(QIODevice::ReadWrite))
{
serialPort.setBaudRate(57600);
ps_printf("*IDN?\n");
QThread::msleep(100);
char buffer[128];
ps_read(buffer,128);
if (strstr(buffer, "KEITHLEY INSTRUMENTS INC.,MODEL 6487"))
{ //gotta our PS!
isOpen = 1;
portName = list[port].portName();
//configure for measurement
QThread::msleep(100);
ps_printf("CONF\n");
//setup medium readout reate (Tint = 20 ms)
QThread::msleep(100);
ps_printf("NPLC 1\n");
QThread::msleep(100);
ps_printf("RANG:AUTO 0\n");
QThread::msleep(100);
ps_printf("RANG 2e-5\n");
QThread::msleep(100);
//setup source
ps_printf("SOUR:VOLT:RANG 10\n");
QThread::msleep(100);
ps_printf("SOUR:VOLT:ILIM 2.5e-2\n");
QThread::msleep(100);
break;
}
serialPort.close();
}
}
return isOpen;
}
void keithley::disconnect()
{
if (!isOpen)
return;
//socket.close();
serialPort.close();
isOpen = 0;
}
void keithley::setVoltage(double voltage)
{
if (!isOpen)
return;
//ps_printf("smua.source.func=smua.OUTPUT_DCVOLTS\n");
//ps_printf("smua.source.levelv=%1.2f\n", voltage);
ps_printf("SOUR:VOLT %1.2f\n", voltage);
}
void keithley::on(int state)
{
if (!isOpen)
return;
if (state)
{
//ps_printf("smua.source.output=smua.OUTPUT_ON\n");
ps_printf("SOUR:VOLT:STAT ON\n");
}
else
{
//ps_printf("smua.source.output=smua.OUTPUT_OFF\n");
ps_printf("SOUR:VOLT:STAT OFF\n");
}
}
void keithley::reset()
{
if (!isOpen)
return;
//ps_printf("smua.reset()\n");
ps_printf("*RST\n");
}
double keithley::getCurrent()
{
char reply[128];
ps_flush();
//ps_printf("print(smua.measure.i())\n");
//ps_printf("MEAS?\n");
ps_printf("READ?\n");
//QThread::msleep(250);
while (!ps_read(reply, 128));
double result = atof(reply);
return result;
}