mirror of
http://172.16.0.230/r/SIF/TowerOptoSifAndSpectral.git
synced 2025-10-18 19:39:43 +08:00
438 lines
11 KiB
C++
438 lines
11 KiB
C++
#include "OControl_USB.h"
|
||
#include <iostream>
|
||
#include <cstring>
|
||
|
||
OceanOptics_lib::OceanOptics_lib()
|
||
{
|
||
m_iSpectralmeterHandle = -100;
|
||
}
|
||
OceanOptics_lib::~OceanOptics_lib()
|
||
{
|
||
|
||
}
|
||
|
||
//使用头文件:#include "api/SeaBreezeWrapper.h"
|
||
int OceanOptics_lib::Initialize(bool bIsUSBMode, ZZ_U8 ucPortNumber, std::string strDeviceName)
|
||
{
|
||
int flag;
|
||
int error;
|
||
//char type[16];
|
||
int device_count = 0;
|
||
int i;
|
||
|
||
for (i = 0; i < SEABREEZE_MAX_DEVICES; i++)
|
||
{
|
||
//printf("\nOpening spectrometer %d.\n", i);
|
||
flag = seabreeze_open_spectrometer(i, &error);
|
||
//printf("Open spectrometer result is (%d) [%s]\n", flag, get_error_string(error));
|
||
if (0 == flag)
|
||
{
|
||
device_count++;
|
||
}
|
||
string sn = GetSerialNumber(i);
|
||
|
||
if (strcmp(sn.c_str(), strDeviceName.c_str()) == 0)
|
||
{
|
||
m_iSpectralmeterHandle = i;
|
||
//printf("\nfind!!!!!!!!!!!!\n");
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
//printf("\nClosing spectrometer %d.\n", i);
|
||
flag = seabreeze_close_spectrometer(i, &error);
|
||
//printf("Close spectrometer result is (%d) [%s]\n", flag, get_error_string(error));
|
||
}
|
||
}
|
||
|
||
if (m_iSpectralmeterHandle == -100)
|
||
{
|
||
//printf("\nNo!!!!!!!!!!!!\n");
|
||
return 1;
|
||
}
|
||
|
||
|
||
|
||
//设置初始积分时间
|
||
long minimum_time;
|
||
|
||
minimum_time = seabreeze_get_min_integration_time_microsec(m_iSpectralmeterHandle, &error);
|
||
//printf("...Minimum is %ld microseconds, result is [%s]\n", minimum_time, get_error_string(error));
|
||
if (minimum_time < 0) {
|
||
/* If there was an error, reset to a time that is supported widely. */
|
||
minimum_time = 15000;
|
||
return 1;
|
||
}
|
||
|
||
//SetExposureTime(minimum_time);
|
||
|
||
return 0;
|
||
}
|
||
|
||
//使用头文件:#include "api/SeaBreezeWrapper.h"
|
||
int OceanOptics_lib::Initialize()
|
||
{
|
||
int flag;
|
||
int error;
|
||
//char type[16];
|
||
int device_count = 0;
|
||
int i;
|
||
|
||
for (i = 0; i < SEABREEZE_MAX_DEVICES; i++)
|
||
{
|
||
//printf("\nOpening spectrometer %d.\n", i);
|
||
flag = seabreeze_open_spectrometer(i, &error);
|
||
//printf("Open spectrometer result is (%d) [%s]\n", flag, get_error_string(error));
|
||
if (0 == flag)
|
||
{
|
||
m_iSpectralmeterHandle = i;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (m_iSpectralmeterHandle == -100)
|
||
{
|
||
//printf("\nNo!!!!!!!!!!!!\n");
|
||
return 1;
|
||
}
|
||
|
||
//设置初始积分时间
|
||
long minimum_time;
|
||
|
||
minimum_time = seabreeze_get_min_integration_time_microsec(m_iSpectralmeterHandle, &error);
|
||
//printf("...Minimum is %ld microseconds, result is [%s]\n", minimum_time, get_error_string(error));
|
||
if (minimum_time < 0) {
|
||
/* If there was an error, reset to a time that is supported widely. */
|
||
minimum_time = 15000;
|
||
}
|
||
|
||
SetExposureTime(minimum_time);
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
//使用头文件:#include "api/seabreezeapi/SeaBreezeAPI.h"
|
||
//int OceanOptics_lib::Initialize(bool bIsUSBMode,ZZ_U8 ucPortNumber,std::string strDeviceName)
|
||
//{
|
||
// int number_of_devices;
|
||
// long *device_ids;
|
||
// int i;
|
||
// int flag;
|
||
// int error = 0;
|
||
// char nameBuffer[80];
|
||
// char *serialNumber;
|
||
//
|
||
//
|
||
//// /* Give the driver a chance to initialize itself */
|
||
//// sbapi_initialize();
|
||
//
|
||
// printf("Probing for devices...\n"); fflush(stdout);
|
||
// sbapi_probe_devices();
|
||
//
|
||
// printf("Getting device count...\n"); fflush(stdout);
|
||
// number_of_devices = sbapi_get_number_of_device_ids();
|
||
// std::cout<<"Device count is "<< number_of_devices <<std::endl;
|
||
// if(0 == number_of_devices) {
|
||
// return 0;
|
||
// }
|
||
//
|
||
// printf("Getting device IDs...\n");
|
||
// device_ids = (long *)calloc(number_of_devices, sizeof(long));
|
||
// number_of_devices = sbapi_get_device_ids(device_ids, number_of_devices);
|
||
// printf("Got %d device ID%s.\n", number_of_devices, number_of_devices == 1 ? "" : "s"); fflush(stdout);
|
||
//
|
||
//
|
||
// for(i = 0; i < number_of_devices; i++)
|
||
// {
|
||
// printf("%d: Device 0x%02lX:\n", i, device_ids[i]);
|
||
//// printf("\tGetting device type...\n");
|
||
// flag = sbapi_get_device_type(device_ids[i], &error, nameBuffer, 79);
|
||
//// printf("\t\tResult is (%d) [%s]\n", flag, sbapi_get_error_string(error));
|
||
// if(flag > 0) {
|
||
// printf("\tDevice type: [%s]\n", nameBuffer);
|
||
// }
|
||
//
|
||
// serialNumber = GetSerialNumber(device_ids[i]);
|
||
// serialNumber = GetSerialNumber(device_ids[i]);
|
||
//
|
||
// printf("\tSerial number tc: [%s]\n", serialNumber);
|
||
//
|
||
//// /* Open the device */
|
||
//// printf("\tAttempting to open:\n");
|
||
//// flag = sbapi_open_device(device_ids[i], &error);
|
||
//// printf("\t\tResult is (%d) [%s]\n", flag, sbapi_get_error_string(error));
|
||
////
|
||
//// // jump to the next iteration if there was a problem
|
||
//// if(flag != 0) {
|
||
//// continue;
|
||
//// }
|
||
////
|
||
//// // log deviations
|
||
//// unsupportedFeatureCount=0;
|
||
//// testFailureCount=0;
|
||
////
|
||
//// /* Test the device */
|
||
//// for(test_index = 0; test_index < __test_function_count; test_index++) {
|
||
//// /* Invoke each of the test functions against this device */
|
||
//// __test_functions[test_index](device_ids[i], &unsupportedFeatureCount, &testFailureCount);
|
||
//// }
|
||
////
|
||
//// /* Close the device */
|
||
//// printf("\tAttempting to close:\n");
|
||
//// sbapi_close_device(device_ids[i], &error);
|
||
//// printf("\t\tResult is (%d) [%s]\n", flag, sbapi_get_error_string(error));
|
||
//// printf("%d: Device 0x%02lX: \n\tNumber of unsupported features = %d\n\tNumber of test failures = %d\n", i, device_ids[i], unsupportedFeatureCount, testFailureCount);
|
||
// }
|
||
//
|
||
// flag = sbapi_get_device_type(device_ids[i], &error, nameBuffer, 79);
|
||
//
|
||
// return 1;
|
||
//}
|
||
|
||
//关闭设备
|
||
void OceanOptics_lib::Close()
|
||
{
|
||
int flag;
|
||
int error;
|
||
|
||
flag = seabreeze_close_spectrometer(m_iSpectralmeterHandle, &error);
|
||
//printf("Close spectrometer result is (%d) [%s]\n", flag, get_error_string(error));
|
||
}
|
||
|
||
//单次数据采集
|
||
int OceanOptics_lib::SingleShot(DataFrame &dfData)
|
||
{
|
||
if (m_iSpectralmeterHandle == -100)
|
||
{
|
||
//printf("\nNo!!!!!!!!!!!!\n");
|
||
return 1;
|
||
}
|
||
|
||
int error;
|
||
int flag;
|
||
int spec_length;
|
||
double *spectrum = 0;
|
||
|
||
//printf("\n\nGetting formatted spectrum length.\n");
|
||
spec_length = seabreeze_get_formatted_spectrum_length(m_iSpectralmeterHandle, &error);
|
||
//printf("Get formatted spectrum_length result is (%d) [%s]\n", spec_length, get_error_string(error));
|
||
|
||
if (spec_length > 0)
|
||
{
|
||
spectrum = (double *)calloc((size_t)spec_length, sizeof(double));
|
||
|
||
//printf("\nGetting a formatted spectrum.\n");
|
||
flag = seabreeze_get_formatted_spectrum(m_iSpectralmeterHandle, &error, spectrum, spec_length);
|
||
//printf("Get formatted spectrum result is (%d) [%s]\n", flag, get_error_string(error));
|
||
//printf("\tPixel value 20 is %1.2f\n", spectrum[20]);
|
||
|
||
for (int tmp = 0; tmp < spec_length; tmp++)
|
||
{
|
||
dfData.usData[tmp] = spectrum[tmp];
|
||
}
|
||
|
||
int exposureTimeInMS;
|
||
GetExposureTime(exposureTimeInMS);
|
||
dfData.usExposureTimeInMS = exposureTimeInMS;
|
||
|
||
float temperature;
|
||
GetDeviceTemperature(temperature);
|
||
dfData.fTemperature = temperature;
|
||
|
||
free(spectrum);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
//设置曝光时间
|
||
int OceanOptics_lib::SetExposureTime(int iExposureTimeInMS)
|
||
{
|
||
iExposureTimeInMS = iExposureTimeInMS * 1000;
|
||
if (m_iSpectralmeterHandle == -100)
|
||
{
|
||
//printf("\nNo!!!!!!!!!!!!\n");
|
||
return 1;
|
||
}
|
||
|
||
int error;
|
||
|
||
seabreeze_set_integration_time_microsec(m_iSpectralmeterHandle, &error, iExposureTimeInMS);
|
||
//printf("Set integration time result is [%s]\n", get_error_string(error));
|
||
|
||
m_iExposureTime = iExposureTimeInMS;
|
||
|
||
return 0;
|
||
}
|
||
|
||
//获取曝光时间设置
|
||
int OceanOptics_lib::GetExposureTime(int &iExposureTimeInMS)
|
||
{
|
||
if (m_iSpectralmeterHandle == -100)
|
||
{
|
||
//printf("\nNo!!!!!!!!!!!!\n");
|
||
return 1;
|
||
}
|
||
|
||
iExposureTimeInMS = m_iExposureTime;
|
||
|
||
return 0;
|
||
}
|
||
|
||
//设置目标温度
|
||
int OceanOptics_lib::SetDeviceTemperature(float fTemperature)
|
||
{
|
||
if (m_iSpectralmeterHandle == -100)
|
||
{
|
||
//printf("\nNo!!!!!!!!!!!!\n");
|
||
return 1;
|
||
}
|
||
|
||
int error;
|
||
|
||
//printf("\nSetting TEC temperature to -5C\n");
|
||
seabreeze_set_tec_temperature(m_iSpectralmeterHandle, &error, fTemperature);
|
||
//printf("Set tec temperature result is [%s]\n", get_error_string(error));
|
||
|
||
//printf("\nSetting TEC enable to true\n");
|
||
seabreeze_set_tec_enable(m_iSpectralmeterHandle, &error, 1);
|
||
//printf("Set tec enable result is [%s]\n", get_error_string(error));
|
||
|
||
return 0;
|
||
}
|
||
|
||
//获取温度设置
|
||
int OceanOptics_lib::GetDeviceTemperature(float &fTemperature)
|
||
{
|
||
if (m_iSpectralmeterHandle == -100)
|
||
{
|
||
//printf("\nNo!!!!!!!!!!!!\n");
|
||
return 1;
|
||
}
|
||
|
||
double temp;
|
||
int error;
|
||
|
||
// usleep(1000000);
|
||
//printf("\nGetting TEC temperature\n");
|
||
temp = seabreeze_read_tec_temperature(m_iSpectralmeterHandle, &error);
|
||
//printf("Read tec temperature result is %1.2f C [%s]\n", temp, get_error_string(error));
|
||
|
||
fTemperature = temp;
|
||
|
||
return 0;
|
||
}
|
||
|
||
//获取设备信息
|
||
int OceanOptics_lib::GetDeviceInfo(DeviceInfo &Info)
|
||
{
|
||
if (m_iSpectralmeterHandle == -100)
|
||
{
|
||
//printf("\nNo!!!!!!!!!!!!\n");
|
||
return 1;
|
||
}
|
||
|
||
string deviceType = GetDeviceType(m_iSpectralmeterHandle);
|
||
string SN = GetSerialNumber(m_iSpectralmeterHandle);
|
||
|
||
Info.strPN = deviceType;
|
||
Info.strSN = SN;
|
||
|
||
return 0;
|
||
}
|
||
|
||
//获取设备特征数据
|
||
int OceanOptics_lib::GetDeviceAttribute(DeviceAttribute &Attr)
|
||
{
|
||
if (m_iSpectralmeterHandle == -100)
|
||
{
|
||
//printf("\nNo!!!!!!!!!!!!\n");
|
||
return 1;
|
||
}
|
||
|
||
int error;
|
||
int flag;
|
||
int spec_length;
|
||
double *wls = 0;
|
||
|
||
//printf("\n\nGetting formatted spectrum length.\n");
|
||
spec_length = seabreeze_get_formatted_spectrum_length(m_iSpectralmeterHandle, &error);
|
||
//printf("Get formatted spectrum length result is (%d) [%s]\n", spec_length, get_error_string(error));
|
||
|
||
Attr.iPixels = spec_length;
|
||
Attr.iMinIntegrationTimeInMS = 0;
|
||
Attr.iMaxIntegrationTimeInMS = 60000;
|
||
|
||
if (spec_length > 0) {
|
||
wls = (double *)calloc((size_t)spec_length, sizeof(double));
|
||
|
||
//printf("\nGetting wavelengths.\n");
|
||
flag = seabreeze_get_wavelengths(m_iSpectralmeterHandle, &error, wls, spec_length);
|
||
//printf("Get wavelengths result is (%d) [%s]\n", flag, get_error_string(error));
|
||
//printf("\tPixel 20 is wavelength %1.2f nm\n", wls[20]);
|
||
|
||
for (int tmp = 0; tmp < spec_length; tmp++)
|
||
{
|
||
Attr.fWaveLengthInNM[tmp] = wls[tmp];
|
||
}
|
||
|
||
free(wls);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
bool OceanOptics_lib::isSuccess(char* resultStr)
|
||
{
|
||
if (strstr(resultStr, "Success") == NULL)//在a中查找b,如果不存在,
|
||
{
|
||
cout << "not found\n";//输出结果。
|
||
return true;
|
||
}
|
||
else//否则存在。
|
||
{
|
||
cout << "found\n"; //输出结果。
|
||
return false;
|
||
}
|
||
}
|
||
const char* OceanOptics_lib::get_error_string(int error)
|
||
{
|
||
static char buffer[32];
|
||
seabreeze_get_error_string(error, buffer, sizeof(buffer));
|
||
return buffer;
|
||
}
|
||
|
||
string OceanOptics_lib::GetDeviceType(int index)
|
||
{
|
||
char type[16];
|
||
int error;
|
||
|
||
seabreeze_get_model(index, &error, type, sizeof(type));
|
||
//printf("...Result is (%s) [%s]\n", type, get_error_string(error));
|
||
type[15] = '\0';
|
||
|
||
string deviceType = type;
|
||
|
||
return deviceType;
|
||
}
|
||
|
||
string OceanOptics_lib::GetSerialNumber(int index)
|
||
{
|
||
static char serial_number[32];//如果不加static,此变量会定义在stack区,函数返回后,就无用了
|
||
int flag;
|
||
int error;
|
||
|
||
//printf("\n\nGetting serial number.\n");
|
||
flag = seabreeze_get_serial_number(index, &error, serial_number, 32);
|
||
//printf("Get serial number result is (%d) [%s]\n", flag, get_error_string(error));
|
||
serial_number[31] = '\0';
|
||
if (flag > 0) {
|
||
//printf("\tSerial number: [%s]\n", serial_number);
|
||
}
|
||
|
||
string sn = serial_number;
|
||
|
||
return sn;
|
||
}
|