mirror of
http://172.16.0.230/r/SIF/TowerOptoSifAndSpectral.git
synced 2025-10-19 03:49:42 +08:00
328 lines
8.4 KiB
C++
328 lines
8.4 KiB
C++
#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);
|
||
}
|
||
|
||
|
||
}
|