Files
TowerOptoSifAndSpectral/source_rlx/sensor/SensorQExPRO.cpp

328 lines
8.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "SensorQExPRO.h"
#include "QDebug"
#include "api/seabreezeapi/SeaBreezeAPI.h"
#include "logout.h"
#include "QMetaEnum"
#include "QThread"
SensorQExPRO::SensorQExPRO(EMQEType qetype)
{
QEType = qetype;
if (qetype==QEPRO_QE)
{
}
else if(qetype == USB2000PLUS_QE)
{
}
else
{
OutputMod = nullptr;
Shuteroffcom = nullptr;
Shuteroncom = nullptr;
}
}
SensorQExPRO::~SensorQExPRO()
{
if (SensorInfo.isSensorInit)
{
sbapi_shutdown();
}
}
bool SensorQExPRO::initSensor(int id)
{
//sbapi_shutdown();
sbapi_initialize();
sbapi_probe_devices();
int number_of_QE = sbapi_get_number_of_device_ids();
logout::out("找到 " + QString::number(number_of_QE) + "个设备",2);
if (number_of_QE <= id)
{
return false;
}
Device_ids=new long[number_of_QE]();
sbapi_get_device_ids(Device_ids, number_of_QE);
logout::out("设备id为" + QString::number(Device_ids[id]),2);
DeviceId = Device_ids[id];
char namearr[100];
//获取名称
FLAG= sbapi_get_device_type(DeviceId, &ERR, namearr, 99);
if (FLAG!=0)
{
QString sensorname = QString(namearr);
QEType = getEMUbyQstring(sensorname);
SensorType = sensorname;
SensorInfo.SensorName = sensorname;
logout::out("设备型号:" + sensorname,2);
}
Sensorid = DeviceId;
//打开设备
FLAG= sbapi_open_device(DeviceId, &ERR);
logout::out("设备打开:" + QString(sbapi_get_error_string(ERR)),2);
if (FLAG!=0)
{
//如果失败 返回false
return false;
}
SensorInfo.isSensorInit = true;
int maxf=sbapi_get_number_of_shutter_features(DeviceId, &ERR);;
long fff;
// sbapi_get_shutter_features(DeviceId, &ERR, &fff,maxf);
// sbapi_shutter_set_shutter_open(DeviceId, fff,&ERR, 0);
// logout::out("设备打开:" + QString(sbapi_get_error_string(ERR)));
// qDebug() << "hello";
SensorInfo=GetSensorInfo();
//为温度二设置的
Numberoftempratrue= sbapi_get_number_of_thermo_electric_features(DeviceId, &ERR);
TemPratrueId=new long[Numberoftempratrue]();
Numberoftempratrue=sbapi_get_thermo_electric_features(DeviceId, &ERR, TemPratrueId, Numberoftempratrue);
sbapi_tec_set_enable(DeviceId, TemPratrueId[0], &ERR, 1);
return true;
}
void SensorQExPRO::Settingshuttertime(float msc)
{
if (!SensorInfo.isSensorInit)
{
return;
}
shuttertime = msc;
sbapi_spectrometer_set_integration_time_micros(DeviceId, SpecMetersId[0], &ERR, msc*1000);
//logout::out("设置曝光时间:" + QString(sbapi_get_error_string(ERR)),2);
}
void SensorQExPRO::SettingTemprature(float temp)
{
sbapi_tec_set_temperature_setpoint_degrees_C(DeviceId, TemPratrueId[0], &ERR,temp);
QThread::msleep(100);
}
STRSensorInfo SensorQExPRO::GetSensorInfo()
{
STRSensorInfo sensorinof;
//return sensorinof;
if (!SensorInfo.isSensorInit)
{
return sensorinof;
}
int ERR=0;
sensorinof.isSensorInit = true;
sensorinof.BandNum= sbapi_get_number_of_spectrometer_features(DeviceId, &ERR);
SpecMetersId = new long[sensorinof.BandNum]();
int numm= sbapi_get_spectrometer_features(DeviceId, &ERR, SpecMetersId, sensorinof.BandNum);
sensorinof.BandNum = sbapi_spectrometer_get_formatted_spectrum_length(DeviceId, SpecMetersId[0], &ERR);
double *wavelenth = new double[sensorinof.BandNum]();
sbapi_spectrometer_get_wavelengths(DeviceId, SpecMetersId[0], &ERR,wavelenth, sensorinof.BandNum);
sensorinof.wavelenthlist.clear();
sensorinof.WavelenthStr = "";
int i = 0;
for (i = 0; i < sensorinof.BandNum-1; i++)
{
sensorinof.WavelenthStr = sensorinof.WavelenthStr + QString::number(wavelenth[i], 'f', 4)+",";
sensorinof.wavelenthlist.append(QString::number(wavelenth[i], 'f', 4));
}
sensorinof.WavelenthStr = sensorinof.WavelenthStr + QString::number(wavelenth[i], 'f', 4);
sensorinof.wavelenthlist.append(QString::number(wavelenth[i], 'f', 4));
sensorinof.maxValue = sbapi_spectrometer_get_maximum_intensity(DeviceId, SpecMetersId[0], &ERR);
char namearr[100];
//获取名称
FLAG = sbapi_get_device_type(DeviceId, &ERR, namearr, 99);
if (FLAG != 0)
{
QString sensorname = QString(namearr);
QEType = getEMUbyQstring(sensorname);
SensorType = sensorname;
sensorinof.SensorName = sensorname;
logout::out("设备型号:" + sensorname, 2);
}
return sensorinof;
}
void SensorQExPRO::SettingShutterOpen(bool isopen)
{
//树莓派 4针脚
system("gpio mode 4 output");
if (isopen)
{
system("gpio write 4 1");
logout::out("打开 Shutter gpio",2);
}
else
{
system("gpio write 4 0");
logout::out("关闭 Shutter gpio",2);
}
if (QEType==QEPRO_QE)
{
SetQEProShutter(isopen);
}
QThread::msleep(100);
}
void SensorQExPRO::SettingSwitchShutter(bool isright)
{
system("gpio mode 5 output");
if (isright)
{
system("gpio write 5 1");
logout::out("切换至SKY",2);
}
else
{
system("gpio write 5 0");
logout::out("切换至VEG",2);
}
}
void SensorQExPRO::GetOnePlot(STROnePlot &OnePlot, bool Dark)
{
if (!SensorInfo.isSensorInit)
{
return;
}
if (!OnePlot.isInit || OnePlot.BandNum != SensorInfo.BandNum)
{
if (OnePlot.isInit)
{
delete[] OnePlot.Plot;
}
OnePlot.Plot = new float[SensorInfo.BandNum];
OnePlot.BandNum = SensorInfo.BandNum;
}
if (!SensorInfo.isSensorInit)
{
return;
}
double *tempvalue = new double[SensorInfo.BandNum];
OnePlot.shutter = shuttertime;
sbapi_spectrometer_get_formatted_spectrum(DeviceId,SpecMetersId[0], &ERR, tempvalue, SensorInfo.BandNum);
logout::out("获取数据:" + QString(sbapi_get_error_string(ERR)),5);
if (QEType != USB2000PLUS_QE)
{
OnePlot.temp = GettingTempratrue();
logout::out("获取温度:" + QString(sbapi_get_error_string(ERR)) + " 温度为:" + QString::number(OnePlot.temp, 'f', 2) + "",2);
}
for (size_t i = 0; i < SensorInfo.BandNum; i++)
{
OnePlot.Plot[i] = tempvalue[i];
}
OnePlot.isInit = true;
delete[] tempvalue;
}
float SensorQExPRO::GettingTempratrue()
{
if (!SensorInfo.isSensorInit)
{
return -1000;
}
float temperature = (float)sbapi_tec_read_temperature_degrees_C(DeviceId, TemPratrueId[0], &ERR);
logout::out("当前温度为:"+QString::number(temperature,'f',2),2);
return temperature;
}
void SensorQExPRO::CloseSensor()
{
if (SensorInfo.isSensorInit)
{
sbapi_shutdown();
SensorInfo.isSensorInit = false;
}
}
void SensorQExPRO::GetOneDark(STROnePlot &darkplot)
{
}
EMQEType SensorQExPRO::getEMUbyQstring(QString str)
{
if (str=="USB2000PLUS")
{
return USB2000PLUS_QE;
}
if (str == "QE65PRO")
{
return QE65PRO_QE;
}
if (str == "QE-PRO")
{
return QEPRO_QE;
}
if (str == "QE65000")
{
return QE65000_QE;
}
return NONQE;
}
void SensorQExPRO::SetQEProShutter( bool isopen)
{
unsigned char GPIO4output[64] = { 0xc1, 0xc0, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00,
0x10, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc5, 0xc4, 0xc3, 0xc2
};
unsigned char GPIO4on[64] = { 0xc1, 0xc0, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00,
0x10, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc5, 0xc4, 0xc3, 0xc2
};
unsigned char GPIO4_off[64] = { 0xc1, 0xc0, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00,
0x10, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc5, 0xc4, 0xc3, 0xc2
};
long FNid;
int FN = sbapi_get_number_of_raw_usb_bus_access_features(DeviceId, &ERR);
FN = sbapi_get_raw_usb_bus_access_features(DeviceId, &ERR, &FNid, FN);
QThread::msleep(100);
int lenth = sbapi_raw_usb_bus_access_write(DeviceId, FNid, &ERR, GPIO4output, 64, 0x01);
logout::out("设置shutter 为gpio",2);
if (isopen)
{
lenth = sbapi_raw_usb_bus_access_write(DeviceId, FNid, &ERR, GPIO4on, 64, 0x01);
logout::out("打开内部Shutter",2);
}
else
{
lenth = sbapi_raw_usb_bus_access_write(DeviceId, FNid, &ERR, GPIO4_off, 64, 0x01);
logout::out("关闭内部Shutter",2);
}
}