mirror of
				http://172.16.0.230/r/SIF/TowerOptoSifAndSpectral.git
				synced 2025-10-25 05:49:43 +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);
 | ||
| 	}
 | ||
| 	
 | ||
| 
 | ||
| }
 |