From efbcde38d78869c530f50e380b6b7fa9170009ff Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Thu, 2 Dec 2021 18:07:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BB=E9=87=87=E9=9B=86=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=AD=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=86=99=E6=96=87=E4=BB=B6=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CmakeLists.txt | 4 + config/DeviceSettings.ini | 25 +- config/DeviceSettings_Test_OSIF.ini | 12 - config/isif+is1/DeviceSettings.ini | 20 + main.cpp | 11 + source/FS/ATPDataFileProcessor.cpp | 0 source/FS/ATPDataFileProcessor.h | 1 - source/FS/DataFileProcessor.cpp | 125 + source/FS/DataFileProcessor.h | 28 + source/FS/OControl_USB.cpp | 437 +++ source/FS/OControl_USB.h | Bin 0 -> 2400 bytes source/OSIF/DLib/SeaBreeze.dll | Bin 0 -> 2670080 bytes source/OSIF/DLib/SeaBreeze.lib | Bin 0 -> 129806 bytes source/OSIF/include/api/DeviceFactory.h | 63 + source/OSIF/include/api/DllDecl.h | 56 + source/OSIF/include/api/SeaBreezeWrapper.h | 864 ++++++ .../AcquisitionDelayFeatureAdapter.h | 63 + .../ContinuousStrobeFeatureAdapter.h | 56 + .../seabreezeapi/DataBufferFeatureAdapter.h | 63 + .../include/api/seabreezeapi/DeviceAdapter.h | 308 ++ .../api/seabreezeapi/EEPROMFeatureAdapter.h | 57 + .../seabreezeapi/FeatureAdapterInterface.h | 57 + .../api/seabreezeapi/FeatureAdapterTemplate.h | 87 + .../api/seabreezeapi/FeatureFamilies.h | 200 ++ .../api/seabreezeapi/IrradCalFeatureAdapter.h | 62 + .../seabreezeapi/LightSourceFeatureAdapter.h | 69 + .../NonlinearityCoeffsFeatureAdapter.h | 57 + .../seabreezeapi/OpticalBenchFeatureAdapter.h | 62 + .../seabreezeapi/PixelBinningFeatureAdapter.h | 68 + .../api/seabreezeapi/ProtocolFamilies.h | 87 + .../RawUSBBusAccessFeatureAdapter.h | 57 + .../api/seabreezeapi/RevisionFeatureAdapter.h | 58 + .../include/api/seabreezeapi/SeaBreezeAPI.h | 2481 +++++++++++++++++ .../api/seabreezeapi/SeaBreezeAPIConstants.h | 55 + .../seabreezeapi/SerialNumberFeatureAdapter.h | 58 + .../api/seabreezeapi/ShutterFeatureAdapter.h | 56 + .../seabreezeapi/SpectrometerFeatureAdapter.h | 74 + .../SpectrumProcessingFeatureAdapter.h | 60 + .../StrayLightCoeffsFeatureAdapter.h | 57 + .../seabreezeapi/StrobeLampFeatureAdapter.h | 56 + .../seabreezeapi/TemperatureFeatureAdapter.h | 58 + .../ThermoElectricCoolerFeatureAdapter.h | 61 + source/OSIF/include/common/ByteVector.h | 63 + source/OSIF/include/common/Data.h | 62 + source/OSIF/include/common/DoubleVector.h | 62 + source/OSIF/include/common/FloatVector.h | 62 + source/OSIF/include/common/Log.h | 132 + source/OSIF/include/common/SeaBreeze.h | 45 + source/OSIF/include/common/U32Vector.h | 77 + source/OSIF/include/common/UShortVector.h | 64 + source/OSIF/include/common/UnitDescriptor.h | 46 + source/OSIF/include/common/buses/Bus.h | 66 + .../OSIF/include/common/buses/BusFamilies.h | 86 + source/OSIF/include/common/buses/BusFamily.h | 54 + .../buses/DeviceLocationProberInterface.h | 58 + .../common/buses/DeviceLocatorInterface.h | 82 + .../include/common/buses/TransferHelper.h | 58 + .../buses/network/IPv4NetworkProtocol.h | 75 + .../buses/network/IPv4SocketDeviceLocator.h | 66 + .../common/buses/network/TCPIPv4SocketBus.h | 75 + .../network/TCPIPv4SocketTransferHelper.h | 52 + .../common/buses/rs232/RS232DeviceLocator.h | 65 + .../common/buses/rs232/RS232Interface.h | 63 + .../common/buses/rs232/RS232TransferHelper.h | 65 + .../common/buses/usb/USBDeviceLocator.h | 59 + .../include/common/buses/usb/USBInterface.h | 64 + .../common/buses/usb/USBTransferHelper.h | 66 + source/OSIF/include/common/devices/Device.h | 129 + .../common/exceptions/BusConnectException.h | 49 + .../include/common/exceptions/BusException.h | 50 + .../common/exceptions/BusTransferException.h | 48 + .../exceptions/FeatureControlException.h | 47 + .../common/exceptions/FeatureException.h | 50 + .../FeatureProtocolNotFoundException.h | 48 + .../exceptions/IllegalArgumentException.h | 50 + .../common/exceptions/NumberFormatException.h | 49 + .../exceptions/ProtocolBusMismatchException.h | 49 + .../common/exceptions/ProtocolException.h | 51 + .../exceptions/ProtocolFormatException.h | 50 + .../exceptions/ProtocolTransactionException.h | 51 + source/OSIF/include/common/features/Feature.h | 71 + .../include/common/features/FeatureFamily.h | 56 + .../include/common/features/FeatureImpl.h | 88 + source/OSIF/include/common/globals.h | 65 + .../OSIF/include/common/protocols/Exchange.h | 59 + .../OSIF/include/common/protocols/Protocol.h | 62 + .../include/common/protocols/ProtocolFamily.h | 55 + .../include/common/protocols/ProtocolHelper.h | 60 + .../include/common/protocols/ProtocolHint.h | 73 + .../include/common/protocols/Transaction.h | 82 + .../OSIF/include/common/protocols/Transfer.h | 93 + .../include/native/network/Inet4Address.h | 62 + source/OSIF/include/native/network/Socket.h | 80 + .../include/native/network/SocketException.h | 44 + .../native/network/SocketTimeoutException.h | 45 + .../native/network/UnknownHostException.h | 44 + .../native/network/posix/NativeSocketPOSIX.h | 71 + .../network/windows/NativeSocketWindows.h | 73 + .../OSIF/include/native/rs232/NativeRS232.h | 61 + source/OSIF/include/native/rs232/RS232.h | 66 + .../native/rs232/windows/NativeRS232Windows.h | 55 + .../OSIF/include/native/system/NativeSystem.h | 53 + source/OSIF/include/native/system/System.h | 51 + source/OSIF/include/native/usb/NativeUSB.h | 226 ++ source/OSIF/include/native/usb/USB.h | 84 + source/OSIF/include/native/usb/USBDiscovery.h | 64 + .../include/native/usb/winusb/WindowsGUID.h | 47 + .../OceanOptics/buses/network/BlazeTCPIPv4.h | 46 + .../OceanOptics/buses/network/JazTCPIPv4.h | 47 + .../buses/rs232/OOIRS232Interface.h | 59 + .../vendors/OceanOptics/buses/usb/ApexUSB.h | 48 + .../vendors/OceanOptics/buses/usb/BlazeUSB.h | 48 + .../buses/usb/BlazeUSBTransferHelper.h | 61 + .../OceanOptics/buses/usb/FlameNIRUSB.h | 47 + .../OceanOptics/buses/usb/HR2000PlusUSB.h | 49 + .../vendors/OceanOptics/buses/usb/HR2000USB.h | 48 + .../vendors/OceanOptics/buses/usb/HR4000USB.h | 48 + .../vendors/OceanOptics/buses/usb/JazUSB.h | 48 + .../OceanOptics/buses/usb/Maya2000ProUSB.h | 48 + .../OceanOptics/buses/usb/Maya2000USB.h | 48 + .../OceanOptics/buses/usb/MayaLSLUSB.h | 48 + .../OceanOptics/buses/usb/NIRQuest256USB.h | 48 + .../OceanOptics/buses/usb/NIRQuest512USB.h | 48 + .../usb/OOIUSB4KSpectrumTransferHelper.h | 61 + .../buses/usb/OOIUSBControlTransferHelper.h | 47 + .../buses/usb/OOIUSBEndpointMaps.h | 123 + .../OceanOptics/buses/usb/OOIUSBInterface.h | 76 + .../OceanOptics/buses/usb/OOIUSBProductID.h | 56 + .../buses/usb/OOIUSBSpectrumTransferHelper.h | 47 + .../buses/usb/OOIUSBTrivialTransferHelper.h | 46 + .../OceanOptics/buses/usb/QE65000USB.h | 48 + .../vendors/OceanOptics/buses/usb/QEProUSB.h | 48 + .../vendors/OceanOptics/buses/usb/STSUSB.h | 48 + .../vendors/OceanOptics/buses/usb/SparkUSB.h | 48 + .../vendors/OceanOptics/buses/usb/TorusUSB.h | 48 + .../OceanOptics/buses/usb/USB2000PlusUSB.h | 48 + .../OceanOptics/buses/usb/USB2000USB.h | 48 + .../OceanOptics/buses/usb/USB4000USB.h | 48 + .../OceanOptics/buses/usb/VentanaUSB.h | 48 + .../vendors/OceanOptics/devices/Apex.h | 48 + .../vendors/OceanOptics/devices/Blaze.h | 48 + .../vendors/OceanOptics/devices/FlameNIR.h | 47 + .../vendors/OceanOptics/devices/HR2000.h | 49 + .../vendors/OceanOptics/devices/HR2000Plus.h | 48 + .../vendors/OceanOptics/devices/HR4000.h | 48 + .../include/vendors/OceanOptics/devices/Jaz.h | 48 + .../vendors/OceanOptics/devices/Maya2000.h | 48 + .../vendors/OceanOptics/devices/Maya2000Pro.h | 48 + .../vendors/OceanOptics/devices/MayaLSL.h | 48 + .../vendors/OceanOptics/devices/NIRQuest256.h | 48 + .../vendors/OceanOptics/devices/NIRQuest512.h | 48 + .../vendors/OceanOptics/devices/QE65000.h | 48 + .../vendors/OceanOptics/devices/QEPro.h | 48 + .../include/vendors/OceanOptics/devices/STS.h | 48 + .../vendors/OceanOptics/devices/Spark.h | 48 + .../vendors/OceanOptics/devices/Torus.h | 48 + .../vendors/OceanOptics/devices/USB2000.h | 48 + .../vendors/OceanOptics/devices/USB2000Plus.h | 48 + .../vendors/OceanOptics/devices/USB4000.h | 48 + .../vendors/OceanOptics/devices/Ventana.h | 53 + .../AcquisitionDelayFeature.h | 81 + .../AcquisitionDelayFeatureInterface.h | 67 + .../AcquisitionDelayFeature_FPGA.h | 79 + .../STSAcquisitionDelayFeature.h | 60 + .../ContinuousStrobeFeature.h | 59 + .../ContinuousStrobeFeatureInterface.h | 55 + .../ContinuousStrobeFeature_FPGA.h | 59 + .../data_buffer/DataBufferFeatureBase.h | 80 + .../data_buffer/DataBufferFeatureInterface.h | 75 + .../data_buffer/QEProDataBufferFeature.h | 49 + .../features/eeprom_slots/EEPROMSlotFeature.h | 62 + .../eeprom_slots/EEPROMSlotFeatureBase.h | 75 + .../eeprom_slots/EEPROMSlotFeatureInterface.h | 60 + .../NonlinearityEEPROMSlotFeature.h | 55 + .../SaturationEEPROMSlotFeature.h | 59 + .../SaturationEEPROMSlotFeatureBase.h | 67 + .../SaturationEEPROMSlotFeature_MayaPro.h | 57 + .../SaturationEEPROMSlotFeature_NIRQuest.h | 57 + .../SerialNumberEEPROMSlotFeature.h | 55 + .../StrayLightEEPROMSlotFeature.h | 55 + .../WavelengthEEPROMSlotFeature.h | 61 + .../WavelengthEEPROMSlotFeature_QE65000.h | 54 + .../fpga_register/FPGARegisterFeature.h | 57 + .../FPGARegisterFeatureInterface.h | 53 + .../features/irradcal/IrradCalFeature.h | 71 + .../irradcal/IrradCalFeatureInterface.h | 62 + .../light_source/LightSourceFeatureBase.h | 76 + .../light_source/LightSourceFeatureImpl.h | 57 + .../LightSourceFeatureInterface.h | 72 + .../features/light_source/StrobeLampFeature.h | 55 + .../light_source/StrobeLampFeatureInterface.h | 51 + .../light_source/VentanaLightSourceFeature.h | 49 + .../nonlinearity/NonlinearityCoeffsFeature.h | 57 + .../NonlinearityCoeffsFeatureInterface.h | 50 + .../optical_bench/OpticalBenchFeature.h | 70 + .../OpticalBenchFeatureInterface.h | 62 + .../PixelBinningFeatureInterface.h | 61 + .../pixel_binning/STSPixelBinningFeature.h | 89 + .../raw_bus_access/RawUSBBusAccessFeature.h | 55 + .../RawUSBBusAccessFeatureInterface.h | 52 + .../features/revision/RevisionFeature.h | 59 + .../revision/RevisionFeatureInterface.h | 52 + .../serial_number/SerialNumberFeature.h | 58 + .../SerialNumberFeatureInterface.h | 53 + .../features/shutter/ShutterFeature.h | 56 + .../shutter/ShutterFeatureInterface.h | 50 + .../spectrometer/ApexSpectrometerFeature.h | 52 + .../spectrometer/BlazeSpectrometerFeature.h | 56 + .../FlameNIRSpectrometerFeature.h | 53 + .../GainAdjustedSpectrometerFeature.h | 56 + .../HR2000PlusSpectrometerFeature.h | 51 + .../spectrometer/HR2000SpectrometerFeature.h | 51 + .../spectrometer/HR4000SpectrometerFeature.h | 51 + .../spectrometer/JazSpectrometerFeature.h | 52 + .../Maya2000ProSpectrometerFeature.h | 53 + .../Maya2000SpectrometerFeature.h | 51 + .../spectrometer/MayaLSLSpectrometerFeature.h | 52 + .../NIRQuest256SpectrometerFeature.h | 46 + .../NIRQuest512SpectrometerFeature.h | 46 + .../NIRQuestSpectrometerFeature.h | 54 + .../spectrometer/OOISpectrometerFeature.h | 111 + .../OOISpectrometerFeatureInterface.h | 95 + .../ProgrammableSaturationFeature.h | 60 + .../ProgrammableSaturationFeatureBase.h | 66 + .../ProgrammableSaturationFeatureImpl.h | 61 + .../ProgrammableSaturationFeatureInterface.h | 53 + .../spectrometer/QE65000SpectrometerFeature.h | 57 + .../spectrometer/QEProSpectrometerFeature.h | 55 + .../spectrometer/STSSpectrometerFeature.h | 74 + .../spectrometer/SparkSpectrometerFeature.h | 62 + .../spectrometer/SpectrometerTriggerMode.h | 70 + .../USB2000PlusSpectrometerFeature.h | 53 + .../spectrometer/USB2000SpectrometerFeature.h | 51 + .../spectrometer/USB4000SpectrometerFeature.h | 52 + .../spectrometer/VentanaSpectrometerFeature.h | 55 + .../SpectrumProcessingFeature.h | 68 + .../SpectrumProcessingFeatureInterface.h | 59 + .../stray_light/StrayLightCoeffsFeature.h | 57 + .../StrayLightCoeffsFeatureInterface.h | 50 + .../features/temperature/TemperatureFeature.h | 65 + .../temperature/TemperatureFeatureInterface.h | 54 + .../QEProThermoElectricFeature.h | 55 + .../ThermoElectricFeatureBase.h | 84 + .../ThermoElectricFeatureInterface.h | 64 + .../thermoelectric/ThermoElectricQEFeature.h | 68 + .../VentanaThermoElectricFeature.h | 63 + .../features/wavecal/WaveCalFeature.h | 59 + .../wavecal/WaveCalFeatureInterface.h | 50 + .../AcquisitionDelayProtocolInterface.h | 64 + .../ContinuousStrobeProtocolInterface.h | 58 + .../interfaces/DataBufferProtocolInterface.h | 77 + .../interfaces/EEPROMProtocolInterface.h | 63 + .../FPGARegisterProtocolInterface.h | 62 + .../interfaces/IrradCalProtocolInterface.h | 82 + .../interfaces/LightSourceProtocolInterface.h | 95 + .../NonlinearityCoeffsProtocolInterface.h | 61 + .../OpticalBenchProtocolInterface.h | 73 + .../PixelBinningProtocolInterface.h | 87 + .../ProgrammableSaturationProtocolInterface.h | 50 + .../interfaces/RevisionProtocolInterface.h | 65 + .../SerialNumberProtocolInterface.h | 63 + .../interfaces/ShutterProtocolInterface.h | 60 + .../SpectrometerProtocolInterface.h | 64 + .../SpectrumProcessingProtocolInterface.h | 67 + .../StrayLightCoeffsProtocolInterface.h | 61 + .../interfaces/StrobeLampProtocolInterface.h | 54 + .../interfaces/TemperatureProtocolInterface.h | 65 + .../ThermoElectricProtocolInterface.h | 73 + .../interfaces/WaveCalProtocolInterface.h | 62 + .../protocols/obp/constants/OBPMessageTypes.h | 166 ++ .../protocols/obp/exchanges/OBPCommand.h | 53 + .../OBPContinuousStrobeEnableExchange.h | 46 + .../OBPContinuousStrobePeriodExchange.h | 46 + .../exchanges/OBPDataBufferClearExchange.h | 46 + .../exchanges/OBPGetAllTemperaturesExchange.h | 45 + .../obp/exchanges/OBPGetBoxcarWidthExchange.h | 45 + .../OBPGetDataBufferCapacityExchange.h | 49 + .../OBPGetDataBufferElementCountExchange.h | 49 + .../OBPGetDataBufferMaximumCapacityExchange.h | 49 + .../OBPGetDefaultPixelBinningExchange.h | 46 + .../OBPGetFirmwareRevisionExchange.h | 45 + .../OBPGetHardwareRevisionExchange.h | 45 + .../obp/exchanges/OBPGetIrradCalExchange.h | 45 + .../OBPGetIrradCollectionAreaExchange.h | 45 + .../exchanges/OBPGetMaxPixelBinningExchange.h | 46 + .../OBPGetNonlinearityCoeffExchange.h | 47 + .../OBPGetNonlinearityCoeffsCountExchange.h | 45 + .../OBPGetOpticalBenchCoatingExchange.h | 45 + ...OpticalBenchFiberDiameterMicronsExchange.h | 45 + .../OBPGetOpticalBenchFilterExchange.h | 45 + .../OBPGetOpticalBenchGratingExchange.h | 45 + .../exchanges/OBPGetOpticalBenchIDExchange.h | 45 + .../OBPGetOpticalBenchSerialNumberExchange.h | 45 + ...PGetOpticalBenchSlitWidthMicronsExchange.h | 45 + .../exchanges/OBPGetPixelBinningExchange.h | 46 + .../obp/exchanges/OBPGetSaturationExchange.h | 49 + .../exchanges/OBPGetScansToAverageExchange.h | 45 + .../exchanges/OBPGetSerialNumberExchange.h | 45 + .../OBPGetSerialNumberMaximumLengthExchange.h | 45 + .../exchanges/OBPGetStrayLightCoeffExchange.h | 47 + .../OBPGetStrayLightCoeffsCountExchange.h | 45 + .../OBPGetTemperatureCountExchange.h | 45 + .../obp/exchanges/OBPGetTemperatureExchange.h | 47 + .../OBPGetThermoElectricTemperatureExchange.h | 45 + .../obp/exchanges/OBPGetWaveCalExchange.h | 48 + .../exchanges/OBPIntegrationTimeExchange.h | 51 + .../obp/exchanges/OBPLampEnableCommand.h | 50 + .../exchanges/OBPLightSourceEnableCommand.h | 49 + .../exchanges/OBPLightSourceEnabledQuery.h | 53 + .../OBPLightSourceIntensityCommand.h | 50 + .../exchanges/OBPLightSourceIntensityQuery.h | 53 + .../protocols/obp/exchanges/OBPMessage.h | 105 + .../protocols/obp/exchanges/OBPQuery.h | 53 + .../OBPReadRawSpectrum32AndMetadataExchange.h | 59 + .../exchanges/OBPReadRawSpectrumExchange.h | 55 + .../OBPReadSpectrum32AndMetadataExchange.h | 54 + .../obp/exchanges/OBPReadSpectrumExchange.h | 48 + .../OBPReadSpectrumWithGainExchange.h | 53 + ...estBufferedSpectrum32AndMetadataExchange.h | 45 + .../exchanges/OBPRequestRawSpectrumExchange.h | 45 + .../exchanges/OBPRequestSpectrumExchange.h | 45 + .../OBPSetAcquisitionDelayExchange.h | 50 + .../obp/exchanges/OBPSetBoxcarWidthExchange.h | 46 + .../OBPSetDataBufferCapacityExchange.h | 48 + .../OBPSetDefaultPixelBinningExchange.h | 47 + .../obp/exchanges/OBPSetIrradCalExchange.h | 46 + .../OBPSetIrradCollectionAreaExchange.h | 46 + .../exchanges/OBPSetPixelBinningExchange.h | 46 + .../exchanges/OBPSetScansToAverageExchange.h | 46 + .../OBPSetThermoElectricEnableExchange.h | 46 + .../OBPSetThermoElectricSetpointExchange.h | 46 + .../obp/exchanges/OBPShutterExchange.h | 46 + .../protocols/obp/exchanges/OBPTransaction.h | 84 + .../obp/exchanges/OBPTriggerModeExchange.h | 47 + .../protocols/obp/hints/OBPControlHint.h | 45 + .../protocols/obp/hints/OBPSpectrumHint.h | 45 + .../obp/impls/OBPAcquisitionDelayProtocol.h | 51 + .../obp/impls/OBPContinuousStrobeProtocol.h | 60 + .../obp/impls/OBPDataBufferProtocol.h | 71 + .../protocols/obp/impls/OBPIrradCalProtocol.h | 63 + .../obp/impls/OBPLightSourceProtocol.h | 86 + .../impls/OBPLightSourceProtocol_Ventana.h | 66 + .../obp/impls/OBPNonlinearityCoeffsProtocol.h | 51 + .../obp/impls/OBPOpticalBenchProtocol.h | 63 + .../obp/impls/OBPPixelBinningProtocol.h | 84 + .../impls/OBPProgrammableSaturationProtocol.h | 53 + .../protocols/obp/impls/OBPRevisionProtocol.h | 54 + .../obp/impls/OBPSerialNumberProtocol.h | 53 + .../protocols/obp/impls/OBPShutterProtocol.h | 54 + .../obp/impls/OBPSpectrometerProtocol.h | 79 + .../obp/impls/OBPSpectrumProcessingProtocol.h | 57 + .../obp/impls/OBPStrayLightCoeffsProtocol.h | 51 + .../obp/impls/OBPStrobeLampProtocol.h | 51 + .../obp/impls/OBPTemperatureProtocol.h | 56 + .../obp/impls/OBPThermoElectricProtocol.h | 57 + .../protocols/obp/impls/OBPWaveCalProtocol.h | 52 + .../protocols/obp/impls/OceanBinaryProtocol.h | 51 + .../ooi/constants/FPGARegisterCodes.h | 81 + .../protocols/ooi/constants/OpCodes.h | 83 + .../protocols/ooi/constants/QETECConstants.h | 36 + .../ooi/exchanges/FPGARegisterReadExchange.h | 45 + .../ooi/exchanges/FPGARegisterWriteExchange.h | 45 + .../ooi/exchanges/FPGASpectrumExchange.h | 50 + .../ooi/exchanges/FlameNIRSpectrumExchange.h | 59 + .../ooi/exchanges/HRFPGASpectrumExchange.h | 50 + .../ooi/exchanges/IntegrationTimeExchange.h | 54 + .../ooi/exchanges/JazSpectrumExchange.h | 57 + .../ooi/exchanges/MayaProSpectrumExchange.h | 58 + .../ooi/exchanges/NIRQuestSpectrumExchange.h | 57 + .../ooi/exchanges/OOI2KSpectrumExchange.h | 52 + .../ooi/exchanges/OOIIrradCalExchange.h | 51 + .../ooi/exchanges/OOIReadIrradCalExchange.h | 53 + .../ooi/exchanges/OOIWriteIrradCalExchange.h | 54 + .../ooi/exchanges/QESpectrumExchange.h | 50 + .../ooi/exchanges/ReadEEPROMSlotExchange.h | 46 + .../ooi/exchanges/ReadSpectrumExchange.h | 48 + .../exchanges/ReadTECQETemperatureExchange.h | 49 + .../exchanges/ReadTECTemperatureExchange.h | 45 + .../ooi/exchanges/RequestSpectrumExchange.h | 45 + .../ooi/exchanges/StrobeEnableExchange.h | 54 + .../ooi/exchanges/TECEnableExchange.h | 52 + .../ooi/exchanges/TECQEEnableExchange.h | 58 + .../ooi/exchanges/TriggerModeExchange.h | 54 + .../ooi/exchanges/USBFPGASpectrumExchange.h | 57 + .../ooi/exchanges/WriteEEPROMSlotExchange.h | 43 + .../exchanges/WriteTECQESetPointExchange.h | 58 + .../ooi/exchanges/WriteTECSetPointExchange.h | 52 + .../protocols/ooi/hints/ControlHint.h | 45 + .../protocols/ooi/hints/SpectrumHint.h | 45 + .../ooi/impls/FPGARegisterProtocol.h | 52 + .../protocols/ooi/impls/OOIEEPROMProtocol.h | 53 + .../protocols/ooi/impls/OOIIrradCalProtocol.h | 63 + .../protocols/ooi/impls/OOIProtocol.h | 51 + .../ooi/impls/OOISpectrometerProtocol.h | 79 + .../ooi/impls/OOIStrobeLampProtocol.h | 55 + .../protocols/ooi/impls/OOITECProtocol.h | 65 + .../vendors/OceanOptics/utils/Polynomial.h | 111 + source/Settings/SystemConfigger.cpp | 12 + source/Settings/SystemConfigger.h | 4 +- source/Thread/AbstractFSController.cpp | 89 +- source/Thread/AbstractFSController.h | 16 +- source/Thread/MainDataGrabber.cpp | 170 +- source/Thread/MainDataGrabber.h | 33 +- 403 files changed, 26857 insertions(+), 77 deletions(-) delete mode 100644 config/DeviceSettings_Test_OSIF.ini create mode 100644 config/isif+is1/DeviceSettings.ini delete mode 100644 source/FS/ATPDataFileProcessor.cpp delete mode 100644 source/FS/ATPDataFileProcessor.h create mode 100644 source/FS/DataFileProcessor.cpp create mode 100644 source/FS/DataFileProcessor.h create mode 100644 source/FS/OControl_USB.cpp create mode 100644 source/FS/OControl_USB.h create mode 100644 source/OSIF/DLib/SeaBreeze.dll create mode 100644 source/OSIF/DLib/SeaBreeze.lib create mode 100644 source/OSIF/include/api/DeviceFactory.h create mode 100644 source/OSIF/include/api/DllDecl.h create mode 100644 source/OSIF/include/api/SeaBreezeWrapper.h create mode 100644 source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/DeviceAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h create mode 100644 source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h create mode 100644 source/OSIF/include/api/seabreezeapi/FeatureFamilies.h create mode 100644 source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h create mode 100644 source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h create mode 100644 source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h create mode 100644 source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h create mode 100644 source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h create mode 100644 source/OSIF/include/common/ByteVector.h create mode 100644 source/OSIF/include/common/Data.h create mode 100644 source/OSIF/include/common/DoubleVector.h create mode 100644 source/OSIF/include/common/FloatVector.h create mode 100644 source/OSIF/include/common/Log.h create mode 100644 source/OSIF/include/common/SeaBreeze.h create mode 100644 source/OSIF/include/common/U32Vector.h create mode 100644 source/OSIF/include/common/UShortVector.h create mode 100644 source/OSIF/include/common/UnitDescriptor.h create mode 100644 source/OSIF/include/common/buses/Bus.h create mode 100644 source/OSIF/include/common/buses/BusFamilies.h create mode 100644 source/OSIF/include/common/buses/BusFamily.h create mode 100644 source/OSIF/include/common/buses/DeviceLocationProberInterface.h create mode 100644 source/OSIF/include/common/buses/DeviceLocatorInterface.h create mode 100644 source/OSIF/include/common/buses/TransferHelper.h create mode 100644 source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h create mode 100644 source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h create mode 100644 source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h create mode 100644 source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h create mode 100644 source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h create mode 100644 source/OSIF/include/common/buses/rs232/RS232Interface.h create mode 100644 source/OSIF/include/common/buses/rs232/RS232TransferHelper.h create mode 100644 source/OSIF/include/common/buses/usb/USBDeviceLocator.h create mode 100644 source/OSIF/include/common/buses/usb/USBInterface.h create mode 100644 source/OSIF/include/common/buses/usb/USBTransferHelper.h create mode 100644 source/OSIF/include/common/devices/Device.h create mode 100644 source/OSIF/include/common/exceptions/BusConnectException.h create mode 100644 source/OSIF/include/common/exceptions/BusException.h create mode 100644 source/OSIF/include/common/exceptions/BusTransferException.h create mode 100644 source/OSIF/include/common/exceptions/FeatureControlException.h create mode 100644 source/OSIF/include/common/exceptions/FeatureException.h create mode 100644 source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h create mode 100644 source/OSIF/include/common/exceptions/IllegalArgumentException.h create mode 100644 source/OSIF/include/common/exceptions/NumberFormatException.h create mode 100644 source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h create mode 100644 source/OSIF/include/common/exceptions/ProtocolException.h create mode 100644 source/OSIF/include/common/exceptions/ProtocolFormatException.h create mode 100644 source/OSIF/include/common/exceptions/ProtocolTransactionException.h create mode 100644 source/OSIF/include/common/features/Feature.h create mode 100644 source/OSIF/include/common/features/FeatureFamily.h create mode 100644 source/OSIF/include/common/features/FeatureImpl.h create mode 100644 source/OSIF/include/common/globals.h create mode 100644 source/OSIF/include/common/protocols/Exchange.h create mode 100644 source/OSIF/include/common/protocols/Protocol.h create mode 100644 source/OSIF/include/common/protocols/ProtocolFamily.h create mode 100644 source/OSIF/include/common/protocols/ProtocolHelper.h create mode 100644 source/OSIF/include/common/protocols/ProtocolHint.h create mode 100644 source/OSIF/include/common/protocols/Transaction.h create mode 100644 source/OSIF/include/common/protocols/Transfer.h create mode 100644 source/OSIF/include/native/network/Inet4Address.h create mode 100644 source/OSIF/include/native/network/Socket.h create mode 100644 source/OSIF/include/native/network/SocketException.h create mode 100644 source/OSIF/include/native/network/SocketTimeoutException.h create mode 100644 source/OSIF/include/native/network/UnknownHostException.h create mode 100644 source/OSIF/include/native/network/posix/NativeSocketPOSIX.h create mode 100644 source/OSIF/include/native/network/windows/NativeSocketWindows.h create mode 100644 source/OSIF/include/native/rs232/NativeRS232.h create mode 100644 source/OSIF/include/native/rs232/RS232.h create mode 100644 source/OSIF/include/native/rs232/windows/NativeRS232Windows.h create mode 100644 source/OSIF/include/native/system/NativeSystem.h create mode 100644 source/OSIF/include/native/system/System.h create mode 100644 source/OSIF/include/native/usb/NativeUSB.h create mode 100644 source/OSIF/include/native/usb/USB.h create mode 100644 source/OSIF/include/native/usb/USBDiscovery.h create mode 100644 source/OSIF/include/native/usb/winusb/WindowsGUID.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/Apex.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/Blaze.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/HR2000.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/HR4000.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/Jaz.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/QE65000.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/QEPro.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/STS.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/Spark.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/Torus.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/USB2000.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/USB4000.h create mode 100644 source/OSIF/include/vendors/OceanOptics/devices/Ventana.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h create mode 100644 source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h create mode 100644 source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h diff --git a/CmakeLists.txt b/CmakeLists.txt index 3a92493..f55164e 100644 --- a/CmakeLists.txt +++ b/CmakeLists.txt @@ -19,12 +19,16 @@ include_directories("source/ZZ_SDK") include_directories("source/Settings") include_directories("source/Thread") include_directories("source/LinearShutter") +include_directories("source/OSIF/include") + +link_directories("source/OSIF/DLib") add_executable( TowerOptoSifAndSpectral main.cpp ${HDR_LIST} ${SRC_LIST} ) +target_link_libraries(TowerOptoSifAndSpectral SeaBreeze) qt5_use_modules(TowerOptoSifAndSpectral ${QT}) diff --git a/config/DeviceSettings.ini b/config/DeviceSettings.ini index 7ca5023..fbf6b16 100644 --- a/config/DeviceSettings.ini +++ b/config/DeviceSettings.ini @@ -1,20 +1,19 @@ [DEVICE INFO] -TotalSpectrometer=2 -[FS1] -Model=ISIF -Port=2 -DUID=test1 +TotalSpectrometer=1 [FS2] -Model=IS1 -Port=3 -DUID=test2 +Model=OSIFBeta +Port=-1 +UID=QEP02975 +[FS1] +Model=OSIFBeta +Port=-1 +UID=FLMS15814 +[FS2] +Model=Null [LINEAR SHUTTER] Port=4 Type=0 DCID=1 -TotalPosition=5 -Position0=0 +TotalPosition=2 +Position0=100000 Position1=200000 -Position2=300000 -Position3=400000 -Position4=500000 diff --git a/config/DeviceSettings_Test_OSIF.ini b/config/DeviceSettings_Test_OSIF.ini deleted file mode 100644 index 6c94c14..0000000 --- a/config/DeviceSettings_Test_OSIF.ini +++ /dev/null @@ -1,12 +0,0 @@ -[DEVICE INFO] -TotalSpectrometer=1 -[FS1] -Model=OSIFAlpha -Port=-1 -UID= -[FS2] -Model=Null -[LinearShutter] -TotalPosition=2 -Position0=100000 -Position1=200000 diff --git a/config/isif+is1/DeviceSettings.ini b/config/isif+is1/DeviceSettings.ini new file mode 100644 index 0000000..7ca5023 --- /dev/null +++ b/config/isif+is1/DeviceSettings.ini @@ -0,0 +1,20 @@ +[DEVICE INFO] +TotalSpectrometer=2 +[FS1] +Model=ISIF +Port=2 +DUID=test1 +[FS2] +Model=IS1 +Port=3 +DUID=test2 +[LINEAR SHUTTER] +Port=4 +Type=0 +DCID=1 +TotalPosition=5 +Position0=0 +Position1=200000 +Position2=300000 +Position3=400000 +Position4=500000 diff --git a/main.cpp b/main.cpp index fd0e5c7..1147c34 100644 --- a/main.cpp +++ b/main.cpp @@ -3,6 +3,7 @@ #include "Logger.h" #include "SystemConfigger.h" #include "MainDataGrabber.h" +#include "DataFileProcessor.h" using namespace std; #pragma once @@ -15,11 +16,21 @@ int main(int argc, char *argv[]) //////////////////////////////////////////////////////////////////////////configger + DataFileProcessor testdp; ZZ_SysConfigger test; RunTimeGrabberParams testp; + EContext testEC; + MEContext testMEC; test.Initialize(); test.LoadSettingsFromFile_System(); + test.LoadSettingsFromFile_MISC(); test.GetGrabberRunParams(testp); + test.GetECParams(testEC); + test.GetMECParams(testMEC); + + testdp.SetEnvironmentContex(testEC); + testdp.SetManmadeEnviromentalContext(testMEC); + testdp.WriteDataFile(); //////////////////////////////////////////////////////////////////////////test using namespace ZZ_MISCDEF::ZZ_RUNPARAMS; CMainDataGrabber testDG; diff --git a/source/FS/ATPDataFileProcessor.cpp b/source/FS/ATPDataFileProcessor.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/source/FS/ATPDataFileProcessor.h b/source/FS/ATPDataFileProcessor.h deleted file mode 100644 index 6f70f09..0000000 --- a/source/FS/ATPDataFileProcessor.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/source/FS/DataFileProcessor.cpp b/source/FS/DataFileProcessor.cpp new file mode 100644 index 0000000..ce67927 --- /dev/null +++ b/source/FS/DataFileProcessor.cpp @@ -0,0 +1,125 @@ +#include "DataFileProcessor.h" + +DataFileProcessor::DataFileProcessor() +{ +#ifdef _DEBUG + m_qstrFilePath = "E:/WorkSpace/TowerOptoSifAndSpectral/Data"; +#else + m_qstrFilePath = /home/data/Data; +#endif // DEBUG + +} + +DataFileProcessor::~DataFileProcessor() +{ +} + +void DataFileProcessor::SetEnvironmentContex(EContext struEC) +{ + m_struEC = struEC; +} + +void DataFileProcessor::SetManmadeEnviromentalContext(MEContext struMEC) +{ + m_struMEC = struMEC; +} + +bool DataFileProcessor::WriteDataFile() +{ + GenerateFilePath(); + WriteInfo(); + bool res = true; + return res; +} + +void DataFileProcessor::GenerateFilePath() +{ + m_qdtTime = QDateTime::currentDateTime(); + QString qstrAddYMD = m_qdtTime.toString("/yyyy_MM_dd"); + QString qstrAddHMS = m_qdtTime.toString("_hh_mm_ss"); + + m_struEC.qstrUTCDateTime = m_qdtTime.toUTC().toString("yyyy_MM_dd hh:mm:ss"); + + m_qstrFullFileName = m_qstrFilePath + qstrAddYMD; + m_qstrFilePath= m_qstrFullFileName; + if (m_struEC.qstrLocation=="") + { + m_struEC.qstrLocation = "Unknown"; + } + m_qstrFullFileName= m_qstrFullFileName+"/"+m_struEC.qstrLocation + qstrAddHMS+".txt"; + + QDir qdirPath(m_qstrFilePath); + if (!qdirPath.exists()) + { + qdirPath.mkdir(m_qstrFilePath); + } +} + +bool DataFileProcessor::WriteInfo() +{ + bool bRes = true; + QFile qfData(m_qstrFullFileName); + bRes = qfData.open(QFile::WriteOnly|QFile::Text|QFile::Truncate); + if (!bRes) + { + return bRes; + } + //EC + qfData.write("EnvironmentalContext,"); + qfData.write("CaseHumidity,"); + qfData.write(m_struEC.qstrCaseHumidity.toLatin1()); + qfData.write(","); + qfData.write("CaseTemperature,"); + qfData.write(m_struEC.qstrCaseTemperature.toLatin1()); + qfData.write(","); + qfData.write("GPS_Altitude,"); + qfData.write(m_struEC.qstrGPS_Altitude.toLatin1()); + qfData.write(","); + qfData.write("GPS_Latitude,"); + qfData.write(m_struEC.qstrGPS_Latitude.toLatin1()); + qfData.write(","); + qfData.write("GPS_Longtitude,"); + qfData.write(m_struEC.qstrGPS_Longtitude.toLatin1()); + qfData.write(","); + qfData.write("GPS_North,"); + qfData.write(m_struEC.qstrGPS_North.toLatin1()); + qfData.write(","); + qfData.write("Location,"); + qfData.write(m_struEC.qstrLocation.toLatin1()); + qfData.write(","); + qfData.write("UTCDateTime,"); + qfData.write(m_struEC.qstrUTCDateTime.toLatin1()); + qfData.write(","); + + //qfData.write("\n"); + + //MEC + //qfData.write("ManmadeEnvironmentalContext\n"); + qfData.write("DownlaodAddress,"); + qfData.write(m_struMEC.qstrDownlaodAddress.toLatin1()); + qfData.write(","); + qfData.write("DownloadUserID,"); + qfData.write(m_struMEC.qstrDownloadUserID.toLatin1()); + qfData.write(","); + qfData.write("HTTPServer,"); + qfData.write(m_struMEC.qstrHTTPServer.toLatin1()); + qfData.write(","); + qfData.write("InstallationTime,"); + qfData.write(m_struMEC.qstrInstallationTime.toLatin1()); + qfData.write(","); + qfData.write("NameOfMaintenanceStaff,"); + qfData.write(m_struMEC.qstrNameOfMaintenanceStaff.toLatin1()); + qfData.write(","); + qfData.write("PhoneNumberOfMaintenanceStaff,"); + qfData.write(m_struMEC.qstrPhoneNumberOfMaintenanceStaff.toLatin1()); + qfData.write(","); + + qfData.close(); + return bRes; +} + +bool DataFileProcessor::WriteData() +{ + bool res = true; + return res; +} diff --git a/source/FS/DataFileProcessor.h b/source/FS/DataFileProcessor.h new file mode 100644 index 0000000..6a9854c --- /dev/null +++ b/source/FS/DataFileProcessor.h @@ -0,0 +1,28 @@ +#pragma once +#include "pch.h" +#include "ZZ_Types.h" +using namespace ZZ_MISCDEF::ZZ_DATAFILE; +class DataFileProcessor +{ +public: + DataFileProcessor(); + virtual ~DataFileProcessor(); +public: + void SetEnvironmentContex(EContext struEC); + void SetManmadeEnviromentalContext(MEContext truMEC); + bool WriteDataFile(); +private: + void GenerateFilePath(); + bool WriteInfo(); + bool WriteData(); + + +public: +private: + QString m_qstrFullFileName; + QString m_qstrFileName; + QString m_qstrFilePath; + EContext m_struEC; + MEContext m_struMEC; + QDateTime m_qdtTime; +}; \ No newline at end of file diff --git a/source/FS/OControl_USB.cpp b/source/FS/OControl_USB.cpp new file mode 100644 index 0000000..471b609 --- /dev/null +++ b/source/FS/OControl_USB.cpp @@ -0,0 +1,437 @@ +#include "OControl_USB.h" +#include +#include + +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 < 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; +} diff --git a/source/FS/OControl_USB.h b/source/FS/OControl_USB.h new file mode 100644 index 0000000000000000000000000000000000000000..de4384ef57393532da52344da8e7138fcedd47ea GIT binary patch literal 2400 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
9qc1yVLHuZQ!5 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
?GXIP@Gdnui*}?APZoHLr|H)M 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 Dcm#4H$)cUKRFyn6&n|9435ybw%q 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

T`F08_aG}xDNe*} zlfz1L(sl|$yRlGEoF)46iknF@vQgUZVwPiALTO(884p!b7opS_SSX~}DIiz87iD!v zr0xn7m|+qqP~ae5pmI3PgZE(tIu1|A3FfM&IGSJ#t;BzOfI~TRGMWb$vH~65G!M>X zp`e>q;&)i-u0UfNvH~65i8voz!`7Uz5phnotI)>obQCy-73k>BMralb1>FL5-(#hF z1`2G-3UqXrA#?*<`oZ?bR8iMTcOp*mCb9w@-6;soW}(>LsC(2X*5^sG<7A`2Ls@~2 z?jnT#%GYzkQtAqXE@q*S&M7qbA8PA^&r-zkzq%09=<@Hs|JfeU43yBc zG`Kv+F3p{K{cH#9Y)>7x2(58K>n4J&cDIOK1Xy;cpXI0%|ZyLg-Q+ znl7b=5n9YbA-Ge;-1}I?&7`yply(U#&FRckB4}#`Ek&t+@YN$lfX=sm%tFDO9I-K< zHAnf8mh*Y6G-u5g#*CL?1~_%sn`eK)WxbtivJfff~~Se2zp5xO4_9WMi<9HHOvMIRN+ zls{hQp(-g*{wQRj(2L;tzkA#u(D=uxs-|N1?aWGZk^<$A19_+{mJ^r{A@n zhsd6Oe2I(tOM2daN2w-W!E-bpc!XbxXUPVejXkgL!>(^M0)6v=(|D+oT8>g1@z7$x z09WeIYe%yLRCH5+ev^mB&IgKEXawg2FWto|R-Kgk^I5Dkr|ain4{T}$Ek)>tA{zoU zADG8N!JHiN)o@mt^5a%id@C!>$r99`BUaE%?E0;EXjry+E7qW(J__HQOt)7`=Ils_)x7xA(Aqb*+oOO&l%27kmKeAOs6 ze|*eCi=|Y`AJ6g7*!(e!hsNfQbQVhaa?W{Sm`Qs#3nlFFUvw~9oSj`uDl;xB^US*+9{)l-1R?|R$qWm!! zYVO=qB9K3teaA!OEMxI2F6wXA)Bihk^ggBaL=(OopnAH1SQbANxL(r;bmkw_)8FEu z<7L-K!VzvX3x#-37So5?C{9IbU07*O_obfRjD>>YEYZPA@px3cWF*T`b&1&seTs!* z5gENbX9z1$W$Udd@IqFgV{|hd&X2HyQYYVfKSu!klOpa}z(b-`U%&Tj7F8I{!QJYU z*Rd$rg2pQAMT?$1Iah55}uccdU6x7Fbj{VB*7_$hBL{z({o z7<^A(6eg5Fo8X)oKkiP1+cN7XB&=@`Sx6V~ZwZlTozI7QyMvnE1W_;>?S1W5&R$Rw zt_P^?rdg9fS&bKRvK-$Pp};@*id8dd;1q;@%tO^kJsY9Vu~2Z}cN$8n0LZWApG}7p06qKF9}rz9 zau45AQ1SzS7 z&@kjCm$n8{m=?(^-z&d#aHG6FkzJ9(ZrKpm8R8~(n1BdN7WdBJ0E2SL{ia4H_^<3aeo(pyiF{;0 zg|3mTlab*wdn0QYgy4gWUc7RnmoPuBrs&0M&@lyX%ie`wg$i#a!|1Ckx=6$5mh*rE z8dhX9jNmOi%70O4ky=ggK)B?H(2ZOiXyYp^_J7~KDaaF?gHLCI_*qq=F{ zWK1{^*ikoUk7i$S6N@b52XZM>96y_5Lw#ifKetrbeSrZLny^-7_xg|@A%eW@J`A71 zh=y_pdf9z#*valIr^$F*`jDX`L3W=GST?)&Ar3OH-UH{PuzzsbeaT7?=+ExyJMgQ} zjoDsy?jIBt6u zXtQl=Fg`d|d z&pbr7+5rYZ@;5rf6kZk#-#zaZn(iEq?FKL*(GQ)tf=-y^tc>|7BHu z4I^!Phef(~5NE6$Ho7dtXzBtl+Te*6AKq#$d=ln#j?b0D3|Hqp(ZgdKA$M_E*^t# z!}q(m`LE>S_We8;*OG=wpKYEbO}fv{#q$BqQZ8JlqIlxgN-o}iCowtj2G7Mgsg8>W zpj?dNra6+&rzSptU2jS;S>hlQ-(!fc^o4-Klcp$6`2>mjqWJYqWZ1_tb|{LUIwdBG zi{SMc7&To?CP@~(*tcy!cNq^)>QVfp65p6a@uHj~z1-V#aY!kb_$UYJPiawFc zk}NR@GL+B7Yanv~U|lcI#TQ8?5XD_kF1mOl)VGn(z7{Tim#>9mE?)l>$mMeJAi0F0 zap|4SsGE23J|7`bU!sWOS*K`dii{nK;-M$SxVSHHK$EVwb8)JHGR(zWyyRN-&z*Ds zYuSI#1DdI7VOpxYo=L^^OeU;n!Xo=MH`FvYAxu2{4F^%%ND#HNz2cC`GL0(j{5vAb z3>D})k>ahp*Y5+}uQObzRG|HRS*&BeHIXv~5)@Q^&5%32b(zV~fPdH6U-@~%$zN1@ z-telP&hNjsqvTU())dd+06osv8hv1F>)oNHM_B(Jx{R1qaou9hhh8|m(2v7GLVaU1 zjn)~WEhJbRN^t)o1s50-)h$YL7LSC zXhaI~Gk^h%!1M?9$>pahm6x9v6qZH`$I-t=<&QESw483wk~h$wg8XdyG>-nLClJ5E zecfp24;eYh01!)#k&RIfTEv@=;=fBuFT*vC+a-1llZ&@9Qw>S<%0N_Vr0_@RbnV4s zvh0z%XMHF_kkEo(u2&BZ?ngAaC&Uf@TuelXkyhc@7vjs@Ta{s$cv^?^%^5mpzE z#6&|QWe1?Io;ymqk7zwQPP(tJ(R~EZ0=V9N$+E>;izzb+5?B!oT@B}EfF5=P(R`h3 zaq1P(C>_n&0I3NmkGq2UEPb^(SyHBZ){K>uk2G~#sbUtu*-&1AE&h-RRgQE|p3ch( zP5GH@OGejshFl3XU(IYQ-AA-0kCE=1Zp;J(9|~~g zK4*aa_wPT-1Dg4SJ3kHO^-=o)Bjy!BtnCiH-CR3~it&g>UPSIFG}|3|)OdU4>`jTK zuv_}>(0cv78htK**!*|*GhqIYb?D$x4M>WPUbt)I;yh9;e3_LJ4W0BmO-EXbYj2>g z*hPNM6348eu1A#`+_e>ZLHdKf`eJwLtMpa9*3?&Fdh*9ZvZE%iFwCU@TL#!*%Sw_k zO%%$*F}q-D9Sj9F^M6zHi(w~aVOo2*H(`Cf!nF3gOAFH47p9%oF|GaZ&UwSzCk#0x za(!BROl#=6^ecYYy{Tbho%Y*nCv0liC}Dlm*nd3{{@gAh_qx=@9r||(46O7HmhTUv5UF$MDlae? z6N2Qmn&$?B?`{oV+n+K;lA&@94nHNTR}!O9qfh0FRPh+UV#fnc%N}qwXeFg(E(re$ zqhpVw=;dJ$zh`s$EFWu}XW1A!ziPTFktT1evs$i5M=c9d(7 z79x*W&6#6B)x$~O7y}CYH{4tI1^KVK-)qf)`puTvt_?mF8oV|h!y=b2aAQ(w3u&1f z4Pd-mZrF1Vy_Qf1XP=9(og;8+44TrZDHr3!wZ*rf1ICqZ)b{k%;jQG1l@)*{zccqG?dh2u-)*;_s8#~ zv+?6%$WclAZIkns5L~D*)JH3L{S0h+?*U?T`+O2A)zKIoG}4U1~H=W3)!3cK;z&R6OR&*W3gx zjN25c;wOF^0AS)iHf4Bq=|-MKI*qtVIr0UT6x0{@ru0tr-G0jfT#%3Zf>5)dKLzNZHIxFJ9V1BSV+Irq!u?Hy-`lmwJ5!M4`Ja<_wo-S^r$6w7kMvH4 z^iGEB9r_+0m~R8~aI6!Nh<%V!v_}qnUV$Qa(m{hzv$M%B^wrvsoHyl&l_R86S{j`~ zvZn%^a|&=7X@X>k41N(E4Q<$qJR*>O$7SS^h>REdQ;?r7KaD3h;kp#BT))u2s)F#o zrP4JdYeO!&#wiYC?1`_jsum4x?@HdGuNEC7qh>a$p98nx#PZwbrl=teqfi4kvml|p z4JgR_=RD{N(j<)k@vn4=NIjqQOefcG8k8)O2c3Tpi_zX3M{_sC85US5!xnmH4uX;5 z+IKlNuo_7g8=wNgMocb-;Q|9HR8Skc4AgPzLmGsD_0IAP!;}K&-_M{3$DAS7Hj@1x z&OZ*9;r)FpLwJMa>44>!hPn|4Ig7ss_9sk-N0v-QX3j*P`d<16ME1rrz3$jil9ghQ zR(yM#_)7SWI}McIrI87Y`vkJ2&uv{X@4)%@(>=GnoangiS&)la;aw9AkbIko!+mme zT!ig>KGERM+|WDm{cdZ%l*qOZdv2>G$x1(L9wzyoZQ?88^8p^*(hJkN0#&SsyaVE> z0yi^QuG+|2OoJSZ5B(tFqN8zqO2lCN@>Akoej0J7ug-4hj8CU3;>R9B@fo}~2a*qv ztb;ex#>s(p1v>iMkB~-TKIUV2mKU$wv%G{k8s|09ad-`6lacI<#YA?gj0*Z{!U1x) zpj$@4kz)*u>Cz#=eC61D6~MvK8p?7rEL2OnEkm40d}AJKnIxw>FLWZeRiI4`B@>wC z@2zMwkZz+jn=Vb^LyOCACk}|wLP8(O(HQ+BrhX{hHXeNv@X+FBI;-uBvh~nyw=W{M zjqOZi>8tDZmu@4mmjVZL+daW?Bpo8>W~~jBVf@_Ze%Gr1@xk(MXudAa)cF1FNp8F8 zQSJy_pFan$oL&D6r+sBNp?i)61=vk)Kin`{%N5hkAqGC5?c>d}KZeYP2@!`O*|YJ= zO^58p|TC1twhcHn@N>li5${5%6?@N!!NBy_s8 zY9un=0f`6H`@GyAau|5|=94`yFRK^hDAQLr?<2iT_hfDifl8wk zUb(SM73k-=4MH`YikM& zhBCol1-O2qs$BSuT*QpTesmvXD-4V*7(`jM#cbsIMIcH}I3X3jE+Lu;vJ@1$M%qr{GYVGxmBVKnbX*(< zj`zZ+cdeN4>46Hcj+bzjY?OjF)F{C@5wM?~N#2u8F9TKZ5*+ z?S=s++ilNKYl6ogqT>+ngxX!wytcA;P^jha6%%ShfdlrAOO7;HB_EeO$3*!;NtqhC zg`%8=d;&u4`iVpt@j#j4YAK{HXpzAuP>ax4pCm}iB=)@llJe(9$^;(^a4v1ipFtaF zKtZToEZ2jYMwQJ4kYp)Elgtz(Rn+kyf5XZDzm)#LRHx;BD?-*B3ln<2y?a*St<6#8zkR$CcY9r4B#AP z$mc!1BNLk9and3`eQO+y$=uzwN}ZP}{$0yr}YGlr%o ztNQYOaH0HY;|x9D6&T3(9LDlB^v_#liCHr~$MibdAG&c2rw2TNJz4B;2x;h_ADqq# zQtwB4&VUM?yFc~MEV1ql*+1R)Zd~;iD2RqK+sN4|hWvuxW&g|)CD+S%f4igC06OpD z&eMZ{<$^ubia5wEhUz{{uj<4@ zWHt7611i+~02S}sW>$*#8|Q$6Xej$|FWx`@)rt2dnKIsIbvDQQlYr%n39XKa_d!I1 zkN1)Xk(n>v!!Hxrt6F>Uev~9D1NdOYx08vlgs;EWK=~3UO}zVBCAYQ5v!u~b$HP3g zJ+;|!+Zd3GOS}h7G$2j%HF0PXWu(pTH5`?)%QyiAk*_&uv+f3Ao~FMI+lp1F$J34i^yzNw_xA z;N5n?1ADmblW9cuC)vi7UElmA#%G(+!@EQSM|b=!P7Y0MJcU#aA_1#%v? z^bpT&CrBpXiZ+VIxfX8QcC~@SNI7Ywu=sEW(%{_|!sGD%PCAj!F@#>1ZA@;vw<5-E zLx2PJjzxBEJKIEg=e{c1S`puvXnP2<40O`5tvt7F|JmuJ8?TZy4!3aIyMSezZXR)v z?feKNDU;j2D%itqyY{G`K3y3J4{Z-j%?w%?SY>hx8;Id4EoPZG(d896Ni&x+?Gr< zc(-NWzlYm?d!F3ZNOlc!+t(XnI%yf4utL6OGAsO7>Hn$+ znDxLt2Xft=Uk`-EEwZv~v;Mu8)8njv?=j?TT>l==3Ub!J22|*%#%j!5H^s|hVO;E9 z1^EP$e`XWPV)WGl;bgIr?)Z;z#=TFnOb@?=4O1V$b_6Up3P8rY4&^cnA$gShGy^L1 z>47wyP@O7~41-_Uz!D2>h2WLD>qeN2d(fP5cnzaaHk$v{Gx$|#TT?QhzFPQ$%!_o( z>`SHLD@}&W*V7jOoHHyGCd%M~Oi0MSQTP)%jaq(?H=J~qOaOfX%Eg9Qb)@9e_)K#{ z%m6G$2IPKm2@eUCH}Xd8m!3o2{Lr%{7m4~7al@X*uR@Q=2&18=_u81Drw4Grp(n@a zVw$BMX`D0;7MLXBw(*w3!N20Vtpeo)-RS!0G)<%u^}pskbD-J_yBf3U^y}%_os_^ zNT{}SF-6(DXHhpF>-FzKqP|#v=t=x4^rDO~iuIiDVq(1?aKPAVXfjDovraWpzNMkc z>y3zS%vvZ|@@@vocR8iB>5#`juvgqj zf_w;#-KL@E;=*qn7vGI?(ZxqY$sPIZW#QsoNjw>d;T44?BK^AB$gwZmdsaY2fWB$;$EkXvMc6V&JQWf5Z8g&{;$ojQa%Ag>P=tRnD@`t?Rk% z&O;!ronZRZmWe%3u^&>n7UK8D=ZzMki{T9T~v!{#oMZ*LP{ z37-#euB9P4Jnt>n0y^nG_-jpOaq`dMyVo+VGv%K~d?7q0|1`LTZ6cL_63=H*bpER) z50UxjYy&EE`@t&z6pX9Xk#;~PfG(Y|x7U$wSmt!3E6&*ZFu(%Oq*$v1j|fv;pS4B#x~SDmzd2_!yW z{+Tc5FN^o`+;+TV0Tse;kF46;#Z-WvW+Qi z-}7mV+inF8m@ls~@s%vP8Yn~liCG2ygA+}FX-xikW_xw=&uG5j9FuKV&!Qv zFkehJ^k+DKIvuc_F`+1NkS9OyDUuy&JWPgUH6E}0tCl7Gk(uxOX*!)Q2;G=Ky`Bp2 z9VJ;Q_GrcT5EEYs-_ePu3?1pKb6rS4wEgv8YvR2yKN;$%@^IMQ#2;gg zmrr@Q{bwsQGWH*Q9MkDP_wu!D2^QV%VIw^(qbC>shy`_7s0!aAgihq4DtwC(n$1I1 z|Cxc%G#;v?mLl|ED`*))f3Cxtl?WK{Yz0E+vruTmWbw@=ZU9&BWs}dE3^hs176ZIF zb8GNEoY=&rdvT%F}vk?(4b)X3%=LJr*?i` z6ceAV&*owT8WO?cy51bh7oRumVuwx@9!1!Yovfh62uVGE zJTx{wds{&%K08`LDLxPIpnpMdX;fZDtoPk`!2M>cyd)c%vZt zZHG;BQxGk+g3iFmDCVIm-YAHM@X!8J zLteJcCO(T0dJGR$;Zcmx1Rffj50`DVAyA4^U*w^&`S5NYs^YT(rFOT1Qa(J&3YvsX zurXxCUloiRy_)bUq@M?L<1<^uXF2?J>H&jK=OPc{6TzZ0?oI}le4YF` z16$|y-&jAU00y%%LJN6lY%!kkYViQEA*xbW-Xly=A=b^Fj)`o}1#@qG^mTPRh z{fCFf#@i$-D8<|DR#1w!3$37(50CJm{t)>~Kk4E#t+h;sP>*U2nXp^f8KyrxnF}~X zid$}XAy#(9rN5h5|1UY!*PovY{lFa$@B@tp@Yiv~{0^=bjRDTgBHE8bdB1~Fep1%3X2A3)3SmAQSXdWl~B-FF}S>bZTnLJK)+>zi%(S(Pp%rPFJ>o>4gtIRP4 zp`|=j5txn8aURqvPX8>BCY;>!(y{g7A~d4&NnC(M@b^I9;Abw;(3|p@P>whzTb^!k z-=6;jE(fEbXI9hchD4mx)teztH{^&vTFBE4mw)7yn>E~lLyjl|Z16Y*DqfbygjS$U zli=hO9uvY=lBXN+%01mcmC9m*p`by5$1J_c#+@x&PJ5 zKp8xH&8fUqZ~$V9;6j($r>Q|o=u4-43gK)N9CQMIcDM{QtDkG0fTK#xPaX(5!5RAL zORv!`o$fT+IS0!|yXQaVMr#3Bw$Vn#G}_NF6EQW~DY$2#emLmX9-alue?|*@KZP(k z3!$M>8F|#0555%Bn0Ggqc5JX~%yfXWru-m}>Sl7vqkg34V`d@f4e)Ci(#;*rHcpmUBlaZk06a)9rZy`E%P8p;DapM!yrD@1arjUm& z@hsSkqm4ht=k*~YR>{bs7=Q7_m>8efMB4GOU5pO^I2T{g4Ab~Y3%)b)YqmlSmd(aE zn`1)J5Wh0SGYZ`zpIH$YMblxb1g#dO4?Xa7m1_Gr>&bKYJ^nMQuS17KL;EhL=BKZ+ zUyz=o+k1gxjDYo~2$0%NH1TXCc~XC>OFZR?0y#Qi%ekWyVJ^hY0QIW+QTV*AGG*hB zWC~*7pXpWKZ(Wbj(DD^z3Vk(siZq2pJ#vsVrHj!Ng7*bD8w4rhyu)3{pEafVSI_@r z59sD}_#2OPu25&vwoImYty8hun^Q3M2FaV0tdGked><&9(wVp+N`LNG)zaTL#a=(2 zrJ8khJopsx$szIJlf>hRE?(;b_lLtT{nfKuhm68Jv`2t)O*`pCIM2U*0QoDh{LVjr z5)q@1=TGWGwuXTv=J_`{ z;mR$O=^F>9wa-v@fK~I#17z+Vx6RZ*@cbKKgIx47Q zNyi5e;rX{uh-@TQu%9=3x+kB;o=feC9Fy5{2;D^ff{xwIq z#%TmV7?z^@4nK=S`Re^guHr(`ftF%C?)cIMT87Xv9-0go;98E*$vjk5Q7RC62M+6tPAe%-c`^?;H}_1BMBD6E!KM1L<){0*W~6HbNsnX&PRA21%v z;4jo0i?B($AI3$R0*i;)XPZjGvNeiP;3HqKE>4lq83?`63R;TLFb`GnSccFL4^=@{ zj?f=huv`_i0-^8l&_uw1vl21L##%v>5!%lR8b;{pR!~eiqA?4F&`lO8@3WRGb5@|` z?=R<|AT3+G+1L%Dzd=W^q@e9D3E)3Bf8z)2FWK-H`pXpbMr&`vqYXN6MW-{CiU7Kzh7Rm-BDP_3qFyQQPN*3iC0+y8RPB zVE@dO{gX_%moF}>=jYx{brY6`meW78#Nto5_ILVcj(FMzCx3flC=XR#l=|KIJTw)W z46LVqmt+N3|6eR9 zG=W&iJ}*HrGL|nitMixFuuma5i-cTk$j|@7x;_Ok5Ombnrt(k~pT#IOmxrpTpMlUG zJX8@VMd;ByR1qjc=p~cGb<>C@(WhbB#ipIte~_?xzvMNW!66jq>WFU z#k%L~bwbb?NpA%0eE!ucXkBv9{fbmu;DzQ}0ssm2T`)JWjk(5G`2Z`bERYffi$PPvoJhxhaUUd8o>Vr6@IxhpKohL+HUg zR1qjg=+BE;vl0OVo=pJHiuqPhnlDeVf~KIZkj|xYh)YKc=YQ1 zF>ZSno(n*?4L0$WEC#cW5rCqJj@!;BzA?LZb8)#94ZSChl_8(r~RU#5wClZdC`3_E)D|+H0dCd zNz%oQOq3&SRAdS`{^X0yE6*b)*S_Yt`2BpRL(lm|xwto!xsgvV6CZGKDq9kV7RwU7 zP;THpH8`fCHS(3lbs)-o=O2!#(I3Tohsm%*WS65T-f(Y>i&w+3Of>1$u2!9YI-cTW zD8n|^Xzy9^KXLl>uc|mbpc|3Ycz@kgu8~dS{l#@4;(|lOJsFWI&TnOb6ierFY@j10 zi)rk9)EV#ZGoV7}I_D=ALtgTwhfZ{cH57i?OApVDaMHtLaOxAgP`h&tT?o4TKs+HD z?3`#Q6mx#!ETX}8`B8ZO+u!9A=}1NBm{+{4x-B=R%m27R@|_tm@Rf<@O@MQhq07fS ztR80+{&{dF-Um(LEHuS?FK-gB*Wu1@uQF{W(EK*jbow<}yk!_$i-vviyLAj&~<%Gi7= zF-gRw_ua##+j7LMipJj3Z4vx2O=a;HoaB=$Wa-8N3TEts!dB#s3*xJ^SjS-P$8XccWY zLVof^+iE#S`St}b+9Hw(M9^u9Mun;M0GlW|1pPEyG;|ShknOyt6Vl+L?N~gl?vJ)t zPbRm0DBGAOR1=5AWY-6NkZv1l;wxEP18{w`Nw-0E4a0g;LH@jS`H$07sUM+t3)50% zajj8apH!%yy`S3Lz44#nkmrh zAsM~&oY!d@-|nR7eZB|1xF~#ewv5KNFE!*oz}^Q~HWcCKPuK8}&~NR$6-yrMikmvv zQmn80JJ`jzc@qr{m_mk82Rk(=9B{hT&}5SAV1EQQl}e@86J_4{qk_>1>fyMEW`P&<0i_dl3!gUb+; ztZ-T4P9B$xQ@uh+Yu#Dgg0$W+BdpWAefGh$9~rRE7v`LNqB0g1i3Lk_N)JA=Utz^m_44L|5BG+dlGfwO{NKZnI(d|^DMKelK9IW@R=B9Y=t_P{no zWU{#Pb&fDZWG+VJWd>B}ixX&amLnz{Uuovhpgm>(#3#I&!_b?ZnL~dF4ov-}*R#zD zOmoEPd?3}MP9CKl@BuG!MwKKi9^(Kwn*`uCK3=&`l2QcF zJMrD+Wi~D^M;%2jnEWKUfWEqQV9Xq&H#`u5UO2Xo!3&Z_2lMk2&AioL^~3#7m!Roi zs?8uz6isp4Hi#H=e?+8L>3&-3%w$i%l%!Hr0L7o4=P7FVRsQ{gBzVoZ@AnH}1CQ6ghR$3cX+na)kO`qYv!K7He=i9GFBLds0QK`0XKo-D@R3Ma+FJZhw*d(d_8s z@J|ufR8js3mhyK_t{VT3*>vymf5MZmYf7A09OgZqU*nMT|PcLoew&a=>K`_Ca7m`w2JciO;%6- zaaEMRmnHuXpQ)OEo@RGkJ^nXUQT~~h^7pTz{BOKvsU`$G{x3aUHUEsTl;5q2@(;6= z|5I_*_|Mzu-pBeUT1EN2Eae|pMfrPK%Kz{w*G?xT`2K2)r}6G-cE{9VMRH(h}byJ!d3{^1s<;IZDVt%ru}F>`9Vv&{?f`LsuP7fzfZr<*$idW zgwC{8I|bWh2)x@9>Yd~80|aal2JBI#AOOxk-%mAC`s$)9WQ~;W34;Qxkv>vuhcoBV z)-j^;sqIDvKJqn!>*w>V<>{dJS(NjuHWg^a<}t27n}(?&jIL2IA8ud|*?IY@v&UK| z3fp(yd#+(xNT~dDuYJeC39HKOd+yuRzE9_S?R)d(G3}cP3b1|8u4mQ0Cm8t1_HAH7 z(SHB;?{c>J+PCq;F0_W)&PI&ZQAXahD#epgHR!>cHN&2KI*4F!*Xt18OB*HZr6LYGHe{%LI~|C%bwpTEWB#rkLG zC>IwO|K67JpQxhz+LrP=S5f{X%l*OC1y%D;S4;WB z{%S!TmF80sN2QSc0Axevd6NRcFBY7Rgdcuqm}uYUcBCLo50~A4MW|mnZ=NBew}czz zU%3C5@M{<*`Ngrp&%ogG!wuR|zWwUZDBV?2fob%nMee*~fw*^kmWZP_iLJd(^=AGF zTotrH4d#-n$dc&nC1uVcciyq6%n@;zBeu3dnVS)Fv_K7gzjcRo?$U>ns(t-u)wv5X zI5t}*)q6f>mB@EztP-(Sed1bm?qca2{gkSbzu6Iv1OLAKG{l1og$^4jkQ+j!q~{YT z@!Fg32s0={eVDB73KumAkh|`gA<-9vin=?MB1WfL#?9Z0(otMW}b) zQAEL7L!B0=VW?AY&M7+ch3CJy{L)VL)0U zrN8_rlfR&5z&cw8v7HF4emkdn=1MI_B+BvG1Td) zAsXrj`@;RYrdDe%)R_{`qEmZJzJe1iD2LDdz?D|j*TB~P;Yq6Mi2+*HEcm{USZMud z+MXCc`wCU{md-~oanc!kISMd!F8)@UXTwgGdI+x9*iycS66-4;2MG8aL|{^xr$U>k zHmbl*#9zKd@>lB1&yoDkYs=&O=(y(nyXO{sg0{o=y$(t5)f@Q(e?8xPA%Cg9JYNvN z1H6T|Hk|m`rRywD482@VI~;=Un>0Iy4bVlBTCk-Y2!t>C#AU}{c}u8U{H!Rs{qvuM zNy({NZ*3yfn#lFlt__vzBh_>`xyrIOb8%1x5Fr?m2wKqZveY5oK@Q74JZ-_9YuDpHk{%~7xxA80C zBFf$SBMd2bw?s%`NbiXf>8)LRKqsQ7L>N*Leb=6LeESX&{dttgaP55i!m6(oRRKqA zL#vgY63D5)+wjJoxna9arKUB|;kR8XJ) z{Rk;5sEfZ9CiS@;TQP;xG49tUexklw^)MEAZuRax`4)L!?JrdE2HzsLrj#BPV6fB* z?LJPAlIkVYj;XH(_}FUP$KLznuuNrF`W|J-`X*!N%Qe!YPd$6TfA9=cwd?x_2XNuX z`u@SEUuvBLJmHzQ*#=*9To1sAL*-;{9?caYV95Gn=YM@A?p2|ujunh1D4*r@#un6As6K&-cw#aJr zjSs%|e3YDsfM=$5;I-i*s^)h8V}w*U?Q@3h?-KZhWnwVl+cQbGNV4V-=Ca9GzQNI4se)!)%=$=|G+ShMKSW&*- z6d{GYE`3{gXCSYaL|9S2o^DG$-o~j$D!a^i+HwQeVycwAByl;qC?DIkB~y>yZ1#HvJMe;M+If=_s_GX zngG8AQ6Kp1{xXI_Gos(w_{3MkMC7JaZ|#$VVRF_@sY~hk33XFSKatS*Q_)TzdQZct zk1523*Yt&o$U&WTE%wX%Bdqn;c86L+>CVyEJTFSha#ws;m^+EAM)muWh{*1-t`ctx z-OGzX>k*3M*)ZS8V}{&r=?{|-&wu26QPh;b@mloM8D2D zCFzrwJs$I!Ff@@|f9(zS#NlHK-7-(*^`)pATGkF?K0*pTl2kVz0xxu`>3Sf-kh-XJ zX@nGxpuQ7zLwBb3<6jHMNF70aF+vKy%6}DZ2s6VwBdjQ2SzD@8RTS*Urzq_DO1vR5 z<=_2YxQOb?Z1|4jo_nn8gMGgmW=kdq>-yl~*N2IstgY*V|6$)63`U^2EunZ-Blh?h zAV2rZ5rJC=1($0F9vV+NI-bveMkk(++#Mvv7s+R8582nQJuxW}RS2(D?gFoqt3r6W zau+OR_3pEyq~>Uk^W(d$(0y$2N%3&)roBPg@qLvAnj=5>=?E$7ZuITSUBCn=HM~HP zef+f%2Kz|rBHLhdmD(O@Pu~(i_Iy!&O;AQ$Cd0M2eb*B4=?*Rv3+u~&B|^$N-06;z z>Lmbwpq^C^@TeXvZG5qO1se3la%+Ih_}HW78D)5>^fgcNo_H_rs2 z%i+w_o)}?8?SQJY4MXiIk|wN%)>HA-jX-_maC|ddJEDFzAYia^TOT2k2E57Y5B?Db&nPKkJ1elA1OZdQV$1Qa-)vu98G&0 z!bMHU^zj3)-wvHe1?37^{ZzPUkFvT4M zc27gjH!45-c)xw^*N!&y{6+d}Prf5uM4d_g!|f4L7U);MBTR~C{CkG2`E_?g)HkE> zmHx?Wu6YT& zxV3gOAKujv4acgLt-guiv4>+(S`<4 zi0jZ8KVOduex5q_6H!t%lG<~%PKvWs0)Ko%LsTzCmsC)`;}Q1(a4F=U-r8{NYemhE zJKqu^WzCO6JHn)-ORe4V7p`xJx-!vYd?Q7Do*k8pRiFPJm5f!NuL-@1BFR|e_ovr2 znT%ij>Rr~g-wHgbw9YDeQCB#!n4|J~r|s6qpd8wiNpxShXpgd5A<+x8M6I{8JuzIA z?+6dqzPYo3k58bOS$b=mqb}vnQ*1xAPb~Bbr9~;9D80|e{@zzS&&NLJR(?MAHxm4O z?2gBDuhjealkT%B_WiF61MoB4eO6ISgo*;|p4x(aY1hXw=H~)o{cc;TX%v0T0>8e# zyY{9~yhSp9*IyzfUcM5uDYhrE9p}4?wfjHGP+tFZ1?8WowV||P_3@9)G5`N&7>*F> zuYDce82Si~h4Lq&q?ReivyOz>k}1SGUi@SG$f#+w1Afn2y$Rt*SB1vVi#Yq}%_x`I z0r;RNC1!Qq)5ArT$$QF#!12CN?_9WxB>HJvv;_p*Dn1z?$xQ9omqWv0Fp{gB)f10UZQgY56rwEzAV?az(s z#s9Jv?ce>dp8aoZZ^&umL-X}VLkE*JU%zm=VcHL6zEgbnWQ5c*Rr1lx!la}|t>f3H zL}cWfW@Dvar1&Wmis9v#hsMAqH(dLb@Oj;YEo)xiA1>#dXD+ct8M)bb5vSCy*b>F`ts9qlvIM|=#NK9^^w#G`?{WQ=<4x@ z0}-}>!N1wpFntZ-#ND*5NVm0(`ov)OSN-MTFyn0Jm!htzSv%J2^Wlcnb(EecsV?e? zH->tYtI!1!O-9AvQ~S(E!z07-viozMfDYu`~frh{)@^wsv= z6z0$xC6`8tY_1)NcJyN#Dpw({QO2iw?D0{!G!!&?{`9pYVIuNc*52An!cEcC`Dxpf zK3JjgS9*hj*S(2;YwH~knRqqw$*rN^ zcjtAuibhw`7HiM?>|;SHw)|bEUG(|4_0B%yQ0nRT{@GoB7T}>F|MXAcTgadIQ*SJd z?X_K)6^oYCJts-oaa-~T^81Jvos1uOyvw-DxO2x=TE6SLt$lZH-`sQO&duh|d!AbS z@?&&yFe6Az;mnJWNctk7d^F;LeOz^* zYlj(-ydC!X(mDd`2&^Npj=(ws>junu@bp+NCSVv$TfprAd5$GraSLAaucs{6u?mOc7MZ+kh_7Pqd(u;*|e2TyD z3oRX&$+29C^(hW|uimgD4tl%f40!qq4>i(}cpq`dQM|{%FYvoc#Wv}*s}1ZNA0)h` zZN>t*FFhw79%a_2JjJ$9%4_BPjYf)B@Y^?Kb0`gpH+^=zcr&aY6mQRqHyTtc)K(*2 z90l^N=@L-syh;6XDE}f$Zq$_+WNwe1b(9gz&WNKQCTAn40>!@f0=f zH4@zxmyOZ6BF4ZYAw}B7d{0u z9^S92gSRHcxC_T8}D`5$(wRR z623J@QoPj&e+>oCg7jfMLZ9NLxnbW$8?Et^2Yn*=5-4FtO>EI}P=3Z%yMBE0(;UB* zP4W7ts;RF#e$&4cFP^-n{y=(cd?-foS)KKzpSPo*Xj?xh_46!f zA1jHD*zlubr_OfHc!{#p3raClbJ`(!;=3>2XlSbCZ*@=ON6x@hO}WuRe;bFSvGJV&g<{C&8CMsX1{{ zYfk=8cIY_cUWc8hfUkg`V{xaQApB-}Bj&3s#`p|I86~V~ek(pd9v&sur?@E2Im982 z>ZSy~%qyIEh)fWb<1pDS$6u)z#EUo0`Vw!~rS5nW;8W~WCtk8c^YI>s9jb$2@bf-) z#BbFhPdL@UQ;kw{`W5-qW$rlp!269~WdZxsJ%{qLOqBZDs{fvN_!U`S;!3>K9alGa zzdW3=_$>#;n|xuscvGw|@s>UDE;Jdh*fF=c^X>uf*B>IE_sGvg$X7h_ixKjPm$~EV z1|Jqr#v?x*AwTbtFGt9)c;t=C!{bR|yEN-%zu=LtM93Q{cRXF-!{X`l$fqOZiyry82>E4?d^JMeyuuxS5BRY7hduK72>G%{ zej!Aj=Iaet+VRl-*90#U=4n!hpfY~v9P-wF4Lr@M)SU8a4d&mgMU$!i7toD%iTi#MG_tnR0|Jo-`Frg^}ht3jt8lUEybz-1Fs&=P2}t~y;!9BU5fB$Yq*!h zN0s#@t}Q$4xSj-+6!;3OijLcon`_v)TAeqgK|55U)QftWR+f z&W~_hE1(;|CttDASOKM`n;*%Y*=OTK^N|TY14_+lhy1Fw_J7)5g1q42tXskF5o{;9 z8Ytn{eT`k`PWxgN<9~+cIcdFEApGhV#>3CJNa<5tKMQ-eArA8Y2Ne#zAA+IAr9oWeO6` zcFmq0yRO)C!!C2@HM{qiSKY8{*WUD=9rmCax@_O%_<^ZgvJ<&|hbJ#gUU132!-M;# z#>Yn|_Z^zV;ssmJzu@BYFT5mq;YIsK#s){HhjRO7rl&?mN2d6aozop6y3E*TOd8|H z0mO2P6cz;TMZ5FlHtpOEF$%3>ep7IS2HzpyQwe#(peMV%-Jssbp@z z`n)lW^<&sh82h(Pu(rq8VeB%l0KEa!Gb#XEi|pPd@nKkDej)^MMi$T@5{eRmS?Db!{T ze__pu?;e&P0E*+lP2o(V$2khNS)+``!6YizUti5X+pMh<=p*WtAlXTb&qEkPqwq2S zxg%K4K{Hr8k3JtktU-~eQ91&z0~`U(4F@fG8mSY;mcYmct+7mFozNpcQ&udp{&MKj zEOT=Hst(7oRptwdPx-qX+0)0y)jY{g4to2!2W|xdG{0;IJ&YIzK~3Xae0mTW^$*Q) z6vw&73$gAn`io}!7g}D#+vS#xaSKm-7Bh{P;jdF|lQmBB#*2Ys&Z+`$Jy8{@xqIBI z143^ENKiev_f-`0V0LV59K&{Oa3V+hJrldZ>D+lEVBg385N#i6p7BMoEzE1pf9NB7&9M=#|!VcgwHkfN}1h0=@_nuVt zF#ntPSLeD*yRDqJ{%Jo;qxS$)I>(@Wal6N`&p6QU7aJn;A2=ia-yU2AY9if zPIQdy#Y)b`{f@4wmi*2x*3S>3&JVWW{9BzR&{>8$yQAat$A3Hde8bL;j>g=__9l+f z=qeGNgVIcITIYOpuIP8}LFo9+Uv%Yx>NEI^m1Z(^E>35p>*u?4EnszKLHD`t0Ismj zShGSF`)TKO+|{n^$*GBvv4bWqgqow{V+R}N<+`kOEy=pFq&7M0hR*8uqwWskOnwwm z4&X?is>6Ae>g4OVbdE~bN$C28Twyr*EWqjK3RoY7mbxNAS6AX)Gowrz$0h6M-{?7Y zrFiY`Pwnd(r}BE!c{tDQRP#Ij9kfQ*DLMZh%E>s{pF21*7JhAtFw%*CKjw;q*o%zC zxK6;w@7wlV?w-TsxPD}8GB;sg9uGXQcg{Dmj|)2PTtA)emvjG^?vv9 zJl(mZyEk;?OGg*O)?CrfqoGdC?leE1d}Y+mHU1GkKW=U8n3x!!Fvq43?axh^(_=%q z10!SfHHquT&7s`k5nQ%BFpky6RpZm6Lnhsl7#tnPl@PVjFs{yJr=}-z)|Qb&`BCd; z1q?uca(ZysJiyz>#~LceMdv5azu*D`M|Xy?Jv)^(r*Ii%5|>HM97SV+d=20CpT_iT z?w>wDTk{j+hjG!xI(*!n%U+3_kGJMtJ(11la}$?c=3S%u%DeWm%iiK$WeIv$UUu2! z@buKs_$_0~&cMKAF1z3IIB+mGg|BsrB!x!j*s6&2i^zJJLlkehwE>+eg|zy@7%ka=*f0)mv_&^$iaiTiR&ESbnrrZ zvL3RzdVJzgc4{g&q~e%9-iiNA~FXlG8vJuiHqh)#$mJCGheb0Bwgp5HXC+SSEgXZ@lMQ zs;n>m&$!<0e*^eF_@U%KsR?CQU5e|0jAn{X;Wf zZ9k_&xRpJ27QxpnNo5CJY&{=TW&b_k>9gEoK5SZ>96%P511a_6L(eN6itba6AJZdvDr<&n)<@l(8`{i+`%{$b`>rENsw&$BQl$l;Z0L9p)$~e(3|sgIdGRYwUU=93EjiCqSPD{_Iz|aUh#yKgoKOKlNu1 z^H^+alX*e%ka$+uzswi)4#gul8n3l+q;dH$a3kE0gA$G#cDbMTmH7LxjqqGxeJnQB z$OpBG!#~AThCkX?0j1{(YoK{hYP4SbOa1n~PQ`BtH1SXTr&wR=aocX?em^G-k;N8rkW`hw!Vgf9d~)7W09rrkda=I8+?*Q%*+_ zFKv4OlyEo(>cm0tFR)%y&LQmepL)HGANf!2RsK_;rTasqYi` zEHf|TWvN5?!F5y3Ti<5J&Y$|YhI}di6;P^gv){kItBhMy&LQmeU-I~$fi*0SPU(Y*mpnc;B#$m%7)cMa=&^eBT@R4yOc=Q}lI5rzB*`k(YeL3Ephd|7DN=-T~#m50w1pL8-5(`R0ExX8x=%`9IA5kFozVGVXC8`OE%b zKBoV&$A3TkQJ%w~lz$PF`kI<={=+fzXMM^4IQu`r{?E?3zbAH5{xSWRJ^u6XM|l=N zDgSv;zx)ONo{^aOv%cj282jI_U-{n(>hv$iwQ{^UAJc!?;h*v@!k;vn59YvAuGDC| z_{SG$hG|`69(kj}f$|`^M;vyZ0R9;GVcLL3B+Uy+){}gCn5WI{Y(ew!3i~I_O?>Jd zibrrXZnAMC{I?FOdfW-x1%3*&1WJu?^ybm9GwQZeV>`x>x-QoPx@1{Vc4&?#`xW-z zk7W~|1?I8X)+Xbca-vpo#7{Zhk9cX@gP=4nkAoIKsnL3hm*Ow59u}KwUjL~>Hh$#4 zH>dpffm-_oP^uAXynN9SIK{B%$ z>Z2Q z?RRNh&Wvod*3&<_&N~l&jyf8Rh!tnI0#wPLLuVw@%g(SVv$TfprAd5qMl95cK<+rCZhhw%O!le_dvM zI)3unAemk~PnF^gbUYE&g6#Ce4(+3AcELyy zw3&M7o@}nadYhE*Z&H3KKwj|C#XnOB$4~5eso-DG)Ypxtu4ykQp2XY2^O1VEeM;3s z36$z#3ACAd=%4nl2Z_u3`;BCq&iAVk@rk~d3f^_rr#xugmcttxqBQUIg74!sqSFxY zSqPf{O0Z+HymS5&6T1Cbd3$(&h&?Zr*sBrxLGkzA;vavIe1DVjGfm3R1;|U@LG_Zj zJsy50>r1_CpK;eq8hkVL5*2SHX1q(Dc+Dg3czeLN60cl$n^%srjyB+z{bAM&xd2ldkDK1?+W`Eg@M}hg4oHn5(c$Cm!Qil#HaNzV7jDNzSw`x}q@TPYs4e&Phb&9{GYaAG7sML&3I zjvqMbMFuUs4@?>Ng|c(+19QF|%{LTlrTu%ZPWf$k{{{V$H2v;$Gr!PpYh7;8ulv)l z&7b@}s@EB>4-Uw)WfOjD-G0j({f_uFeoK22zj2MLdX1b%fd>pHi8nX#~^S(s+qsD}3lykH7H zeH-=~Fy1HAB?Edzr>{x7zXyyP9eajW-(l&t5&d3|-N@Jf?UjVX6!v-Q&5uF*zH@!E z3SKF{5B~ydPZ#IyRPOz#_suAqf-6Fe+Jn=3x14+bW}|k_4{NPn zPCjx7K4NONYV6KjyW_<@3$Mlz&1#Q58%2BR@rJHhMZU&fD`;Z=?M^rNTO%>B8+EPj>3 zoEmn#2=JEdBwo^My`w&hA5b@Ya_1jB-<-&0M@Pp8@se%)?)~`S;Pk{qZfJ{%-*P8q zHcYBRxF|R=ek3>aLVKwBF6rVGj)jSHNZPMttz+IC_SsW7Iwb1d!nHIZ0@M1? zUS3rZy+Mr5kJbBIdqB^}anSjYqjx*Gk0wWOMlpshbZ#*SpA(kM5Y8`X-30!Ne|Oxs zzz!XgQ&p%f<9J^-d3+(FS&i02e~;kxFq5w9B;3o{F_Yd^DZ@In3)|Iy)Nj;#gjVp; zgtM3EDuD?s)w^xI{jQ6z=fH;sf!}N88(l@csNN#A){aN~j$a3itAM6@3t4OL6Y*ZZ z@#0MVMV{@qorS#(+RA9jXd;u;~%p)@~-aQbgiDh z$F0pxd|pOJRtK$PS@#>K!;WuFJc%i1jdFgO$MLp05~p**aabGze*k~@rk?dX%vxBc)2XwZ;DlG=(`>CDSuu)?zN1r&{g8XZYcm z`Ln*{zx`g7{~l1v|29zSYiiBZtI}xS|Df*^b8tL;y_UC}+B=X~>zD7hD08ZLMJ^ysK5FX_hVZ*Jm1b}+Yv-nDK0F1K~l z53@Ln|@w}OVvM>DK1xav|F+XavRS@@%EbL_w3@vm#&D_8nkRbTl-s=nSbqv!{& zQB>qhT(3t)!sUYMr|^|{^;2Yhsh__0x$9>b{A$#X%;(9!ju&r=^`(B!m{a|CCMeD4 z+d!T3xp#lQ5YvCfrpkXiDCIv28k&Dh{}qq_3j1GT|0^EN z%|GW{tmtz-;hv|Kcs_gW3&Z6k&-Bi{yJ^|le-7mij|}3WAkQw+Ij7P5K%YH-8?Qbx ztWWiEChYazXU}J6fnNsioXm5XBVIh|2>l>Dhv)tA zBzc3z)Juhy8Wuh9MPY|Acf8dX&)b9|slaB%@ z)o&TJnfmR$KiIxsE|~y%kqxTf)VIU)7kw`k{L-v1_4_E|kVfNp1$>HEh>mRcqd|BN z|Dit~VnerH%Ihs8&6r&p5!T1uw07J55lwOBmQ_w{cgv0@{s|h`YnPsQ@`CG z4Yn^i2qizM0C|xKs$b)Hy#7qEzSQr-h(j9H?=tuluMo^-yB`h0yRYnzhuF}qmuk#> zjqmE=r5jIP)1KrhRIn^Y=m+81^)Y`urG7VKyH!`9RKI!9X6kn(#J=Ppl>C?<_m4+p zg6g;OJ-z-AJ3*kDfN5C1FC*aP^#ZFXfyS@40)3~*m=Ac6p!&qe|f2qp!zNRQ#|~N ztWR-Kecp{Yq*49Oflu*@IQ850sfheE>o@cLc=;AI^>ypFu4zv&6)IRJeh{8dP`xY$ z;3@Tc9NR4)f28U+3EE8kE$k3H&x@O2nfUkce1h=o`*VLhrGAI7oqQBPsea3#&D3x2Uj*Ct%Ow*a zFS0@PoBEIN{6*hO1-~@wOZ`5IIHb{jXa#(VSBQ>m_oG304?pCOhuF}q7jq?Ez9~(8 z-FV8H_9RcCg5^?#eh{8Lf9a2>)bDm|Cm$J5s^21LGxgj3{{`EZ9E6geRDit51l6zc zU-9}g!TM6a4 z>i2%cA&u&H0ep&Ah>mRcqd|E0{8dDLn%B=t{~a&iil)A9{U(1JFP?OSeh{9u06e9B z&-j9>UlWw-Hx1fM{Vqe^SZwiPpRMI*lzjw zlB(Y%XfyS@0C|&x)v4cVfV|`zRKKay!}Aw?FBSaKtS|LD`sIxcQL5h=@F`v+It>Az zg&@3Zuw$~k6Av+=TQBC%#LG9OsjnMPS<{~6DO9jriqH?jbAHJmPpRLBu$_EVL23R? ze5JYiorAo|!8-dZD4t4yJevr<{`-V@{h45Wii`5y`PUo8rMmtLKE-QjdsGX`ZxMD( zR(9ec_H^r|8Z%$xiF$bH#*^2yCwU4LEQ=BPL3qx7)gMoir+Mcnwv&$vDAjKrw3+#L z=8<6gl7mq4Qwoq5nV|W%@+7_f5IaHzza`d}`rYz38%0E2{{^4oHKNlH@L34LdmeU7 zmXA}vrLK7SRy6f>>o@u2c=4no^n>sm{#$=MrG9V6cIvMZDAn&0XfyTO|FvNI+>H%F zehLBdA{11=g`bUwUy=2tem5*{6qoAyFZdL%p*W*j5Z<$}W3qCb`prBgUcLoQeck%4 zYufYTCRipmgy$24XW!TT@s#=E*!+J;E`c} zg2%S18;=b5PU4X{(~U=(d5ODSRPe~NKf&YdZ@ckGf$t<9`DeQE$S~h79K^2RQDA?9 z$73Em%3d~DP?V^H5iTw#4 z4@hCDcF|~^d9%c3?c-(i~jYkE1C+Cmyv)y=;IZ#}ZafO$JBi2AbKH1Tm~R&jVps5}vOmFN z+dsPT$bj!89@Vqmcq}n5akq;K9(DF7c${5xmTGzFjzoUBScnMde@c zc+7)``A?n2!+4$>k2=REakq;K9trj@cpO9i(yZf;?{^lDgz3h^U|wQs7Zp5A_9u8e zi2S8l#~&TW!`$e`Bf-4H)GjJ`B-x+fao-QzcvQg0nLo(xX-Hz~QQIzEcPxMpy536i z6^A@s4_^dtT~EX^ZI>qYyMO4mZ-NiApK-{O{bBH7_7@!T6n`bczVXj?JY>HMe3<=y zhdkNOfDenm_PfA`+3$16ll?UKu=q<3d9ptrVZY{( zC;RmX`>7M|`1`l z>@P*wH~-y^hwS%&53@h)kSF_j@L};+Jo1YX^4iNa7Ei_@Pw@Z?3_kMQe zT!p{r=~7O~sA}r##*=Ny_#(D1Xy2A0uc&)dXUr1=HvPs5kg5xLrXx;4&{Aj$Ez_)X} zrvJyk&UD8|{``3LQ`FSgjmLO#ym-tA{h;xeFg6(`SB7)m3zAO;$g_#S=UwX&@rk~d zHpX63;UnYqLBt`A>TeNzidQsrL?DFfj@Jj+zwBStp@Q*IEc&7}zapz&8a-5(Evezl_&@=4HI5nGf@IDz?dZ z&2xN&AFVs;z>mgj1$;ZlYyJ%XI@28=OD~C6KXpxg-FPw=$BU;Bp&vBLzaUeS*6dSoUEuW9h@9IwWc{Oe42d=xH?S3f09ecgBxm&J=G8KECE{we`D2FX_gqG2c_OA=f%Xlrfn4jR*E-K@7$$=lOd&q$wjn^vp zc8=HLljDuoU z8Ly8a4rx?>T~BH6c%6E=ieJX-F!M5AGt5g&YlX^qEpU8bzHU5uO?!f|P#Leq2>qb(R}H{1NZxp=KkgDw(0I*UsfU-?5i0rR zSzpHM-H1aP)!!WW6t55+*&ar9&tErRv>3J6_El@#0BE=m(9z{L}q$43aMf$a7Z&ULQ_e9WOtV z^<})Cop6uW9`Gp+q8;P)5%w?p*G1-KyjEJwPjG7&mGN42;79AG9Qe_AErM_7{x$V; z{&l81K2m-0>L;VAuN%*jraf=JN^RC7^n=Eq@$>#T2FaTN@)B3j{j?F-X1~ATI$0jo18j zdU%N)p^{&L^<}(nd!}7)RDXToQ>-L9Vk3;|j@PZ%yT@w}^D}$w{`de@*X>S3h}8ecka|)wIVcH%Oy4_k`yYH2%uZ_Qx?ueknj+0ty0^iQ@T6m6so#~DbKE*2p6WJa{b;s-W*SN=PFY_{9lgx+t zIu+Ywyrwxm8L!))YvV`bH3Pn#<2CV%{&l81KFY6+S3gUd`nvI?UKcN(OoV>W_*)9V zF-X21ATPBTG+vYY;^miOeHpK}JxaKDGs6?u*OD1;yk_1IuYL-e`nuz_u4&KPuTqn{BjOW%FO~f2tS{qr!zTB5?FOG>Wzq54^5b>)uSYWqUm34+%*%K!GVkZ( zRIZcpTITpXuKxQY43Qgz`n@K)#M`h6t8ILh(HL{-M>D-{^fXho_QIsCFVn1 zosvy5UMmj#Xx*9T+W66UO@eRdc&);|$q2Nve>D%q8y_i6ecka|*0jedH;B~cQiOic z_$$50AIBj1N`Sls6f|B-WAX4Vv%ZYiom=dBqx$OypW+|{6NxE|4(z>pWMXp47}&cr z3j(@5M^xGj7P|1sjH~$jneS(w#w%@4GmphJ)nvTpTZ~T^pF-Y^&kXZ|PoDWT1rCA{ ze2Oi`r;AVNW;Z@_%nLq6=GQ7d;z;!|%iK3#l_X*WJAQ;HXS>ddcId=eagv+?QTV;*+n)6Kl#lVHAC|LvBS`8nBQ ze7g9gZgJz&%e>%|WWL?`Hfvw-Nw*lEE#lV`r&`8I1`@F}(!pDsS7Tiy7~F)#QOnQu1!cFPMs!r+S+kpJnC+pC#s-jlbRUf=|80_;m3x-r~k*<;{v0eCo`%JKtvQ z3qA>szgc}@JTS=tp9e)3qHvf%|WWL?`Hfvw-Nw*lE zEUq90PqK_(XD(k>TK-*K0+-gzdEc0Z@{! zMaa)wpyclcCHV?y29%ng{q%)Oeh8H0=Rh+gjOHibbCHtY21@dI&`DK=Wl;zErgv*z)o$NdWO7>SG6!SIO@LCHVqqhJ?}l^NYXlWlDY@D9IN=GbD`WCvRS^17YY2tEmpU)JkVU3|>!r|>~HJ~PYx|tVz63pxR?UbD0lWZ|QU3^j> za^us>yx@~$zEgSY`VoB6EykydPv-aB`1CU`_@tTFjk{BFf=|B1_;m3p%)9ZKVP5db zGvBGab^QoF#TMh!#i#W9ZhYpL7krA$>&D$FIl-sgVtl&zR6gv+XMuUar_6k(^49eu z_$;*;pDsStKXBu-%)H>U#Jq0YostuL>Mh2ni;wY#ZhThmSG?d;XTDQ;>-rIV5*)v- zp2+FqV}8VqPdD>|Pl9=|yH=>+lWZ|QU3^j>b>q{^yx@~$ey!jlaR@%?7UR>!CsTIg z)6cx%lV)DxS}RoW$+sAvE3QpCa=T z*IJ>1Pr1eTbn&Tt!i~=Y^MX&A`L%+J#3A@BwHTi+KGg@@_$)Io_$)Cmajg|9_|#jB zPZuBKQ*L}#KB;)Yr_TIZ!A0T_d=ebLtkiS#&&Ea%_GLuSjuAkw54|qwoPHpgmD0C z2eD)t=Nel)ek7JGY>dL*pk<+x5nYbBF1PX zR|3%k_#-Skk8!I}v>R6eymfrjsNfl(ItqkGP_1Lu|AVIh<2aGD8|T*X-HmZHff_zy z>;$q0jbZRtVPxg3YMwj=IIl)TYZ-5vzi39Ez>IOoNQ2UhnzLqgs_;`$+q z#y$Rgasx7@y&~^u`)NxzqQEferc4JF(LhJQ(tlW8oTaTj?7`I-(JB%GT2iaxZU|ffJg0AjN zor3ypHHuDP8*l%14aOy%Uk~Akg3dTPU%9PB&~98?uh%^|UZ87ihft|IfTx^G(-~do zv5gx|yK#;`|K5O^;Tp^g_En2$7}K9=>+Dj*Y|F#x<{e23$lhY?MMYm}U9+FG?wH8+x6aQX@#ASX*75d#S&90((r-Rp*7P ze^+Yt;(EN`AAOIgbC|ahOFMCHeLk`4Nbmko=P+(Ho_69K|9Hg4dpG6={X18k!#!?X zk01Q)V?w<(x3wZ~mTB=g?n`*gDl0tJNQ2ccward~;EB3ggw7zni-+)j7oD#?^^FSPlHu zadOx_tIlEGN-XWfc{T9WxntEigjxi90xtSQ+iS26CZ}@$y z&SBbY9PPwaYIZg74ZC+m`=D{_?wa?`L+5Z`t@s`<{h@b{t#kOd8qebgZ@RA*b*HV9 zc()eM;|1?#?sRny^>|Tr0(+YCa}yKe6EgXO_VCC2q53|YW0Th6X)KjweR^*QeP=B_ zV84I<3E=bKXINHrm<=Tda)vRI#XoMtp!7cZN7!E<^Ghwp&t|m=y{m~@)sZi)OJvl0 zB}`C?Zy#up1ksww*ZBJL3MBu&9>bzz&r@{z8H!p4>EE)F>pDAJZtvJo?!d@cZip3k z=O#w7qt{O#+Mlz^V0S(@I5jbTC^x0}J;S+)L*qL}Y3<0MVO%pYksTVzjt%Cn%8rig zpU6&)jE}+AjveV;H(X~JJ4X%V3u=XPcf<#&u__m4I@?yB*zsgbei z@##q=!QmLYho`5=^{caobECPjgHyw9Ki7|sjUxQ)#K_cyK;v|CRGZSp&Rm3BZJw|D|2ImR9c3@ zWBO2fVx06x#`tYO>5-Y-=#?X5W4va2b}D=2^nn8kHN&`K@aAb4CUmyvMzcp$lQ$dDPAEuvfYo89U4AeH>r95Y*2ciP#QGD3VwEUzpq|C zq4Mn~ANb5OFW*-$G0(2n3?VG3Ra%TM$@{+xKBo3-54~5>Tc4}wH$JMU@?sd>f2a0? zKijJ(KhN@?x|2{NLZHXTPti?0@zqJ^5vp|AA)w!{1i+PrO>s z{tC-K_4#`8v)@tnKmSTS`R;#E^7p(;Pkx@|uRTjozW2DY|Bq=s`9+rh=EZvQLFXgo z|BN@^S6H9sX_}MzNA3BZ_ER(9TRk6A&jnKLvl3=k1`B|NS2SGTsRj z8gKpo6ElC-m;8+hByS zzSQsVw5s13P^#Y&sPlM5{0Gs6n(C*Iy;R{p`%8*`F6-{61@6zc9txKeKSBMKI3s5M ztS|l5ec0V!z2H})zht~uV#d4Vh?n+vk03spi;ja*e{HzMJ>I2m#DCut;^CEMeW{lW z{E`1WDEXiB@jt@Xq_Nqcn5iY6sNx_ybX};U!o@h2tD3;aCB6 z*0nc}hMgz7`y>4(9%rCrXAab9NAiEvlYgy4`L_Vs|0MGU7Caiu)Do;O`@4s3+oU$&Kb_xI!O!p-(P;?yEXaP~wl}N# zyc?AE0}p`qIP8dA*ISfaH)t2O?*TP^&JSEa~PED9R)Q(snL4z zdv-y|Z2={@VNes4np3XIa&=Jh+x<4TUrV8hf89S&b@7*js=uGX*E4S%ao0un_m$k@ z&Tu(#?Y$p-tV62jq>t3 zpg6j3xAUU7rD@;)ds@8lSJc$kjmLO;ym-tA{U98x0XPQ98+Z8Q9wcuA2AxF4BL#KSMc`V<${*F%Uy8eOkm0-xd)v^}bkozo$d`eij=?E$6nI18F# zWj{N*_ajq3r}Cxa1)2wYnU~|GB=hWQ%@DaCnQk$@KAwl~bpEEgqTVfkgg{}&~n{-Lrz%6_Bdt1SP6aTRZre9-Yj>KXCsJT`wt^r`}@xP;IKw7_{1%3NOhwJN!13)?|w*{bMhI|&gSz@uOL zhq42B>MT1wI%UnpluzNA@#?3jsUI|78)wDypJ08NuUCMdG;5CemDc9#H1r7nAyDd< zInWFn_Ujkj`MS>W%6wg8Ugqm+i+FHoZ6h*Y8_#O3zw$p)^W)@itNHGy{G7yJZc@Ai zp8sbh_mdBY%LUDc>F(CzlRnL`eq(;P%dRJy5A)z#nGa711nQ&7VP%Dvla9c4K)T>n(z({bN7#^UQByewgLc%y)w~A>YS*4a;ON zCHh!4@kug2gJs%oGEZZa_-^L0xZWN|2xNzbCg{0#48E!H!SPY5QL0UO9C`uuLG^Uv z7gb#*!P9-X73ND=Ccege50>duWgd%<>&8RPFrH_R%O@eD-l7_pc~E-(eh##Uc4TOP z$jE1>hG|)Fl<%C>u&xWAK2zD7!*VY^Ddq_~`t&l7#WmIBcq+~D(L6=_>+-u49#zn1 zfbV)Yp06Sx(1^%fN4e2_(YI0MkHw}Mn>5m_PyVf#-eb?#)IZ(e>ui~H@a>a>2XhnG zjSuCFA!`O!8z~-|XBT6}Q+32c{!TdJq2sT|z^6f}(RPZP$|e0iJ8r7A40sci8p#P> zkHn0xu*t4p%edno`MDo{yJ!K8;`R2|3hP?}P5fh%hVe_bf9kJAN8WUuwn{t;H*}it zvo5+e5g52);^5Aa$tj7B=DIF?Qs=}R{}K8$zQm_ctFAs^k1wioZ_~ZrU61hZwJW^T zcH;SZ`Rm40(6lFU2$gtB5&A)RE(YK!^YU?Qw|sn1-S0|*(ws(3eA9A}{RPOIB!K4Z zFOnzyN3mTR%_}S5sm7@3*zYX`+gDcX|75Q}KwhMRt`{YH^!i)u2$dXCtS@;VLmbj5 z?;7|NuMi#C?nlK=&u_c!B*B|Lc7pn+;E;FrkN6zebBGQP8%_3SsTan>BhC7f$C>}n zorej&kG<;RaXREzphxl>en(x0NP%X2?2uoQuV6dLKf>}|NB!m5gfXxu%ijQ1Yc_+B ze)`;acw{v7b+7kT*EdH-QT-+Oth`9^f=``! z70ufDFZd)l{$?Xv;_F$z&DS|a|1iGbJx*78vbd^52aoh+TDoX6iAy>rE(9ISiKvUN z#_z?@J7nq2ZuDE}o%?-;aIg07FVJsi(3^4n^LK&a!)$WBXVa{G<5 z^j4)Q>kW59kTfmN^xnptVb6|kCpP{A#*L7ZH~J1>iQd;l+Xqha@`ud)_z14mPq-&rFTV7< zLI*I)1{`yP)A=SuMX}My&!eAd-WtM~rDb|^o4oZv$(%g1~&vEuA`}1mx@srJF8XZ$ot2^?g>q6-d zspHH%sP)_}Xw8yT$B*9oWAj_%;az5ZInLeud&>V-P`ci?544%%YYsJ%^#7~6U-mV= zKlak=)cvsc^L;Zh(El$=?&Z%{+k@nS>ap^Yc=#-_zSQHRz(X3R``GG4uevoe(cAG#`{**>%lVJpXgy8i*0SP zFO+(s*eISA_D}WIjZeKp@d%E_OKlu!e^_T66MwkLp!)~Cpfylxgkzq5U+YHeq|~*4 zCp=Aj7T6vZn`&g6+L9w4TDJuM(&+eP8GM0Pc;j)_M{%2-7wIKFV%wqm=mDQ#r$lD( zA^aa=|I{BQK7DKli*0RmAJZ9s`ekcn|O~iki^<{oM&i+rZ z|Fg^f{wXHPe=(;2C6E6+{84NLP|ANEGy_UaVpiPx|4tyVa6%oQ-E*Nj?)s$vcBv$ANiO)FVgXK9sCRj(@cHIeogX_`Cut# zyj4fMG!NeWaWx+91Euls5NOzZ(0^q-yfUmW^Fj9~l>Z)3@}CCv`lq>E=7VFb-vik$ ze3n~`2dYgq!irke6aP_;{{c{nrw;1ek5E54wS8qX&i=fmZK=7Z#pc=erPeVGq# z|D=09D1l#%`JfL8Q-4)s##?v9OEr@El&Xg`D2>M%P`NRxGkaXh6@%pRI`qE!@GW6Mit2~nXRCh7^Y1<0{xf?U>2=`}@obnueeWchIGk?~X z{@S;!>`EtQtyueFKIMCb^r0|)VtJMa%a4FQ>-uj z{Q%;lx_Std`ukDP3@A0JH|O!ugRI|!?Nt8@EyhFkn`yM~qgL_6pL$Tmp9ZCP?gsT6 zFB0#}b@A{ku)g4T#%GoPGeHTzZJ;zaQ6v1?-RA#Gji2XiQRCv9{QFba^L2FbKhNXr zcYh&Vj`E_oA3+|{=z7vI@Pr{X+AjGg{=}A}dN;u*NeIm^f6^m+3y`z?fKtCD{?u)s z^qo!jd7AVMs(+~l$Zj9=)F;HJn8)IpYJ>^3OpEa?a~*vBsOsP6o}=i?UaP3Gj`8yo zt{1+)vi$>U`@4>~<)jWCL%&F)7|*D<`$_7c7we@_9rS?@s{`HVQ4_C9&`cDd`fi+QPEgL#Q(tx&07v&H!8 zT$f+s-;v4l@$G-`@61S^QkSJax9g33&x3d3FLim$AxHiADEP3tl>WW_FI4}QK&gM1 zK%Mp_9-+GZTi@;O-x~AMzg6bN?pmSJzs8={#$(|zHSe6m-*=v!QS;5e@q1*vdA^Rm zFFJuA^?AKvT!xLW!w>dMPtaRVUT=)$4qLA`kz=}BvJ>>`7h`1Xz&O#N-2Q2LI2O;e z4CX-h?7HHr9iU`q`;II3zJiypx&G=KuxMO<`Q^r|uh?}xEuVYtxyFuNyKdNpWqLkh zGMC*yk;~nhGtW8ilF4({@Cuqgs1BKJ z5L!PAIg{6ro;*24wMn1;8(ZrinX@viFXQZfN1Rjx4|w9tP8_tppDOjc9MgZ5^~J8l zm43C#OV*3OB(FzkO*PT)Yf)d~Dth9Q_4wj!ftJ1TR$KHZ@vgL}FL9+fuF-M&8k-$o zKVqeMZjQHa#WLv>na5&V+v#k*6cJzVYZR^$Uy}K@1_$F3UyA(&;kWFGZ>huaRU_h? zd9542JoBBxuh1cX?arsu_5;8FwomnEv+>A$kdDv~+7DG8vX6&oKO`+kz6yDo!>H-V zcVRyx$6HQ$WkLUaTj|%w!zUl1ACzzYbMF1L#7*)vmmI}*X_Vgrc$$N$N#7_={U5ku z^iWnV#9@_u-zW8kc=@F@^}XLmqxqMfpQ&i-t1RsQlH(HV6E3u_chSa$jyF=^)2t>s zww05Y#Lkk(&N6s2#7@xn%Sr?B@GY~x#MS?KcYYc0eIaq3oS|Byd%ls$sQ6|7-p@RZ zMcUt|nGf=Fs@BW-M!v=PCh;KM*g3pf zv+cB&o^+@0zR)*GhOuqJ*uv{i{vL`*&^J)%$#(i?jrtCX(!3nHgZPdLd6+~!+Fr9* zJBnxH2eC~(&u{y)zXNpgGyktMaDvoA+hqBc+$fT1V?X{6TKVP?gNbP9TR=n);D6AQ z`pWrG?q>Wj4qj?Gb;R7CJ1{`ww-_$sM zDP-TFNi1Hl_52GiKL5f?k{4dIZ)9w6bb2Va&ob(t+z`&b_90%1ZOXXC>X#hW9LBl} zafW|^af!tZ;y>X@@A{s^@*(^`j4by-VykgJ{$Gs$7eYFT{}*9B^)~gD+lEV|b}6 ze*5ZHd}BuqKKZt!Z_svq4j9|vQB`!S-_CPdi2iP#Q<`R0o$u+b^|2xqB~^9u%pB+2 zfG2n1Ce$i@n`#UdLvu3CGE_MSn9`g@b)J9KC#;sUO-@zhX)&D1d z_tQQ)IXMPe)2K(OM(2Jtq!9h$_r@NyziB06Ye;O{bGeCKj5#_kuS>SBtDS~ChW^UV zl#VqHPZKPBl%_Mo4kSSd7JM2 zlk^+o9lz!^^>yQ^YTEPW+raRq@O*;sEI#ayC&^R)-;eF&V-b{&i;XYZ@(tfuE%LWx zJFPE)lKc{=vwpD3YC-Yzf62D*+rN9S9+|+;-3;vAnWbO78Q8l$XaD+*dVZh$rbgYz z_r1)^@qLnc4rk2}IlfP~7+>PQ)%}F$@$<(2`7w1r;SHDj-^VO`*&d(ddltO2zo?&1 z$NC2ya?~#mgZCTnXD`|INNx-GIOBZ<`X=m9^Q{NX_lu{-!pDd5aPoht@rHW)RrA6- z(rW$3e|T1b`c0PxA!faN1RHlu4d*7ta+r|~W7qBrFS?Kw_FR>I@ipngbXm-5d$+rJ zstdYa*7G;^yg|yv--_mIQ?Q^B7go&Z8)q8QEp zLG|AIH9Ifgde@xK5|c6W*VNaY&q|v1yzmLOl?eSHJdI_4JcH!TCgoF*m-)=uUqSXW z0rn+t@AYE3UQP91pNiL?#xCqnZh(j99F?H}MULlyvc0WpXPREA+udDfe6qLqE z2{gkBes*-Pzg9Wke%PY@#xnCVUoSDwuGS2Z`MTa>d<#4ePw;!gKFPoH^!n}Y`MUH! zYQ7%IsP#c|NyD_}@$cOiE>~f>mn6gG{(tta2C%B}jo(y^lAFRLoU~XWO5NLb*Bxv3+DENKH%*3Q2rGTuzO*P7VG@Qge_@fo{RvmXkPOif{?BvX=eg(H z)6RB3S~hy??m55r`~AJo`@HWt=RN1xnu+|f=hYogPyc-%>W@d%rwRyXhkEZ<#aHW- zpX!l7^O|1!jmL=kYUeR7qlm&s(mravcpN{J`3l>S_fc>=3II!#3ATgBVYMnA>Q0R& z9?xqzDW1vc9%Y`)O%2ABb>Mp`u`|VZcR>J-pBTbut0edt2;*U6ay))aR6pbi{mi=* zKJmG18{jgkxLPmB>#zwuJ&yla=})!Y4|P5)nH8NquLv=HsP(bj7+rnr^`zJ1v08^m zz4*pYYUf=qz6s)^&ZATJlU{tAPW~bX{qKhr&W?^hAEn27p+4_~day(N_XD<&M=1J^ z`5XiBt)Ghdc_K)hp9?|S>&Pe6`PqAuXfMytd4zd>_7J9`8jWE4QW#BiDW>N& z+bk6G;AwXV$qg;0czx)(9KCqv79zitK_b0gJkA%kP~!ho#=~&CXQm@VeB+~^l$&{d zrh7)Fgy&TFMGyI-0uUMX0q4`5enqcPANB*5K%zsv%5kM<56sOT;+U46F;m8l95pTi zKkQ@g9MS()!XCl^8`PmrqbsEHSkD)IrnC#^yETBTW$afJn(ZJ zq53dyMk=5AkKe8EkNbbkfQ=LxtBdhamZ;+4SS$tX0*Ma8`TaMk&g>NQ!!YE(hRQ?T zi-lh`VK{71$L%%TBKXF3V7>RN+JWnl)}NnasG*u*JN_wd@-VnxieD3=24PC4G3&YdOf;_wZ@_BFYsu$$WTdVN@1Uq9vZ4Lz?twv#C5k(-5ld%Tbv z==rcWHP_9w`JsMj{jkm3K|gS;qQiBFJg&jOBA=+!mHE-}>8JEO&h|rj>`-410?s23 z?gI|5OX{_!Xpb^)sMl4Yt~X0=jjp{FA*K(tK9>2>)yG~>dOaSKzo?x@z4&=L@wpH6 zzSn5FExPtuLQJoB{i-Cy^xO`XtgB^|p7p!qm%;iS575?{8%EapXXSyPW-_q)^QVP-@{|4 z3cUOxA+_tq?X=#UzF36oF{11boDRFg`0f4L9jvvzJ%1eS49=##XjVv{0q1hKKTR^6 zALfo{^{&!LN>lcE9=anh(!J8iS>*iKfCt>OhkLtm7qV5}mxp`!4mUS-m2|jynUdoS zQY9XL6@}5wUw%r@c6{evVVC!SM7!MjySnXcP^AzYCwXyxh#x5QUwi)Lqj1~M+QY3e zBK>H(f3=6MkGUifpUdl#ZILf#VZCvz7eGDP;rh!5SRxOsPpH?Yq+oK zhr;`#vtK?+&;4wuR{9C`AqKEoAGmxy={jDL?N>Y6-^la(+kHj5A5ImL{aH@$DE#lH z`@!1$hd9zR;K_j;x0K~{q)Lv=nNli#YdbB=Jx!7~HuaE`DDh@wflewBAtguS_b^}r z)>r94MPJd+rQyK?xIivJ(O2w)T@OUYKi7fF_i4)CpecW|PWg69M^!uGqK5kWQo0}W zEnUC+GEwv=R|xi_^)uylG4;wwmc2rqPdr6}Un`_S8(}BR`8Jf~`NT`*u^p3sP{v0L z6m9}sMU}w5)VtqdUo6_ew}K-7U;%isPmIaq@{wcU0EP!h(-$>~~F8DAOZ#}LN8!Egg%JZwzPnVBko zXAJAaoZ!1v`BwiBx^d4~e#sET#e4tgyekyG@V=!V_(6JN_n%`p8Keay^M(FZ@QZ<8 z9HlFUV+np{!pNT)e({8vzm9|@s0TaLxf;M0^58Ta zUYpe8!}@D@{COaLZG7nEUleBkr8@DsO?vkqjq9T0TcY&X4&<}NZ^3*U0b8gNq3|83 zug>@9%c87rg{Hn0n)+4(wuVt(Z1*t`-~PLp_i{kub@O77_FD4c_@;v*ega60p9iwG z_>@J+_cQ&)%6t$5i7N@?+=#e>Fz4G?B+m!c5!Nr%`2l0^~zW7 z-)X-s-uS;yuD!2^cMiqeDhmIFzFVvfAD@}(OiRynrjp^}bxXpZ!RwYpz!JqlyUFvmPZbZ(OG`BID9ItB z;AGLRrKgK_Z+k$q#EOm?1b6cs`45@KQQ%Paa_iYEn**Kck_uL86wZ&yzykpIP=qbp7iO zF@31@u{{}GeLVG~*WEr-8hc6K|R>v zxT^qcB@Y^I99*k3wv*)f;_~joJ{6GN=k*{b`X|lL+8uQbz4k*6|2_OgzZU#=@pbst zhCEhL@;uFcJikiMMrVIalwQy7x{m2=D5XNx^BvbiEA{g6K|WF~`RK(j(}~aJ>Dgn` zmgxAfP~RIzJ8Aj*hF7Pjap9H@Jlpmho zV*R{?dH&5K3_*>`;kg64LaHC~f$gtU@zDw+9NXEDOp2=3R}4B5PESv2pk5MHptf~K zsOPt)m!s2XTZrjHtxs8q`DwZ5zVX+SUXRbx<7($qFMeg1@eMKIP=XUGf|J)W` ze@c`d+l`zqg?g~VF;fiKLLSUHhu0=CA52#R=`eo#<2%du?Q9^?Mxd)LAHDT!b(HNh zysFqgEO*=q!R@mHw#v1ty4>~nP05!Nr{`=76i{$ze?UK5!4sU|FH(|G!Ex_f8O+O)2B%9U-J0FIRNJg?f!ar z3<|c8_R#eomIzV~JuTgtiZ{!6zD{f%JfDpN zEI~Lrtiu$i!NB*j)W__{Yf0aBWuC-&rwH=F`d5N9f{Z`0v!Q?{HWW4J2R}QdDT$SXRcTYw|{w}j@K3c64Iyd>rw?R;Z7 zP0UMi_lR)q{puo7SEYFrbCZArerv=#+mNS3#Md1SIM93le>(cXCgfjT?|q2 z=_fTG+Hm=)Cslv*xU`=XJT6^;@fksMI4(KfQcb)yfF+Csj^hcW{6+stRXnu8>6zk( zO5{jQ#YcYvb{miL;D>gh#k;~zTj3b(a?K8b<1h?<)r8@&QMthSm+H^_)oA!L7&{v( zsOHF%+>sz*%S%olCI;{#_+fjE?}_&F{1QVLKdgY^`x`kQ64e*^K#uxD``O{Xl5v2` z$wSQt&Y!3cu{%ZkDN4u!^Fk+4dhU;MRry$-3cv+&Org)&?#UT2>f~qBGMt%Hb6iRv zabIEdQuty0HdFqrzZ(dTgD~u$HH5jpiU>nclXloPbY;{YXHlO+Tjuust0{ww;O^Uc@fy9lu=-y%qZ{n47zB@=EznE9`HKQeuS>>AYNq)&6g zr{j{+GcwZg**-npW8OU<1oN|3!_Pqt@2syTO2_&dPnh*pBFual2{<k3i5`3pc>QsEi{yfsO6kwN4N0aIq?IJ2ec=??Kyq!SJ)U%a&=w6a4lU(U6*;>EY=0#_Z8 z%Rn^v?!pO%30+KmlIbD}yhSKkf;M-7g&6i7@;8pIS7ssGs-#%A6bHOK03zwc4wNLd-cEDYr{BY(w_jI_Sh1v7ld|;-438J?7m*&5E>!O{vLroW2{e$OAo$AYT zptc^4loV%nHmn}%Z2`=qG@s&Jsm&+U_B54rNsc^N1j_evveRcdaU~_|z+ig6lO(^S zFu9JEh*)>1*CP@TmA7BpZ$!Ot{eynSQ-jx8v4D%gA039n zw$C*9a(oJ6r-zTk^Nct@=Tm<1aE$LU$|DSi4eA2(AC;%Ko|3+e&YqhhOy8i5ZvvU? zt>;SiM%N!@^`y6-A=YyP=sT}W74KtaY=whZ_*uS-u0A$OkK?I1Sr%Yo$w%xI1N81;#g}oXrf5y{J*~PTWUpe5SM@Ma)d*GBSe{40J z{Xd*DX~BzC4-8*&>%+VIEl8Qj{^txl!@TI1>H!bj`qzXf?4R;>7sKTPR{z=Z=C;F@ z+~8^6^M{ugar{YNuXKIW?y~{jwylR{tSQ9H7qT00>$P!%E;%Qmq)WSX`M=D3hW+RN z_-oI6+n)oUk-8m|y11{r{=+a+TYHbuW0xf@Y|*7_+Lj8u4Jx}wW_H`w?~xJK^>=sw z>HPI4;BruQ`wkrQ{_AJ{F>>v-)g#;!TMlOb(hIM6_u~7_mZgh2`g=_5G=}{*w{gEx z(A6`1;l7ysgWcnLv;TmtX+4W>Za(tKk$X>?+^y3>_MiOhskze+q$VsFd+e!mEZY~e zf2Xom{fo`fEts#MSecIxG`vz{BH(*n% zYuY}zIxldYh^P*pp9{FJ(=X1`o`wLh8_t{~O-?z2u){VUUE> z>|>0B&mFw@%P&^m{CtOR*#DME-)%hp+0%zC9`^GGXKrZqCj0OHzxBu6xh;c zwtf2n_J3{npLaLA;DsR@pS|Rck6+#V7yG9@^1t85-v6LwOTu@V%beeovj3I$f9W3X z@eRE@?&Z7gbALFL{XZ;yd;O5Neot6`=P{3`e=;Os+}A$2ZK2Ecvh{`BQKp0!3f6J_ z^ve@n2iCN=+%|6K=$UIBQ`!I2XHTEs!e5#6P}+x8Zf{x<`)_^mqiaSUw=!vq`J+28 zexm#*_W$~~qBhs;|14?URra1gJorn1hoSpUHVi1dcEm$7#!lXHXZwL1-?sLX(dOs2 zjaYofH}CX)VNyB!Z`*C2y0&WI@J-kGEnlVQ!j)y=iXZws`ODH@Miy4w{#dUklK;#8 zZC?A_yXd*f;m`R`?0Nt9uLb(|vtHL-vSip3mV4sXU-zeHdZ1m!D;9L#c*1uB=Iwv* zg}Cl_OPr6t*IRRY=lzs$TVK!IpYA%_!~P$=^h?(d=f7%Q@zIY@-*|SyhwT6Bs%5eBpdw25&?=<#*<@r7xuD`iQ!upETr@!yJFrWQ@zJJr2F1J(;^`5+Jz{L;F-_8DI z$;bQKz5Mp@4Kx1S{#}oKYuUf^@$){Jvi9)-zWJZ8dTq*ayCx^G?fAk7U0& z?~3&&?Bw|QMHTHv9vD8fc+At!S8Z%w%>KikoG`KL#@!>Awd&U8ypv|lW&hjHdT`Y9 z`^F~}f3p1Q7HzVJvj6Jut<#r&eEG|DFDh?B70`IdI;U!!G*e z#VG-MHM-Z>aWC8wXMNzMp-;EUIgz6qT4Wz{)i1+a47k_+`TxdP4+i)@V76`bceW3E z;KSaJK7RE@dpUu||2y_yxbL#tzwhQBaQkadU3+}j2NHGsli2@?$4YYjTh|Rd(9qP#{O+S{m-%ArQVTn`+0BQ_-mUdVU;4B#(xs~Cp_vqIsVV} zqn>`6n6Pxl-8XtH6)aW`#?)$tG9n|uBH-!02}bV*uyYwJI5 z&DruA$JhA3&i?oAPb~WG(t?EIUkA>ACRyVyZiJRd+(}O**~Fd>)=}}cMqE1a$lR*zP|oy_BUtse&LoA zhYVP6AJuo*PEVkocMN~z&ez(HPFQ$n`{$oOJ-08%Up~im@!HQ{Oxm>TlyA))U4i*a z;~$tuDpr5@&V$p_2CqM7eN4vAWr6YXq%C3OOvgPVOMjT~?0t97UCH^E+}Ab3diUAZ zt*;qAK5yV7f${sFRnxC6tGdv#vUjKCVHYHCi{lUQtyDeS%XhNIo*+2P%dq>1wGupbwGxyrO$36@6<2>s*H*SA&X42dh^Kwq< z{=#gIKcH*-Pk)j=9l2!q(s}QFaM}*`KkveiU2m^xJ2L;azKiy>yEf3Sna95H`f2g$ zNz0BIy=3go6#;!1aKP_;DINPwpEf^?dT83W#;bc<0_#$Z ze^-t_^yybyfBI72A-8w<4reNDqlXnVEm??1Gj#7VxKEVZ~BPyd3r(rMfbVS8@TbduUG%MHzvUU zBPUs4|p~t+}Ha*9MOEo2Se6YPw}37>ZyTs%epOb zH|4iF$(rB#jN=BCoiv%_Yy9o(-|YJ*7hjmWa)|f$8K!1ucMhDV)cj&-{@+K}4}NCU zu$c4?mZv!WEkAxRqr=^A4ZOAQ;K3)%d#H;2dwzOO%)F%?6MQpI-1ClM>5c5)GWQ|J zrG{HZKJ#$WyGu>S-=O0k*x$7F!wkoy^udE4-1y+G3(oksfa7cYZ)bl~w!we<&)*GP z)9l)hj9=aQ9{c|`@xnQ+f9Py|>a(x=RZSiesQ=UV#?9Ge|6=fC<7Zs4;Qjvu=A(7r zA8)zft1XGkKfNbrWbvD?a6adCoL}?R{S$}IpU|%C%`27##_vs+7)n|_beXm2jr8;F z_IF<7_}%h%{gFCv*T_ZhyfnxDNk=dHI}dI++qC}G5i88Lk!24)SH}Lko-Vzw=-7@) z%l90c@U@{l(7$u<^lzDTLBWuX*R_l5eWh~*$3Nxa_ZBTKes%a`-S$-e(&yqi?0=cL z)a>6rGjaLlSFZVC_BOAM|6KOJa(BXI=VYCdu>QNHgMYiM(xl_xll@mLcK%#)MTY^a z&b^{p(I+nj;%oc^@e4-ZbD1gcv0>|$oK&*%i-0*aX#4~7@};kzmvH5S6Ni_Mc>Vcx zOS2^|SL5G_{rBCw@a_56WetAOFTH$b^S3NI{sY+mqw8n3Innsvp{w3M@a~6e&mPVG z9iDk))ED=jJM^iZ=M27j>IDHiTs3|C56=|MAMk9#H@~GN9P>Yp|Gy_5ciq3Qc<9}> z0jI=xvp2E-)k`kF_WiF7BOZSKuRec`c3Rm#>7>iIoL0KXvTDcsDKo$H1=djmyc^eD zv-z>a+g9&;bF*vxXB_{OE6%-X&A~5*-8y3Zk1swyF^>JuydyL3yv+%N?mh1KuUhST zVLkh|c{#sZ=Z&8x-S<(;zn;JOU|>CO9eh&%E6S1*pZ&4(&7ZhZrgQwto)bs+IdIvj zzCYUf7Ti|ZT=uz$~cT^$x@FBy6F;%ClYyzI%q{L(I| zgYEHwT@zO9DDJf2+=UXyKlay?_sw{BgyrcEzxb`gRnvZE|0&n^o44lE9Yb!Z@h|UF z(KT=$YQAu)b;+zJM%-C**{v^}{>ey=|7+aAZmT9Wv)#OCLNj zqS*fW_{YDx`A7C|K5WZ>-RACzcYHLl)04gK>caka-M4vi)mbNvSkm8iamk~L1J{Ml zzcc^iYwsAHuw?foZw+wXox$-(UO(lm7Vq3OYU%55%${&k=X==S{B~TM`(7D1^!ZIW zqed+EFJ%8$R*gwEId`;udNo|9%Dpi#AAR`P65AzLg8#~3|Bo+ta_uE^whk}7x3JBi zrS?{}=oy+l!3)^k6?fzi+{8QiQFl(prEB4QGuiAawWB!q=PkMXY&(|z^i~TQo ze%60$=1v+ucTCpjXT5RqKK3tvc}#I)hf4=8=>F4*x7^nuV28)d-!bRU*6&(MR<=6! zy4!M>bNtd7KUux58x!x`Wo|b8HD_Rb{>hK$joRJ5)u6S*X760E^_IaL|NMtXZ0~WZ zbx8iKr=S1zzRxdW|1Br%?l`)rQ^F$CnV&q9R&_l4XO4dS97Bs zf7)F`{G3nukl)AMUY$5((;rvwc)I(gHuj&oqj0Nd(Io@cZ+W5Bb3Z>5Xjji2bI;yz zMc={8Ti<+R>kCJW=lG|_&$?hz>w|-resxuwNpF4q2KyhE^7GgipRQ=T=tqO^jkA8g zll^0K{7=yFZ>8hkTF3uH9e<;ae_I{@lXd*e95Q%f4n?kCvUlIW9Hs2TZcUJ$4k|p-fau4^W*O@ z&gorr>4;~%-LId#wrmRL(`k0Xd9Q3eF3C4x^(7NF?+fVpGW)!NFDJb)=()|KPWklh z?hcMW|Gibqe$M)Qc{ZHC|3sTOUHcGz}w_J2rwL~9z)U*2DG@QluZ zO5q&WqNB1;2FHlr{undFGf~QxAah+#!;}=KfgdC(06)~v*mgpHQSA}8Cu}8bBn+@o zIiBw&svq)zi@9;oZsa8&B#y_OAdO^9*rptghE&nMxy$K0NfT}o`{o}zRmkNR2|1je z_xh9M_6@>+`eGsV>cagWcUEx!cLyv{B5aRd|Jxy6Nd13`rvC{C`k$~~J^wEMK>t(y zxc_HEyOEa-AhG`sf^3NXFX$-A>*Ta{q9678Ki(7$3Z| z#gXIAf~ztd9vmR0!OMKcjP2FCmlRk)KxA-wdNNK5))W5jH$QX6G6qPEhkUH334JMt zW5gE1s4r&x5r)G?AR6pbc?c!``Kf6|Num*53DiAmxUns4elz5nz4KTJB9Yq)5 zF#nA|Q|Q?X^t{#W^nB^teT6=KOy3ilH(uZg^qlH+djIp?^!_PrwRkIkl0#mp%jbKs z5J@^+^shF4eV92gQF`XLT*VvmTMf9FGUGILRj`2idbKQ?MddwM^Z9zRzt z5$y|=AA=JfC!}@C?ejlLc+E2Y-^v|oKg7uIy)zilc;)UadD!J}{6|cx+g{r-% zk2Qe9(Z>pESAV-`hn_zEyi$aRs*m1Ik{9dT-z?H;^-+(X>N6wjf9A(V zy@Lo3l^-ci@Y9*TD--JYvUQ4%A3LRI{iy*y*x~q+x`wAeHfl%S*>&^Ni|k0K{200j zezNHM9ij5$IVU=Pyp%q`5AeZG=I8wI_%TsCCZAF_Ki`HqzWkK$31rs~;m5-(O;LL* z2wZO#c8-o8AEgiQ1AMTP`RNuOKgM%KKfiuP-Tb^q?+*`Ef66G|=2wV(>*EL4FUU_x zTy*@DQThNszy~{-pYELvKJo~~{!~*t=B=%ppA&|P@KE{johQlj`>JU={Lu5wtVOIp z6x<;UJt@N*W;ds=?5{>`D{d!WATa6NYr zutXke{V$~aw$gWuE6)=3X>p&BoCoHM>AV*z`C>T*fF+8g&ewFlsOOn|L_XtguRY%i zig!$GaCueTMEb>xg8lQl3;$kZx2b4D%mu=KQ=y38(<7umUr3HuNb!cYuREU9Lz2ho znl5$6E1`JDj;K2xm(SO;^saX?&y}WNp8bF&$^?17-Z@kL>=L{MKG(?~U;_VS_@O;D zoGVx(a=bW8{vTBs*3(-#O(BF^(@0SSgdrfuo7u|ap zj_R9ah~`^PY{zph4z}a70ZT-#+WwZ%_}@nZ#GJg^~ZIRsjtEdo=+zOF0O?au9sF;Q@bvnRkt0UO8ZelwZp!ig0Bnc zd{S$NojTX^?0uu-$3y7@{FpWT01k(r3Tns1OY7!mW|-IWyuAcJ>&J+EL*>V7j*g!~ zN+00o5)D6q!{Mid+Hvj^b@THDT@MXaf9$;lKb5zI$B*xl==dq2^Z|bQY4`yg4nKv| zj-7PEYH zi;f>7r4R6PnT8+0;qYUkc05V@5(5i&oo`G z@Pqez?SM;Z5?8N#wDUS+V_(tFXVf#k3a<~3pEAn#w9`W8#|V|OToD~VHcHR>lYE83 z53YZ_fWy(BYHG)}A)+06`m=6*c>MUxk{A2u z`s4Y(1V5K0I=;M=9{Fkw`BhmIzVHIFbpY^1iiE~~-Akozp z-!)XkpA8b@mw>cmWN@{`H(N#gM35NY3(}5}!Kvd5AA=#(>xYF2g8yVli2YbV80`mQ zFJU-rRIWMI#us7zLglAqa44M+n4faO%ugBN#>$UB z!unOv{CpS9`;MMso^D3hqdyreu)CL#bLcspF|>~I(RGbIcT+l>ka|1~%y7(dLSVK7 z9?5m!w~K=(eesc_k-5{RIJ49t@Tpz+-lx+6pBkB|_Rod~h}9k$j%glscsv*t3Cb(6 zivF#FW5hnf#e@q8y9j#-#}iH_4Des&_#R{#wIAn+Q-A^Qu+9MJRWJ;J0pz@34oJV+-`$apY^%w2)ECe zB>2Vl;d+0MO=%yl_gjoUGV6UPN_N$xub25E)7Kjoi*(`Yt948-lL#nKq_)+aMz!EVF-rj$#wzVYeTo^^u=?cf zC+yt`?#T3K2i=c~OnW}ui1g{SaqeXwQepT5b)30!Qmix;{w<)@wt7~s`jCMb6ush5B0GC@R7Kl!Sy#@D)jS{t0U9ToK%r6 zeEsZGr+w4YPv6*J{VX8N?P(~<{Z~Tev3?dNEB%N1X}mf*{mdH|Y%g7e8>(HLFSoCd z%42(3bB)qI)X&%nM^-<5q@QQg{_1eoi^+8U7Os8{cg&Kh(VKsH{TF{_WcCr)X6P)G z9{FwqSemHteJ0>SzLeXJ4)+fKJeQ572la%(MKG^{`q`fos z7xpcK?w^ILKUdK6IN|C~l4GVrtl$J~dU~X_b7`Kb4)u9HlU@u568wsig}(88T|k)U zYY$;g*H~n8sz?dd5B0qr_}M2b`fwiL8o)6WITC#@y*k)_787o09$4Qis64ixeWobw zLwz3yxFPkuzIK+;c<8t~viW`^?GuW0JlL|_auq`z58NI;|1O#!`j_pmmoUd`D9Qa> zLgiuq;`w)KiqgM$v=?vzMUF&&^CkxCuZwU)wTtuR_7zfjtiRPxrG2Qs#Wm2$y#uH|q8%lEj*{D3$&yG`-{==g+fTPjR z*vY~A8AG_C+Qs>D`%F|G>t}Jg(mvGBa==H@zWPZ&Uu_qeJvGdWOh4gD=IC5!c22L0 z#3xijwWoUPi&EfDf?thY^e^jk6=Alw6@(#bqjJruHb#f2Kk5fw&)<2Sq91rYfA;n8 z{0>Eq#6HJP(da+nh9)DR|5P69fAut_eX@PdJhJ+)ZMWxgVXqUWMm8P}x}qBo7xnBV zSLtw#hnUph@lcZ@Fpmd6VJ#1TH|FsmQT=&5#Jd%J!SPT5IGXVg?+hLfv4k7C{X8Bl zR349qge;|fI37{~AIbUPkak}o#=}p;A{!55XkT%->+R8lFTMybutho!_s$!9G41cbI;)*z5%XDR+HW83`FQH1!VZKxp2vgq@1zvKguBu#rn2&?@b?Mm?N6HNe&I~20*1niQc_hfOBva^P4NM4#eS}L17ZA=P zoJZJ9IGNLff?|3LrzdRU^n_zMJz)c@^BVX3 zAQSaB{6W6Jq#11aVjp5ENaU*sq@C&mCM)1dXdX-L9of1xgU;tdoyW#{9PnyL{q<;5 zpRZgrpO|xn{>KxJCtOAIMGWC$!qqtI>dqPP|jm7d+YtxPT(proZ*=@2;f$S-;B(W7!SqxP8^C_Tg!F zYe75t0k)6+uA3IRq9u%s6^7SC!Y@v_wz?B5Q0>W_E zppN^mgvvwxJPAr{aktWcX9J!M*cyd?=G`RP$NK3a+@Otv%(;DqR35eu_0xKf(mvEr z7vLkQpZ0;mZhkj6GP_x^C@THLTST%8RZlrS+f(bDV0&sJ%<&pZa(~*XJhrD9_bUB~ zNBaRsV^8C~!TK6YxS`s``EvU#R37VV%_60JsIRg2A6b2^CVib3;XMCKX2kj`ZzvB{ zPgy^!=LYL%C1K{dp(OX8;TBOo>u1~pO8?=}2EftiXF281_Oz66L$!cV{dapHXmYp8vtaPlQVJpZkN#{$4HfEQ4>88Ds$?4!PbBzR=zo0k>Y-SzdcB0C^7JT_EG}h2-GW=Qrwp#xU)9 z4!^Ia>^9M#Z10K*W15C^Z0{$`CkJW)2*Dx^uHLX38bYA0Uv@v!xVAip!ab<)*_8OF47+gZ4NUev9r9 z`po{JN*p`re3Tyb5#M=W_9^;^!^{r22qS{SG-;kpoOS}=*Yg12Z|z|moWs$1?o{R< z9NR5cigDZrBtA!+4^pB^peThOwy8U%!!ps{#uHAaaEY*)!ea>oY|;+-M;^?p6#kn7 zwg7ff%VhpFFXJK#4gLiR-{?16lTSY2D(V~z=lQ9K(oqrrSm7gklWiAv=85l4^&$`T zNi8AqgN5D7UsHEJYaAl{8(K$d^Dzw(`P||Z@%l^>Qlj_JXycE~^?2YVY^jG@B*~qd zBe~P0EJx;4Cz~fj1omzQyko{G4Y3U!0A_1ydbVtB#%DUFWH`|rg86e!bwG?m%^8Hs z$pXgI1vV{1Hdb}nNwgiP_c%Aku2%FO)ifTkjYzs#T3bTx$9_RRywDHWKV=~CdY*9&-0#K?0Y^fB zzxl77#*^N7=IRwvyoW9m<82~cH>-*jIJ1Y4Jbp(M2;6C-kjKUg$@#Ig43%ViGK=09 z>KG;By*c&J_^j8Mmi2$)+FA-UsF-N9F}dB=Rrl!(Qo2^YHlWF z21{RgjXBM6ojXf{FWTX5TjhK3EglKhuhxLkKB7bY!{-|DIK`bRzsZ;->LNO6iK4GK z7Hq2g(5`v_7m{+LXaRpv`WK6Id*B#xC1E=pTi{ng7!DhibI~iOso%st7pNigVR|T- zkNqk>@VY?zM}c2#FgO(D@H4`%nt1fUu?2orgt0Fq`1uLLVWVwUm610H z%<)jxVpl929?AMI174ddr8;sP(v;k^G-p;Q>&z(1n+n$pRi#OAzKqus!2srF=J1Jm zee2xASbmDb<4A$m#>z$4S8fFSYTG+4Ju`h;?liby8AiE>vAxqAc}KK-ygsb%?~vQg z*FDf4ST+RP11sR*c`NvOD_`$GdyDake8RpI!*LA!CK7g0cp+h2ug1c!fG`|3X~*kT zAGHV9t8fd?un73W_5XH|xL)nJG5EW++UrQ_b1Ec+^EItf>^A1>hkP*K*vCY^E|9f- z4|ng%;Qpv0%>Cgf%>7YG7|U+Tu0CGNp>gr>OIRJukA*PvVudMNg1Qmt3@@yhx7*97ZpUWv%J1SIBb*c6;E_s3F7R}4{N;8#SL`=gLB z_eTL?%(5xF`gmo2_OA`r*J{GdPZeS2$4|H^bAxqfy)rx;tXJDWkI)Vt1c`c;_(ZT? z)yFI6TevPbU*nS^Un@w=w+N(q9B_XmQo3S@69YdhVeStLVeStzVTjtKo!cUD|0&NHVc z2-(dmH?yG3?Ev0<#ltetfZ!*y$usS~4Aa*#u@OwSwQ!r4p;q)5+yH|lNlFY{Ra<**JUJ0*%`2@g>E=cf%DqbY&x;6 zFP!a5pQn}fBOm<%$76%RVZG8Fc-2qrtwZ~sw=p{V=B4ylKF(WtP#%_3021e-5|GIt z(V;(|Utyi_R}*FVhR2k74)Z?<<*~!|w|J(rA&)#ToO!Z1?p0 z1Xo)=p?-hLwn?-X#~_Y(D`B*qh%JQSuu(Z2lj!Ub)~}rGaDDTeCtC@pG0#}QsHl=nl5 zxk5}Fp>Z?z-(=jE>>73>4*H5Gx3p3&nvH5%;>?!Zp z59^uW&V^l5ShI0iGjW?K?2r;$L1C{aJn5h9l+rU{hi7^!H$|zx2u_uA;Hg$MyHc}5 zt4E?cbE@Dc(t4!B1#Ft{gDSyxq5X4;eL*`H2N=gLI6GjECBf{e#yn^PxX*-Ln;B8<4HH!g_-YwqE}r zamDaMzH6Qq{o#V+c=%Nlwo-T%VStUwv3)i?BkIq5_@VvCN9^;R4f6AvAT26BGTc+A z;>JaB#|Yo+lmp{btV>}_q`dzczue2ZiyWh~mn!AR`*>au<>Z6J=d^c%tiXc7VR86= zCFE10bg_VA0Cyx@4afLvPq-M4G2BSFfN%_991r;ZLIdGGaERs9Q2R0Hs5^WNgsUg< z)Zf-ELQi6-zY_@ip=#LQ{RtPrG4{8aa1I>f`HG3K6^^mL;|cS6S0W5SN8Mp$fXBIw z_(gky9T1qlN)?~ye2g&J<`I(<#pd-;$qT~Xkax&}>t0q*`kFD47vsK0`Y;N`MfH1^_F1c=6{-OptJdcuRiE%Zj=D{Mtfc`GI5aP&PokD2&RPNb`14X!ji|GF*DOW4PI|6QpjfxN_=sif%&Ci ziBxYo|H;j~KGQuTQwluRCZE3GnT#d@kAuQjg2#amuzDQue2Kdm@P}(CbU0?v`Cd}i zPiSjvAU&E<)3(m?zOqFi@tF>EC`#dn^P`>8@q9Uva59A_6XyBRMi_#dw9~!*_i}XO zy@b-Uy;|_9(ywT*76EPy*Z=D4Jgh&~xBYA4x|Io}tS=xXN=)h`qhzvEY?oM4RD++w zZzDT$*;-*&I9wVp)oBN96u#6Z(y<-fMfV{%ACx9FkdLdcU@zr)Eba9WDGm0;DxVjZ zGMv+$8G-A`v9AaBqXbwzKDobBHSsb4;%!hUe8_%Q0+NhMj9U zU?7BF*I_?lwx(9R`5d<+{060fh$ z25AO~4*juBG4QidIygKc&P4s7H^18{+|f?-3-_mX{1j5W_dAJr($zu^q5E6hm`L^e zAn?Tw$9;=8YS(Wo__M=!Ho)QNcUe7r_^y$>*kAY9gZbEbzrb8}1;w-E3;#&5#t=k zGLGNYgyFD39i4(2EL0xWAI}$xp}ttp3XrWp)_^pl2RIbkb%h)Ne{fDJg2h@*g!QK) z48}JVyN7hmkT_!gb`lgCZ-aK0!}M^GOu+oM~b z*(g2h<4!1_9ojQLU@Lhr=Nw*}w9vR>d##n6rkvvGjpO2L#rWJu_mN(w^Rvgz|N*)Rw=K~Ax^!gWo*{fFv9H$&ic zis8}$?+pvwmmG_)1WQbZ*VE`+ZBQZvUu(cZ51AJ+Gbsae)69yZipuqb+RsOneNw@}%vA)|0m%=fImlG}`Tt?Uh7_aY_66Wg{C4?d9sQVik z(5{nseI)ISZhkjWdY<2_-%<1))vpHdkys!7UDU=*66*-Pbx0wF-%jUK%a;eQ8!VGW zdcAduhr(Ac66yFlOk%I#e6ao4r|j4c6;&wxfp(}EFpg_nD*r+^ik70*6A25Q%>kej+UaASUN2}))6gVG<`5-!dmnc2! z`ywcx9qRj1z-oQxdhb-l!*%)|z_P)IW2|>WIW9l{U8SB_ei7hgDpXy*kMvDXpX2R9 zU-zFX^zV+F`-9cUJ##m&3#R zQ?gUC(mlazGVY(&?V5y8{`&#>`A@VTdsIB(eUBD9gZF3hE48p*ypF-+ z0{9{Ci#`W_Es2u7JIv>>!^#<+F0%$+>-&T-#e|--~^?e^T zAL?f}^B^wrQT&nM1IHrrv4${)Asb1Pxw7x^q9+y{=aKE;IL zut_`Zyk~;e;Po%VCxVY~8;9JWGg5l&2lUJNAlRPH2CSa%2@*Yj#WUyx~m|^TM)8!k^cD_tAAI&KD*2wbm);xgozl7H`PICm_?O zz`JhXT{YtTx4!+wTy7I6Pd?#Kac5+}(g9zY>i`eYNN7ZT?Tny(Vz0JNfpwL~*W{U7 zlxW*x;kW&>=*F|3(z9JPRVw2d?W!HH4M`Kuf-*2%S7)TbDZW8jxc z*hS$J30o;VnJ~a6?RcK@Pfd8y|)*M0zYA&p``566=m4khtC} z1Bu+Dt808zLU=s<3Mju)IL7+r6V9XX*@TlRJdZHIChfRC3#mQapB;CJ{!9dk{kasR zg%%ri@rnE)pOs&V{wacEUPK?Zx3qUY$h;1gvYz_tA%!0L4!uP0+EU6UsBXyrp@poG?;+I4MxSX+QORjg+R z+$Gkt{;Pz%x{r`gCJCANxR55gFRRVRPx(wL67l$Y$uUa=R>wyhz-|~lzD9S3+__mP z_)J?W@9T_UeaG(yR%aRVdh%#}^shHzpZ!bussB8r-s^bscRb{iK6n<=nU&@MMaRd^ zXW-pS^vZ`?RWnC3ZL;{&of((R(LnGtAL620sXKVHHw z-c!hsKVFiJXM~dThFpApF5LKh&c^d=+4su)ir15iK2_#dd>?5UU|hqX!!)>diG`n+ z(!pU^PVc;e*A2F6r9ODwHq|fI4NF1d{o}nLT~v7#Rq(?)87W;k9LK<~HQ@pZZ$a2a z;ReD0o3yKsPu~y0e3pJD_^bwrd|Gzb&ZnKyF`p9&GoRxKGoLoXO`1%oe0_XY{}{|? z>(2$B2_V}*`b8ks&jHtfUp)LuC|xBS$G~p`VH{f+zJ_ofh5HBtY|^eiJ}vu$`E>0O zeELA5epZ95ZM+*OT{*--J`esR@+p90TL=UESGktdT06BL&tGvr@76EGzNPkGb~c;> zcmYT|-TcRSsJ?#Td`$-weaG|QZC{Ced1DLv{3`uV?B)=hX_q6)D3x&+6I`zAPEcfi<3 z=rA9S=hDRU0QO=ea9jt0j{ZH$z(0opqf_#te%E*1roM13BSn<&Zh9V$)4$MFT#tG9 zHX%3A{g#S9td!9IdOPZ)}U!#b}*LlvQ>qZ<8$2CqD<=-mfAJ2Iz0oy2& zdR%)b-{a`HoHC2ZKic|AQ$>BRoGkL=_fx$^&vSEqQCif1j-$E$1n1WwU3cPhR4fwL zGB|(5{TZFTHc@))2fROG->dWk-cKw9>;s7o`$2ErS_)xUr&7wV2##_6w3%=+g>N8i zrto6I0GqVq^Yk)m5A$jLPORJWK;pWl9Hc}FjY2yQv#whVXUXH8=RNN}rC*vux&pxJ zd6ehxn!h5`hsH*}jm9I}BbHpxN(%2w`!L3N#JJ^fuS<;QKj=LXy#Jzz>=wsEiQH)& z+a<&I3h&s*M!9IfP-IYAC;AIF5nee!?ya-%Hp^;Z=kIHfhK9)6hb( zd#LY*AB6ohfyDDoFG%(N0X_TaZK>pgyqkVh`lUHwGvM0nrO2R>v zYl49JtfuxbpY4AUd?tXz^TkCV!{O81CYaAYgqhFogqhEH!cCCEpei$;7HSXknRr0( zIU6MMxgBIUd={J(%x6Af=5sb-<};6QQ01B+U_J|}JDuJ7MOtoNyDQFsRDRr=Qxxd~OB)(0=X(iG23|Ej&KsPY&iYjxh7tkudWaOE{=< zO%O1jCTb7!xgYpLKI48DeCB{uk9WQE#gcY{N6ZJ;RoxE;pD*?ST-*7gi_$eg3XfL# zCHTfme0|qT z@^$ll-9$XTt}%(OgQ(-HuWM9Ly2I7J2(DM)_kBI-dCm-JN_u7{?)HSepYV{pd~ay1 z$C;9zmJVN~4-S;lv*lMy2EJNPcarM6?hrx!xaDdm_w|5ZpEc=HlaZX0(r}RAE=l`M1(|CPkGhiP^1czy~--F@(Vd`fgF>VY* z#yaMlA?jC!e(>`UE{01pB{l?=ZgVI$&98BjTT#R|Z z&raAyIGHf>Z6gf9|0<{LAFbY(0~^R+3rX}#F&xJrLxf#$h~YJ7i*V+%nlMIf%8tjq zk=l#)1jl{RF+wjZK;rqb)I50H*T*a8>+7WGJLbCw^1<`Qjx9vK86a!3Cle_h_eU~e z?hhMb?hh+r$ht|p`gkpe)}cObJ||dTO9(SR#e|t3AK@lV4pg4?s*Kvh`f6%Pb`&J) zYbi*zUg=$ru*50)iSuOsv2g*4@c#7zz_neEsOc=y1tK3kILbg1WFR?1oX4N>m^hE0 z*H_4^Xdmk1i2}EORLEcHIpjB|3w%hEr%7HMN8hXy;j?-QnR3aY@zFME9i7h&%*`H` z<;cuVb7l?ZJJ0Z#rTn#;@nZ)nH=*l^FTYzxodE3x)^Gc9!Q*@~~Fr2>+=yGPj zMvCD5L>PzdkT+hjAGpSgjfs=fTR`G{PZvmhMgkp*Qutvx{V81$9LK=VOc?EVEc{G_ zF|Gu^c*1blq@5n0Xlv0`bXE97j*Z6)K20F;dC+8#l^78m@>u{siu2n>ryy2ar~uT5S>1IC_VN!?pIt2{mTxoM{Nh}BM8O0l77yfMbe;yhf z4{M>m{}rLV4{N`qy5&cryxQ#jxZcs(dpo7)@l@DG83$?_{S&UWSIz#FBc z>>Njq{Dekb_pxiUuba)$+1D~k&-%OOWJT}LzU~CJy*ryH57jNY!S}m`G#0ipQO|9FEg;chc&JXVzWyldTdk?DLB%)L zHwLhUDj7=C?X~2?@hd6*UWzYus69SqVVFFANP1Q_d_!@3 zq5}lT1Sd*%d2oRC+Hi&FPqf#FYc3ak`}u2J5xw=XCdDp*@65=b`t(w zQiR;HK*-|?g`AopWZ7dvUbI}u`q(n%NOC<_()#YenIhd|3lB|SsLBlOyy3R{nyc-- zD%gPEKS6sZ4UEp-nJ7KmYttEuy+eDQhnNfp3UQw#+i;a*x^ob`XcN<6RSP>R>2NhooUSo}c`OxjZ}dZ>tfaKec*TGgbKi-Fg_CE6I8| zYrd#YIC@xJdD3~ThuGh^ZnU4N^mi=aGQf4s>sBiNxkf%-4bufrYfcT1C*(yQA7?AP z;JEMrMqNjT;rxj{w$D|AqZ_}~lpf1R9p3=uVL4kt;=H{FB#t|D=pU*x5f45(Kh^4W zW3jJxs^{+X@cIk&S*_Q&o>n`yuil~2^-m$C=W&xEDf)rqW;*B{1V(e;N!>9IfX{zu+9 zN`IURxB_rpc1%@e`Orh{HQpxL*Vy_)%9G^&C>$i}7ixdtwHE9Tl&F{5{zw477Vz^8 zkFGyTC_RsliE&DQ;P}`II5~{*VWalWBYV);`ol0&^oKbkkX1=l*b= z8{8k|fWxs@CTef|m7={zx<5i)r&m!uGv|qVhPpli6_uUT5w3l_`)Sa6T|H(}Ar_98 zok^m95(rlimNRLh-v7qk{XpjIfrs!;QJWE2uo4@4V+L{f+ZoC186L{cX5W^!I_kXiie#cwRF)xPN_w>#J9^;oQF^R34A#)b2|E;{3S{a5UrDPyA)~7UQI`j_0D;LJ!S! z-6mA~jl3b389fx6nt`bk1`2>o;oDFnqc_C(Atzzh*SVDZd`D zUq9GSD*SV&!F%-Fxf!YQlkQ=?&n?R_L&}yj&z&Ye8IK$9@zMG$_)ZYqa0nED4?Ckj zN9OLR>;5;!39TLDGt=Bz(;RSXJvC6GC?SOO^0NYCH1$1Pd>n@MA$9rM!+EcM}XfoFTR?nZjSA=bz zG(oJJFg-*Mau{b9q%S7lmLM@NT+jHg5$Px>WRc-ULTlf9jhR%!56j4*dX>U)4E#KV z^C;X!IGMsXQ+=@YSZ_Op!{NWmVIQIMQv0!A@jlQ&=to>%_30HSf43+fr26^+_Y3n^ zGcmIMWxX<7tLPQ_S$hZTr46tJ{Lx|fj0~D@WFKWtF4N>wpvk8YFyF7kd~nZ(4Sso) zj$H4TM9k*gqs9>!(ERXZ_p`{fPS6 zqL0weaUj+Dsn;LeN1SiwufAMF38 zhO^B_IN6rv&YL+IKRlh{fR_+blz?FSSm=swyq1KRKGgb1>Cx54Qcrq49?h55&LhT0 zyE6{L(H{Muy|00f>?-TNrHh7ABw*i{h}B+T7XobS0E>oNW!i4b04s97(lFSAK} zsRN$=-;8$Zt)ry>t0;Z`qbZ{O`|zXThKP-huUGfhKg%M|Jkg&WKiR&%_k+)fU7J_q zinqGa=WXY%asKQ1;;isP(8|12g!dYG0C%zvN!2a-x6%A8jJD^eCcNgSD!lV%`~27Z zG`8s9oZJVGe?R2@;=5(CA^ttO_P~6e(9OS9@$d9UJO4KNIj!oQ45otN;C%e;4_=J7 zEF1(s9!!8ch;l4o`+hvdG=;W_pdhUmpmh}7B>ut({kj`Vp6P%i=>w@`$p1Mr}Tzw5Bk<0~U9J)VHCN3hpt-gNF52Al?I$WJ{jUt8b@9$0cjH;-!P$?Ajqg`E z+!L>L`&ZxZ%C9}M9k=$K?|dg6bCz>nDSZxV^8IQ3eu3}#+^J)3{OkpsIV}sXdQMa+ zx3+_d*kk{(zjj~TTG#lz<_+NUvIw$>e}1X{G4?FBq3e2^pIMRDb@tA^Eq}Pq-UWV6 zjOyAfY)?f>`hAbQCnNs+(@}Z;?nHgBuAB4A;@`vNdo7#2Ug>`lEMPn`XWTdzx#>7a zU+?;jdFS(G`z~qao$Kyx;7gKl7W=SqyzUS={r*xQJep1@#lII?hBdCSi(-Ee^$=U* ze)322*c5xrBgbp_oK_zB+0zhs`#n|cIw92mi*6nJh8)l1l_Ka^vUo33B?ntXHpx-5hHhXjCF#K(>H(=E?!@2A_rXN{bWuizKlJkjyB z_VZg??;?jb@lVHBO6+e!)C=8zS>ecm;llpm;-SLy=u~tr(??`wYw<{`g8mK4C%vDd zvO)QHP-=fpcgyoy{mS{c06s0kDkH47pq?oA&)*r1pR-W%yfK3^FA_dI8@+#7 zex=KI4!W5ClJI)}GB3QC+BOAqNvdqozg3z4PdMh*q4@gr4SD|mfm)xcH@Nll%{M#$ zp7lOge)<+yy6D~is%4`3>c#P0N$b@j#*q@&tMIb+_hcunSLMrFay+igg15&NU9T2? zv3fYAthRAcB<9Xlc3tHof=Y4m8=d&*)-#X`7TK|WB$>rnKuXAz5`|FIn z+kc|^Yop)4Tope*`E2LUM!&D3k#6++hwDWX{ARvC9=^u) z&yPOkf$1O3UsBl=|K2_8{M+b!itgQP;QQmtv%U4ls>thnx$25me{jCs4t_J=9}i|- zfBep#2c|zZI$!GI=O5qX{M_t(S$z?bW8N>s{5=f2O8Z**X#TZf zbo_h&2b~`qov&NGf2`kT!qY+ri<6W12Gs`cBQu6A*o)pzD&OVeM;l_W^{&!LZ(;gy zDf;ANYW(2%Xjs%=X=(j5OO(Pb*yryXoK*4p?$_^oV{hwiUgWu6@Vcw|;?}(9n%@Lp zjWX=ki*EPpS43Y8GQ8fpTlf;{gV^p8J|pc*!h=1jX@_{fD)DGOXJ6v(*Vj?<{Gu<{ zem>DHpF?x5e`}P*wnz99>Vw#J3!jnpLE*uk)TH@LOFWv-I`YT0e+6aq`NvD!^V#ip z?No2`%`UIh%j4S$^iXg3)9yXGWt8^3ZxL>`znG?B_Hj(1^;OoQaI`I|fyLp&?ZToy|O8dt$ZokgkAADsyj_T~Z z)x2zR{%-5vkJH##-XHPVbxGHwvu^HfJqkr$=TDe#jeD*~S@2Z`2-?VcR1SUgb&fgeD$M=n%@6QVU<)iNS{v+~S=EsK|KXGyUaX1_T5hJ{-1E=`JZ&<1y{TBkxzEzGcI*y zBy9dIzcGyR@z@`5?W-?yZtc&%LzXt?OEY7;MpG;;ZZ%Qsnb|xV2jw8 zpW8m%K3*4uFG+h%_#yDjPgQtSPioR})sT2}ye?rJ@jiL~h#OaVlx^d+aAah3q&TU; z>)N0GmDc#=zMWUMju$+B>;~^U-&m_TIn{TnJTV#Qf0H|&c00d_x5vFni=J zz{Pf?Pz-Wx!*=^e-1y`CCSMmG)e}mbW2A=IqyOA@7yRY?xd$cv860i@eqXVOPtx&z zRXs+m>$$Zx|G2LPIi-i9QU|{(JE(si+aR`z$nhL1i)}`DR8MNE%J}*V`TkwfIQ@l7 z+&JF-Mpwpz&d!C=dFabu=i2{7&aZvr)Sid3Ke_H@kF@%M=glSXX)(fnh>yq1KGr@S zGs26=2`h9QWyPM3#})WXKi5!lJnk85ACH@Ls3Q4%mVEw@)GvQv&J`eziZG z=N;O@|U)wiYsy!`NMBh$%o;|KdaWgkLyHAwkQ4+52Z4URT zfyPw)V^G;{)_EdYj>Q`LfyBzM{ zyWr*p_stKr>r*|0?{<2|rrO)pUQ(&@TGmC+qh7x;Ju0VV=4R)||NLybytXe%`&VLq zYJ2HDPX1kCyL{Y##jgqe$v18cKl@&%|BLcGh3Zv(1MhR~GaqsKLOI|0jh&AF=KEdw zsJFRN<+Rjw^`5EL@r3K@x54YWXV+E5-!i>3T5szpd0x7LGA~LkKB$J#I(H!F>~Gb- zz1Oz;w-0>UW3MXqo-y2;y~UWlCGfs{q~Gu2`~91Gv$ywXEI#l)d&^?4DdROMpF8CI zS5mZIX#X{0_L@ode%ZzMm|ExflI%SPucax3lcn*ADf|WpZcraB6~{vS7RSUf{`|(l zLb-5oWa^kaMeeS{d46=kOnW{q18?)eI5^I3H8`FJ-3ESEqHP<8vM*j#KH%bej(m=> z*?e}14=49Wieq>-3AY)h7^LQZ$FcVK&I0d?Z_3~p-}T@(6JL0Xi|^9|C#3(56lN}N z>q3q14&yi1le@tC;=ACwRvsANUhtcVuOab$>6)#@r~ck#{Gh+LfVci)S48;_x_til zOM0`{|Ff;QX)grtvlo2G*?XiMM>jh@HNG2T_HItFR~37UFY7J7zU$lL8vyT%Fa2Q` z-+%vDZ}x78*}Eyh-m=*Hw{&mzf}d-TuOGZGzDmu-_n)uq&EEAfdp9Q73xCDgJO9zW z*$aL?79V(Dd=0TT{Mg>?T_3Y|V}iZ>ue$j5Jgql-YcYF$zu=EA_=vOj3^`xh>inC6 zekIQL8xrhQ#ok+9(_4J2F?&J9A7A=b7vI0Uwl{mD(67Y!u1~PHEcSkTi^p4C&sJjg z))MShKI-DTV^44K4ZpHIzA5m&`4E20*}MD7-s~;M?5!r)YlyuMJaudKx}3kX-WTUy zGkDy2+EuS=&&w!yn-}&M&%^F8I3DNk1V1kWW+Ufm`H#E2&c1tVaq76)`HSuT?g4N8 z6_@ZuSZD7uM|-nZjoDjBuvZm(Pm=TYt*$d?-_Rc4Zt%YN(w}hgJ?XmM;+v1zt0mZ5 z7JG-}`gF_jy*d^jcwc;#PrCR%^{gJ_i`lCs*b6`9?Dh3H@6Y( z_fx;zIloEwE!5w8j2}F&`F6}-%}-c&_Fnp^&h|9FPd>}xR6btzn&efUgK2_wT;u_4DI7vB&(g-B4K z9U3W)GWQAchsMY86S-)Qp4YhCX{F6LKZAXP*wSBU^&k0^@Ti_p(*DbeJ@y~RQ}y*b z*X{CsBMtEOeSq;e6r4eY{`Y;+#iRQ-TI$#cMPBD~_QsY!oX>gi3!;=VI__rQ(86)t zRl%1HPO2xo$p400SH6E&Z{zcl8NNxQhzEr6A$k2bn0aw=X<=j(Uecw)#AGo%A`?lSoj~IuJi&yg zxvm{KSPb@JPVv>}(Q!v(To*c4F76HwqdEFL-KmM`BMhrNJ_gOh@?5d`$K1Sr z{WY$fpKxW|;ZyUMU!mCi{2iWapTAS!dzrtte7Sx8-YmS%-H z&g=YLkoa}}-i7|)JU#2pZvI|?@?@C5soxAM^!sx^>*nj;SG)3LpTBzSiq2CJ-}+Hn z1}M+TNvlh49zbS>T?p}&500e-8BzkS7Dks8DPVdQuOwW(lt!Y^O(cdkb9>qiHp z-#+3mXeI0D^b1rk3tqmd{yJHXXB(Xl!Cme1;j*{3&xcX)zWGr9ODCuEVL^DE4>jR8 zmE7+F@XTkz3fGO1C%bv@s$=)ne3-=V9dVrZIwx9s?u&VGU(AQe=w*o~?%GV}0*6=h zM9+(h2X&|whOeHU#Py}}i>QRynt$!aH_wO2H-y*oq1%K<)3zc#&Mk|7dYnt$)IP7X z;5YTY*&d?|Z+G+JP49K{;d!6%&kMN(UcaBQX8h)LQ~%p`1`Y9r^DKppeUe{x{UuEs zE~tYvw?X-)#4$bK{Qqp|kHcvVf_OYt_^-rx>Iw0r{-(Eh@*9*de>RNPtMC8t*5b*$ zy*-{h_=W^%`zQF@-r`AZP`>}STs*IMOy_twFL=3qkMW=9`rii6V;D)t2I~u=_jNLU zlRgL3`{b0dr1r}1Xyq%qF9Y6ZFZ*L=*QU5V|r1pnq5E*}e*Zrwlj_s(~=+uH-)m;cn~oV|D4)|-eQ8i?B`v4hkKYm9G@55+#cU$;C=C}ioG-5u(kMf&b97aADzHwYrKJd zV0!XAb3Z$J`Z>CF9W{txOU~WzF3wC9$A)o}TMu~0;WnrLxuc`S!#pL7ZkMm${SNf= zKlOhQl>uy(mEMjob0W`mNp)+d;Bg7srk*;_~Ls2c2{=>ye7C2CC9;z z_v8C6=5q#)ANK!^BDaD%`5S~^M78odg$H|zPGw-r8HoQL znvSoTe|F=XW3LZeS@%Xo!W`uP;|fbXz=(pfrEuHeil7hEMCLU$ES&$HMFpTtkthj=~(k5CnmGWW#C$RRwp;=WB6J(E(L(5DNJ zclhyL`jF$DpNxdjY#57XX&8-4X7LdAj$=HB@RsB85ImoVyyv)gGinNGYGBKxHzw;< zEIx@Xda4Ca$+Yg9s!TWk+x_OOe=eyiDZ1nP+_r~jpq#4i`=a6Q^IpBaVrUr>Vt|Zf8fUH{wX(p{_(Z#<7gkBms=kk<71=8!pZ4! z8DEp049CZc(PMWbW7Ff)lX#ALV*CKcQ!#pgZhRv84o;#{ckrIvHiHYcZN5||#q^(U*Qh$%Yvnz8EhP{DUsvYBtIxTswb4x ze=XIYwU|Gv_me-G$Kb!(^SJZFt^Qyh_kdrP%*gaVp?TV@@^I13vzNZn&9C>5xbg$< z-1vOM`w8$U_9)KGrg?^e6?Y$&TgTu$WVkrP7Z^;BVgWCP*A*wmF#~&@fARHStQ{OJ z7AD%4emqVqD+BHd;;blo(zaBX7(R+Kqi1WrI?d+?BEIi-f4veqVdDm@bJ>hx9 z?cm$aPjr3na-OmVS+3VRzvI@cy6|TUUjolHy8NK{`y#d~S?`9GEnB(h3ZdUjy;n^45O2VVM zt*G01vBr1PX)Z4s-;Kg+d==rhRd8@d`?V_mX}|9ImDYG+zg`C3_N$(suy47|Kg7k4 z>ZVA~6{;ey>p{cVr;m%^XGHU6#%uZX_VK#oSKH${8@!E6`*XL*X@Bk%Ui))E_)P_S zKY+DgeB+kp>)6;|dw00Jlu(ai5}s|`Qo^IUtw_gfR{YcPIv4BL8u(BKmyWS*704-P z?w1TS7TtOO2R`Y}^9x5@`MD>$@>@@E<*jqBJUZ{nr^@&9<4*Q^zO(-PX7p+^IlJe# z*f#RTI`hkgy?n3Eswqt1hY|0C>y%#eqIuq~`BDE`aq^pl(KpqbG_O zc$2u#uIJNIx^Hm?LG+mtV)Q~WYB1%7^H6D3y>R!apwjCdJ?-$*Tk};CFpJT0$ zjL5ON8PfTp?>~so8|8JrEF1qg4`$(y66Z?|{IUeYg6E#}u_|(FsFR-;zApTn@Hc^v z^a`H=&v+}sqxztt_18YaDQ_WWXpI--j8{e%&fxyiG!xK_wx(Yf6A_VE5(V*v!2J@iE*UF zW8z)l?Ri{u`GEa;{LytMe^%@G$m2w~(9*->Pa1q)1||!xL0m6Gk*lDd#x@{4swb4< z>-Qq8(VrEuKZ81tZ_D?SKbpr?vB&;k9-FZ|u7b~)JZitqe4>?a_FDyfh>}Ejyx&%^ zkMS=3AJ=blsHd?tg-7*-lE%9%_B7tln>aXb?gn2r@y7dYUC;k*AAeJyY~_P`ZUS%f zru|(NIqmOx;ZJDrr<5O`fj?B?H)Yk1MQ-zCXXU9luq5 zl|Od=y+Mwb`E#A#S3kR5f0932J&v6$a-6@Mi?vU+<{i&B>)>nBIqYA>_21Tx3&Hzv zGcnvO__{~matyZ`!->d!RxHSPxb$VN|IfL=l{&sIf4$>%yw+as_^ZcU8F!>~M;ML& z;3C%^A77bE-2Q*v@0V}gAKKdUUhDV2_HF(BTcaamcsc;TmVkRr#Y2Zi4vyeq$j!Wi zi|_KnLq$d0o6_Uj)UUP136E>ngSY1+ktOWcj}fCEGPp#!)_IDaujuu1{|~i}7u?q{ zcD@h%3itszxNzL&@Q=sK=GjheK=?)Bc|76yLS1-0o-7Ez7i~MR)r3d&6g>bLn3s9> z(Koqy6z)4Q^QqVQcuHR1v$wVNOxKS)KHa{4+zH;UACsdaQ!g1Ao+`;$)RjZm3$8h& z^y6CV1@{g7dP^_who-;}a-jgR;IWMBMIdrHRJlH^g-*{N)VaK@2#@NvqC+G2NMY|t z;YiWF-!q;Ujc?%bE*_1qUwDl#5Pn+)2WPZjL-CK}h5K%a_3Q1ievRirzYn?y*#T^W zPjLB|WgS~6Jo}#8fbghpE7E+V#6RYP$Hi2=HO?OnJ_mlzjPq{!7~0vMkCgD5k3r$L zRWjg=<|8fsX+C!RMteSXgWpU(GP~OIkrrO_F(mwU%|}-J(|jz&@)7*z=JJtyVtYQa z!fQSSKh3$aH0{cF$bFV6kxTNj*YoA| z>)(#g#}tp0admtAo2Lt5d1R(I8Xg!Kb8k&A@cXb^y!4Gi>@}YF^ZWdQmi+F4+(LC< z+-iGzAK&eYKfT|pAKG81@{4aroWT5^>hG!0zRum;N{WUck4HRhUB10_JmN8H1-!i; zjGxcybzmJ>p3nFFh&w*d2p)5^E?Q_Z9 z@-dKV&qu%TnvXu=w^cIWjOHU0|1=+UlMjBb-UJ_ZxZa76kHM$4=OYwe^D!X&cFjjh z{L_3~@LTQUV;}gu~Kg~ze@3rF4c(6n41z5PRu|BQTo@%bAaf7dfy8IP*h^LUPL9tLk~wB|dH zp|^v#=TAxB|Ct4rb9(QPo9}u*V@P;3olw%}M6zO!@kIMR*NTVtJNv;eizjl}@5!&3 zFND!`@67vMzx=NBTU=?c{j+|3)x+nvQ@Fh43!J7Wid(*P?KKX~%XW!J$NlwYoN(OV z0N#%Kr1NAw&#e5o8~1vgSTy>0oLC0$dp;>Gayoy8gxC3#5?=GRUCKiv6G!+0fGhAG znMu4fhJNX}GVAettzaM5htdTuPc`B937-ScnDfHx=Sykf(R5PN4)MM$@#r|&_dBii ziQ{Axe92sooYX;gaDL#6Zr%Lp%iOy80eODrA#(hSi}t$itgkm6@BbzI@El%XQJfgT zTWsAov9`Q;BB);D(7de2^8g?0>Eq zM(69#xy|Km?!zZ0fBgOA7rf}Q%iQl%7o)H8^7nSzej^8sBL_?2(ZXanJ?1dQVfV$| zUiX(($Y1`gP=U+&I>GF!1}WamaNi1-{>|!`R31-!F1H zANqvf*y!9kO8wW;{yx(5GoHTwOG(4y)A&K$b$0#x*y&6w-afc-i;4G9;O_=MB*|ge zGx!&xT+?`kzeo5rw6T3z_<7WspC#dQ!Z(En`=BE2C!{T+#&cWw=f1oDpf%pO?%f04 zu6sJZDkA5!Z2W)Re)@Us_6HZ+?We%|><1#Zamx-Fx8I1_AC1|cO0ZwqqW#VK`(Vef z$#L_=a@@RJ&Og35;f|lre2gm}BiC_zuk{~SHIKcn@9Wn;TfCl&eyR>X=ezz2)JeRV z8t=Is5Akc<6NSTDy+hV(T)xlwCyP_%al9a&*PS?3z#|>}#dE$6gfDTJjNZZ6tKIuB zp9k@i={(grFg|k-FOxhpGRoI_ALT>XTfcJdHNLIpRnH^79b1of{9*ffL^OQ%jbG>n z&++%abiLal6JX(mt@W1cdj|THcz%%wZ|?)GU>}d4Ws$21UlN|jQyvrY!t4FBtng?$ zsVV6?SFaO;pK8zNow0o01KwUIE+QMuXCv$6W`(Z{&s=g_5FXWSMcwkze?@yf@_*DC zU(x#nz=v}3!J>|h`DjWWXM|rAo^8xWLwHoT6?Mx;cx8J&?vCZ-+X?wtmON@cmW0=Q zG=<+*$vEZA1D=8TFNM*4h98)6=RpS!xN=n93;ktz58RRK{O3u%9`DwV=RMpX#*5$a zI{@yD6up1r({+g+PiueNT93GfFMzk#<(vK9XAX-P=j7sx-8>%S?)Rg$yPuzE}=_h_~_Ut>_zc)*n?Lb3+>gL;vWWG&Jw$H0x z=aY`x;7{7eZ6EmdaU1<=#`=9xy`NNlY3umIeU}+M%=1;?mn4xq9?xRqc+QI)$11m+ z@ThKUT9W>F*Tt?M9{#HPwm*99&--G1yf2=oxTr83UN~`h`Ut*CfByM=@4wM1FaPKL z;kGM2+#>#NiC^c{qL~jo9yE`eSJPutp6~tZ{0d&)KEKZTLTjFKe(eOmDl^8;uf|nQ zPUqKx@F#k5nO=@e>G^B7_Z#SSJqme{}zPT<6lj9J^sxLKLe|bc}{pe{#ArO z(ea<``gsjSYDm8HczL}UcRXI+0zPBzo11>WDEhUJNK5N}LAU(idCf zop$HI_Zhpq_T}+pLFD>`uL)mA8^^=E@Fn5rgxB#gBRrZ<(WwmdoPn7?bLVaUTXyFM zuY9d5pIvk1!$0oIxS{*(__wwD$7ULD?Ve_@{`>A{J`msk^ZBun`_+2fzp2?;w|LyY z8N5B8W}?~mdVJL5pO*Uk&=A(M0pJ#g-MYAjI@h~~@Lb=>*M-;hZ9#Zl-)h1G`k*2` zt~4cnJ)SL_{^9dSeP2R3eWlwwv6zoZY$FJ%6ajR`QX0W z7{3tD0qy{A@1u6hN9k~TKJvnAK61jVjqOruKFZ>s=40qj+w+kHZ}YKT{NL_=4BQz; z_X~ej-rsxCYus_KR&nJuKh%C4?DhC@UtIql#Yd&1#j(RvrQTl%r^kbP&3NLN`!;xc zJc!>H)Z>7bJEWuguW6khb6@(;TH}=O3(bSC;+R2Vv4)Lvuz9tU)Aegn_!8QT;`na7bbZhe zc^!Y@ovm@g@iz$Geh%ABZ|=)sG>?Byz6Z4X^47fFF?2yXlihb!zSMVS-SPn11l{-?H)Jk>G3KR|TWKlU)&e-+I2Y^R2hLa$cUx5RvuwayGu) zijT+qCU}l(lGQu==Pr)V9C7+S8~XJ+$sm|477k1li`Ny;KYx6DBrCr^IiLa_L|-4{PedOoM6d5FPZW^@e4h+I zA3Qvbdzbk2Y5ZdF$mAq`3?@p)=s0{rKkND&*}X)590u81&!S|GYbvQ(Zmr)Or~CfA zHEwwxdOi3V8L%vtu!Y!WMQ$E-uIDqt=Y%f{Pi>Sd36JV2dH^yo_!YO#ynUxzU-BRH zuQQ43%P3x9_=4wN(QS>nv@7o9T4RPW@g^oqg;Bhe_b~b`KF{Lw%03UwZY~U8Jw1uV zOS^m!lOZHC<>uWAs^nKE9bXfES$Ligaegfcuk)!XJenR0-tvI=sRl)nN3+Dd9tqZSwiPQV_0sp#ivds4N@m(69m}-43=D6ddj_>ei zTjM)Kp8AE?@!co<1J&-={R{MyeuzJxmYRpB{{IBiyhNA;wp9pZf`@pHZ4aiRY&TkFLmzz>0+zaQ6& z6P?s0S&w$h@$L6tu(|aJm!dz#AHwanAa%!?1?i_QNmj>uE*tuh=M#VTD?ZoQSKY2V zwLkU#&CILZ{Nnwa5L-!jy?=9+@H*f239oui)>7x&oW!H^ZRcI>^X)S5w!JE#v}o1Jyz0o6^BEQ!IK$g@A#NB0{0 z{9NtKueICXs1fSpV=pU^r>$?JutS4h$Fe z4;K#=rbnluvEPTrx!3lVkLm{HHNFMJqs0DefUn99+h3fU?60BM_2yq%*(pJ+7brN1i`S>aV2h(N3poVm2x| z;ZC}PA0p};&x7RPhdgxqT&COg=MEVp%{RDt#c|Aec*Ebe<^|W$Tfuuj{}j1-U^qu- zgwF|I7M|KT-b=!xdWs%^45Yv2)}4QucI(bte%O`qbw|g+)Ysd`!Oh^C;F$^1#voXyHOj?atS-?;Jkm1j6yw{c$oMyp>q&KJS^#`&!1 zeb)`0$GM(o?D_k4y?ep?^bY>5^Y@3Zc6vYbB3H)aS`^%>oM*@9S^RgX)sMSke%zDb zN9pU%kEg%G*?;t7+WlBP&+$6wRDWruJc@TdJpb7E*tyY*N99-S4o!?73Ard< zQ9L|?C%z`Gz=@AOi5mp#>*hsx=oFuS<7e%{E+Uc3>vGSC9#@_0Ce&+un)iW!YVY3= zy#0QF@AoP6oQ;n2*;;moL9mRl>%6?Y-IQW1ZWO@Ti_p5*LH4*yDKNzN`MZHD0)G zje_@GFP%{5PJr^#id#4Pvu-_k{p!N^`*y;V=lQQd&LVc@BLCv^h}Q88G1aA zKV6gyx%+CJSvBK^$B{MgcAZK3o*%CZNqw@u&dUZ#;qT(c(p6**KObRa{#|*#4n`uaBs+}DNNv%XIx5p zT}SYFaO>T&!{bGM`DQAdoGzE~oMH5B8h)$h;P~h$&bb%>eoLnS!=2@hPK-?X<@Efh zYUTyktr~c{Zt=F)#f8!J6F@yT(vs^}w4Tb?;M^kRZ)wdx&h2}Q9bT85`L8>JMKh20 zp-$Y{BB$%&fbffG6gA-S$D3AI(=) z_!FHhU6&hTPtUh*#yC*o*tr$_vh3jS&=}bF+-5$swf>c%7F0xD$N!oC*0N6@&jQb5 z0m)~7tw;O8hg6*_i#vkyHQHGf))hme2fS7~OYi9CUFUdzC+)r2C;b zKDb*G?z!LA7j3z)zi4dzYhQZ*LT&eYJnQxMM79)<3F0L5A8!_FJqLPU^+T_DP(L=^ zA9$(HzKIcjnfLPX;bPC{M>?Md{=Kzcb3TRO?fFXlnNmG|%md5gNBveezjMMb2v4n? zk2T>@-B!d{Ne%Ij`Pc!zWb(oDs#)+uW_?M@hyC0@G1Q;*doQVvwT@eSE^6T3RzL84 z16lAZ#x8vbv47>GPHqi#@=f7usIxy7g)a%;5T5U&r@FfEs6MDj$E}_>EquI{f9~7! zAFcfJylF3Zj&Tz6mchpSmPJm-_g(i>KGlEvLMkt`{O7)#jsG0mw}77|5XAN&Z1g`R za;R>KbWE!snvc5Z(|jy!QU9i#0a*L7Ve-Iz%O(%($JJOrZr08z{QZ-GB{?s9<*n{~ ztn>+2Hm`K$>GC{m{f&U(>xw<9?gHNwJva-UI3pKqnuYdA9Q{#e#*^D zfo!!9;V|=%WLr&n%3F1i`YVJ=})`y$1yU9 zZAkcx@G0TJZY$FBv8?!~^RH?0!uhuXJ}Z-jh34<7wf1>344ye45vTKW?-t`1lR^2{ zU4Aw9x<9D5ACIdse`*Q-G(=zI=!59rz&&mqdi!JD`tybTu6)#wy7DRVy>?AWUGQsf za_zc5^_wp5>Cd=w{&rV3qzpdm_#r8^zgXJs%BjM^Yj6{ozvvac@#)$EesLN<)fhf0 zGWDeBS3(btPfSdg@!A&ov-7 z+qk_xs&A-*Z_|_0*l`R9c|ZaB2%*PDYPfiC6t~1(0O9ypaUFDUeC%4hET8wx8Jrc0 zekBdRHP$X%2!}@w;bmhG@+dj)41UbLX}S=qCh=}A{9ar*c?AB`EZ?>@b*x+rOL$}d z!9vslg>aM!L6ma%c&dvyI&F+4CbMH%GzQar#>oGBbBj~34l!!sW7u!AN12;0H%C&Iyz z@QGn+=F&@_{Nral;^I@ag4>BSX2d{MuSA+e+Qv2*lp0f{^4UP1N>^xMePF-Afe z*L&13UY;5`!Xbr^Glq*>%%^sMn+HdVN5&`M2GgiRzP+C=L|QRyT4SHsDB%Z+xCw@E zrX<7bBfd>Rn;n^U`_YY1+R1G2qOoi67PYbP3j7?w$dO`rajA%TdkJ4?)~5f8U^*BJ zrh<{+NKg#I;9@)>Q49_S*Pwn$FoC~uZ07}M1dqU;7Xe!c4g{kSb_#7_Fbvtrpp1Qm z;28KTf_=~u2A2afiN8W{7`63!z;KHq5E-@Xc~*x3$zLOI(J_yVLWZYYvaNv>>3Ww4R^IHxPDph^l+?* z(K{_k*M&}vq1<)e({mw8T|bKjT|~7vWh`O57ALqu9pL-zF#pyUDAd>Ooncf*Rqpu7 zFbK}ri^+X{c!9Q`abYx8qGf1o`p5xHe@;xDM5_FJh_=xgS7N4^y=PoFJPg++&&SNP z!22j3t1_zZn#5lj+jYbE$4&kOd0}ftAupRhkSx4mFgm}_zR{J(IUqaI{}e{JLr-(Z z)91-`m*NlLb%Sm?GR3+V_nSoStxxJ8#}9Eaa*l@X?X)dvoRfae9gj0oR-~*-xg@2^ zxPH(Bi;NTF(ZzBU&|^Tf{B!B&%4k=9RVby?D`WF`wZUcWt6SU3rU&uplW(uy*n+k` zyj$P{nD1l3RhaijFw=iD*n|4z!IeQa*c)6FJPmvbYs=o?GW?NVjJ4+qtWz(*3i4ba zFA>aMpoXz>jJ8yJYXz)iBUn$4U^O{6I2u_$7waKc!6NqX|6%N%#F{yQ_3m6~d>a09 zqbEr=3TU|&QBeCcf~Oyc#8ZziEEmU~Up#in%uC=Ic)Xus;@FG%%#hm^`HTG*qq~X# zM*Nk*3xi7$>q~+Q5%(p?&P(9y(I`{2^8#?g@R?Z~K^$DqC$SxZ|5qVfjAR;qjUuO0 zsBtwPM+-B19wNF5`-@RaIl^D;&01?`HnK1bO$Q;h7uw9rQvqxBl#_|~rD{srpWS;A z^MtgF;5?=HOyb)uU=4iTEd}o9eXiGIyYoN7;LfjysI}VgTHD|(Z2516LH_O#HKEhA za^IFKbGxE-%D|}%oXWtd44lfqsSKRTz^M$J%D|}% zJm49yr~m!$*cGI{bPitrf~^ZtE@N;xQ>Q3(DSZdTdKz1#pG=IbA8E+ep>H;(GbR$T zlxrH?vZ)h5T}svu>i3cLqXyaZpPm!+W9vq|7R(u38TGg?)IptU!}>!zK2j{(%8+dW zS53fL`P0Fy7+n9Kof9PaWaVgsv5>5PwCf}5-x6fYu#?8tjVL#3aPy{4S?W@C{0=bvceZq^*!RhBA8phP zZkc|5`J5o0x41lQ`1+G}eN+ZseYEkUVXG5G86Jr!DGj8adUcrNuAY zjN{)D{N~n$n6He%l~J!^>y|It@Z~GA>$CYDf4-W=woi;URtzS|HyeKdTan(sNRHp) zE5PT0O?AMlZ}exz;O0fVJ}UXVu{P{?hLcb*c^P5AFC! zv23eCwgkOH*t!w@sTkaRfz%3?VtvvndzpJHl5OrUFQK#Cl z{?Lw(6w9`u_w5R1p*Lsj_++?`{!|UFp5PC4stxN8?f6KsY^y+a;IGaJRuZsQp8lkO zRm!05%MW#`4eJl>_(-vAYeKdL+)M)2%F~~Q!7ZWg^M^XshV_Sbe56>mh1Ffb&|jYu z^kM5p^e1a@CDeWXP^a3k{?Lw(6w9_UWEX*(PrzDv`m=0sYpDDDp-#17{h=KnDVA+@ z$mYIwPB4hA8_}P#!Of!X^M^XshV_Sbe5BZ@?ftv(KH77FdIHwU)1P3urE>svpFaU~ zstxN8?f6KsY|BA*26{8bj!%aB=+B(N)e`)nPPJkEp&cJ7mTfi2_WjK{!BPU&%F~|^ zSfwGWHVpK`46^kM1S%IH-oy*AL>*a)*ssOkz(1F{s7K@fU6~7tvvl%HMqXJ{r*s= z+OYo6j*k?}wmHa_pmzvcH=;ikgPTwAhdR}U^@nzRq*%5sLv{_g#RROCr$7CF*U~wN zy05>eQ*Bs(Xvas2Wn1bNoc};?&e-wEa38O$ss^`+`Wm)w*HyH^SV-1C+VxQdc=gfZ z2fyLRs}9;o8%&aKs+)4OMZGyAr~0(C_%-0`z|MBSs~q#yG`Ka?2mii%zG%ajFWU7{ z_JjU>a*Co<%>3a z`J!DP^?%r(uX+Mrbh_v31KA zZTRv1+I~Rwes|*@1I&aL)3l#P^a3k{?Lw(6w9_UWGm2{HFkV5+(&=r z4Q?U9AL>*a)*ssOkz(1_fNcLi<8!$Ltd*xfgTN}KQTOGCI@N~thjx6VShl5qbyrXY zuAG3i@?2Ny2DglQ|G#u!S7?K=kgR{S>!Uf~)klj@!&WDvjhw+G`KG$5i?*n@Y~
    tDs^KiImh!?fYc7w!5e54`$l^HqkePDC5C29xBQ>ZUH* zqTZ^Ji`%gH!CSEg{wqHJ=zv#w$_)UkG-&GF7wM8l8z=Sq$oi3kAG5&a60laD{Z=)& zMby`@b?Z0U@bw$*`e*@o_0h&N_-}r^>Y$CZ!6f;nx+zCn)SEMMs!vOcPkj{UC&12j zz^fed)ik&@)Cd2)d%kGHmoM7&Q3ZJQ(dH`$Tb+nD$_A6a*Co<%>3a`J!DPr9SS@S3Lo*I%uP5FiF1I_-TuJSB#wM z)6(J_z-PXN^IvS;i22GJ+$`#KY~Auj8@_zeu8;Z`{P|i*z^jhP#(%bSCi!OLr!DFo zFmkF-ON*Zaeg@b~2fWHLUvmamM|}lbw|votFJH9lqveEr4XpX`s)IIC29xBQji0ut zH)G^fpOzM%{{%k&0(PbYUgemthQY0%KJfp#=ZiLc`J!DPEdZ}R+VwsITb+nD@&=RS zo9d=6+M?bWBNw+}@u^SZ{x7h#4tSMkzE%xx;J?r>*t(4`+VJIzc6~Gly!vSKH3M6n zh&JX7CdoI|O3wvuJS3sQdh(PPJkEp&cJ7mTfDLP5%$BGqH6e`ja!bGU`5m zs8elNe`v=?ie+1P8?OI=t0rKrJpEa*xc~M0L!D~F`a?TDQY_oDZ^8W^=uKhkMwFW| zxLH%DEOjYaKd9eF){h)wSOKn{fVJ|>OYohR&H>ajhF2_gstxN8?f7U8cqNOU@#t0@ zOWK$-n7A+M1F?&+(FC??@Z9gCsQ=q=p*K$IR2$ZB+VPQM+1B@K=>H(Zx0pj8v~3^# znK8II)Z?*IfI3eTN$U^o_(-vAOG9=QxJClj%F~~|)57&#A?iMVs8elNe`v=?ie*~` zvX#?9yeBFQx)J@EKP_B`Euil6hdR}U^``>7j}*%`j!}-s<o@iL$okPh%!|OyCt$5S<(3U@)zpcjE+y*+_4~;Bu?E@f>0uCJ z>qe9-8QhGiQ@4)=j2)j0_ff8Da0{l+cIr~Hd7*wESwF&G$Nm5BL3{~VE6=TsUlJzgL>vp&OxBk^2+k~B}vD*eV%nsC73~rzgdETIpR6|>gk!1a( zeIHpr!#a*Lu$RHsjhKr$gR7w)U$d!$I@N~thjx6VShkfQ+xM_ASW3WJdHNFqt2BhV zZ`@O-+OYo6j*k?}wi;yTfh#3otvvl%Ft|n3edC@w)rR$lc6_8*wk<<;@Qg56OTb!r z`jZA$DTlhRzo=7fSbu28M~Y=z_#3!C3EXS~*2>eLropYC?&~k=R2$YG+VPQM+17{8 z=`s%wg8^*ai2mdaZU%KR1Fj}*(cJYrb_u9kqc^7Lob;QG$=_ZM}l4eJl> z_(-vAt3tK}y+hc#5#=fdH)raUr7k7w2le~N`q6~!DsYVitd-~b*!PHVeb*4`n^_-e z%eOw#zK^V*{lAI%4|^qJ-zUR;^mD=BmQnBjzKtDgC{J5HKWX1b4P1wF%#dvU)3Diz zXd`DZ8}-rVg|=y@V)VpqT6`X{Ed#sI0k87RQI!7ZY`k@E`L@bw$*`pEjX3faMatp5pEE6+TpfmJG_Ud6T%A1OmyzC6;tkJ6v< z$JI>0s}9;&F_?||X!AnbwA25nP}Lq+T6_igGO+0mcvZkW&Kg`D^^N*S9kk`kBklXh z`nd?%fk%hIN&?o((?$wdr5x%T>1*2XjYrz`QJa7GP9wj+IGcdA@|0^D+_I??mwBuI zcv6qyR44VNu(5vzZpV7`{pf#e-H5T~46clN)$l4$of>P~`s%?_#`;g5er2(B@}D?T z7Pf-3!l0R;+o9Zl`ZNHn(x9nxU!+SKt>4t|BaM-5v+!dUxLg9(%2Tdta0{lcx)g8y zpne}&Kln@}pMP9Vz*64g8|?r8gZ{_XjVPBhxRR+;mb#Rz-_-9T>&F^o7lE5kz*>3A zEgRgbsS`(CO4bkR_mTA@^;z8i`oCciV(Uhn4<&=EpdKGn)IptU!}>!zK2j{(N|0R! zZXp3{<>}9w!Sz4J?+_(-vAt3tL6y=iRSC|dswu8#U<&Od3(yZ#%U)(7k7 zGGqq^u>L1tt=vPwq<~c_p}tvPDNCD-nPl@yKYV2U9sDhff8gd5uvVTqSvI)7AK2LO ziZ*=5E86vu^{)ik66_3N>qeBT7~GtxQh&i{Z_%AuZg?^Q7@X~Q?4XxB&9zba(wz|AILtvvl}8r&M{8}W}eeE!j{kF0-7 zkj?!N))j2si2jugZXWfddw5nCZTS47T_0Kh1{(PMgLV?IDo>e*V(b6mP6Gpu6pY4YXa#8^{+W}7<+7I&v*F=4@u~8Ro`uc%>_{hem{sy5ROL-e#1-A0Q zraIu&Ci{BE;Hs!6-HTKimbBrU2ej*>)6C9A$OezYdXRusC}lVg27pz{qP~^<)21)~ z^utHAt>a7mtvoLDL8E=duhZvn{`)wb|6=Pzlwo{pj|=hNQR?wqi!XppUwrh#N3^Z+ zQI@zoY$p-%N<+XmfSv1rCzdjdZ^_{LpRl#~Xww%T{qT{EPyJ29b`sh6%CJ=hw%h?v zJsMx#;8s!J%J`&BUwrh#M>an7H{9vRQr^Z_gRKg%*$#M>VgJn=Tod)J#7CRH_~?g^ zY<%i(u*;97yp3-Ow(`KHI^b1?@y!_A0_t0dk2ZHuDaal->4%SOeCqFV0+#YNzW(3A z{f{T&{s*>BL>b1HGq^d_w-O(1`r@M>KC5Gqk_{hem{#FvO zl(+HKVQU%Kg${U?VSH-_mwNKn;-gJpeDuRdHa_(?58Fv(<6DKT2C#D-@T%u@RF*96 zDH}V#qK$`$61$$zu8*vL>EFfr2RkWj-H86p7+iIO{?UfdKic(?^=}rk!Ba8*6R=jE zHU@xIN}--NyzZw?wPEu`J3eaC2T&h2i=RutM_~M;jheyKO`RCk%lbz2s?Wp^d>+^T zyK(&=)5*3tF)t}#l`^RN@!zK2j{(a*(Y7H@Vf~>U zA1Rh?^N<}n7xM>OH=%aXyZq8|5!c({czj=deY|ua2@cBo(KC=GhAsapo=YI)Um8T5P zABKQcDxLqaQx9@u|Pn1T5uk zd|B8Eo`vII2fW(kIm7_4N-5Oi&nB~tI@N|fAEX^0DVA*&$j$+mPrzDv`cpHw2I@Y4 zs8elNe`v=?ie=jZWW)2({|Q(tPk)AhRm!67^M^XshV_Sbe56>mtw44GxJm-n%F~}k zgIh-3=MQzN4eJl>_(-vA8~8)a{~yQv$JUMLPtM@VsQdh(PPJkEp&cJ7mTg(cHi4@q zV68m;S+Tea{Qgj<+OYo6j*k?}whCnP(3`^6jp)ye!ObQ3L!D~F`a?TDQY_mRAiD}& zBLQpW=}+HJgzLLP)P4O$ood7SLpwfFEZbHfTY=uJvE!5BKKe6na0?0kP^a3k{?Lw( z6w9{okMRA!pA3WL1gw>(KZC$3rBV0ghdR}U^@nzRq*%6PAzKBmoPf3R^rvocP1Jq< zP^a3k{?Lw(6w9_*$flkh1_8G&M1L{{mq*>_4|S>y>rZ6IV?(iQYCyI@y~d75B-%xP zmJDt+!5`{W8`dA%@sVQLwhGy7It)T=-H85_46cH@FF(|InkcjW(2kE3%eL^3as3C} zLIT#x)1Nhi>%Y+N4|S>y>ksYtNU?0oLbiNi7^JavBly>ksYtNU>}ixC7@uz*Q2kR{kMi z77cD0b)P@fsWz-XwBsYivMmGI^j@6*VCzQoCueYF)P4R?r`oXo(2kE3%eKbbasC5b zH34hoDYs&9Yo@Nc6mR{YejiysW)MT}5{g|2Y^Zo6I$J(I#_1viYVTK4N@1Y?M)d)3BXHHXr?eg7Y6>%N_94qw&=Z zZWZ;d#7CRH_~?g^=x-VuWz^p=6N2-TjjxRPS^+lO0k2vpH*at?QzwSHlx)9HzmKdR zImF!e+%Q;5z^c5?*AQ5xEb2O6<31_ImbB%Yue9$Y`Z(V4D3P& zJY_VlHG>;`-sa+>Eni%;?;{(R`k8~xB(ia>-Gp@l*x3$v)kC?a!7ZCQG1R4G#|`!S z$ojF0nA6Y4@ef-k(){KOZWeVNH*ueQx@gOnU)uK({Y+!yxKTgr30Oed#!c!A`27E} zFj(n;rwsk!x|#x3sf7AwW1}o>`qmx#;UgQL`a7S1rM&I8^xN?KJFtr#@M@EC{g;Qz z2BE2QCv_>=@k9MSvVP1U<_h#>V>;tK=8 zOLehFpEDL?e2tVP{L_4pkH!kUikJ3&5dbpT?R~@vmY%rVkbq;oQK2Rt1WwE6Z zZztk>$Qeup^#yGGUGih?+5S$lw+#P$<7wI0_W8+})(j@exBf4=@z)1@n?GIRpieo2 zDVaL`QN65hM6ZpLGVF&mwxl>!Km8^tJ{|MJwYDEGxCU~)TT8%FhVkinn&Jnq4B6x* z?ISkMy$j!e2R7FMuSzIaHMj*+S6zy=d8B?HSwGU~+x~sH|C@kSc|9Ht0;`lqoxaSW zY+ze8ZHn=gw8_38S%2w=kC}Z9QNUwxXQ8zihL7!8yEfcQR+{31>ftzFDKv$<#>+z5Prw$M8#Ht zpR}98X5*Um_@F)!&v8>Vm?rCz>-d;ZIa{h-?%RmnCj8`lBUyZ^L%-5bZW)W&ppR-V zo|hzhI_~56PUD_fl8*bP_0u)2|K~i(V`JVGAG|aK=O;U_I2JkXQeE)skK*%P@Hv>K zKZ>90f>%$&Kf~vrz&1MIiDln$p7;NBi2vUwI&8~yeX^R4;Q_^KYi zRo3>W;+tLYDqDeXsh5R8z^wym{<0q20`{HA{Lx2W{vy9UKHL0he9IocRn+EB@%>kY z+I(C|yiyJKTFSttJKz;dxmkmoH+5pDOUaHC>i3cLV+lE018y+^tMcqeUf=Y;Jk(u5 zhIMnSn=x(cAWwxhIcG`MU;5!AjW52gb&5~tfyP(s;2ZOi#zvnMztjZ}Xhi)tcmi&l8ux4ePsQpLALK8u747+Dt|gE?Ees0r7Y@tA3yGsVr)rU z)I+j<(!P)A=MXm9RX-~USjyYDX5WVMPhb~1;3-3*+?v7l4Ts#lPSmAj{ic2&SwB_~ za|!x}Vmjk;n%|1SEugOXjr$arCr?|x{L;RU=w})m^Q(R?Ctv|-%WwWBeEw4mgMMt? zh<0)YS2A_VQkRm=FZKJ#<~Q>dy#EZi`2?)WYkrpvuK!Rgzj2>b&X%<0%P;Nw$mUo5 zOv7dp*|_Fls|swn1D<;5&qJ}*4Q>_n&BjJuw7G*7knIQh;UoI1#|8B_JnY9(-o`h8 zKCb|q?SQ8YiE{G>S2K0CQn*pjw< zR7PFrN8BgH*pjw< z`K5gy+5D=X)dVc%ZCrU?dyT@s4tTXmxdC9622Gv&B3;sG^Gp3cvVN=}=2_r!30Rfa z{8kOFiMr-D?vu*dlD2&LrF|dK&onk36V%V(NC?hPHm(rQB;|okb-=3@%FP(utf>=2 zT}n2;)bAtfN9r%|`**3aj4f%)7Z>gO$i}69&L?0g zZ{upd75D#uUF?8Yo0RK+MW}2LnmTtbL}fTxVcIcIQ9)O(4OwtaEZA0OE`)$ib1KbG<~PR;?2 z_f!|Wju*w}yWrK&8e(YxJJ$hEEc3{imkh4|=+@Q(+Vst9`r#wyV-6c-)Za90Cy~wH z8f;a8EqB0EkH%LwxK-3QJ9nvzHhuBY4Tht&kEOhgZx*)lz@|FjDWmgz#^CCx_cG6E+c(eYkB{j0JT~S= z{a#7HQr^bdgsseVIRC}gi8RiGotKRiCrUtMq1-v#4GT*Ss#g024R@%�Jms|?2Z2>8q25bB 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
      c^jy&T9N(hz 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 +#include +#include "common/devices/Device.h" + +namespace seabreeze { + + class DeviceFactory { + + public: + static DeviceFactory* getInstance(); + static DeviceFactory* instance; + static void shutdown(); + + Device *create(const std::string& name); + Device *create(int index); + int getNumberOfDeviceTypes(); + + private: + typedef Device *(*creatorFunction)(void); + DeviceFactory(); + std::map nameToCreator; + }; + +} + +#endif diff --git a/source/OSIF/include/api/DllDecl.h b/source/OSIF/include/api/DllDecl.h new file mode 100644 index 0000000..d141060 --- /dev/null +++ b/source/OSIF/include/api/DllDecl.h @@ -0,0 +1,56 @@ +/***************************************************//** + * @file DllDecl.h + * @date September 2012 + * @author Ocean Optics, Inc. + * + * This class provides the DLL import/export decorations + * required for Windows DLLs. It is encapsulated to + * reduce copy-paste and to allow a single point of + * maintenance. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ******************************************************/ + +#ifndef SEABREEZE_DLL_DECL_H +#define SEABREEZE_DLL_DECL_H + +#ifdef _WINDOWS + #ifdef BUILD_DLL + #define DLL_DECL __declspec(dllexport) + #else + #define DLL_DECL __declspec(dllimport) + #endif + + // "STL member 'seabreeze::api::Foo::foo' needs to have dll-interface + // to be used by clients of class 'seabreeze::api::Foo'" + #pragma warning (disable: 4251) + + // "non dll-interface class 'seabreeze::Foo' used as base for dll-interface + // class 'seabreeze::api::Bar'" + #pragma warning (disable: 4275) +#else + #define DLL_DECL +#endif + +#endif diff --git a/source/OSIF/include/api/SeaBreezeWrapper.h b/source/OSIF/include/api/SeaBreezeWrapper.h new file mode 100644 index 0000000..da6b94c --- /dev/null +++ b/source/OSIF/include/api/SeaBreezeWrapper.h @@ -0,0 +1,864 @@ +/***************************************************//** + * @file SeaBreezeWrapper.h + * @date July 2009 + * @author Ocean Optics, Inc. + * + * This is a trivial interface to SeaBreeze that allows + * the user to connect to devices over USB. + * This is intended as a usable and extensible API. + * + * This provides a C interface to help with linkage. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_WRAPPER_H +#define SEABREEZE_WRAPPER_H + +#define SEABREEZE_API_VERSION "3.0.11" //!< current version of the SeaBreezeWrapper API +#define SEABREEZE_MAX_DEVICES 32 //!< how many different spectrometer types we support + +#include "api/DllDecl.h" + +#ifdef __cplusplus + +/** +* @brief Encapsulates all SeaBreeze classes +*/ +namespace seabreeze { + class Device; +} + +/** + Original interface to SeaBreeze. SeaBreezeAPI represents a proposed architecture for + future development. +*/ +class DLL_DECL SeaBreezeWrapper { +public: + + //! get handle to Singleton + static SeaBreezeWrapper *getInstance(); + + //! free some static memory under Microsoft profiler + static void shutdown(); + + // lifecycle + int openSpectrometer (int index, int *errorCode); + int closeSpectrometer (int index, int *errorCode); + + // metadata + int getModel (int index, int *errorCode, char *buf, int len); + int getSerialNumber (int index, int *errorCode, char *buf, int len); + + // basic acquisitions + void setIntegrationTimeMicrosec(int index, int *errorCode, unsigned long integration_time_micros); + int getWavelengths (int index, int *errorCode, double *wavelengths, int length); + int getFormattedSpectrum (int index, int *errorCode, double* buffer, int buffer_length); + int getUnformattedSpectrum (int index, int *errorCode, unsigned char *buffer, int buffer_length); + int getFormattedSpectrumLength(int index, int *errorCode); + int getUnformattedSpectrumLength(int index, int *errorCode); + long getMinIntegrationTimeMicrosec(int index, int *errorCode); + long getMaxIntegrationTimeMicrosec(int index, int *errorCode); + int getMaximumIntensity(int index, int *errorCode); + + // advanced features + int getElectricDarkPixelIndices(int index, int *errorCode, int *indices, int length); + void setTriggerMode (int index, int *errorCode, int mode); + void setStrobeEnable (int index, int *errorCode, unsigned char strobe_enable); + void setShutterOpen (int index, int *errorCode, unsigned char opened); + void setContinuousStrobePeriodMicrosec(int index, int *errorCode, unsigned short strobe_id, unsigned long period_usec); + void setAcquisitionDelayMicrosec(int index, int *errorCode, unsigned long delay_usec); + + // Buffering features + void clearBuffer (int index, int *errorCode); + unsigned long getBufferElementCount(int index, int *errorCode); + unsigned long getBufferCapacity (int index, int *errorCode); + unsigned long getBufferCapacityMaximum(int index, int *errorCode); + unsigned long getBufferCapacityMinimum(int index, int *errorCode); + void setBufferCapacity (int index, int *errorCode, unsigned long capacity); + + // EEPROM access + int readEEPROMSlot (int index, int *errorCode, int slot_number, unsigned char *buffer, int buffer_length); + int writeEEPROMSlot (int index, int *errorCode, int slot_number, unsigned char *buffer, int buffer_length); + + // irradiance calibration + int readIrradCalibration (int index, int *errorCode, float *buffer, int buffer_length); + int writeIrradCalibration (int index, int *errorCode, float *buffer, int buffer_length); + int hasIrradCollectionArea (int index, int *errorCode); + float readIrradCollectionArea (int index, int *errorCode); + void writeIrradCollectionArea (int index, int *errorCode, float area); + + // thermal-electric cooler + double readTECTemperature (int index, int *errorCode); + void setTECTemperature (int index, int *errorCode, double temperature_degrees_celsius); + void setTECEnable (int index, int *errorCode, unsigned char tec_enable); + void setTECFanEnable (int index, int *errorCode, unsigned char tec_fan_enable); + + // Wrapper features + void setVerbose (bool flag); + void setLogfile (char *path, int length); + int getAPIVersionString (char *buffer, int length); + int getErrorString (int errorCode, char *buffer, int buffer_length); + + // raw USB access + int writeUSB (int index, int *errorCode, unsigned char endpoint, unsigned char *buffer, unsigned int length); + int readUSB (int index, int *errorCode, unsigned char endpoint, unsigned char *buffer, unsigned int length); + int getUSBDescriptorString (int index, int *errorCode, int id, unsigned char *buffer, int length); + + // light sources (JAZ?) + int getLightSourceCount (int index, int *errorCode); + void setLightSourceEnable (int index, int *errorCode, int lightIndex, unsigned char enable); + void setLightSourceIntensity (int index, int *errorCode, int lightIndex, double intensity); + +private: + SeaBreezeWrapper(); + virtual ~SeaBreezeWrapper(); + + //! Singleton + static SeaBreezeWrapper *instance; + + //! types of supported Ocean Optics devices (not actual devices found enumerated on the USB bus) + seabreeze::Device *devices[SEABREEZE_MAX_DEVICES]; +}; + +extern "C" { +#endif /* __cplusplus */ + + /* All of these C functions start with seabreeze_ to prevent namespace + * collisions. + */ + + /** + * @brief This function opens a device attached to the system. + * @param index (Input) The index of a USB device to try to open. + * Valid values will range from 0 to N-1 for N connected devices. + * @param error_code (Output) A pointer to an integer that can be used + * for storing error codes. + * @return int: The function will return an integer of 0 if it opened a + * device successfully, or 1 if no device was opened (in which + * case the error_code variable will be set). + * + * This can be called repeatedly with incrementing index values (until + * it returns 1) to open all connected devices. + * + * Note that the index used to open a device with this function should also + * be used to communicate with that same device in the other functions + * provided here. + */ + DLL_DECL int + seabreeze_open_spectrometer(int index, int *error_code); + + /** + * @brief This function closes the spectrometer attached to the system. + * @param index (Input) The index of a device previously opened with + * open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used + * for storing error codes. + * @return int: This function will return 1 no matter what! (MZ) + */ + DLL_DECL int + seabreeze_close_spectrometer(int index, int *error_code); + + /** + * @brief This function returns a description of the error denoted by + * error_code. + * @param error_code (Input) The integer error code to look up. Error + * codes not be zero, but can be any non-zero integer (positive or + * negative). + * @param buffer (Output) A character buffer allocated to contain at least + * 'buffer_length' bytes, which will be populated with the string + * description of the given error code. + * @param buffer_length (Input) allocated size of the output buffer + * @return int: Number of bytes written to buffer. + */ + DLL_DECL int + seabreeze_get_error_string(int error_code, char *buffer, int buffer_length); + + /** + * @brief This function returns a string denoting the type of the device. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. This may be NULL. + * @param buffer (Output) A character buffer allocated to contain at least + * 'buffer_length' bytes, which will be populated with the + * spectrometer type. + * @param buffer_length (Input) allocated size of the buffer + * @return int: Number of bytes written to the buffer. + * + * The populated buffer will hold one of the following strings: + * + * \verbatim + * NONE: Used if no spectrometer is found (error_code will also be set) + * HR2000: Represents an HR2000 Spectrometer + * HR2000PLUS: Represents an HR2000+ Spectrometer + * HR4000: Represents an HR4000 Spectrometer + * JAZ: Represents a Jaz Spectrometer + * MAYA2000: Represents a Maya2000 Spectrometer + * MAYALSL: Represents a Maya-LSL Spectrometer + * MAYA2000PRO: Represents a Maya2000 Pro Spectrometer + * NIRQUEST256: Represents an NIRQuest256 Spectrometer + * NIRQUEST512: Represents an NIRQuest512 Spectrometer + * QE65000: Represents a QE65000 Spectrometer + * QE-PRO: Represents a QE-Pro Spectrometer + * STS: Represents an STS Spectrometer + * TORUS: Represents a Torus Spectrometer + * USB2000: Represents a USB2000 Spectrometer + * USB2000PLUS: Represents a USB2000+ Spectrometer + * USB4000: Represents a USB4000 Spectrometer + * \endverbatim + */ + DLL_DECL int + seabreeze_get_model(int index, int *error_code, char *buffer, int buffer_length); + + /** + * @brief This function sets the trigger mode for the specified device. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param mode (Input) a trigger mode (0 = normal, 1 = software, 2 = synchronization, + * 3 = external hardware, etc.) + * + * Note that requesting an unsupported mode will result in an error. + */ + + DLL_DECL void + seabreeze_set_trigger_mode(int index, int *error_code, int mode); + + /** + * @brief This function sets the integration time for the specified device. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param integration_time_micros (Input) The new integration time in units of + * microseconds + * + * This function does not automatically perform a stability scan. + * If your application requires a stability scan following a change + * in integration time, you need to command that yourself. + */ + DLL_DECL void + seabreeze_set_integration_time_microsec(int index, int *error_code, + unsigned long integration_time_micros); + + /** + * @brief This function returns the smallest integration time setting, + * in microseconds, that is valid for the spectrometer. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return Returns minimum legal integration time in microseconds if > 0. + * On error, returns -1 and error_code will be set accordingly. + */ + DLL_DECL long + seabreeze_get_min_integration_time_microsec(int index, int *error_code); + + /** + * @brief This function sets the shutter state on the spectrometer. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param opened (Input) A logical boolean used for denoting the desired + * state (opened/closed) of the shutter. If the value of opened is + * non-zero, then the shutter will open. If the value of opened is + * zero, then the shutter will close. + */ + DLL_DECL void + seabreeze_set_shutter_open(int index, int *error_code, unsigned char opened); + + /** + * @brief This function sets the strobe enable on the spectrometer. Note that + * this refers to a particular set of one or more digital pins on the + * device: lamp enable, single strobe, and continuous strobe may all + * be affected by this setting, and these generally control lamps + * that are external to the device. Note that this is related to, but + * different from, the light source interface which allows the intensity + * and/or enable status of individual light sources (e.g. lamp bulbs, + * LEDs, or lasers) in attached modules to be controlled. Refer to + * the seabreeze_xxx_light_source_ functions for finer control of + * certain light source modules that are more closely integrated with + * the spectrometer. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param strobe_enable (Input) A logical boolean used for denoting the + * desired value (high/low) of the strobe-enable pin. If the value of + * strobe_enable is zero, then the pin should be set low. If the value + * of strobe_enable is non-zero, then the pin should be set high. + */ + DLL_DECL void + seabreeze_set_strobe_enable(int index, int *error_code, unsigned char strobe_enable); + + /** + * @brief This function gets the number of attached light sources that can + * be programmatically controlled. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return The number of light sources that can be controlled + */ + DLL_DECL int + seabreeze_get_light_source_count(int index, int *error_code); + + /** + * @brief This function sets the enable status on a connected light source. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param light_index (Input) The index of the light source. This will + * usually be zero, but if the light module contains multiple LEDs, + * bulbs, lasers, etc. then this may be higher. Use + * seabreeze_get_light_source_count() to bound the maximum value . + * @param enable (Input) A logical boolean used for denoting whether to enable + * the indicated light source. If the value of + * enable is zero, then the light source should be disabled. If the value + * of enable is non-zero, then the light source should be enabled. + */ + DLL_DECL void + seabreeze_set_light_source_enable(int index, int *error_code, + int light_index, unsigned char enable); + + /** + * @brief This function sets the intensity of a connected light source. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param light_index (Input) The index of the light source. This will + * usually be zero, but if the light module contains multiple LEDs, + * bulbs, lasers, etc. then this may be higher. Use + * seabreeze_get_light_source_count() to bound the maximum value. + * @param intensity (Input) The desired intensity of the light source. The + * range of intensities is normalized over [0, 1], where 0 is the + * minimum controllable intensity of the light source, and 1 is the + * maximum. + * + * @warning SETTING THE INTENSITY TO ZERO MAY NOT CAUSE THE LIGHT SOURCE + * TO TURN OFF COMPLETELY. The light source will go to the + * dimmest level it can reach without changing its enable status. + * To switch the light source off, try using the + * seabreeze_set_light_source_enable() function or provide the + * operator with another way to disable or block the light source. + */ + DLL_DECL void + seabreeze_set_light_source_intensity(int index, int *error_code, + int light_index, double intensity); + + /** + * @brief This function reads a string out of the spectrometer's EEPROM slot + * and returns the result. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param slot_number (Input) The number of the slot to read out. Possible + * values are 0 through 16*. + * @param buffer (Output) A buffer (with memory already allocated) to hold the + * value read out of the EEPROM slot + * @param buffer_length (Input) The length of the allocated output buffer (typically 16) + * @return int: The number of bytes read from the EEPROM slot into the buffer + * + * (*) Actual maximum slot count varies by spectrometer model. For the number of supported + * slots on your spectrometer, see EEPROMSlotFeature instantiation in appropriate + * device file under src/vendors/OceanOptics/devices. + */ + DLL_DECL int + seabreeze_read_eeprom_slot(int index, int *error_code, int slot_number, unsigned char *buffer, + int buffer_length); + + /** + * @brief This function writes a string to a spectrometer's EEPROM slot + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer for storing error codes. + * @param slot_number (Input) The number of the slot being written (e.g. 0-16*). + * @param buffer (Input) A buffer containing the text to write to the slot. + * @param buffer_length (Input) The length of the text to write (typically 15) + * @return number of bytes written + * + * @warning CARELESS USE OF THIS FUNCTION CAN RENDER YOUR SPECTROMETER INOPERABLE, + * POSSIBLY REQUIRING R.M.A. OR REFLASHING TO RESTORE FUNCTIONALITY. + * PLEASE READ YOUR SPECTROMETER'S DATA SHEET CAREFULLY BEFORE USE. + * + * (*) See note in seabreeze_read_eeprom_slot() regarding per-device slot limits. + */ + DLL_DECL int + seabreeze_write_eeprom_slot(int index, int *error_code, int slot_number, unsigned char *buffer, + int buffer_length); + + /** + * @brief This function reads out an irradiance calibration from the spectrometer's + * internal memory if that feature is supported. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) array of floating point values into which calibration values are stored + * @param buffer_length (Input) maximum number of values to copy from the device into buffer + * @return int: the number of floats read from the device into the buffer + */ + DLL_DECL int + seabreeze_read_irrad_calibration(int index, int *error_code, float *buffer, + int buffer_length); + + /** + * @brief This function writes an irradiance calibration to the spectrometer's + * internal memory if that feature is supported. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) array of floating point values to store into the device + * @param buffer_length (Input) number of calibration factors to write + * @return int: the number of floats written from the buffer to the device + */ + DLL_DECL int + seabreeze_write_irrad_calibration(int index, int *error_code, float *buffer, + int buffer_length); + + /** + * @brief This function checks for an irradiance collection area in the spectrometer's + * internal memory if that feature is supported. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return int: 0 if no collection area available, 1 if available. + */ + DLL_DECL int + seabreeze_has_irrad_collection_area(int index, int *error_code); + + /** + * @brief This function reads an irradiance collection area from the spectrometer's + * internal memory if that feature is supported. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return float: collection area (typically in units of cm^2) read from device + */ + DLL_DECL float + seabreeze_read_irrad_collection_area(int index, int *error_code); + + /** + * @brief This function writes an irradiance collection area to the spectrometer's + * internal memory if that feature is supported. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param area (Input) collection area to save to the EEPROM (presumably cm^2) + */ + DLL_DECL void + seabreeze_write_irrad_collection_area(int index, int *error_code, float area); + + /** + * @brief This function reads the value of the TEC and returns the value in + * degrees celsius. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return int: The TEC temperature in degrees Celsius. + */ + DLL_DECL double + seabreeze_read_tec_temperature(int index, int *error_code); + + /** + * @brief This function sets the TEC temperature. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param temperature_degrees_celsius (Input) The desired temperature, in degrees + * Celsius. + */ + DLL_DECL void + seabreeze_set_tec_temperature(int index, int *error_code, + double temperature_degrees_celsius); + + /** + * @brief This function enables the TEC feature on the spectrometer. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param tec_enable (Input) A logical boolean that denotes the desired TEC enable + * state. If the value of tec_enable is zero, the TEC should be disabled. + * If the value of tec_enable is non-zero, the TEC should be enabled. + */ + DLL_DECL void + seabreeze_set_tec_enable(int index, int *error_code, unsigned char tec_enable); + + /** + * @brief This function enables the TEC Fan on the spectrometer. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param tec_fan_enable (Input) A logical boolean that denotes the desired TEC fan enable + * state. If the value of tec_fan_enable is zero, the TEC fan should be disabled. + * If the value of tec_fan_enable is non-zero, the TEC fan should be enabled. + */ + DLL_DECL void + seabreeze_set_tec_fan_enable(int index, int *error_code, unsigned char tec_fan_enable); + + /** + * @brief This acquires a spectrum and returns the answer in raw, unformatted bytes. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) A buffer (with memory already allocated) to hold the + * spectral data + * @param buffer_length (Input) The length of the buffer in bytes (not pixels) + * @return int: The number of bytes read into the buffer + * @see sample-code/c/demo-unformatted-spectrum.c + * + * An unformatted spectrum is the raw sequence of bytes returned by the spectrometer to + * the PC over USB. The bytes have not been broken down into pixels, they're in the + * original endianness, absolutely nothing has been done to them. The caller is expected + * to know how many bytes are returned by each spectrometer model, which bytes indicate + * synchronization points or whatever, etc. + */ + DLL_DECL int + seabreeze_get_unformatted_spectrum(int index, int *error_code, + unsigned char *buffer, int buffer_length); + + /** + * @brief This acquires a spectrum and returns the answer in formatted + * floats. In this mode, auto-nulling should be automatically + * performed for devices that support it. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) A buffer (with memory already allocated) to hold the + * spectral data + * @param buffer_length (Input) The length of the buffer in floats (not bytes) + * @return int: The number of floats read into the buffer + * + * A formatted spectrum returns exactly one double-precision floating-point IEEE value + * per pixel, as opposed to a raw byte stream. It has also had autonulling (gain control) + * applied, meaning it has been scaled up to the spectrometer's full dynamic range using + * the gain setting recorded in that spectrometer’s EEPROM. + */ + DLL_DECL int + seabreeze_get_formatted_spectrum(int index, int *error_code, + double* buffer, int buffer_length); + + /** + * @brief This returns an integer denoting the length of a raw spectrum + * (as returned by get_unformatted_spectrum(...)). + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return int: An integer denoting the length of an unformatted spectrum in bytes + * + * The caller is expected to know the number of bytes per pixel and the endian + * ordering, but it will normally be 2 bytes per pixel, LSB-MSB order. + */ + DLL_DECL int + seabreeze_get_unformatted_spectrum_length(int index, int *error_code); + + /** + * @brief This returns an integer denoting the number of pixels in a + * formatted spectrum (as returned by get_formatted_spectrum(...)). + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return int: An integer denoting the length of a formatted spectrum (in pixels) + */ + DLL_DECL int + seabreeze_get_formatted_spectrum_length(int index, int *error_code); + + /** + * @brief This computes the wavelengths for the spectrometer and fills in the + * provided array (up to the given length) with those values. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param wavelengths (Output) A pre-allocated array of doubles into which the + * wavelengths will be copied + * @param length (Input) The number of values to copy into the wavelength array (this should + * be no larger than the number of doubles allocated in the wavelengths + * array) + * @return int: An integer denoting the number of wavelengths written to the buffer + */ + DLL_DECL int + seabreeze_get_wavelengths(int index, int *error_code, double *wavelengths, int length); + + /** + * @brief This reads the device's serial number and fills the + * provided array (up to the given length) with it. + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) A pre-allocated array of characters into which the serial number + * will be copied + * @param buffer_length (Input) The number of values to copy into the buffer (this should + * be no larger than the number of chars allocated in the buffer) (typically 16) + * @return int: An integer denoting the number of bytes written into the buffer + * + * Note that "serial numbers" may include both digits and letters + */ + DLL_DECL int + seabreeze_get_serial_number(int index, int *error_code, char *buffer, int buffer_length); + + /** + * @brief This fills in the provided array (up to the given length) with the indices + * of the pixels that are electrically active but optically masked + * (a.k.a. electric dark pixels). + * @param index (Input) The index of a device previously opened with open_spectrometer(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param indices (Output) A pre-allocated array of ints into which the pixel indices + * will be copied + * @param length (Input) The number of values to copy into the indices array (this should + * be no larger than the number of ints allocated in the indices array) + * @return int: An integer denoting the number of indices written into the indices buffer + * + * Note that not all detectors have optically masked pixels; in that case, + * this function will return zero. + */ + DLL_DECL int + seabreeze_get_electric_dark_pixel_indices(int index, int *error_code, + int *indices, int length); + + /** + * @brief Shutdown SeaBreeze completely, releasing all resources and destroying + * any cached device handles. + * + * This function is not normally needed (Singletons are destroyed automatically + * at process end), but calling this explicitly can resolve some spurious warnings + * in highly paranoid memory leak profilers. + */ + DLL_DECL void + seabreeze_shutdown(); + + /** + * @brief Write a raw array of bytes to a USB spectrometer. + * @param index (Input) index of an opened spectrometer + * @param errorCode (Output) pointer to an allocated integer field for receiving error codes + * @param endpoint (Input) USB endpoint for write operation + * (see src/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.cpp) + * @param buffer (Input) array of bytes to send to USB spectrometer + * @param length (Input) number of bytes to write from buffer to spectrometer + * @return number of bytes written + * + * Write the bytes in the buffer according to the two command bytes at the + * start of the buffer. + * + * \section Endpoints + * + * You may wonder why the caller needs to specify an explicit endpoint for + * raw read and write operations; does not SeaBreeze already know the appro- + * priate endpoints for any open spectrometer, for example. Yes it does, + * but currently there is no easy way to extract endpoints from a generic + * spectrometer, due to the fact that OOIUSBCypressEndpointMap and + * OOIUSBSTSEndpointMap do not share a common base class (see + * OOIUSBEndpointMaps.h). + * + * We could attempt to extract them from the TransferHelpers held by + * OOIUSBInterface, but without a Hint to use as a key, we would likely + * obtain unmatched or inappropriate versions for control exchanges. + * As ControlHint and OBPControlHint share no common ancestor or type data + * to associate them while distinguishing from other hint types, we cannot + * automatically infer appropriate control endpoints. + * + * And finally, we have no way of knowing that the user really wants to + * use control endpoints anyway: they may actually desire high-speed + * spectral retrieval. So really, this needs to remain a manual external + * operation until such time as we provide a much richer, generic query + * interface over our internal endpoint lookup tables. + * + * \section Example + * + * For instance, for most USB spectrometers, the hex values 05 00 in + * the buffer means 'read EEPROM slot 0'. Writing this command, and following + * it with the \c seabreeze_read_usb command and the same hex 05 00 + * in the buffer, will result in the spectrometer's serial number, in ASCII + * characters, being delivered to the subsequent bytes in the buffer array. + * This would appear in the output buffer as: + * + * \code + * 05 00 55 53 42 32 2B 48 30 31 34 31 36 00 00 00 00 (hex) + * \endcode + * + * (USB2+H01416 ASCII, skipping the two command bytes) + * + * A C or C++ program could use the data as-is, but a C# program could + * append to a string, each byte, cast as char, stopping on the first null + * character: + * + * \code + * string serial = ""; + * for (int i = 0; i < length && buffer[i] != '\0'; i++) + * serial += (char)buffer[i]; + * \endcode + * + * This is equivalent to: + * + * \code + * string serial = System.Text.ASCIIEncoding.ASCII.GetString(buffer).Trim('\0'); + * \endcode + * + * For C# and VB.NET, the trailing zero-fill must be removed. Those null + * characters would not print or display on a screen but would make a file + * name invalid. + */ + DLL_DECL int + seabreeze_write_usb(int index, int *errorCode, unsigned char endpoint, unsigned char* buffer, unsigned int length); + + /** + * @brief Read a raw array of bytes from a USB spectrometer. + * @param index (Input) index of a previously opened spectrometer + * @param errorCode (Output) pointer to an allocated integer field for receiving error codes + * @param endpoint (Input) USB endpoint for read operation + * (see src/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.cpp) + * @param buffer (Input) array of allocated bytes at which to recieve USB data + * @param length (Input) maximum number of bytes to read from spectrometer + * @return number of received bytes written to buffer + * + * Read bytes from the spectrometer into the buffer. The buffer starts with + * two bytes of command information that will be followed by the transferred + * bytes. The read and write USB functions allow low-level control of the + * spectrometer via USB commands. The higher-level SeaBreeze functions issue + * USB commands internally. + * + * Reading USB data takes two steps. First a seabreeze_write_usb call requests + * the transfer, then a seabreeze_read_usb call delivers the data. Writing a buffer + * to USB takes one step. The operating system handle for the spectrometer is + * managed by SeaBreeze. USB has a concept of "end points". These are implicitly + * addressed by the seabreeze_read_usb and seabreeze_write_usb functions. + */ + DLL_DECL int + seabreeze_read_usb(int index, int *errorCode, unsigned char endpoint, unsigned char* buffer, unsigned int length); + + /** + * @brief Get the SeaBreeze library's internal version identifier. + * @param buffer (Output) pointer to an allocated character array + * to hold the returned version string + * @param len (Input) size of the allocated buffer + * @return number of bytes written to buffer + */ + DLL_DECL int + seabreeze_get_api_version_string(char *buffer, int len); + + /** + * @brief Get a USB descriptor string by number + * @param index (Input) Which spectrometer to set + * @param errorCode (Output) pointer to allocated integer to receive error code + * @param id (Input) numeric ID of the desired USB descriptor string + * @param buffer (Output) pointer to an allocated character array to hold + * the returned descriptor string + * @param len (Input) size of the allocated buffer + * @return number of bytes written to buffer + */ + DLL_DECL int + seabreeze_get_usb_descriptor_string(int index, int *errorCode, int id, unsigned char *buffer, int len); + + /** + * @brief Set the continuous strobe period in microseconds + * @param index (Input) Which spectrometer to set + * @param errorCode (Output) pointer to allocated integer to receive error code + * @param strobe_id (Input) index of the strobe generator (currently always zero) + * @param period_usec (Input) total period of the strobe, in microseconds + * @return zero (on success or failure; check errorCode) + * + * The resolution is 0.1 milliseconds (100 microseconds). + */ + DLL_DECL void + seabreeze_set_continuous_strobe_period_microsec(int index, int *errorCode, + unsigned short strobe_id, unsigned long period_usec); + + /** + * @brief Set the acquisition delay (trigger delay) in microseconds. This + * controls the amount of time between a particular event + * (usually a request for spectrum or an external trigger pulse) + * and the start of acquisition. + */ + DLL_DECL void + seabreeze_set_acquisition_delay_microsec(int index, + int *errorCode, unsigned long delay_usec); + + /** + * @brief Clear the spectrum buffer (if equipped) + * @param index (Input) Which spectrometer should have its buffer cleared + * @param error_code (Output) Pointer to allocated integer to receive error code + */ + DLL_DECL void + seabreeze_clear_buffer(int index, int *error_code); + + /** + * @brief Get the number of spectra presently in the buffer (if equipped) + * @param index (Input) Which spectrometer should have its buffer queried + * @param error_code (Output) Pointer to allocated integer to receive error code + * @return Number of spectra in the buffer + */ + DLL_DECL unsigned long + seabreeze_get_buffer_element_count(int index, int *error_code); + + /** + * @brief Get the currently configured size of the data buffer (if equipped) + * @param index (Input) Which spectrometer should have its buffer queried + * @param error_code (Output) Pointer to allocated integer to receive error code + * @return The present limit on the number of spectra that will be retained. + */ + DLL_DECL unsigned long + seabreeze_get_buffer_capacity(int index, int *error_code); + + /** + * @brief Get the maximum possible configurable size for the data buffer (if equipped) + * @param index (Input) Which spectrometer should have its buffer queried + * @param error_code (Output) Pointer to allocated integer to receive error code + * @return Maximum allowed value for the buffer size + */ + DLL_DECL unsigned long + seabreeze_get_buffer_capacity_maximum(int index, int *error_code); + + /** + * @brief Get the minimum possible configurable size for the data buffer (if equipped) + * @param index (Input) Which spectrometer should have its buffer queried + * @param error_code (Output) Pointer to allocated integer to receive error code + * @return Minimum allowed value for the buffer size + */ + DLL_DECL unsigned long + seabreeze_get_buffer_capacity_minimum(int index, int *error_code); + + /** + * @brief Set the number of spectra that the buffer should keep + * @param index (Input) Which spectrometer should have its buffer modified + * @param error_code (Output) Pointer to allocated integer to receive error code + * @param capacity (Input) Limit on number of spectra to store. + * Note that this must be within the range defined by the capacity minimum + * and maximum values. + */ + DLL_DECL void + seabreeze_set_buffer_capacity(int index, int *error_code, unsigned long capacity); + + /** + * @brief Programmatically enable debug outputs to stderr + * @param flag (Input) zero to disable (default), non-zero to enable + */ + DLL_DECL void + seabreeze_set_verbose(int flag); + + /** + * @brief redirect verbose logging to named file + * @param flag (Input) NULL for default behavior (stderr), non-null for valid OS path + */ + DLL_DECL void + seabreeze_set_logfile(char* pathname, int len); + +#ifdef __cplusplus +}; +#endif /* __cplusplus */ + +#endif /* SEABREEZE_WRAPPER_H */ diff --git a/source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h new file mode 100644 index 0000000..4964256 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h @@ -0,0 +1,63 @@ +/***************************************************//** + * @file AcquisitionDelayFeatureAdapter.h + * @date November 2015 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows access to SeaBreeze + * DataBufferFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_ACQUISITION_DELAY_FEATURE_ADAPTER_H +#define SEABREEZE_ACQUISITION_DELAY_FEATURE_ADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class AcquisitionDelayFeatureAdapter + : public FeatureAdapterTemplate { + public: + AcquisitionDelayFeatureAdapter(AcquisitionDelayFeatureInterface *intf, + const FeatureFamily &f, Protocol *p, Bus *b, + unsigned short instanceIndex); + + virtual ~AcquisitionDelayFeatureAdapter(); + + /* Acquisition delay functions */ + unsigned long getAcquisitionDelayIncrementMicroseconds(int *errorCode); + unsigned long getAcquisitionDelayMaximumMicroseconds(int *errorCode); + unsigned long getAcquisitionDelayMinimumMicroseconds(int *errorCode); + unsigned long getAcquisitionDelayMicroseconds(int *errorCode); + void setAcquisitionDelayMicroseconds(int *errorCode, const unsigned long delay_usec); + }; + + } /* end namespace api */ +} /* end namespace seabreeze */ + +#endif /* SEABREEZE_ACQUISITION_DELAY_FEATURE_ADAPTER_H */ + diff --git a/source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h new file mode 100644 index 0000000..23a106a --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h @@ -0,0 +1,56 @@ +/***************************************************//** + * @file ContinuousStrobeFeatureAdapter.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows access to SeaBreeze + * ContinuousStrobeFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_CONTINUOUS_STROBE_FEATURE_ADAPTER_H +#define SEABREEZE_CONTINUOUS_STROBE_FEATURE_ADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class ContinuousStrobeFeatureAdapter + : public FeatureAdapterTemplate { + public: + ContinuousStrobeFeatureAdapter(ContinuousStrobeFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~ContinuousStrobeFeatureAdapter(); + + void setContinuousStrobePeriodMicroseconds(int *errorCode, unsigned long period_usec); + void setContinuousStrobeEnable(int *errorCode, bool enable); + }; + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h new file mode 100644 index 0000000..af1d536 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h @@ -0,0 +1,63 @@ +/***************************************************//** + * @file DataBufferFeatureAdapter.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows access to SeaBreeze + * DataBufferFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_DATA_BUFFER_FEATURE_ADAPTER_H +#define SEABREEZE_DATA_BUFFER_FEATURE_ADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class DataBufferFeatureAdapter + : public FeatureAdapterTemplate { + public: + DataBufferFeatureAdapter(DataBufferFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~DataBufferFeatureAdapter(); + + /* Data buffer functions */ + void clearBuffer(int *errorCode); + unsigned long getNumberOfElements(int *errorCode); + unsigned long getBufferCapacity(int *errorCode); + unsigned long getBufferCapacityMaximum(int *errorCode); + unsigned long getBufferCapacityMinimum(int *errorCode); + void setBufferCapacity(int *errorCode, unsigned long capacity); + }; + + } /* end namespace api */ +} /* end namespace seabreeze */ + +#endif /* SEABREEZE_DATA_BUFFER_FEATURE_ADAPTER_H */ + diff --git a/source/OSIF/include/api/seabreezeapi/DeviceAdapter.h b/source/OSIF/include/api/seabreezeapi/DeviceAdapter.h new file mode 100644 index 0000000..7931024 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/DeviceAdapter.h @@ -0,0 +1,308 @@ +/***************************************************//** + * @file DeviceAdapter.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * This is a wrapper that allows + * access to SeaBreeze Device instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ +#ifndef DEVICEADAPTER_H +#define DEVICEADAPTER_H + +/* Includes */ +#include "common/devices/Device.h" +#include "common/buses/DeviceLocatorInterface.h" +#include "api/seabreezeapi/EEPROMFeatureAdapter.h" +#include "api/seabreezeapi/IrradCalFeatureAdapter.h" +#include "api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h" +#include "api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h" +#include "api/seabreezeapi/TemperatureFeatureAdapter.h" +#include "api/seabreezeapi/RevisionFeatureAdapter.h" +#include "api/seabreezeapi/OpticalBenchFeatureAdapter.h" +#include "api/seabreezeapi/SpectrumProcessingFeatureAdapter.h" +#include "api/seabreezeapi/SerialNumberFeatureAdapter.h" +#include "api/seabreezeapi/ShutterFeatureAdapter.h" +#include "api/seabreezeapi/SpectrometerFeatureAdapter.h" +#include "api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h" +#include "api/seabreezeapi/StrobeLampFeatureAdapter.h" +#include "api/seabreezeapi/ContinuousStrobeFeatureAdapter.h" +#include "api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h" +#include "api/seabreezeapi/LightSourceFeatureAdapter.h" +#include "api/seabreezeapi/PixelBinningFeatureAdapter.h" +#include "api/seabreezeapi/DataBufferFeatureAdapter.h" +#include "api/seabreezeapi/AcquisitionDelayFeatureAdapter.h" +#include + +namespace seabreeze { + namespace api { + + class DeviceAdapter { + public: + DeviceAdapter(Device *dev, unsigned long id); + ~DeviceAdapter(); + + int open(int *errorCode); + void close(); + + DeviceLocatorInterface *getLocation(); + + /* An for weak association to this object */ + unsigned long getID(); + + /* Get a string that describes the type of device */ + int getDeviceType(int *errorCode, char *buffer, unsigned int maxLength); + + /* Get a usb endpoint for the device according to the enumerator */ + /* endpointType. A 0 is returned if the endpoint requested is not in use. */ + unsigned char getDeviceEndpoint(int *errorCode, usbEndpointType anEndpointType); + + /* Get one or more raw USB access features */ + int getNumberOfRawUSBBusAccessFeatures(); + int getRawUSBBusAccessFeatures(long *buffer, int maxFeatures); + int rawUSBBusAccessRead(long featureID, + int *errorCode, unsigned char *buffer, unsigned int bufferLength, unsigned char endpoint); + int rawUSBBusAccessWrite(long featureID, + int *errorCode, unsigned char *buffer, unsigned int bufferLength, unsigned char endpoint); + + /* Get one or more serial number features */ + int getNumberOfSerialNumberFeatures(); + int getSerialNumberFeatures(long *buffer, int maxFeatures); + int getSerialNumber(long featureID, int *errorCode, + char *buffer, int bufferLength); + unsigned char getSerialNumberMaximumLength(long featureID, int *errorCode); + + /* Get one or more spectrometer acquisition features */ + int getNumberOfSpectrometerFeatures(); + int getSpectrometerFeatures(long *buffer, int maxFeatures); + void spectrometerSetTriggerMode(long spectrometerFeatureID, int *errorCode, int mode); + void spectrometerSetIntegrationTimeMicros(long spectrometerFeatureID, int *errorCode, + unsigned long integrationTimeMicros); + unsigned long spectrometerGetMinimumIntegrationTimeMicros( + long spectrometerFeatureID, int *errorCode); + unsigned long spectrometerGetMaximumIntegrationTimeMicros( + long spectrometerFeatureID, int *errorCode); + double spectrometerGetMaximumIntensity( + long spectrometerFeatureID, int *errorCode); + int spectrometerGetUnformattedSpectrumLength( + long spectrometerFeatureID, int *errorCode); + int spectrometerGetUnformattedSpectrum(long spectrometerFeatureID, + int *errorCode, unsigned char *buffer, int bufferLength); + int spectrometerGetFormattedSpectrumLength( + long spectrometerFeatureID, int *errorCode); + int spectrometerGetFormattedSpectrum(long spectrometerFeatureID, int *errorCode, + double *buffer, int bufferLength); + int spectrometerGetWavelengths(long spectrometerFeatureID, int *errorCode, + double *wavelengths, int length); + int spectrometerGetElectricDarkPixelCount( + long spectrometerFeatureID, int *errorCode); + int spectrometerGetElectricDarkPixelIndices( + long spectrometerFeatureID, int *errorCode, int *indices, int length); + + + /* Get one or more pixel binning features */ + int getNumberOfPixelBinningFeatures(); + int getPixelBinningFeatures(long *buffer, int maxFeatures); + void binningSetPixelBinningFactor(long spectrometerFeatureID, int *errorCode, const unsigned char binningFactor); + unsigned char binningGetPixelBinningFactor(long spectrometerFeatureID, int *errorCode); + void binningSetDefaultPixelBinningFactor(long spectrometerFeatureID, int *errorCode, const unsigned char binningFactor); + void binningSetDefaultPixelBinningFactor(long spectrometerFeatureID, int *errorCode); + unsigned char binningGetDefaultPixelBinningFactor(long spectrometerFeatureID, int *errorCode); + unsigned char binningGetMaxPixelBinningFactor(long spectrometerFeatureID, int *errorCode); + + /* Get one or more TEC features */ + int getNumberOfThermoElectricFeatures(); + int getThermoElectricFeatures(long *buffer, int maxFeatures); + double tecReadTemperatureDegreesC(long featureID, int *errorCode); + void tecSetTemperatureSetpointDegreesC(long featureID, int *errorCode, + double temperatureDegreesCelsius); + void tecSetEnable(long featureID, int *errorCode, bool tecEnable); + + /* Get one or more irradiance calibration features */ + int getNumberOfIrradCalFeatures(); + int getIrradCalFeatures(long *buffer, int maxFeatures); + int irradCalibrationRead(long featureID, + int *errorCode, float *buffer, int bufferLength); + int irradCalibrationWrite(long featureID, + int *errorCode, float *buffer, int bufferLength); + int irradCalibrationHasCollectionArea(long featureID, int *errorCode); + float irradCalibrationReadCollectionArea(long featureID, int *errorCode); + void irradCalibrationWriteCollectionArea(long featureID, + int *errorCode, float area); + + /* Get one or more EEPROM features */ + int getNumberOfEEPROMFeatures(); + int getEEPROMFeatures(long *buffer, int maxFeatures); + int eepromReadSlot(long featureID, int *errorCode, int slotNumber, + unsigned char *buffer, int length); + + /* Get one or more light source features */ + int getNumberOfLightSourceFeatures(); + int getLightSourceFeatures(long *buffer, int maxFeatures); + int lightSourceGetCount(long featureID, int *errorCode); + bool lightSourceHasEnable(long featureID, int *errorCode, + int lightSourceIndex); + bool lightSourceIsEnabled(long featureID, int *errorCode, + int lightSourceIndex); + void lightSourceSetEnable(long featureID, int *errorCode, + int lightSourceIndex, bool enable); + bool lightSourceHasVariableIntensity(long featureID, int *errorCode, + int lightSourceIndex); + double lightSourceGetIntensity(long featureID, int *errorCode, + int lightSourceIndex); + void lightSourceSetIntensity(long featureID, int *errorCode, + int lightSourceIndex, double intensity); + + /* Get one or more strobe lamp enable features */ + int getNumberOfStrobeLampFeatures(); + int getStrobeLampFeatures(long *buffer, int maxFeatures); + void lampSetStrobeEnable(long featureID, int *errorCode, bool strobeEnable); + + /* Get one or more continuous strobe features */ + int getNumberOfContinuousStrobeFeatures(); + int getContinuousStrobeFeatures(long *buffer, int maxFeatures); + void continuousStrobeSetPeriodMicroseconds(long featureID, int *errorCode, + unsigned long period_usec); + void continuousStrobeSetEnable(long featureID, int *errorCode, bool enable); + + /* Get one or more shutter features */ + int getNumberOfShutterFeatures(); + int getShutterFeatures(long *buffer, int maxFeatures); + void shutterSetShutterOpen(long featureID, int *errorCode, bool opened); + + /* Get one or more nonlinearity coefficients features */ + int getNumberOfNonlinearityCoeffsFeatures(); + int getNonlinearityCoeffsFeatures(long *buffer, int maxFeatures); + int nonlinearityCoeffsGet(long featureID, int *errorCode, + double *buffer, int bufferLength); + + /* Get one or more temperature features */ + int getNumberOfTemperatureFeatures(); + int getTemperatureFeatures(long *buffer, int maxFeatures); + unsigned char temperatureCountGet(long temperatureFeatureID, int *errorCode); + double temperatureGet(long temperatureFeatureID, int *errorCode, int index); + int temperatureGetAll(long temperatureFeatureID, int *errorCode, + double *buffer, int bufferLength); + + /* Get one or more revision features */ + int getNumberOfRevisionFeatures(); + int getRevisionFeatures(long *buffer, int maxFeatures); + unsigned char revisionHardwareGet(long revisionFeatureID, int *errorCode); + unsigned short int revisionFirmwareGet(long revisionFeatureID, int *errorCode); + + /* Get one or more spectrum processing features */ + int getNumberOfSpectrumProcessingFeatures(); + int getSpectrumProcessingFeatures(long *buffer, int maxFeatures); + unsigned short int spectrumProcessingScansToAverageGet(long spectrumProcessingFeatureID, int *errorCode); + unsigned char spectrumProcessingBoxcarWidthGet(long spectrumProcessingFeatureID, int *errorCode); + void spectrumProcessingBoxcarWidthSet(long featureID, int *errorCode, unsigned char boxcarWidth); + void spectrumProcessingScansToAverageSet(long featureID, int *errorCode, unsigned short int scansToAverage); + + /* Get one or more optical bench features */ + int getNumberOfOpticalBenchFeatures(); + int getOpticalBenchFeatures(long *buffer, int maxFeatures); + unsigned short int opticalBenchGetFiberDiameterMicrons(long opticalBenchFeatureID, int *errorCode); + unsigned short int opticalBenchGetSlitWidthMicrons(long opticalBenchFeatureID, int *errorCode); + int opticalBenchGetID(long opticalBenchFeatureID, int *errorCode, char *buffer, int bufferLength); + int opticalBenchGetSerialNumber(long opticalBenchFeatureID, int *errorCode, char *buffer, int bufferLength); + int opticalBenchGetCoating(long opticalBenchFeatureID, int *errorCode, char *buffer, int bufferLength); + int opticalBenchGetFilter(long opticalBenchFeatureID, int *errorCode, char *buffer, int bufferLength); + int opticalBenchGetGrating(long opticalBenchFeatureID, int *errorCode, char *buffer, int bufferLength); + + + /* Get one or more stray light coefficients features */ + int getNumberOfStrayLightCoeffsFeatures(); + int getStrayLightCoeffsFeatures(long *buffer, int maxFeatures); + int strayLightCoeffsGet(long featureID, int *errorCode, + double *buffer, int bufferLength); + + /* Get one or more data buffer features */ + int getNumberOfDataBufferFeatures(); + int getDataBufferFeatures(long *buffer, int maxFeatures); + void dataBufferClear(long featureID, int *errorCode); + unsigned long dataBufferGetNumberOfElements(long featureID, int *errorCode); + unsigned long dataBufferGetBufferCapacity(long featureID, int *errorCode); + unsigned long dataBufferGetBufferCapacityMaximum(long featureID, int *errorCode); + unsigned long dataBufferGetBufferCapacityMinimum(long featureID, int *errorCode); + void dataBufferSetBufferCapacity(long featureID, int *errorCode, unsigned long capacity); + + /* Get one or more acquisition delay features */ + int getNumberOfAcquisitionDelayFeatures(); + int getAcquisitionDelayFeatures(long *buffer, int maxFeatures); + void acquisitionDelaySetDelayMicroseconds(long featureID, int *errorCode, + unsigned long delay_usec); + unsigned long acquisitionDelayGetDelayMicroseconds(long featureID, int *errorCode); + unsigned long acquisitionDelayGetDelayIncrementMicroseconds(long featureID, int *errorCode); + unsigned long acquisitionDelayGetDelayMaximumMicroseconds(long featureID, int *errorCode); + unsigned long acquisitionDelayGetDelayMinimumMicroseconds(long featureID, int *errorCode); + + protected: + unsigned long instanceID; + seabreeze::Device *device; + std::vector rawUSBBusAccessFeatures; + std::vector serialNumberFeatures; + std::vector spectrometerFeatures; + std::vector tecFeatures; + std::vector irradCalFeatures; + std::vector eepromFeatures; + std::vector lightSourceFeatures; + std::vector strobeLampFeatures; + std::vector continuousStrobeFeatures; + std::vector shutterFeatures; + std::vector nonlinearityFeatures; + std::vector temperatureFeatures; + std::vector revisionFeatures; + std::vector opticalBenchFeatures; + std::vector spectrumProcessingFeatures; + std::vector strayLightFeatures; + std::vector pixelBinningFeatures; + std::vector dataBufferFeatures; + std::vector acquisitionDelayFeatures; + + RawUSBBusAccessFeatureAdapter *getRawUSBBusAccessFeatureByID(long featureID); + SerialNumberFeatureAdapter *getSerialNumberFeatureByID(long featureID); + SpectrometerFeatureAdapter *getSpectrometerFeatureByID(long featureID); + ThermoElectricCoolerFeatureAdapter *getTECFeatureByID(long featureID); + IrradCalFeatureAdapter *getIrradCalFeatureByID(long featureID); + EEPROMFeatureAdapter *getEEPROMFeatureByID(long featureID); + LightSourceFeatureAdapter *getLightSourceFeatureByID(long featureID); + StrobeLampFeatureAdapter *getStrobeLampFeatureByID(long featureID); + ContinuousStrobeFeatureAdapter *getContinuousStrobeFeatureByID(long featureID); + ShutterFeatureAdapter *getShutterFeatureByID(long featureID); + NonlinearityCoeffsFeatureAdapter *getNonlinearityCoeffsFeatureByID(long featureID); + TemperatureFeatureAdapter *getTemperatureFeatureByID(long featureID); + RevisionFeatureAdapter *getRevisionFeatureByID(long featureID); + OpticalBenchFeatureAdapter *getOpticalBenchFeatureByID(long featureID); + SpectrumProcessingFeatureAdapter *getSpectrumProcessingFeatureByID(long featureID); + StrayLightCoeffsFeatureAdapter *getStrayLightCoeffsFeatureByID(long featureID); + PixelBinningFeatureAdapter *getPixelBinningFeatureByID(long featureID); + DataBufferFeatureAdapter *getDataBufferFeatureByID(long featureID); + AcquisitionDelayFeatureAdapter *getAcquisitionDelayFeatureByID(long featureID); + }; + } +} + +#endif + diff --git a/source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h new file mode 100644 index 0000000..f64e321 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file EEPROMFeatureAdapter.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows + * access to SeaBreeze EEPROMFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_EEPROMFEATUREADAPTER_H +#define SEABREEZE_EEPROMFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class EEPROMFeatureAdapter + : public FeatureAdapterTemplate { + public: + EEPROMFeatureAdapter(EEPROMSlotFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~EEPROMFeatureAdapter(); + + /* EEPROM functions */ + int readEEPROMSlot(int *errorCode, int slotNumber, + unsigned char *buffer, int bufferLength); + }; + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h b/source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h new file mode 100644 index 0000000..41ad782 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file FeatureAdapterInterface.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This interface allows device features to be treated + * consistently regardless of the actual capabilities. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FEATUREADAPTERINTERFACE_H +#define SEABREEZE_FEATUREADAPTERINTERFACE_H + +#include "common/features/FeatureFamily.h" + +namespace seabreeze { + namespace api { + + class FeatureAdapterInterface { + public: + virtual ~FeatureAdapterInterface() = 0; + + /* This gets a semi-unique integer ID for this feature instance */ + virtual long getID() = 0; + + /* Gets the general category of the feature, if any */ + virtual FeatureFamily &getFeatureFamily() = 0; + }; + + /* Default empty destructor for otherwise abstract class */ + inline FeatureAdapterInterface::~FeatureAdapterInterface() { } + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h b/source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h new file mode 100644 index 0000000..6bdc267 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h @@ -0,0 +1,87 @@ +/***************************************************//** + * @file FeatureAdapterTemplate.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a templated wrapper around SeaBreeze Feature + * instances. This should make it easier to obtain a + * particular Feature to call methods against. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef FEATUREADAPTERTEMPLATE_H +#define FEATUREADAPTERTEMPLATE_H + +#include "api/seabreezeapi/FeatureAdapterInterface.h" +#include "common/buses/Bus.h" +#include "common/exceptions/IllegalArgumentException.h" +#include "common/features/FeatureFamily.h" +#include "common/protocols/Protocol.h" +#include + +namespace seabreeze { + namespace api { + + template class FeatureAdapterTemplate + : public FeatureAdapterInterface { + public: + FeatureAdapterTemplate(T *featureInterface, const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex) { + this->feature = featureInterface; + this->family = f; + this->protocol = p; + this->bus = b; + this->index = instanceIndex; + + /* Create a unique ID based on the feature type and index. This + * might be expanded in the future to use one of the bytes for + * the feature type or index as a module number. + */ + this->ID = (family.getType() << 16) | (instanceIndex & 0x00FFFF); + + if(0 == this->feature || 0 == this->protocol || 0 == this->bus) { + std::string error("Null feature interface, protocol, or bus is not allowed."); + throw IllegalArgumentException(error); + } + } + virtual ~FeatureAdapterTemplate() { /* Do nothing -- others delete feature */ } + T *getFeature() { return this->feature; } + + virtual FeatureFamily &getFeatureFamily() { return this->family; } + + virtual long getID() { return this->ID; } + + protected: + T *feature; + FeatureFamily family; + Protocol *protocol; + Bus *bus; + unsigned short index; + unsigned long ID; + }; + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/FeatureFamilies.h b/source/OSIF/include/api/seabreezeapi/FeatureFamilies.h new file mode 100644 index 0000000..cd18080 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/FeatureFamilies.h @@ -0,0 +1,200 @@ +/***************************************************//** + * @file FeatureFamilies.h + * @date February 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * This provides a way to get references to different kinds + * of features (e.g. spectrometer, TEC) generically. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FEATUREFAMILIES_H +#define SEABREEZE_FEATUREFAMILIES_H + +#include "common/features/FeatureFamily.h" +#include + +namespace seabreeze { + namespace api { + + class UndefinedFeatureFamily : public FeatureFamily { + public: + UndefinedFeatureFamily(); + virtual ~UndefinedFeatureFamily(); + }; + + class SerialNumberFeatureFamily : public FeatureFamily { + public: + SerialNumberFeatureFamily(); + virtual ~SerialNumberFeatureFamily(); + }; + + class SpectrometerFeatureFamily : public FeatureFamily { + public: + SpectrometerFeatureFamily(); + virtual ~SpectrometerFeatureFamily(); + }; + + class ThermoElectricFeatureFamily : public FeatureFamily { + public: + ThermoElectricFeatureFamily(); + virtual ~ThermoElectricFeatureFamily(); + }; + + class IrradCalFeatureFamily : public FeatureFamily { + public: + IrradCalFeatureFamily(); + virtual ~IrradCalFeatureFamily(); + }; + + class EEPROMFeatureFamily : public FeatureFamily { + public: + EEPROMFeatureFamily(); + virtual ~EEPROMFeatureFamily(); + }; + + class LightSourceFeatureFamily : public FeatureFamily { + public: + LightSourceFeatureFamily(); + virtual ~LightSourceFeatureFamily(); + }; + + class StrobeLampFeatureFamily : public FeatureFamily { + public: + StrobeLampFeatureFamily(); + virtual ~StrobeLampFeatureFamily(); + }; + + class ContinuousStrobeFeatureFamily : public FeatureFamily { + public: + ContinuousStrobeFeatureFamily(); + virtual ~ContinuousStrobeFeatureFamily(); + }; + + class ShutterFeatureFamily : public FeatureFamily { + public: + ShutterFeatureFamily(); + virtual ~ShutterFeatureFamily(); + }; + + class WaveCalFeatureFamily : public FeatureFamily { + public: + WaveCalFeatureFamily(); + virtual ~WaveCalFeatureFamily(); + }; + + class NonlinearityCoeffsFeatureFamily : public FeatureFamily { + public: + NonlinearityCoeffsFeatureFamily(); + virtual ~NonlinearityCoeffsFeatureFamily(); + }; + + class TemperatureFeatureFamily : public FeatureFamily { + public: + TemperatureFeatureFamily(); + virtual ~TemperatureFeatureFamily(); + }; + + class RevisionFeatureFamily : public FeatureFamily { + public: + RevisionFeatureFamily(); + virtual ~RevisionFeatureFamily(); + }; + + class OpticalBenchFeatureFamily : public FeatureFamily { + public: + OpticalBenchFeatureFamily(); + virtual ~OpticalBenchFeatureFamily(); + }; + + class SpectrumProcessingFeatureFamily : public FeatureFamily { + public: + SpectrumProcessingFeatureFamily(); + virtual ~SpectrumProcessingFeatureFamily(); + }; + + class StrayLightCoeffsFeatureFamily : public FeatureFamily { + public: + StrayLightCoeffsFeatureFamily(); + virtual ~StrayLightCoeffsFeatureFamily(); + }; + + class RawUSBBusAccessFeatureFamily : public FeatureFamily { + public: + RawUSBBusAccessFeatureFamily(); + virtual ~RawUSBBusAccessFeatureFamily(); + }; + + class DataBufferFeatureFamily : public FeatureFamily { + public: + DataBufferFeatureFamily(); + virtual ~DataBufferFeatureFamily(); + }; + + class AcquisitionDelayFeatureFamily : public FeatureFamily { + public: + AcquisitionDelayFeatureFamily(); + virtual ~AcquisitionDelayFeatureFamily(); + }; + + class PixelBinningFeatureFamily : public FeatureFamily { + public: + PixelBinningFeatureFamily(); + virtual ~PixelBinningFeatureFamily(); + }; + + class FeatureFamilies { + public: + const UndefinedFeatureFamily UNDEFINED; + const SerialNumberFeatureFamily SERIAL_NUMBER; + const SpectrometerFeatureFamily SPECTROMETER; + const ThermoElectricFeatureFamily THERMOELECTRIC; + const IrradCalFeatureFamily IRRAD_CAL; + const EEPROMFeatureFamily EEPROM; + const LightSourceFeatureFamily LIGHT_SOURCE; + const StrobeLampFeatureFamily STROBE_LAMP_ENABLE; + const ContinuousStrobeFeatureFamily CONTINUOUS_STROBE; + const ShutterFeatureFamily SHUTTER; + const WaveCalFeatureFamily WAVELENGTH_CAL; + const NonlinearityCoeffsFeatureFamily NONLINEARITY_COEFFS; + const TemperatureFeatureFamily TEMPERATURE; + const RevisionFeatureFamily REVISION; + const OpticalBenchFeatureFamily OPTICAL_BENCH; + const SpectrumProcessingFeatureFamily SPECTRUM_PROCESSING; + const StrayLightCoeffsFeatureFamily STRAY_LIGHT_COEFFS; + const RawUSBBusAccessFeatureFamily RAW_USB_BUS_ACCESS; + const DataBufferFeatureFamily DATA_BUFFER; + const AcquisitionDelayFeatureFamily ACQUISITION_DELAY; + const PixelBinningFeatureFamily PIXEL_BINNING; + + FeatureFamilies(); + ~FeatureFamilies(); + std::vector getAllFeatureFamilies(); + }; + } +} + +#endif + diff --git a/source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h new file mode 100644 index 0000000..e6180c1 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file IrradCalFeatureAdapter.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows + * access to SeaBreeze IrradCalFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_IRRADCALFEATUREADAPTER_H +#define SEABREEZE_IRRADCALFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class IrradCalFeatureAdapter + : public FeatureAdapterTemplate { + public: + IrradCalFeatureAdapter(IrradCalFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~IrradCalFeatureAdapter(); + + int readIrradCalibration(int *errorCode, float *buffer, + int bufferLength); + int writeIrradCalibration(int *errorCode, float *buffer, + int bufferLength); + int hasIrradCollectionArea(int *errorCode); + float readIrradCollectionArea(int *errorCode); + void writeIrradCollectionArea(int *errorCode, float area); + }; + + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h new file mode 100644 index 0000000..f55ffd4 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h @@ -0,0 +1,69 @@ +/***************************************************//** + * @file LightSourceFeatureAdapter.h + * @date May 2013 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows + * access to SeaBreeze LightSourceFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_LIGHTSOURCEFEATUREADAPTER_H +#define SEABREEZE_LIGHTSOURCEFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class LightSourceFeatureAdapter + : public FeatureAdapterTemplate { + public: + LightSourceFeatureAdapter(LightSourceFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~LightSourceFeatureAdapter(); + + int getLightSourceCount(int *errorCode); + + bool hasLightSourceEnable(int *errorCode, int lightSourceIndex); + bool isLightSourceEnabled(int *errorCode, int lightSourceIndex); + void setLightSourceEnable(int *errorCode, int lightSourceIndex, + bool enable); + + /* The intensity is normalized over the range [0, 1] where 0 is + * the minimum programmable intensity and 1 is the maximum + */ + bool hasVariableIntensity(int *errorCode, int lightSourceIndex); + double getLightSourceIntensity(int *errorCode, int lightSourceIndex); + void setLightSourceIntensity(int *errorCode, int lightSourceIndex, + double intensity); + }; + + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h new file mode 100644 index 0000000..33b046d --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file NonlinearityCoeffsFeatureAdapter.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows + * access to SeaBreeze NonlinearityCoeffFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_NONLINEARITYCOEFFSFEATUREADAPTER_H +#define SEABREEZE_NONLINEARITYCOEFFSFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class NonlinearityCoeffsFeatureAdapter + : public FeatureAdapterTemplate { + public: + NonlinearityCoeffsFeatureAdapter(NonlinearityCoeffsFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~NonlinearityCoeffsFeatureAdapter(); + + int readNonlinearityCoeffs(int *errorCode, double *buffer, + int bufferLength); + }; + + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h new file mode 100644 index 0000000..4f6eb53 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file OpticalBenchFeatureAdapter.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * This is a wrapper that allows + * access to SeaBreeze TemperatureFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OPTICALBENCHFEATUREADAPTER_H +#define SEABREEZE_OPTICALBENCHFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class OpticalBenchFeatureAdapter + : public FeatureAdapterTemplate { + public: + OpticalBenchFeatureAdapter(OpticalBenchFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~OpticalBenchFeatureAdapter(); + + unsigned short int readOpticalBenchFiberDiameterMicrons(int *errorCode); + unsigned short int readOpticalBenchSlitWidthMicrons(int *errorCode); + int readOpticalBenchID(int *errorCode, char *buffer, int buffer_length); + int readOpticalBenchSerialNumber(int *errorCode, char *buffer, int buffer_length); + int readOpticalBenchCoating(int *errorCode, char *buffer, int buffer_length); + int readOpticalBenchFilter(int *errorCode, char *buffer, int buffer_length); + int readOpticalBenchGrating(int *errorCode, char *buffer, int buffer_length); + }; + + } +} + +#endif \ No newline at end of file diff --git a/source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h new file mode 100644 index 0000000..7cba13f --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h @@ -0,0 +1,68 @@ +/***************************************************//** + * @file PixelBinningFeatureAdapter.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows access to SeaBreeze + * TECFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_PIXEL_BINNING_FEATURE_ADAPTER_H +#define SEABREEZE_PIXEL_BINNING_FEATURE_ADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class PixelBinningFeatureAdapter + : public FeatureAdapterTemplate { + public: + PixelBinningFeatureAdapter(PixelBinningFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~PixelBinningFeatureAdapter(); + + /* Thermoelectric cooler functions */ + unsigned char getPixelBinningFactor(int *errorCode); + + void setPixelBinningFactor(int *errorCode, + const unsigned char binningFactor); + + unsigned char getDefaultPixelBinningFactor(int *errorCode); + + void setDefaultPixelBinningFactor(int *errorCode, + const unsigned char binningFactor); + + void setDefaultPixelBinningFactor(int *errorCode); + + unsigned char getMaxPixelBinningFactor(int *errorCode); + }; + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h b/source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h new file mode 100644 index 0000000..8e0dbd4 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h @@ -0,0 +1,87 @@ +/***************************************************//** + * @file ProtocolFamilies.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This provides a way to describe different kinds + * protocols (e.g. OOI, OBP) generically. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_PROTOCOLFAMILIES_H +#define SEABREEZE_PROTOCOLFAMILIES_H + +#include "common/protocols/ProtocolFamily.h" +#include + +namespace seabreeze { + namespace api { + + class UndefinedProtocolFamily : public ProtocolFamily { + public: + UndefinedProtocolFamily(); + virtual ~UndefinedProtocolFamily(); + }; + + class OOIProtocolFamily : public ProtocolFamily { + public: + OOIProtocolFamily(); + virtual ~OOIProtocolFamily(); + }; + + class OceanBinaryProtocolFamily : public ProtocolFamily { + public: + OceanBinaryProtocolFamily(); + virtual ~OceanBinaryProtocolFamily(); + }; + + class JazMessagingProtocolFamily : public ProtocolFamily { + public: + JazMessagingProtocolFamily(); + virtual ~JazMessagingProtocolFamily(); + }; + + class VirtualProtocolFamily : public ProtocolFamily { + public: + VirtualProtocolFamily(); + virtual ~VirtualProtocolFamily(); + }; + + class ProtocolFamilies { + public: + const UndefinedProtocolFamily UNDEFINED_PROTOCOL; + const OOIProtocolFamily OOI_PROTOCOL; + const OceanBinaryProtocolFamily OCEAN_BINARY_PROTOCOL; + const JazMessagingProtocolFamily JAZ_MESSAGING_PROTOCOL; + const VirtualProtocolFamily VIRTUAL_PROTOCOL; + + ProtocolFamilies(); + ~ProtocolFamilies(); + std::vector getAllProtocolFamilies(); + }; + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h new file mode 100644 index 0000000..c4e841f --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file RawUSBBusAccessFeatureAdapter.h + * @date February 2015 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows + * access to SeaBreeze RawUSBBusAccessFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_RAWUSBBUSACCESSFEATUREADAPTER_H +#define SEABREEZE_RAWUSBBUSACCESSFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class RawUSBBusAccessFeatureAdapter + : public FeatureAdapterTemplate { + public: + RawUSBBusAccessFeatureAdapter(RawUSBBusAccessFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~RawUSBBusAccessFeatureAdapter(); + + int readUSB(int *errorCode, unsigned char *buffer, unsigned int bufferLength, unsigned char usbEndpoint); + int writeUSB(int *errorCode, unsigned char *buffer, unsigned int bufferLength, unsigned char usbEndpoint); + }; + + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h new file mode 100644 index 0000000..d81040f --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h @@ -0,0 +1,58 @@ +/***************************************************//** + * @file RevisionFeatureAdapter.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * This is a wrapper that allows + * access to SeaBreeze RevisionFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_REVISIONFEATUREADAPTER_H +#define SEABREEZE_REVISIONFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/revision/RevisionFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class RevisionFeatureAdapter + : public FeatureAdapterTemplate { + public: + RevisionFeatureAdapter(RevisionFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~RevisionFeatureAdapter(); + + unsigned char readHardwareRevision(int *errorCode); + unsigned short int readFirmwareRevision(int *errorCode); + + }; + + } +} + +#endif \ No newline at end of file diff --git a/source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h b/source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h new file mode 100644 index 0000000..f0af007 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h @@ -0,0 +1,2481 @@ +/***************************************************//** + * @file SeaBreezeAPI.h + * @date February 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * This is an interface to SeaBreeze that allows + * the user to connect to devices over USB and other buses. + * This is intended as a usable and extensible API. + * + * This provides a C interface to help with linkage. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZEAPI_H +#define SEABREEZEAPI_H + +#include "api/DllDecl.h" + +#ifdef __cplusplus + +#include "api/seabreezeapi/DeviceAdapter.h" + +/*! + @brief This is an interface to SeaBreeze that allows + the user to connect to devices over USB and + other buses. This is intended as a usable and + extensible API. + + @note Detailed method documentation is available in + the analogous C functions in SeaBreezeAPI.h +*/ +class DLL_DECL SeaBreezeAPI { +public: + /** + * No public constructor. To use this class in C++, + * you must first call getInstance(). This provides + * a singleton: it is the same on every call. + */ + static SeaBreezeAPI *getInstance(); + + /** + * No public destructor. Call this to force memory cleanup. + */ + static void shutdown(); + + /** + * Use the probeDevices() method to force the driver to look for any + * device that can be found automatically. If this is not called then + * such devices will not be available for use. This should be used when + * attempting to find USB devices. + */ + int probeDevices(); + + /** + * Use the addIPv4DeviceLocation() method to specify that a device may be + * found on a TCP/IPv4 network on a given port. Once specified, + * the typical openDevice() function can be used to access it. + */ + int addTCPIPv4DeviceLocation(char *deviceTypeName, char *ipAddr, int port); + + /** + * Use the addRS232DeviceLocation() method to specify that a device may be + * found on a particular serial bus with a given baud rate. Once specified, + * the typical openDevice() function can be used to access it. + */ + int addRS232DeviceLocation(char *deviceTypeName, char *deviceBusPath, unsigned int baud); + + /** + * This provides the number of devices that have either been probed or + * manually specified. Devices are not opened automatically, but this can + * provide a bound for getDeviceIDs(). + */ + int getNumberOfDeviceIDs(); + + /** + * This provides a unique ID of each device that is detected or specified. + * The IDs are copied into the user-provided buffer. These IDs are weak + * references: attempting to access a device that no longer exists will cause + * an error value to be returned but should not cause any instability. + * The IDs may be entirely random, but a given ID will always refer to the + * same device for as long as the program is running. This will return the + * number of device IDs actually copied into the array or 0 on error. + */ + int getDeviceIDs(long *ids, unsigned long maxLength); + + /** + * This will attempt to open the bus connetion to the device with the given ID. + * Returns 0 on success, other value on error. + */ + int openDevice(long id, int *errorCode); + + /** + * This will attempt to close the bus connection to the device with the given ID. + */ + void closeDevice(long id, int *errorCode); + + /* Get a string that describes the type of device */ + int getDeviceType(long id, int *errorCode, char *buffer, unsigned int length); + + /* Get the usb endpoint address for a specified type of endpoint */ + unsigned char getDeviceEndpoint(long id, int *error_code, usbEndpointType endpointType); + + /* Get raw usb access capabilities */ + int getNumberOfRawUSBBusAccessFeatures(long deviceID, int *errorCode); + int getRawUSBBusAccessFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + int rawUSBBusAccessRead(long deviceID, long featureID, int *errorCode, unsigned char *buffer, unsigned int bufferLength, unsigned char endpoint); + int rawUSBBusAccessWrite(long deviceID, long featureID, int *errorCode, unsigned char *buffer, unsigned int bufferLength, unsigned char endpoint); + + /* Serial number capabilities */ + int getNumberOfSerialNumberFeatures(long deviceID, int *errorCode); + int getSerialNumberFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + int getSerialNumber(long deviceID, long featureID, int *errorCode, char *buffer, int bufferLength); + unsigned char getSerialNumberMaximumLength(long deviceID, long featureID, int *errorCode); + + /* Spectrometer capabilities */ + int getNumberOfSpectrometerFeatures(long id, int *errorCode); + int getSpectrometerFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + void spectrometerSetTriggerMode(long deviceID, long spectrometerFeatureID, int *errorCode, int mode); + void spectrometerSetIntegrationTimeMicros(long deviceID, long spectrometerFeatureID, int *errorCode, unsigned long integrationTimeMicros); + unsigned long spectrometerGetMinimumIntegrationTimeMicros(long deviceID, long spectrometerFeatureID, int *errorCode); + unsigned long spectrometerGetMaximumIntegrationTimeMicros(long deviceID, long spectrometerFeatureID, int *errorCode); + double spectrometerGetMaximumIntensity(long deviceID, long spectrometerFeatureID, int *errorCode); + int spectrometerGetUnformattedSpectrumLength(long deviceID, long spectrometerFeatureID, int *errorCode); + int spectrometerGetUnformattedSpectrum(long deviceID, long spectrometerFeatureID, int *errorCode, unsigned char *buffer, int bufferLength); + int spectrometerGetFormattedSpectrumLength(long deviceID, long spectrometerFeatureID, int *errorCode); + int spectrometerGetFormattedSpectrum(long deviceID, long spectrometerFeatureID, int *errorCode, double *buffer, int bufferLength); + int spectrometerGetWavelengths(long deviceID, long spectrometerFeatureID, int *errorCode, double *wavelengths, int length); + int spectrometerGetElectricDarkPixelCount(long deviceID, long spectrometerFeatureID, int *errorCode); + int spectrometerGetElectricDarkPixelIndices(long deviceID, long spectrometerFeatureID, int *errorCode, int *indices, int length); + + /* Pixel binning capabilities */ + int getNumberOfPixelBinningFeatures(long id, int *errorCode); + int getPixelBinningFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + void binningSetPixelBinningFactor(long deviceID, long spectrometerFeatureID, int *errorCode, const unsigned char binningFactor); + unsigned char binningGetPixelBinningFactor(long deviceID, long spectrometerFeatureID, int *errorCode); + void binningSetDefaultPixelBinningFactor(long deviceID, long spectrometerFeatureID, int *errorCode, const unsigned char binningFactor); + void binningSetDefaultPixelBinningFactor(long deviceID, long spectrometerFeatureID, int *errorCode); + unsigned char binningGetDefaultPixelBinningFactor(long deviceID, long spectrometerFeatureID, int *errorCode); + unsigned char binningGetMaxPixelBinningFactor(long deviceID, long spectrometerFeatureID, int *errorCode); + + /* TEC capabilities */ + int getNumberOfThermoElectricFeatures(long deviceID, int *errorCode); + int getThermoElectricFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + double tecReadTemperatureDegreesC(long deviceID, long featureID, int *errorCode); + void tecSetTemperatureSetpointDegreesC(long deviceID, long featureID, int *errorCode, double temperatureDegreesCelsius); + void tecSetEnable(long deviceID, long featureID, int *errorCode, unsigned char tecEnable); + + /* Irradiance calibration features */ + int getNumberOfIrradCalFeatures(long deviceID, int *errorCode); + int getIrradCalFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + int irradCalibrationRead(long deviceID, long featureID, int *errorCode, float *buffer, int bufferLength); + int irradCalibrationWrite(long deviceID, long featureID, int *errorCode, float *buffer, int bufferLength); + int irradCalibrationHasCollectionArea(long deviceID, long featureID, int *errorCode); + float irradCalibrationReadCollectionArea(long deviceID, long featureID, int *errorCode); + void irradCalibrationWriteCollectionArea(long deviceID, long featureID, int *errorCode, float area); + + /* EEPROM capabilities */ + int getNumberOfEEPROMFeatures(long deviceID, int *errorCode); + int getEEPROMFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + int eepromReadSlot(long deviceID, long featureID, int *errorCode, int slotNumber, unsigned char *buffer, int bufferLength); + + /* Light source capabilities */ + int getNumberOfLightSourceFeatures(long deviceID, int *errorCode); + int getLightSourceFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + int lightSourceGetCount(long deviceID, long featureID, int *errorCode); + bool lightSourceHasEnable(long deviceID, long featureID, int *errorCode, int lightSourceIndex); + bool lightSourceIsEnabled(long deviceID, long featureID, int *errorCode, int lightSourceIndex); + void lightSourceSetEnable(long deviceID, long featureID, int *errorCode, int lightSourceIndex, bool enable); + bool lightSourceHasVariableIntensity(long deviceID, long featureID, int *errorCode, int lightSourceIndex); + double lightSourceGetIntensity(long deviceID, long featureID, int *errorCode, int lightSourceIndex); + void lightSourceSetIntensity(long deviceID, long featureID, int *errorCode, int lightSourceIndex, double intensity); + + /* Lamp capabilities */ + int getNumberOfLampFeatures(long deviceID, int *errorCode); + int getLampFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + void lampSetLampEnable(long deviceID, long featureID, int *errorCode, bool strobeEnable); + + /* Continuous strobe capabilities */ + int getNumberOfContinuousStrobeFeatures(long deviceID, int *errorCode); + int getContinuousStrobeFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + void continuousStrobeSetContinuousStrobeEnable(long deviceID, long featureID, int *errorCode, bool strobeEnable); + void continuousStrobeSetContinuousStrobePeriodMicroseconds(long deviceID, long featureID, int *errorCode, unsigned long strobePeriodMicroseconds); + + /* Shutter capabilities */ + int getNumberOfShutterFeatures(long deviceID, int *errorCode); + int getShutterFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + void shutterSetShutterOpen(long deviceID, long featureID, int *errorCode, bool opened); + + /* Nonlinearity coefficient capabilities */ + int getNumberOfNonlinearityCoeffsFeatures(long deviceID, int *errorCode); + int getNonlinearityCoeffsFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + int nonlinearityCoeffsGet(long deviceID, long featureID, int *errorCode, double *buffer, int maxLength); + + /* Temperature capabilities */ + int getNumberOfTemperatureFeatures(long deviceID, int *errorCode); + int getTemperatureFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + unsigned char temperatureCountGet(long deviceID, long featureID, int *errorCode); + double temperatureGet(long deviceID, long featureID, int *errorCode, int index); + int temperatureGetAll(long deviceID, long featureID, int *errorCode, double *buffer, int maxLength); + + /* Spectrum processing capabilities */ + int getNumberOfSpectrumProcessingFeatures(long deviceID, int *errorCode); + int getSpectrumProcessingFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + unsigned char spectrumProcessingBoxcarWidthGet(long deviceID, long featureID, int *errorCode); + unsigned short int spectrumProcessingScansToAverageGet(long deviceID, long featureID, int *errorCode); + void spectrumProcessingBoxcarWidthSet(long deviceID, long featureID, int *errorCode, unsigned char boxcarWidth); + void spectrumProcessingScansToAverageSet(long deviceID, long featureID, int *errorCode, unsigned short int scansToAverage); + + /* Revision capabilities */ + int getNumberOfRevisionFeatures(long deviceID, int *errorCode); + int getRevisionFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + unsigned char revisionHardwareGet(long deviceID, long featureID, int *errorCode); + unsigned short int revisionFirmwareGet(long deviceID, long featureID, int *errorCode); + + /* Optical Bench capabilities */ + int getNumberOfOpticalBenchFeatures(long deviceID, int *errorCode); + int getOpticalBenchFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + unsigned short int opticalBenchGetFiberDiameterMicrons(long deviceID, long featureID, int *errorCode); + unsigned short int opticalBenchGetSlitWidthMicrons(long deviceID, long featureID, int *errorCode); + int opticalBenchGetID(long deviceID, long featureID, int *errorCode, char *buffer, int bufferLength); + int opticalBenchGetSerialNumber(long deviceID, long featureID, int *errorCode, char *buffer, int bufferLength); + int opticalBenchGetCoating(long deviceID, long featureID, int *errorCode, char *buffer, int bufferLength); + int opticalBenchGetFilter(long deviceID, long featureID, int *errorCode, char *buffer, int bufferLength); + int opticalBenchGetGrating(long deviceID, long featureID, int *errorCode, char *buffer, int bufferLength); + + /* Stray light coefficient capabilities */ + int getNumberOfStrayLightCoeffsFeatures(long deviceID, int *errorCode); + int getStrayLightCoeffsFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + int strayLightCoeffsGet(long deviceID, long featureID, int *errorCode, double *buffer, int maxLength); + + /* Data buffer capabilities */ + int getNumberOfDataBufferFeatures(long deviceID, int *errorCode); + int getDataBufferFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + void dataBufferClear(long deviceID, long featureID, int *errorCode); + unsigned long dataBufferGetNumberOfElements(long deviceID, long featureID, int *errorCode); + unsigned long dataBufferGetBufferCapacity(long deviceID, long featureID, int *errorCode); + unsigned long dataBufferGetBufferCapacityMaximum(long deviceID, long featureID, int *errorCode); + unsigned long dataBufferGetBufferCapacityMinimum(long deviceID, long featureID, int *errorCode); + void dataBufferSetBufferCapacity(long deviceID, long featureID, int *errorCode, unsigned long capacity); + + /* Acquisition delay capabilities */ + int getNumberOfAcquisitionDelayFeatures(long deviceID, int *errorCode); + int getAcquisitionDelayFeatures(long deviceID, int *errorCode, long *buffer, unsigned int maxLength); + void acquisitionDelaySetDelayMicroseconds(long deviceID, long featureID, + int *errorCode, unsigned long delay_usec); + unsigned long acquisitionDelayGetDelayMicroseconds(long deviceID, + long featureID, int *errorCode); + unsigned long acquisitionDelayGetDelayIncrementMicroseconds(long deviceID, + long featureID, int *errorCode); + unsigned long acquisitionDelayGetDelayMaximumMicroseconds(long deviceID, + long featureID, int *errorCode); + unsigned long acquisitionDelayGetDelayMinimumMicroseconds(long deviceID, + long featureID, int *errorCode); + +private: + SeaBreezeAPI(); + virtual ~SeaBreezeAPI(); + + seabreeze::api::DeviceAdapter *getDeviceByID(unsigned long id); + + static SeaBreezeAPI *instance; + + std::vector probedDevices; + std::vector specifiedDevices; +}; + +extern "C" { +#endif /* __cplusplus */ + + /* All of these C functions start with sbapi_ to prevent namespace + * collisions. + */ + + /** + * This should be called prior to any other sbapi_call. The API may + * recover gracefully if this is not called, but future releases may assume + * this is called first. This should be called synchronously -- a single + * thread should call this. + */ + + DLL_DECL void sbapi_initialize(); + + /** + * This may be called to free up any allocated memory being held by the + * driver interface. After this is called by any thread, sbapi_initialize + * should be called again before any other sbapi_ functions are used. + */ + DLL_DECL void sbapi_shutdown(); + + /** + * This specifies to the driver that a device of the given type might be + * found on the network at a given address and port. The driver will add + * the device type and location to the set of those that can be opened. + * + * @param deviceTypeName (Input) The name of a type of device. This can be + * one of the following: Jaz + * + * @param ipAddress (Input) The IPv4 address of the device. This should be + * in "dotted quads" notation, such as "192.168.1.100". + * + * @param port (Input) The network port to open on the device. This will + * depend on the device type; consult its datasheet. + * + * @return zero on success, non-zero on error + */ + DLL_DECL int + sbapi_add_TCPIPv4_device_location(char *deviceTypeName, char *ipAddress, + unsigned int port); + + /** + * This specifies to the driver that a device of the given type might be + * found on a particular RS232 bus (e.g. a COM port). The driver will add + * the device type and location to the set of those that can be opened. + * + * @param deviceTypeName (Input) The name of a type of device. This can be + * one of the following: QE-PRO, STS. + * + * @param deviceBusPath (Input) The location of the device on the RS232 bus. + * This will be a platform-specific location. Under Windows, this may + * be COM1, COM2, etc. Under Linux, this might be /dev/ttyS0, /dev/ttyS1, + * etc. + * + * @param baud (Input) Baud rate at which to open the device. This should + * be specified as the rate itself, e.g. 9600, 57600, or 115200. + * + * @return zero on success, non-zero on error + */ + DLL_DECL int + sbapi_add_RS232_device_location(char *deviceTypeName, char *deviceBusPath, + unsigned int baud); + + /** + * This causes a search for known devices on all buses that support + * autodetection. This does NOT automatically open any device -- that must + * still be done with the sbapi_open_device() function. Note that this + * should only be done by one thread at a time, and it is recommended that + * other threads avoid calling sbapi_get_number_of_device_ids() or + * sbapi_get_device_ids() while this is executing. Ideally, a single thread + * should be designated for all device discovery/get actions, and + * separate worker threads can be used for each device discovered. + * + * @return the total number of devices that have been found + * automatically. If called repeatedly, this will always return the + * number of devices most recently found, even if they have been + * found or opened previously. + */ + DLL_DECL int + sbapi_probe_devices(); + + /** + * This returns the total number of devices that are known either because + * they have been specified with sbapi_add_RS232_device_location or + * because they were probed on some bus. This can be used to bound the + * number of device references that can be gotten with + * sbapi_get_device_ids(). + * + * @return the total number of devices references that are available + * through sbapi_get_device_ids(). + */ + DLL_DECL int + sbapi_get_number_of_device_ids(); + + /** + * This will populate the provided buffer with up to max_ids of device + * references. These references must be used as the first parameter to + * most of the other sbapi_ calls. Each uniquely identifies a single + * device instance. + * + * @param ids (Output) an array of long integers that will be overwritten + * with the unique IDs of each known device. Note that these + * devices will not be open by default. + * @param max_ids (Input) the maximum number of IDs that may be written + * to the array + * + * @return The total number of device IDs that were written to the array. + * This may be zero on error. + */ + DLL_DECL int + sbapi_get_device_ids(long *ids, unsigned int max_ids); + + /** + * This function opens a device attached to the system. The device must + * be provided as a location ID from the sbapi_get_device_ids() + * function. Such locations can either be specified or probed using the + * other methods in this interface. + * + * @param id (Input) The location ID of a device to try to open. Only IDs + * that have been returned by a previous call to seabreeze_get_device_ids() + * are valid. + * @param error_code (Output) A pointer to an integer that can be used for + * storing error codes. + * + * @return 0 if it opened a device successfully, or 1 if no device was opened + * (in which case the error_code variable will be set). + */ + DLL_DECL int + sbapi_open_device(long id, int *error_code); + + /** + * This function closes the spectrometer attached to the system. + * + * @param id (Input) The location ID of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * + */ + DLL_DECL void + sbapi_close_device(long id, int *error_code); + + /** + * This function returns a description of the error denoted by + * error_code. + * + * @param error_code (Input) The integer error code to look up. Error codes + * may not be zero, but can be any non-zero integer (positive or + * negative). + * + * @return char *: A description in the form of a string that describes + * what the error was. + */ + DLL_DECL const char * + sbapi_get_error_string(int error_code); + + /** + * This function copies a string denoting the type of the device into the + * provided buffer. + * + * @param id (Input) The location ID of a device previously opened with + * sbapi_get_device_locations(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. This may be NULL. + * @param buffer (Output) Pointer to a user buffer that the name will be + * stored into. This may be one of the following: + * \li NONE: Used if no spectrometer is found (error_code will also be set) + * \li HR2000: Represents an HR2000 spectrometer + * \li HR2000PLUS: Represents an HR2000+ spectrometer + * \li HR4000: Represents an HR4000 spectrometer + * \li JAZ: Represents a Jaz spectrometer + * \li MAYA2000: Represents a MAYA2000 spectrometer + * \li MAYA2000PRO: Represents a MAYA2000PRO spectrometer + * \li MAYALSL: Represents a Maya-LSL spectrometer + * \li NIRQUEST256: Represents an NIRQUEST256 spectrometer + * \li NIRQUEST512: Represents an NIRQUEST512 spectrometer + * \li QE65000: Represents a QE65000 spectrometer + * \li STS: Represents an STS spectrometer + * \li Torus: Represents a Torus spectrometer + * \li USB2000: Represents a USB2000 spectrometer + * \li USB2000PLUS: Represents a USB2000+ spectrometer + * \li USB4000: Represents a USB4000 spectrometer + * + * @param length (Input) Maximum number of bytes that may be written to the + * buffer + * + * @return integral number of bytes actually written to the user buffer + */ + DLL_DECL int + sbapi_get_device_type(long id, int *error_code, + char *buffer, unsigned int length); + + /** + * This function returns the usb endpoint for the type specified. + * If the type is not supported by the device, a zero is returned. + * 0 is normally the control endpoint. That value is not valid in this context. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @return the usb endpoint address. + */ + DLL_DECL unsigned char + sbapi_get_device_usb_endpoint_primary_out(long id, int *error_code); + + /** + * This function returns the usb endpoint for the type specified. + * If the type is not supported by the device, a zero is returned. + * 0 is normally the control endpoint. That value is not valid in this context. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @return the usb endpoint address. + */ + DLL_DECL unsigned char + sbapi_get_device_usb_endpoint_primary_in(long id, int *error_code); + + /** + * This function returns the usb endpoint for the type specified. + * If the type is not supported by the device, a zero is returned. + * 0 is normally the control endpoint. That value is not valid in this context. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @return the usb endpoint address. + */ + DLL_DECL unsigned char + sbapi_get_device_usb_endpoint_secondary_out(long id, int *error_code); + + /** + * This function returns the usb endpoint for the type specified. + * If the type is not supported by the device, a zero is returned. + * 0 is normally the control endpoint. That value is not valid in this context. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @return the usb endpoint address. + */ + DLL_DECL unsigned char + sbapi_get_device_usb_endpoint_secondary_in(long id, int *error_code); + + /** + * This function returns the usb endpoint for the type specified. + * If the type is not supported by the device, a zero is returned. + * 0 is normally the control endpoint. That value is not valid in this context. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @return the usb endpoint address. + */ + DLL_DECL unsigned char + sbapi_get_device_usb_endpoint_secondary_in2(long id, int *error_code); + + + /** + * This function returns the total number of raw usb bus access feature + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of raw usb bus access features that will be + * returned by a call to sbapi_get_raw_usb_bus_access_features(). + */ + DLL_DECL int + sbapi_get_number_of_raw_usb_bus_access_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each raw usb bus access feature + * instance for this device. The IDs are only valid when used with the + * deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) a preallocated array to hold returned feature handles + * @param max_features (Input) length of the preallocated buffer + * + * @return the number of raw usb bus access feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_raw_usb_bus_access_features(long deviceID, int *error_code, long *features, + int max_features); + + /** + * This function reads out a raw usb access from the spectrometer's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an irradiance calibration + * feature. Valid IDs can be found with the + * sbapi_get_raw_usb_access_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) preallocated array to hold an unsigned char buffer + * @param buffer_length (Input) size of the preallocated buffer (should equal pixel count) + * @param endpoint (Input) a USB endpoint gotten from one of the + * sbapi_get_device_usb_endpoint_xxx_xxx() type calls. + * + * @return the number of floats read from the device into the buffer + */ + DLL_DECL int + sbapi_raw_usb_bus_access_read(long deviceID, long featureID, + int *error_code, unsigned char *buffer, int buffer_length, unsigned char endpoint); + + /** + * This function writes a buffer of unsigned chars to the specified USB endpoint + * if the feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an raw usb bus access + * feature. Valid IDs can be found with the + * sbapi_get_raw_usb_bus_access_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) a pointer to unsigned char values to send to the usb endpoint + * @param buffer_length (Input) number of calibration factors to write + * @param endpoint (Input) a USB endpoint gotten from one of the + * sbapi_get_device_usb_endpoint_xxx_xxx() type calls. + * + * @return the number of floats written from the buffer to the device + */ + DLL_DECL int + sbapi_raw_usb_bus_access_write(long deviceID, long featureID, + int *error_code, unsigned char *buffer, int buffer_length, unsigned char endpoint); + + + /** + * This function returns the total number of serial number instances available + * in the indicated device. Each instance may refer to a different module. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @return the number of serial_number features that will be returned + * by a call to sbapi_get_serial_number_features(). + */ + DLL_DECL int + sbapi_get_number_of_serial_number_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each serial number instance for this + * device. Each instance refers to a single serial number feature. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for + * storing error codes. + * @param features (Output) a pre-allocated array to hold the list of + * supported serial number features + * @param max_features (Input) size of the preallocated output array + * @return the number of serial number feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_serial_number_features(long deviceID, int *error_code, long *features, + int max_features); + + /** + * This reads the device's serial number and fills the + * provided array (up to the given length) with it. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a serial + * number feature. Valid IDs can be found with the + * sbapi_get_serial_number_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param buffer (Output) A pre-allocated array of characters that the + * serial number will be copied into + * @param buffer_length (Input) The number of values to copy into the buffer + * (this should be no larger than the number of chars allocated in + * the buffer) + * + * @return the number of bytes written into the buffer + */ + DLL_DECL int + sbapi_get_serial_number(long deviceID, long featureID, int *error_code, + char *buffer, int buffer_length); + + /** + * This reads the possible maximum length of the device's serial number + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a serial + * number feature. Valid IDs can be found with the + * sbapi_get_serial_number_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * + * @return the length of the serial number in an unsigned character byte + */ + DLL_DECL unsigned char + sbapi_get_serial_number_maximum_length(long deviceID, long featureID, int *error_code); + + /** + * This function returns the total number of spectrometer instances available + * in the indicated device. Each instance refers to a single optical bench. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @return the number of spectrometer features that will be returned + * by a call to sbapi_get_spectrometer_features(). + */ + DLL_DECL int + sbapi_get_number_of_spectrometer_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each spectrometer instance for this + * device. Each instance refers to a single optical bench. The IDs are only + * valid when used with the deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for + * storing error codes. + * @param features (Output) a preallocated output array to hold the features + * @param max_features (Input) size of the preallocated output array + * @return Returns the number of spectrometer feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_spectrometer_features(long deviceID, int *error_code, long *features, + int max_features); + + /** + * This function sets the trigger mode for the specified device. + * Note that requesting an unsupported mode will result in an error. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a + * spectrometer feature. Valid IDs can be found with the + * sbapi_get_spectrometer_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param mode (Input) a trigger mode (0 = normal, 1 = software, + * 2 = synchronization, 3 = external hardware, etc - check your + * particular spectrometer's Data Sheet) + */ + DLL_DECL void + sbapi_spectrometer_set_trigger_mode(long deviceID, long featureID, + int *error_code, int mode); + + /** + * This function sets the integration time for the specified device. + * This function should not be responsible for performing stability + * scans. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a + * spectrometer feature. Valid IDs can be found with the + * sbapi_get_spectrometer_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param integration_time_micros (Input) The new integration time in + * units of microseconds + */ + DLL_DECL void + sbapi_spectrometer_set_integration_time_micros(long deviceID, long featureID, + int *error_code, unsigned long integration_time_micros); + + /** + * This function returns the smallest integration time setting, + * in microseconds, that is valid for the spectrometer. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a + * spectrometer feature. Valid IDs can be found with the + * sbapi_get_spectrometer_features() function. + * @param error_code (Output) A pointer to an integer that can be used + * for storing error codes. + * @return Returns minimum legal integration time in microseconds if > 0. + * On error, returns -1 and error_code will be set accordingly. + */ + DLL_DECL long + sbapi_spectrometer_get_minimum_integration_time_micros(long deviceID, + long featureID, int *error_code); + + /** + * This function returns the maximum pixel intensity for the + * spectrometer. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a + * spectrometer feature. Valid IDs can be found with the + * sbapi_get_spectrometer_features() function. + * @param error_code (Output) A pointer to an integer that can be used + * for storing error codes. + * @return Returns maximum pixel intensity if > 0. + * On error, returns -1 and error_code will be set accordingly. + */ + DLL_DECL double + sbapi_spectrometer_get_maximum_intensity(long deviceID, + long featureID, int *error_code); + + /** + * This returns an integer denoting the number of pixels in a + * formatted spectrum (as returned by get_formatted_spectrum(...)). + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a spectrometer + * feature. Valid IDs can be found with the sbapi_get_spectrometer_features() + * function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * + * @return the length of a formatted spectrum. + */ + DLL_DECL int + sbapi_spectrometer_get_formatted_spectrum_length(long deviceID, + long featureID, int *error_code); + + /** + * This acquires a spectrum and returns the answer in formatted + * floats. In this mode, auto-nulling should be automatically + * performed for devices that support it. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a + * spectrometer feature. Valid IDs can be found with the + * sbapi_get_spectrometer_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param buffer (Output) A buffer (with memory already allocated) to + * hold the spectral data + * @param buffer_length (Input) The length of the buffer + * + * @return the number of floats read into the buffer + */ + DLL_DECL int + sbapi_spectrometer_get_formatted_spectrum(long deviceID, + long featureID, int *error_code, + double* buffer, int buffer_length); + + /** + * This returns an integer denoting the length of a raw spectrum + * (as returned by get_unformatted_spectrum(...)). + * + * @param deviceID (Input) The index of a device previously opened with + * open_spectrometer(). + * @param featureID (Input) The ID of a particular instance of a + * spectrometer feature. Valid IDs can be found with the + * sbapi_get_spectrometer_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * + * @return the length of an unformatted spectrum. + */ + DLL_DECL int + sbapi_spectrometer_get_unformatted_spectrum_length(long deviceID, + long featureID, int *error_code); + + /** + * This acquires a spectrum and returns the answer in raw, + * unformatted bytes. + * + * @param deviceID (Input) The index of a device previously opened with + * open_spectrometer(). + * @param featureID (Input) The ID of a particular instance of a spectrometer + * feature. Valid IDs can be found with the sbapi_get_spectrometer_features() + * function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param buffer (Output) A buffer (with memory already allocated) to hold + * the spectral data + * @param buffer_length (Input) The length of the buffer + * + * @return the number of bytes read into the buffer + */ + DLL_DECL int + sbapi_spectrometer_get_unformatted_spectrum(long deviceID, + long featureID, int *error_code, + unsigned char *buffer, int buffer_length); + + /** + * This computes the wavelengths for the spectrometer and fills in the + * provided array (up to the given length) with those values. + * + * @param deviceID (Input) The index of a device previously opened with + * open_spectrometer(). + * @param featureID (Input) The ID of a particular instance of a spectrometer + * feature. Valid IDs can be found with the sbapi_get_spectrometer_features() + * function. + * @param error_code (Ouput) pointer to an integer that can be used for storing + * error codes. + * @param wavelengths (Output) A pre-allocated array of doubles that the wavelengths + * will be copied into + * @param length (Input) The number of values to copy into the wavelength array + * (this should be no larger than the number of doubles allocated in the wavelengths + * array) + * + * @return the number of bytes written into the wavelength buffer + */ + DLL_DECL int + sbapi_spectrometer_get_wavelengths(long deviceID, + long featureID, int *error_code, double *wavelengths, int length); + + /** + * This returns the number of pixels that are electrically active but + * optically masked (a.k.a. electric dark pixels). Note that not all + * detectors have optically masked pixels; in that case, this function + * will return zero. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a spectrometer + * feature. Valid IDs can be found with the sbapi_get_spectrometer_features() + * function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of pixels that can be retrieved by the + * sbapi_spectrometer_get_electric_dark_pixel_indices() function. + */ + DLL_DECL int + sbapi_spectrometer_get_electric_dark_pixel_count(long deviceID, + long featureID, int *error_code); + + /** + * This fills in the provided array (up to the given length) with the indices + * of the pixels that are electrically active but optically masked + * (a.k.a. electric dark pixels). Note that not all detectors have optically + * masked pixels; in that case, this function will return zero. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a spectrometer + * feature. Valid IDs can be found with the sbapi_get_spectrometer_features() + * function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param indices (Output) A pre-allocated array of ints that the pixel indices + * will be copied into + * @param length (Input) The number of values to copy into the indices array + * (this should be no larger than the number of ints allocated in the indices + * array) + * + * @return the number of bytes written into the indices buffer + */ + DLL_DECL int + sbapi_spectrometer_get_electric_dark_pixel_indices(long deviceID, + long featureID, int *error_code, int *indices, int length); + + /** + * This function returns the total number of pixel binning instances available + * in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * + * @return the number of pixel binning features that will be returned by a call + * to sbapi_get_pixel_binning_features(). + */ + DLL_DECL int + sbapi_get_number_of_pixel_binning_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each pixel binning feature for this + * device. The IDs are only valid when used with the deviceID used to + * obtain them. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for + * storing error codes. + * @param features (Output) a pre-populated array to hold the returned + * feature handles + * @param max_features (Input) size of the pre-allocated array + * + * @return the number of pixel binning feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_pixel_binning_features(long deviceID, int *error_code, long *features, + int max_features); + + /** + * This function sets the pixel binning factor on the device. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a pixel binning feature. + * Valid IDs can be found with the sbapi_get_pixel_binning_features() function. + * @param error_code (Output) A pointer to an integer that can be used for + * storing error codes. + * @param factor (Input) The desired pixel binning factor. + */ + DLL_DECL void + sbapi_binning_set_pixel_binning_factor(long deviceID, long featureID, + int *error_code, unsigned char factor); + + /** + * This function gets the pixel binning factor on the device. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a pixel binning feature. + * Valid IDs can be found with the sbapi_get_pixel_binning_features() function. + * @param error_code (Output) A pointer to an integer that can be used for + * storing error codes. + * + * @return the pixel binning factor for the specified feature. + */ + DLL_DECL unsigned char + sbapi_binning_get_pixel_binning_factor(long deviceID, long featureID, int *error_code); + + /** + * This function sets the default pixel binning factor on the device. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a pixel binning feature. + * Valid IDs can be found with the sbapi_get_pixel_binning_features() function. + * @param error_code (Output)A pointer to an integer that can be used for + * storing error codes. + * @param factor (Input) The desired default pixel binning factor. + */ + DLL_DECL void + sbapi_binning_set_default_pixel_binning_factor(long deviceID, long featureID, + int *error_code, unsigned char factor); + + /** + * This function resets the default pixel binning factor on the device back to the factory default. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a pixel binning feature. + * Valid IDs can be found with the sbapi_get_pixel_binning_features() function. + * @param error_code (Output)A pointer to an integer that can be used for + * storing error codes. + */ + DLL_DECL void + sbapi_binning_reset_default_pixel_binning_factor(long deviceID, long featureID, + int *error_code); + + /** + * This function gets the default pixel binning factor on the device. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a pixel binning feature. + * Valid IDs can be found with the sbapi_get_pixel_binning_features() function. + * @param error_code (Output)A pointer to an integer that can be used for + * storing error codes. + * + * @return the default pixel binning factor for the specified feature. + */ + DLL_DECL unsigned char + sbapi_binning_get_default_pixel_binning_factor(long deviceID, long featureID, int *error_code); + + /** + * This function gets the maximum pixel binning factor on the device. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a pixel binning feature. + * Valid IDs can be found with the sbapi_get_pixel_binning_features() function. + * @param error_code (Output)A pointer to an integer that can be used for + * storing error codes. + * + * @return the maximum pixel binning factor for the specified feature. + */ + DLL_DECL unsigned char + sbapi_binning_get_max_pixel_binning_factor(long deviceID, long featureID, int *error_code); + + /** + * This function returns the total number of shutter instances available + * in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * + * @return the number of shutter features that will be returned by a call + * to sbapi_get_shutter_features(). + */ + DLL_DECL int + sbapi_get_number_of_shutter_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each shutter instance for this + * device. The IDs are only valid when used with the deviceID used to + * obtain them. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for + * storing error codes. + * @param features (Output) a pre-populated array to hold the returned + * feature handles + * @param max_features (Input) size of the pre-allocated array + * + * @return the number of shutter feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_shutter_features(long deviceID, int *error_code, long *features, + int max_features); + + /** + * This function sets the shutter state on the device. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a shutter feature. + * Valid IDs can be found with the sbapi_get_shutter_features() function. + * @param error_code (Output)A pointer to an integer that can be used for + * storing error codes. + * @param opened (Input) A boolean used for denoting the desired state + * (opened/closed) of the shutter. If the value of + * opened is non-zero, then the shutter will open. If + * the value of opened is zero, then the shutter will close. + */ + DLL_DECL void + sbapi_shutter_set_shutter_open(long deviceID, long featureID, + int *error_code, unsigned char opened); + + /** + * This function returns the total number of light source instances available + * in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * + * @return the number of light source features that will be returned + * by a call to sbapi_get_light_source_features(). + */ + DLL_DECL int + sbapi_get_number_of_light_source_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each light source instance for this + * device. The IDs are only valid when used with the deviceID used to + * obtain them. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param features (Output) pre-allocated buffer that will receive the IDs of the + * feature instances + * @param max_features (Input) the maximum number of elements that can be + * copied into the provided features array + * + * @return the number of light source feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_light_source_features(long deviceID, int *error_code, + long *features, int max_features); + + /** + * This function gets the number of light sources that are represented by + * the given featureID. Such light sources could be individual LEDs, + * light bulbs, lasers, etc. Each of these light sources may have different + * capabilities, such as programmable intensities and enables, which should + * be queried before they are used. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a light source + * feature. Valid IDs can be found with sbapi_get_light_source_features(). + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * + * @return the number of light sources (e.g. bulbs) in the indicated feature + */ + DLL_DECL int + sbapi_light_source_get_count(long deviceID, long featureID, int *error_code); + + /** + * Queries whether the indicated light source within the given feature + * instance has a usable enable/disable control. If this returns 0 + * (meaning no enable available) then calling sbapi_light_source_set_enable() + * or sbapi_light_source_is_enabled() is likely to result in an error. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a light source + * feature. Valid IDs can be found with the sbapi_get_light_source_features() + * function. + * @param error_code (Ouput) A pointer to an integer that can be used for + * storing error codes. + * @param light_source_index (Input) Which of potentially many light sources + * (LEDs, lasers, light bulbs) within the indicated feature instance to query + * + * @return 0 to indicate specified light source cannot be enabled/disabled, + * 1 to indicate specified light source can be enabled/disabled with + * sbapi_light_source_set_enable() + */ + DLL_DECL unsigned char + sbapi_light_source_has_enable(long deviceID, long featureID, int *error_code, + int light_source_index); + + /** + * Queries whether the indicated light source within the given feature + * instance is enabled (energized). + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a light source feature. Valid + * IDs can be found with the sbapi_get_light_source_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param light_source_index (Input) Which of potentially many light sources (LEDs, lasers, + * light bulbs) within the indicated feature instance to query + * + * @return 0 to indicate specified light source is disabled (should emit no light), + * 1 to indicate specified light source is enabled (should emit light depending + * on configured intensity setting) + */ + DLL_DECL unsigned char + sbapi_light_source_is_enabled(long deviceID, long featureID, int *error_code, + int light_source_index); + + /** + * Attempts to enable or disable the indicated light source within the given + * feature instance. Not all light sources have an enable/disable control, + * and this capability can be queried with sbapi_light_source_has_enable(). + * Note that an enabled light source should emit light according to its last + * (or default) intensity setting which might be the minimum; in this case, + * the light source might appear to remain off. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a light source feature. Valid + * IDs can be found with the sbapi_get_light_source_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param light_source_index (Input) Which of potentially many light sources (LEDs, lasers, + * light bulbs) within the indicated feature instance to query + * @param enable (Input) Whether to enable the light source. A value of zero will attempt + * to disable the light source, and any other value will enable it. + */ + DLL_DECL void + sbapi_light_source_set_enable(long deviceID, long featureID, int *error_code, + int light_source_index, unsigned char enable); + + /** + * Queries whether the indicated light source within the given feature + * instance has a usable intensity control. If this returns 0 + * (meaning no control available) then calling sbapi_light_source_set_intensity() + * or sbapi_light_source_get_intensity() is likely to result in an error. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a light source feature. Valid + * IDs can be found with the sbapi_get_light_source_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param light_source_index (Input) Which of potentially many light sources (LEDs, lasers, + * light bulbs) within the indicated feature instance to query + * + * @return 0 to indicate specified light source cannot have its intensity changed, + * 1 to indicate the specified light source can have its intensity controlled + * with sbapi_light_source_set_intensity() + */ + DLL_DECL unsigned char + sbapi_light_source_has_variable_intensity(long deviceID, long featureID, + int *error_code, int light_source_index); + + /** + * Queries the intensity level of the indicated light source within the + * given feature instance. The intensity is normalized over the + * range [0, 1], with 0 as the minimum and 1 as the maximum. + * + * SAFETY WARNING: a light source at its minimum intensity (0) might still + * emit light, and in some cases, this may be harmful radiation. A value + * of 0 indicates the minimum of the programmable range for the light source, + * and does not necessarily turn the light source off. To disable a light + * source completely, use sbapi_light_source_set_enable() if the device + * supports this feature, or provide some other mechanism to allow the light + * to be disabled or blocked by the operator. + * + * In some cases, the intensity may refer to the duty cycle of a pulsed + * light source instead of a continuous power rating. The actual power output + * of the light source might not vary linearly with the reported intensity, + * so independent measurement or calibration of the light source may be + * necessary. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a light source feature. Valid + * IDs can be found with the sbapi_get_light_source_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param light_source_index (Input) Which of potentially many light sources (LEDs, lasers, + * light bulbs) within the indicated feature instance to query + * + * @return Real-valued result (as a double-precision floating point number) over + * the range [0, 1] where 0 represents the minimum programmable intensity + * level and 1 indicates the maximum. Note that the minimum intensity level + * might still allow the light source to produce light. + */ + DLL_DECL double + sbapi_light_source_get_intensity(long deviceID, long featureID, + int *error_code, int light_source_index); + + /** + * Sets the intensity level of the indicated light source within the + * given feature instance. The intensity is normalized over the + * range [0, 1], with 0 as the minimum and 1 as the maximum. + * + * SAFETY WARNING: a light source at its minimum intensity (0) might still + * emit light, and in some cases, this may be harmful radiation. A value + * of 0 indicates the minimum of the programmable range for the light source, + * and does not necessarily turn the light source off. To disable a light + * source completely, use sbapi_light_source_set_enable() if the device + * supports this feature, or provide some other mechanism to allow the light + * to be disabled or blocked by the operator. + * + * In some cases, the intensity may refer to the duty cycle of a pulsed + * light source instead of a continuous power rating. The actual power output + * of the light source might not vary linearly with the reported intensity, + * so independent measurement or calibration of the light source may be + * necessary. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a light source feature. Valid + * IDs can be found with the sbapi_get_light_source_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param light_source_index (Input) Which of potentially many light sources (LEDs, lasers, + * light bulbs) within the indicated feature instance to query + * @param intensity (Input) The target intensity of the light source in the range [0, 1] + */ + DLL_DECL void + sbapi_light_source_set_intensity(long deviceID, long featureID, + int *error_code, int light_source_index, double intensity); + + /* + * This function returns the total number of strobe/lamp instances available + * in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of strobe/lamp features that will be returned + * by a call to sbapi_get_strobe_lamp_features(). + */ + +// There is not code in seabreezeAPI.cpp for this function. Perhaps it was not finished + + //DLL_DECL int + //sbapi_get_number_of_strobe_lamp_features(long deviceID, int *error_code); + + /* + * This function returns IDs for accessing each strobe/lamp instance for this + * device. The IDs are only valid when used with the deviceID used to + * obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) a preallocated array to hold returned feature handles + * @param max_features (Input) length of the preallocated buffer + * + * @return the number of strobe/lamp feature IDs that were copied. + */ + +// There is not code in seabreezeAPI.cpp for this function. Perhaps it was not finished. + + //DLL_DECL int + //sbapi_get_strobe_lamp_features(long deviceID, int *error_code, long *features, + // int max_features); + + /** + * This function returns the total number of lamp instances available + * in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of lamp features that will be returned + * by a call to sbapi_get_lamp_features(). + */ + DLL_DECL int + sbapi_get_number_of_lamp_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each lamp instance for this + * device. The IDs are only valid when used with the deviceID used to + * obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) a preallocated array to hold returned feature handles + * @param max_features (Input) length of the preallocated buffer + * + * @return the number of lamp feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_lamp_features(long deviceID, int *error_code, long *features, + int max_features); + + /** + * This function sets the strobe enable on the spectrometer. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a lamp feature. Valid + * IDs can be found with the sbapi_get_lamp_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param lamp_enable (Input) A character used for denoting the desired value + * (high/low) of the strobe-enable pin. If the value of + * strobe_enable is zero, then the pin should be set low. If + * the value of strobe_enable is non-zero, then the pin should be + * set high. + */ + DLL_DECL void + sbapi_lamp_set_lamp_enable(long deviceID, long featureID, + int *error_code, unsigned char lamp_enable); + + /** + * This function returns the total number of continuous strobe instances + * available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of continuous strobe features that will be returned + * by a call to sbapi_get_continuous_strobe_features(). + */ + DLL_DECL int + sbapi_get_number_of_continuous_strobe_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each continuous strobe instance + * for this device. The IDs are only valid when used with the deviceID + * used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) a preallocated array to hold returned feature handles + * @param max_features (Input) length of the preallocated buffer + * + * @return the number of continuous strobe feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_continuous_strobe_features(long deviceID, int *error_code, long *features, + int max_features); + + /** + * This function sets the continuous strobe enable state on the device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a continuous strobe feature. + * Valid IDs can be found with the sbapi_get_continuous_strobe_features() + * function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param enable (Input) A boolean used for denoting the desired state + * (on/off) of the continuous strobe generator. If the value of + * enable is nonzero, then the continuous strobe will operate. If + * the value of enable is zero, then the continuous strobe will stop. + * Note that on some devices the continuous strobe enable is tied to other + * enables (such as lamp enable or single strobe enable) which may cause + * side effects. + */ + DLL_DECL void + sbapi_continuous_strobe_set_continuous_strobe_enable(long deviceID, long featureID, + int *error_code, unsigned char enable); + + /** + * This function sets the continuous strobe period on the device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a continuous strobe feature. + * Valid IDs can be found with the sbapi_get_continuous_strobe_features() + * function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param period_micros (Input) The new period of the continous strobe measured in microseconds + */ + DLL_DECL void + sbapi_continuous_strobe_set_continuous_strobe_period_micros(long deviceID, long featureID, + int *error_code, unsigned long period_micros); + + /** + * This function returns the total number of EEPROM instances available + * in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of EEPROM features that will be returned + * by a call to sbapi_get_eeprom_features(). + */ + DLL_DECL int + sbapi_get_number_of_eeprom_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each EEPROM instance for this + * device. The IDs are only valid when used with the deviceID used to + * obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) a preallocated array to hold returned feature handles + * @param max_features (Input) length of the preallocated buffer + * + * @return the number of EEPROM feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_eeprom_features(long deviceID, int *error_code, long *features, + int max_features); + + /** + * This function reads a string out of the device's EEPROM slot + * and returns the result. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an EEPROM feature. Valid + * IDs can be found with the sbapi_get_eeprom_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param slot_number (Input) The number of the slot to read out. Possible + * values are 0 through 17. + * @param buffer (Output) A buffer (with memory already allocated) to hold the + * value read out of the EEPROM slot + * @param buffer_length (Input) The length of the buffer + * + * @return the number of bytes read from the EEPROM slot into the buffer + */ + DLL_DECL int + sbapi_eeprom_read_slot(long deviceID, long featureID, + int *error_code, int slot_number, + unsigned char *buffer, int buffer_length); + + /** + * This function returns the total number of irradiance calibration + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of irradiance calibration features that will be + * returned by a call to sbapi_get_irrad_cal_features(). + */ + DLL_DECL int + sbapi_get_number_of_irrad_cal_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each irradiance calibration + * instance for this device. The IDs are only valid when used with the + * deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) a preallocated array to hold returned feature handles + * @param max_features (Input) length of the preallocated buffer + * + * @return the number of irradiance calibration feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_irrad_cal_features(long deviceID, int *error_code, long *features, + int max_features); + + /** + * This function reads out an irradiance calibration from the spectrometer's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an irradiance calibration + * feature. Valid IDs can be found with the + * sbapi_get_irrad_cal_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) preallocated array to hold irradiance calibration scalars (one per pixel) + * @param buffer_length (Input) size of the preallocated buffer (should equal pixel count) + * + * @return the number of floats read from the device into the buffer + */ + DLL_DECL int + sbapi_irrad_calibration_read(long deviceID, long featureID, + int *error_code, float *buffer, int buffer_length); + + /** + * This function writes an irradiance calibration to the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an irradiance calibration + * feature. Valid IDs can be found with the + * sbapi_get_irrad_cal_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) array of floating point values to store into the device + * @param buffer_length (Input) number of calibration factors to write + * + * @return the number of floats written from the buffer to the device + */ + DLL_DECL int + sbapi_irrad_calibration_write(long deviceID, long featureID, + int *error_code, float *buffer, int buffer_length); + + /** + * This function checks for an irradiance collection area in the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an irradiance calibration + * feature. Valid IDs can be found with the + * sbapi_get_irrad_cal_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return 0 if no collection area available, 1 if available. + */ + DLL_DECL int + sbapi_irrad_calibration_has_collection_area(long deviceID, long featureID, + int *error_code); + + /** + * This function reads an irradiance collection area from the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an irradiance calibration + * feature. Valid IDs can be found with the + * sbapi_get_irrad_cal_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return float: collection area (usually in units of cm^2) read from device + */ + DLL_DECL float + sbapi_irrad_calibration_read_collection_area(long deviceID, long featureID, + int *error_code); + + /** + * This function writes an irradiance collection area to the spectrometer's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an irradiance calibration + * feature. Valid IDs can be found with the + * sbapi_get_irrad_cal_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param area (Input) collection area to save to spectrometer, presumably in cm^2 + */ + DLL_DECL void + sbapi_irrad_calibration_write_collection_area(long deviceID, long featureID, + int *error_code, float area); + + /** + * This function returns the total number of thermoelectric cooler (TEC) + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of TEC features that will be returned by a call to + * sbapi_get_thermoelectric_features(). + */ + DLL_DECL int + sbapi_get_number_of_thermo_electric_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each thermoelectric cooler + * (TEC) instance for this device. The IDs are only valid when used with + * the deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) preallocated array to hold feature handles + * @param max_features (Input) size of the preallocated array + * + * @return the number of TEC feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_thermo_electric_features(long deviceID, int *error_code, long *features, + int max_features); + + /** + * This function reads the actual temperature of the TEC and returns the value in + * degrees celsius. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an thermoelectric cooler + * feature. Valid IDs can be found with the + * sbapi_get_thermo_electric_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return double: The TEC temperature in degrees celsius. + */ + DLL_DECL double + sbapi_tec_read_temperature_degrees_C(long deviceID, long featureID, + int *error_code); + + /** + * This function sets the target (setpoint) TEC temperature. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an thermoelectric cooler + * feature. Valid IDs can be found with the + * sbapi_get_thermo_electric_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param temperature_degrees_celsius (Input) desired temperature, + * in degrees celsius. + */ + DLL_DECL void + sbapi_tec_set_temperature_setpoint_degrees_C(long deviceID, long featureID, + int *error_code, double temperature_degrees_celsius); + + /** + * This function enables the TEC feature on the device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of an thermoelectric cooler + * feature. Valid IDs can be found with the + * sbapi_get_thermo_electric_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param tec_enable (Input) A character that denotes the desired TEC enable + * state. If the value of tec_enable is zero, the TEC should + * be disabled. If the value of tec_enable is non-zero, the TEC + * should be enabled. + */ + DLL_DECL void + sbapi_tec_set_enable(long deviceID, long featureID, + int *error_code, unsigned char tec_enable); + + /** + * This function returns the total number of nonlinearity coefficient feature + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of features that will be returned by a call to + * sbapi_get_nonlinearity_coeffs_features(). + */ + DLL_DECL int + sbapi_get_number_of_nonlinearity_coeffs_features( + long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each nonlinearity coefficient + * feature instance for this device. The IDs are only valid when used with + * the deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) preallocated array to hold returned feature handles + * @param max_features (Input) size of preallocated array + * + * @return the number of nonlinearity coefficient feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_nonlinearity_coeffs_features(long deviceID, int *error_code, + long *features, int max_features); + + /** + * This function reads out nonlinearity coefficients from the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a nonlinearity coefficient + * feature. Valid IDs can be found with the + * sbapi_get_nonlinearity_coeffs_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) preallocated buffer to store NLC coefficients + * @param max_length (Input) size of preallocated buffer + * + * @return the number of doubles read from the device into the buffer + */ + DLL_DECL int sbapi_nonlinearity_coeffs_get(long deviceID, long featureID, + int *error_code, double *buffer, int max_length); + +/** + * This function returns the total number of temperature feature + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of features that will be returned by a call to + * sbapi_get_temperature_features(). + */ + DLL_DECL int + sbapi_get_number_of_temperature_features( + long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each temperature + * feature instance for this device. The IDs are only valid when used with + * the deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) preallocated array to hold returned feature handles + * @param max_features (Input) size of preallocated array + * + * @return the number of temperature feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_temperature_features(long deviceID, int *error_code, + long *temperatureFeatures, int max_features); + + /** + * This function reads out an the number of indexed temperatures available from the + * device's internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a temperature + * feature. Valid IDs can be found with the + * sbapi_get_temperature_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of temperatures available as an unsigned char + */ + DLL_DECL unsigned char sbapi_temperature_count_get(long deviceID, long temperatureFeatureID, int *error_code); + + /** + * This function reads out an indexed temperature from the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a temperature + * feature. Valid IDs can be found with the + * sbapi_get_temperature_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param index (Input) An index for the device's temperature sensors + * + * @return the temperature as a double + */ + DLL_DECL double sbapi_temperature_get(long deviceID, long temperatureFeatureID, int *error_code, int index); + + /** + * This function reads out all temperatures from the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a temperature + * feature. Valid IDs can be found with the + * sbapi_get_temperature_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) preallocated buffer to store temperatures + * @param max_length (Input) size of preallocated buffer + * + * @return the number of doubles read from the device into the buffer + */ + DLL_DECL int sbapi_temperature_get_all(long deviceID, long temperatureFeatureID, int *error_code, double *buffer, int max_length); + + + +/** + * This function returns the total number of spectrum processing feature + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of features that will be returned by a call to + * sbapi_get_spectrum_processing_features(). + */ + DLL_DECL int + sbapi_get_number_of_spectrum_processing_features( + long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each spectrum processing + * feature instance for this device. The IDs are only valid when used with + * the deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) preallocated array to hold returned feature handles + * @param max_features (Input) size of preallocated array + * + * @return the number of spectrum processing feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_spectrum_processing_features(long deviceID, int *error_code, + long *spectrumProcessingFeatures, int max_features); + + /** + * This function reads out an the number of scans to average from the + * device's internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a spectrum processing + * feature. Valid IDs can be found with the + * sbapi_get_spectrum_processing_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of scans to average as an unsigned short integer + */ + DLL_DECL unsigned short int sbapi_spectrum_processing_scans_to_average_get(long deviceID, + long spectrumProcessingFeatureID, int *error_code); + + /** + * This function sets the number of scans to average in the the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a spectrum processing + * feature. Valid IDs can be found with the + * sbapi_get_spectrum_processing_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param scansToAverage (Input) The number of spectrum scans used to generate a less + * noisy spectrum due to averaging + * + * @return void + */ + DLL_DECL void sbapi_spectrum_processing_scans_to_average_set(long deviceID, + long spectrumProcessingFeatureID, int *error_code, unsigned short int scansToAverage); + + /** + * This function reads out an the width of the boxcar filter from the + * device's internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a spectrum processing + * feature. Valid IDs can be found with the + * sbapi_get_spectrum_processing_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the width of the boxcar filter an unsigned char (values typically 0-15) + */ + DLL_DECL unsigned char sbapi_spectrum_processing_boxcar_width_get(long deviceID, + long spectrumProcessingFeatureID, int *error_code); + + /** + * This function sets width of the boxcar filter in the the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a spectrum processing + * feature. Valid IDs can be found with the + * sbapi_get_spectrum_processing_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param boxcarWidth (Input) The width of the boxcar smoothing function to be used. + * Values are typically 1 to 15. + * + * @return void + */ + DLL_DECL void sbapi_spectrum_processing_boxcar_width_set(long deviceID, + long spectrumProcessingFeatureID, int *error_code, unsigned char boxcarWidth); + + + +/** + * This function returns the total number of revision feature + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of features that will be returned by a call to + * sbapi_get_revision_features(). + */ + DLL_DECL int + sbapi_get_number_of_revision_features( + long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each revision + * feature instance for this device. The IDs are only valid when used with + * the deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) preallocated array to hold returned feature handles + * @param max_features (Input) size of preallocated array + * + * @return the number of revision feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_revision_features(long deviceID, int *error_code, + long *revisionFeatures, int max_features); + + /** + * This function reads out the hardware revision from the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a temperature + * feature. Valid IDs can be found with the + * sbapi_get_revision_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the hardware revision as one unsigned char byte. (Note that both Ocean View and SpectraSuite display the hex value.) + */ + DLL_DECL unsigned char sbapi_revision_hardware_get(long deviceID, long revisionFeatureID, int *error_code); + + /** + * This function reads out the firmware revision from the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a temperature + * feature. Valid IDs can be found with the + * sbapi_get_revision_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the firmware revision as two unsigned short int bytes (Note that both Ocean View and SpectraSuite display the hex value.) + */ + DLL_DECL unsigned short int sbapi_revision_firmware_get(long deviceID, long revisionFeatureID, int *error_code); + +/** + * This function returns the total number of optical bench feature + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of features that will be returned by a call to + * sbapi_get_optical_bench_features(). + */ + DLL_DECL int + sbapi_get_number_of_optical_bench_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each optical bench + * feature instance for this device. The IDs are only valid when used with + * the deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) preallocated array to hold returned feature handles + * @param max_features (Input) size of preallocated array + * + * @return the number of optical bench feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_optical_bench_features(long deviceID, int *error_code, long *opticalBenchFeatures, int max_features); + + /** + * This function reads out the optical bench fiber diameter in microns + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param opticalBenchFeatureID (Input) The ID of a particular instance of a optical + * bench feature. Valid IDs can be found with the + * sbapi_get_optical_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the fiber diameter in microns + */ + DLL_DECL unsigned short int sbapi_optical_bench_get_fiber_diameter_microns(long deviceID, long opticalBenchFeatureID, int *error_code); + + /** + * This function reads out the optical bench slit width in microns + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param opticalBenchFeatureID (Input) The ID of a particular instance of a optical + * bench feature. Valid IDs can be found with the + * sbapi_get_optical_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the slit width in microns + */ + DLL_DECL unsigned short int sbapi_optical_bench_get_slit_width_microns(long deviceID, long opticalBenchFeatureID, int *error_code); + + /** + * This reads the optical bench ID and fills the + * provided array (up to the given length) with it. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param opticalBenchFeatureID (Input) The ID of a particular instance of a serial + * number feature. Valid IDs can be found with the + * sbapi_get_optical_bench_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param buffer (Output) A pre-allocated array of characters that the + * serial number will be copied into + * @param buffer_length (Input) The number of values to copy into the buffer + * (this should be no larger than the number of chars allocated in + * the buffer) + * + * @return the number of bytes written into the buffer + */ + DLL_DECL int + sbapi_optical_bench_get_id(long deviceID, long featureID, int *error_code, char *buffer, int buffer_length); + + /** + * This reads the optical bench Serial Number and fills the + * provided array (up to the given length) with it. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param opticalBenchFeatureID (Input) The ID of a particular instance of a serial + * number feature. Valid IDs can be found with the + * sbapi_get_optical_bench_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param buffer (Output) A pre-allocated array of characters that the + * serial number will be copied into + * @param buffer_length (Input) The number of values to copy into the buffer + * (this should be no larger than the number of chars allocated in + * the buffer) + * + * @return the number of bytes written into the buffer + */ + DLL_DECL int + sbapi_optical_bench_get_serial_number(long deviceID, long featureID, int *error_code, char *buffer, int buffer_length); + + + /** + * This reads the optical bench Coating and fills the + * provided array (up to the given length) with it. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param opticalBenchFeatureID (Input) The ID of a particular instance of a serial + * number feature. Valid IDs can be found with the + * sbapi_get_optical_bench_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param buffer (Output) A pre-allocated array of characters that the + * serial number will be copied into + * @param buffer_length (Input) The number of values to copy into the buffer + * (this should be no larger than the number of chars allocated in + * the buffer) + * + * @return the number of bytes written into the buffer + */ + DLL_DECL int + sbapi_optical_bench_get_coating(long deviceID, long featureID, int *error_code, char *buffer, int buffer_length); + + /** + * This reads the optical bench filter and fills the + * provided array (up to the given length) with it. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param opticalBenchFeatureID (Input) The ID of a particular instance of a serial + * number feature. Valid IDs can be found with the + * sbapi_get_optical_bench_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param buffer (Output) A pre-allocated array of characters that the + * serial number will be copied into + * @param buffer_length (Input) The number of values to copy into the buffer + * (this should be no larger than the number of chars allocated in + * the buffer) + * + * @return the number of bytes written into the buffer + */ + DLL_DECL int + sbapi_optical_bench_get_filter(long deviceID, long featureID, int *error_code, char *buffer, int buffer_length); + + /** + * This reads the optical bench grating and fills the + * provided array (up to the given length) with it. + * + * @param deviceID (Input) The index of a device previously opened with + * sbapi_open_device(). + * @param opticalBenchFeatureID (Input) The ID of a particular instance of a serial + * number feature. Valid IDs can be found with the + * sbapi_get_optical_bench_features() function. + * @param error_code (Output) pointer to an integer that can be used for + * storing error codes. + * @param buffer (Output) A pre-allocated array of characters that the + * serial number will be copied into + * @param buffer_length (Input) The number of values to copy into the buffer + * (this should be no larger than the number of chars allocated in + * the buffer) + * + * @return the number of bytes written into the buffer + */ + DLL_DECL int + sbapi_optical_bench_get_grating(long deviceID, long featureID, int *error_code, char *buffer, int buffer_length); + + + /** + * This function returns the total number of stray light coefficient feature + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of features that will be returned by a call to + * sbapi_get_stray_light_coeffs_features(). + */ + DLL_DECL int + sbapi_get_number_of_stray_light_coeffs_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each stray light coefficient + * feature instance for this device. The IDs are only valid when used with + * the deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) preallocated buffer to hold returned feature handles + * @param max_features (Input) size of preallocated buffer + * + * @return the number of stray light coefficient feature IDs that were copied. + */ + DLL_DECL int + sbapi_get_stray_light_coeffs_features(long deviceID, int *error_code, + long *features, int max_features); + + /** + * This function reads out stray light coefficients from the device's + * internal memory if that feature is supported. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a stray light coefficient + * feature. Valid IDs can be found with the + * sbapi_get_stray_light_coeffs_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param buffer (Output) preallocated buffer to store stray light coefficients + * @param max_length (Input) size of preallocated buffer + * + * @return the number of doubles read from the device into the buffer + */ + DLL_DECL int sbapi_stray_light_coeffs_get(long deviceID, long featureID, + int *error_code, double *buffer, int max_length); + + + /** + * This function returns the total number of data buffer feature + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of features that will be returned by a call to + * sbapi_get_data_buffer_features(). + */ + DLL_DECL int sbapi_get_number_of_data_buffer_features(long deviceID, int *error_code); + + /** + * This function returns IDs for accessing each data buffer + * feature instance for this device. The IDs are only valid when used with + * the deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) preallocated buffer to hold returned feature handles + * @param max_features (Input) size of preallocated buffer + * + * @return the number of data buffer feature IDs that were copied. + */ + DLL_DECL int sbapi_get_data_buffer_features(long deviceID, int *error_code, + long *buffer, unsigned int maxLength); + + /** + * @brief Clear the data buffer + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + */ + DLL_DECL void sbapi_data_buffer_clear(long deviceID, long featureID, int *error_code); + + /** + * @brief Get the number of data elements currently in the buffer + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return A count of how many items are available for retrieval from the buffer + */ + DLL_DECL unsigned long sbapi_data_buffer_get_number_of_elements(long deviceID, + long featureID, int *error_code); + + /** + * @brief Get the present limit of how many data elements will be retained by the buffer. + * This value can be changed with sbapi_data_buffer_set_buffer_capacity(). + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return A count of how many items the buffer will store before data may be lost + */ + DLL_DECL unsigned long sbapi_data_buffer_get_buffer_capacity(long deviceID, + long featureID, int *error_code); + + /** + * @brief Get the maximum possible configurable size for the data buffer + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return The largest value that may be set with sbapi_data_buffer_set_buffer_capacity(). + */ + DLL_DECL unsigned long sbapi_data_buffer_get_buffer_capacity_maximum( + long deviceID, long featureID, int *error_code); + + /** + * @brief Get the minimum possible configurable size for the data buffer + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return The smallest value that may be set with sbapi_data_buffer_set_buffer_capacity(). + */ + DLL_DECL unsigned long sbapi_data_buffer_get_buffer_capacity_minimum( + long deviceID, long featureID, int *error_code); + + /** + * @brief Set the number of data elements that the buffer should retain + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param capacity (Input) Limit on the number of data elements to store. This is + * bounded by what is returned by sbapi_data_buffer_get_buffer_capacity_minimum() and + * sbapi_data_buffer_get_buffer_capacity_maximum(). + */ + DLL_DECL void sbapi_data_buffer_set_buffer_capacity(long deviceID, + long featureID, int *error_code, unsigned long capacity); + + /** + * This function returns the total number of acquisition delay feature + * instances available in the indicated device. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * + * @return the number of features that will be returned by a call to + * sbapi_get_data_buffer_features(). + */ + DLL_DECL int sbapi_get_number_of_acquisition_delay_features(long deviceID, int *errorCode); + + /** + * This function returns IDs for accessing each data buffer + * feature instance for this device. The IDs are only valid when used with + * the deviceID used to obtain them. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param features (Output) preallocated buffer to hold returned feature handles + * @param max_features (Input) size of preallocated buffer + * + * @return the number of data buffer feature IDs that were copied. + */ + DLL_DECL int sbapi_get_acquisition_delay_features(long deviceID, int *errorCode, + long *buffer, unsigned int maxLength); + + /** + * Set the acquisition delay in microseconds. This may also be referred to as the + * trigger delay. In any event, it is the time between some event (such as a request + * for data, or an external trigger pulse) and when data acquisition begins. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @param delay_usec (Input) The new delay to use in microseconds + */ + DLL_DECL void sbapi_acquisition_delay_set_delay_microseconds(long deviceID, long featureID, + int *errorCode, unsigned long delay_usec); + + /** + * Get the acquisition delay in microseconds. This may also be referred to as the + * trigger delay. In any event, it is the time between some event (such as a request + * for data, or an external trigger pulse) and when data acquisition begins. + * + * Note that not all devices support reading this value back. In these cases, the + * returned value will be the last value sent to sbapi_acquisition_delay_set_delay_microseconds(). + * If no value has been set and the value cannot be read back, this function will + * indicate an error. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return The acquisition delay in microseconds + */ + DLL_DECL unsigned long sbapi_acquisition_delay_get_delay_microseconds(long deviceID, + long featureID, int *errorCode); + + /** + * Get the allowed step size for the acquisition delay in microseconds. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return The acquisition delay step size in microseconds + */ + DLL_DECL unsigned long sbapi_acquisition_delay_get_delay_increment_microseconds(long deviceID, + long featureID, int *errorCode); + + /** + * Get the maximum allowed acquisition delay in microseconds. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return The maximum acquisition delay in microseconds + */ + DLL_DECL unsigned long sbapi_acquisition_delay_get_delay_maximum_microseconds(long deviceID, + long featureID, int *errorCode); + + /** + * Get the minimum allowed acquisition delay in microseconds. + * + * @param deviceID (Input) The index of a device previously opened with sbapi_open_device(). + * @param featureID (Input) The ID of a particular instance of a data buffer + * feature. Valid IDs can be found with the + * sbapi_get_data_buffer_features() function. + * @param error_code (Output) A pointer to an integer that can be used for storing + * error codes. + * @return The minimum acquisition delay in microseconds + */ + DLL_DECL unsigned long sbapi_acquisition_delay_get_delay_minimum_microseconds(long deviceID, + long featureID, int *errorCode); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* SEABREEZEAPI_H */ diff --git a/source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h b/source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h new file mode 100644 index 0000000..f5abf42 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file SeaBreezeAPIConstants.h + * @date January 2015 + * @author Ocean Optics, Inc. + * + * This file defines constants for use with SeaBreeze API + * implementations. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ +#ifndef SEABREEZEAPICONSTANTS_H +#define SEABREEZEAPICONSTANTS_H + +/* Macros and constants */ +#define SET_ERROR_CODE(code) do { if(NULL != errorCode) { *errorCode = code; } } while(0) + +#ifdef ERROR_SUCCESS +#undef ERROR_SUCCESS +#endif + +/* Constants */ +#define ERROR_SUCCESS 0 +#define ERROR_INVALID_ERROR 1 +#define ERROR_NO_DEVICE 2 +#define ERROR_FAILED_TO_CLOSE 3 +#define ERROR_NOT_IMPLEMENTED 4 +#define ERROR_FEATURE_NOT_FOUND 5 +#define ERROR_TRANSFER_ERROR 6 +#define ERROR_BAD_USER_BUFFER 7 +#define ERROR_INPUT_OUT_OF_BOUNDS 8 +#define ERROR_SPECTROMETER_SATURATED 9 +#define ERROR_VALUE_NOT_FOUND 10 + +#endif /* SEABREEZEAPICONSTANTS_H */ diff --git a/source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h new file mode 100644 index 0000000..eb8d2c8 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h @@ -0,0 +1,58 @@ +/***************************************************//** + * @file SerialNumberFeatureAdapter.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows + * access to SeaBreeze SerialNumberFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_SERIALNUMBERFEATUREADAPTER_H +#define SEABREEZE_SERIALNUMBERFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class SerialNumberFeatureAdapter + : public FeatureAdapterTemplate { + public: + SerialNumberFeatureAdapter(SerialNumberFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~SerialNumberFeatureAdapter(); + + int getSerialNumber(int *errorCode, char *buffer, int buffer_length); + unsigned char getSerialNumberMaximumLength(int *errorCode); + + }; + + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h new file mode 100644 index 0000000..cf3a65d --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h @@ -0,0 +1,56 @@ +/***************************************************//** + * @file ShutterFeatureAdapter.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows + * access to SeaBreeze ShutterFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_SHUTTERFEATUREADAPTER_H +#define SEABREEZE_SHUTTERFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class ShutterFeatureAdapter + : public FeatureAdapterTemplate { + public: + ShutterFeatureAdapter(ShutterFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~ShutterFeatureAdapter(); + + void setShutterOpen(int *errorCode, bool open); + }; + + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h new file mode 100644 index 0000000..2ec42b4 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h @@ -0,0 +1,74 @@ +/***************************************************//** + * @file SpectrometerFeatureAdapter.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows + * access to SeaBreeze OOISpectrometerFeature instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_SPECTROMETER_FEATURE_ADAPTER_H +#define SEABREEZE_SPECTROMETER_FEATURE_ADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "common/buses/Bus.h" +#include "common/protocols/Protocol.h" +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class SpectrometerFeatureAdapter : public FeatureAdapterTemplate { + public: + SpectrometerFeatureAdapter( + OOISpectrometerFeatureInterface *spec, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~SpectrometerFeatureAdapter(); + + /* Spectrometer commands */ + int getUnformattedSpectrum(int *errorCode, + unsigned char *buffer, int bufferLength); + int getFormattedSpectrum(int *errorCode, + double* buffer, int bufferLength); + int getUnformattedSpectrumLength(int *errorCode); + int getFormattedSpectrumLength(int *errorCode); + void setTriggerMode(int *errorCode, int mode); + int getWavelengths(int *errorCode, double *wavelengths, int length); + int getElectricDarkPixelCount(int *errorCode); + int getElectricDarkPixelIndices(int *errorCode, + int *indices, int length); + void setIntegrationTimeMicros(int *errorCode, + unsigned long integrationTimeMicros); + long getMinimumIntegrationTimeMicros(int *errorCode); + long getMaximumIntegrationTimeMicros(int *errorCode); + double getMaximumIntensity(int *errorCode); + }; + + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h new file mode 100644 index 0000000..6ed2264 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h @@ -0,0 +1,60 @@ +/***************************************************//** + * @file SpectrumProcessingFeatureAdapter.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * This is a wrapper that allows + * access to SeaBreeze SpectrumProcessingFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_SPECTRUMPROCESSINGFEATUREADAPTER_H +#define SEABREEZE_SPECTRUMPROCESSINGFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class SpectrumProcessingFeatureAdapter + : public FeatureAdapterTemplate { + public: + SpectrumProcessingFeatureAdapter(SpectrumProcessingFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~SpectrumProcessingFeatureAdapter(); + + unsigned char readSpectrumProcessingBoxcarWidth(int *errorCode); + unsigned short int readSpectrumProcessingScansToAverage(int *errorCode); + void writeSpectrumProcessingBoxcarWidth(int *errorCode, unsigned char boxcarWidth); + void writeSpectrumProcessingScansToAverage(int *errorCode, unsigned short int scansToAverage); + + }; + + } +} + +#endif \ No newline at end of file diff --git a/source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h new file mode 100644 index 0000000..54d208b --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file StrayLightCoeffsFeatureAdapter.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows + * access to SeaBreeze StrayLightCoeffFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_STRAYLIGHTCOEFFSFEATUREADAPTER_H +#define SEABREEZE_STRAYLIGHTCOEFFSFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class StrayLightCoeffsFeatureAdapter + : public FeatureAdapterTemplate { + public: + StrayLightCoeffsFeatureAdapter(StrayLightCoeffsFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~StrayLightCoeffsFeatureAdapter(); + + int readStrayLightCoeffs(int *errorCode, double *buffer, + int bufferLength); + }; + + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h new file mode 100644 index 0000000..e5bd4a0 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h @@ -0,0 +1,56 @@ +/***************************************************//** + * @file StrobeLampFeatureAdapter.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows + * access to SeaBreeze StrobeLampFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_STROBELAMPFEATUREADAPTER_H +#define SEABREEZE_STROBELAMPFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class StrobeLampFeatureAdapter + : public FeatureAdapterTemplate { + public: + StrobeLampFeatureAdapter(StrobeLampFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~StrobeLampFeatureAdapter(); + + void setStrobeLampEnable(int *errorCode, bool enable); + }; + + } +} + +#endif diff --git a/source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h new file mode 100644 index 0000000..7ff3fd0 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h @@ -0,0 +1,58 @@ +/***************************************************//** + * @file TemperatureFeatureAdapter.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * This is a wrapper that allows + * access to SeaBreeze TemperatureFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_TEMPERATUREFEATUREADAPTER_H +#define SEABREEZE_TEMPERATUREFEATUREADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class TemperatureFeatureAdapter + : public FeatureAdapterTemplate { + public: + TemperatureFeatureAdapter(TemperatureFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~TemperatureFeatureAdapter(); + + unsigned char readTemperatureCount(int *errorCode); + double readTemperature(int *errorCode, int index); + int readAllTemperatures(int *errorCode, double *buffer, int bufferLength); + }; + + } +} + +#endif \ No newline at end of file diff --git a/source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h b/source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h new file mode 100644 index 0000000..46813e1 --- /dev/null +++ b/source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h @@ -0,0 +1,61 @@ +/***************************************************//** + * @file ThermoElectricCoolerFeatureAdapter.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a wrapper that allows access to SeaBreeze + * TECFeatureInterface instances. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_THERMO_ELECTRIC_COOLER_FEATURE_ADAPTER_H +#define SEABREEZE_THERMO_ELECTRIC_COOLER_FEATURE_ADAPTER_H + +#include "api/seabreezeapi/FeatureAdapterTemplate.h" +#include "vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h" + +namespace seabreeze { + namespace api { + + class ThermoElectricCoolerFeatureAdapter + : public FeatureAdapterTemplate { + public: + ThermoElectricCoolerFeatureAdapter(ThermoElectricFeatureInterface *intf, + const FeatureFamily &f, + Protocol *p, Bus *b, unsigned short instanceIndex); + virtual ~ThermoElectricCoolerFeatureAdapter(); + + /* Thermoelectric cooler functions */ + double readTECTemperature(int *errorCode); + void setTECTemperature(int *errorCode, + double temperature_degrees_celsius); + void setTECEnable(int *errorCode, bool tecEnable); + void setTECFanEnable(int *errorCode, bool tecFanEnable); + }; + + } +} + +#endif diff --git a/source/OSIF/include/common/ByteVector.h b/source/OSIF/include/common/ByteVector.h new file mode 100644 index 0000000..8c168ca --- /dev/null +++ b/source/OSIF/include/common/ByteVector.h @@ -0,0 +1,63 @@ +/***************************************************//** + * @file ByteVector.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_BYTEVECTOR_H +#define SEABREEZE_BYTEVECTOR_H + +#include "common/SeaBreeze.h" +#include "common/Data.h" +#include + +namespace seabreeze { + + class ByteVector : public Data { + public: + ByteVector(); + /* Constructor that makes a copy of the given vector for internal use */ + ByteVector(const std::vector &that); + virtual ~ByteVector(); + /* Dimensionality of data. 0 for scalar, 1 for vector, + * 2 for a pair of related vectors (e.g. [X, Y] or matrix), + * 3 for 3D, etc. + */ + virtual int getNumberOfDimensions(); + + /* Get all of the unit descriptors associated with this Data. */ + virtual std::vector *getUnits(); + + /* Get the data associated with this instance */ + std::vector &getByteVector(); + + private: + std::vector *data; + }; + +} + +#endif diff --git a/source/OSIF/include/common/Data.h b/source/OSIF/include/common/Data.h new file mode 100644 index 0000000..ed23c67 --- /dev/null +++ b/source/OSIF/include/common/Data.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file Data.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a sort of a wrapper class that can encapsulate + * different kinds of data that may be returned as the + * result of a protocol transfer. The idea is that the + * data being passed back up from the device probably needs + * to be in some specific form, but we need to be able + * to convert it to whatever the receiver can use. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_DATA_H +#define SEABREEZE_DATA_H + +#include "common/SeaBreeze.h" +#include "common/UnitDescriptor.h" +#include + +namespace seabreeze { + + class Data { + public: + Data(); + virtual ~Data(); + /* Dimensionality of data. 0 for scalar, 1 for vector, + * 2 for a pair of related vectors (e.g. [X, Y] or matrix), + * 3 for 3D, etc. + */ + virtual int getNumberOfDimensions(); + + /* Get all of the unit descriptors associated with this Data. */ + virtual std::vector *getUnits(); + }; + +} + +#endif diff --git a/source/OSIF/include/common/DoubleVector.h b/source/OSIF/include/common/DoubleVector.h new file mode 100644 index 0000000..50c6d35 --- /dev/null +++ b/source/OSIF/include/common/DoubleVector.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file DoubleVector.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_DOUBLEVECTOR_H +#define SEABREEZE_DOUBLEVECTOR_H + +#include +#include "common/SeaBreeze.h" +#include "common/Data.h" + +namespace seabreeze { + + class DoubleVector : public Data { + public: + DoubleVector(); + DoubleVector(const std::vector &that); + virtual ~DoubleVector(); + /* Dimensionality of data. 0 for scalar, 1 for vector, + * 2 for a pair of related vectors (e.g. [X, Y] or matrix), + * 3 for 3D, etc. + */ + virtual int getNumberOfDimensions(); + + /* Get all of the unit descriptors associated with this Data. */ + virtual std::vector *getUnits(); + + /* Get the data associated with this instance */ + std::vector &getDoubleVector(); + + private: + std::vector *data; + }; + +} + +#endif diff --git a/source/OSIF/include/common/FloatVector.h b/source/OSIF/include/common/FloatVector.h new file mode 100644 index 0000000..69b6cb9 --- /dev/null +++ b/source/OSIF/include/common/FloatVector.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file FloatVector.h + * @date March 2010 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FLOATVECTOR_H +#define SEABREEZE_FLOATVECTOR_H + +#include +#include "common/SeaBreeze.h" +#include "common/Data.h" + +namespace seabreeze { + + class FloatVector : public Data { + public: + FloatVector(); + FloatVector(const std::vector &that); + virtual ~FloatVector(); + /* Dimensionality of data. 0 for scalar, 1 for vector, + * 2 for a pair of related vectors (e.g. [X, Y] or matrix), + * 3 for 3D, etc. + */ + virtual int getNumberOfDimensions(); + + /* Get all of the unit descriptors associated with this Data. */ + virtual std::vector *getUnits(); + + /* Get the data associated with this instance */ + std::vector &getFloatVector(); + + private: + std::vector *data; + }; + +} + +#endif diff --git a/source/OSIF/include/common/Log.h b/source/OSIF/include/common/Log.h new file mode 100644 index 0000000..242f8aa --- /dev/null +++ b/source/OSIF/include/common/Log.h @@ -0,0 +1,132 @@ +/** + @file Log.h + @brief Interface to Log + @author Mark Zieg + + LICENSE: + + SeaBreeze Copyright (C) 2014, Ocean Optics Inc + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject + to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef SEABREEZE_LOG_H +#define SEABREEZE_LOG_H + +#include "api/DllDecl.h" + +#include +#include +#include +#include + +#ifdef OOI_DEBUG + #define OOI_LOG_PRINT 1 +#else + #define OOI_LOG_PRINT 0 +#endif + +#ifdef __cplusplus + +/** +* @brief instantiate logger in the current function +* @param s (Input) function name (typically __FUNCTION__) +*/ +#define LOG(s) Log logger(s); + +/** +* @brief log a printf string (and optional arguments) if debugging is enabled +* @note double parens: call as LOG_DEBUG(("variable x is %d, y is %f", x, y)); +* @see http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing +*/ +#define LOG_DEBUG(s) do { if (OOI_LOG_PRINT) logger.debug s; } while (0) + +//! @see LOG_DEBUG +#define LOG_INFO(s) do { if (OOI_LOG_PRINT) logger.info s; } while (0) + +//! @see LOG_DEBUG +#define LOG_WARN(s) do { if (OOI_LOG_PRINT) logger.warn s; } while (0) + +//! @see LOG_DEBUG +#define LOG_ERROR(s) do { if (OOI_LOG_PRINT) logger.error s; } while (0) + +#define OOI_LOG_LEVEL_NEVER 0 +#define OOI_LOG_LEVEL_ERROR 1 +#define OOI_LOG_LEVEL_WARN 2 +#define OOI_LOG_LEVEL_INFO 3 +#define OOI_LOG_LEVEL_DEBUG 4 +#define OOI_LOG_LEVEL_TRACE 5 + +/** +* @brief Simple logger for OOI applications. +* @todo Provide better thread support (hard to tell what thread model +* the caller may be using...) +* @todo Provide flat C interface (e.g. for NativeUSBWinUSB.c, test apps) +* +* Provides automatic heirarchical call-stack indentation. +*/ +class DLL_DECL Log +{ + public: + Log(const char *s); + ~Log(); + + // public class methods + static void setLogLevel(int lvl); + static void setLogLevel(const std::string& s); + static void setLogFile(void *f); + + // public instance methods + void debug(const char *fmt, ...); + void info (const char *fmt, ...); + void warn (const char *fmt, ...); + void error(const char *fmt, ...); + + // these must be public for C interface to work + static unsigned logLevel; + void formatAndSend(int lvl, const char *lvlName, + const char *separator, const char *fmt, va_list args); + + private: + // private class attributes + static FILE *logFile; + static std::stack* callstack; + + // private instance methods + void trace(const char *fmt, ...); +}; + +extern "C" { +#endif /* __cplusplus */ + +// We need the flattened C interface if we want to call from Cygwin (mainly +// to set log level)...see http://cygwin.com/ml/cygwin/2006-04/msg00251.html +void DLL_DECL seabreeze_log_set_level_int(int lvl); +void DLL_DECL seabreeze_log_set_level_string(const char *s); +void DLL_DECL seabreeze_log_debug(const char *fmt, ...); +void DLL_DECL seabreeze_log_info (const char *fmt, ...); +void DLL_DECL seabreeze_log_warn (const char *fmt, ...); +void DLL_DECL seabreeze_log_error(const char *fmt, ...); + +#ifdef __cplusplus +}; + +#endif /* __cplusplus */ +#endif diff --git a/source/OSIF/include/common/SeaBreeze.h b/source/OSIF/include/common/SeaBreeze.h new file mode 100644 index 0000000..aaa1c5e --- /dev/null +++ b/source/OSIF/include/common/SeaBreeze.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file SeaBreeze.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This provides some project-wide constants and definitions. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_H +#define SEABREEZE_H + +typedef unsigned char byte; + +#ifdef WINDOWS +/* Visual studio does not implement declared exception + * specification but accepts it with a warning. This + * suppresses the warning (4290). + */ +#pragma warning( disable : 4290 ) +#endif /* WINDOWS */ + +#endif /* SEABREEZE_H */ diff --git a/source/OSIF/include/common/U32Vector.h b/source/OSIF/include/common/U32Vector.h new file mode 100644 index 0000000..93785b4 --- /dev/null +++ b/source/OSIF/include/common/U32Vector.h @@ -0,0 +1,77 @@ +/***************************************************//** + * @file U32Vector.h + * @date September 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_U32VECTOR_H +#define SEABREEZE_U32VECTOR_H + +#include +#include "common/SeaBreeze.h" +#include "common/Data.h" + +/* This class requires a 32-bit integer type. This will need a little help + * to know what the target machine is, so this tries to work it out. + */ +#ifdef _MSC_VER +/* Visual Studio */ +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +#else +/* C99 compatible */ +#include +#endif + + +namespace seabreeze { + + class U32Vector : public Data { + public: + U32Vector(); + /* Constructor that makes a copy of the given vector for internal use */ + U32Vector(const std::vector &that); + U32Vector(unsigned int length); + virtual ~U32Vector(); + /* Dimensionality of data. 0 for scalar, 1 for vector, + * 2 for a pair of related vectors (e.g. [X, Y] or matrix), + * 3 for 3D, etc. + */ + virtual int getNumberOfDimensions(); + + /* Get all of the unit descriptors associated with this Data. */ + virtual std::vector *getUnits(); + + /* Get the data associated with this instance */ + std::vector &getU32Vector(); + + private: + std::vector *data; + }; + +} + +#endif diff --git a/source/OSIF/include/common/UShortVector.h b/source/OSIF/include/common/UShortVector.h new file mode 100644 index 0000000..7606375 --- /dev/null +++ b/source/OSIF/include/common/UShortVector.h @@ -0,0 +1,64 @@ +/***************************************************//** + * @file UShortVector.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_USHORTVECTOR_H +#define SEABREEZE_USHORTVECTOR_H + +#include +#include "common/SeaBreeze.h" +#include "common/Data.h" + +namespace seabreeze { + + class UShortVector : public Data { + public: + UShortVector(); + /* Constructor that makes a copy of the given vector for internal use */ + UShortVector(const std::vector &that); + UShortVector(unsigned int length); + virtual ~UShortVector(); + /* Dimensionality of data. 0 for scalar, 1 for vector, + * 2 for a pair of related vectors (e.g. [X, Y] or matrix), + * 3 for 3D, etc. + */ + virtual int getNumberOfDimensions(); + + /* Get all of the unit descriptors associated with this Data. */ + virtual std::vector *getUnits(); + + /* Get the data associated with this instance */ + std::vector &getUShortVector(); + + private: + std::vector *data; + }; + +} + +#endif diff --git a/source/OSIF/include/common/UnitDescriptor.h b/source/OSIF/include/common/UnitDescriptor.h new file mode 100644 index 0000000..3a5c737 --- /dev/null +++ b/source/OSIF/include/common/UnitDescriptor.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file UnitDescriptor.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_UNITDESCRIPTOR_H +#define SEABREEZE_UNITDESCRIPTOR_H + +namespace seabreeze { + + class UnitDescriptor { + public: + UnitDescriptor(); + ~UnitDescriptor(); + + /* FIXME: need to define unit property getters */ + + }; + +} + +#endif diff --git a/source/OSIF/include/common/buses/Bus.h b/source/OSIF/include/common/buses/Bus.h new file mode 100644 index 0000000..491604c --- /dev/null +++ b/source/OSIF/include/common/buses/Bus.h @@ -0,0 +1,66 @@ +/***************************************************//** + * @file Bus.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This provides a base class for all sorts of buses. A bus + * is a mechanism for transferring a stream of data from one + * point to another. The bus does not concern itself with the + * contents of the data stream. At most, it may use hints to + * determine how a particular message will be moved if this + * is necessary to complete the operation. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_BUS_H +#define SEABREEZE_BUS_H + +#include "common/protocols/ProtocolHint.h" +#include "common/buses/TransferHelper.h" +#include "common/buses/BusFamily.h" +#include "common/buses/DeviceLocatorInterface.h" +#include "common/exceptions/IllegalArgumentException.h" + +namespace seabreeze { + + class Bus { + public: + Bus(); + virtual ~Bus(); + virtual TransferHelper *getHelper(const std::vector &hints) const = 0; + virtual BusFamily getBusFamily() const = 0; + /* Associate this Bus instance with a particular device location. + * This MUST be done before open or close can be used. + */ + virtual void setLocation(const DeviceLocatorInterface &location) + throw (IllegalArgumentException) = 0; + virtual bool open() = 0; + virtual void close() = 0; + virtual DeviceLocatorInterface *getLocation() = 0; + }; + +} + +#endif diff --git a/source/OSIF/include/common/buses/BusFamilies.h b/source/OSIF/include/common/buses/BusFamilies.h new file mode 100644 index 0000000..7b77043 --- /dev/null +++ b/source/OSIF/include/common/buses/BusFamilies.h @@ -0,0 +1,86 @@ +/***************************************************//** + * @file BusFamilies.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This provides a way to get references to different kinds of buses + * (e.g. USB, Ethernet, serial) generically. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef BUSFAMILIES_H +#define BUSFAMILIES_H + +#include "common/buses/BusFamily.h" +#include + +namespace seabreeze { + + class USBBusFamily : public BusFamily { + public: + USBBusFamily(); + virtual ~USBBusFamily(); + }; + + class EthernetBusFamily : public BusFamily { + public: + EthernetBusFamily(); + virtual ~EthernetBusFamily(); + }; + + class RS232BusFamily : public BusFamily { + public: + RS232BusFamily(); + virtual ~RS232BusFamily(); + }; + + class TCPIPv4BusFamily : public BusFamily { + public: + TCPIPv4BusFamily(); + virtual ~TCPIPv4BusFamily(); + }; + + class UDPIPv4BusFamily : public BusFamily { + public: + UDPIPv4BusFamily(); + virtual ~UDPIPv4BusFamily(); + }; + + class BusFamilies { + public: + const USBBusFamily USB; + const EthernetBusFamily ETHERNET; + const RS232BusFamily RS232; + const TCPIPv4BusFamily TCPIPv4; + const UDPIPv4BusFamily UDPIPv4; + + BusFamilies(); + ~BusFamilies(); + std::vector getAllBusFamilies(); + }; + +} + +#endif /* BUSFAMILIES_H */ diff --git a/source/OSIF/include/common/buses/BusFamily.h b/source/OSIF/include/common/buses/BusFamily.h new file mode 100644 index 0000000..d1dbb97 --- /dev/null +++ b/source/OSIF/include/common/buses/BusFamily.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file BusFamily.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This provides a way to describe different kinds of buses + * (e.g. USB, Ethernet, serial) generically. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ +#ifndef BUSFAMILY_H +#define BUSFAMILY_H + +#include + +namespace seabreeze { + class BusFamily { + public: + virtual ~BusFamily(); + virtual std::string getName() const; + virtual bool equals(const BusFamily &that); + + protected: + BusFamily(std::string name, int id); + + private: + std::string busName; + int type; + }; + +} + +#endif /* BUSFAMILY_H */ diff --git a/source/OSIF/include/common/buses/DeviceLocationProberInterface.h b/source/OSIF/include/common/buses/DeviceLocationProberInterface.h new file mode 100644 index 0000000..3cf63e1 --- /dev/null +++ b/source/OSIF/include/common/buses/DeviceLocationProberInterface.h @@ -0,0 +1,58 @@ +/***************************************************//** + * @file DeviceLocationProberInterface.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * DeviceLocatorInterface provides a base interface for + * classes that allow the location of a device to be + * probed in a bus-specific way. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef DEVICELOCATIONPROBERINTERFACE_H +#define DEVICELOCATIONPROBERINTERFACE_H + +#include +#include "common/buses/DeviceLocatorInterface.h" + +namespace seabreeze { + + class DeviceLocationProberInterface { + public: + virtual ~DeviceLocationProberInterface() = 0; + + /* Report how many devices of this type are available */ + virtual std::vector *probeDevices() = 0; + + protected: + DeviceLocationProberInterface(); + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline DeviceLocationProberInterface::~DeviceLocationProberInterface() {} + +} + +#endif /* DEVICELOCATIONPROBERINTERFACE_H */ diff --git a/source/OSIF/include/common/buses/DeviceLocatorInterface.h b/source/OSIF/include/common/buses/DeviceLocatorInterface.h new file mode 100644 index 0000000..caccd5f --- /dev/null +++ b/source/OSIF/include/common/buses/DeviceLocatorInterface.h @@ -0,0 +1,82 @@ +/***************************************************//** + * @file DeviceLocatorInterface.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * DeviceLocatorInterface provides a base interface for + * classes that allow the location of a device to be + * specified in a bus-specific way. For instance, a + * USB DeviceLocator might include a device path or + * index, and a socket DeviceLocator might include an + * IP address and port number. This allows + * devices that cannot be identified by probing to still + * be found easily. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef DEVICELOCATORINTERFACE_H +#define DEVICELOCATORINTERFACE_H + +#include +#include "common/buses/BusFamily.h" + +namespace seabreeze { + + class DeviceLocatorInterface { + public: + virtual ~DeviceLocatorInterface() = 0; + + /** + * Get a unique identifier for this location. This can be any value + * as long as it is globally unique. + */ + virtual unsigned long getUniqueLocation() const = 0; + + /** + * Determine whether this DeviceLocator refers to the same device + * as another. + */ + virtual bool equals(DeviceLocatorInterface &that) = 0; + + /** + * Get a human-readable string that describes the location + */ + virtual std::string getDescription() = 0; + + /** + * Get a description of the type of bus that the device is associated with + */ + virtual BusFamily getBusFamily() const = 0; + + /* Get an exact copy of this instance */ + virtual DeviceLocatorInterface *clone() const = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline DeviceLocatorInterface::~DeviceLocatorInterface() {} + +} + +#endif /* DEVICELOCATORINTERFACE_H */ diff --git a/source/OSIF/include/common/buses/TransferHelper.h b/source/OSIF/include/common/buses/TransferHelper.h new file mode 100644 index 0000000..8d7988e --- /dev/null +++ b/source/OSIF/include/common/buses/TransferHelper.h @@ -0,0 +1,58 @@ +/***************************************************//** + * @file TransferHelper.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is effectively an interface for wrappers around bus + * activity. These wrappers may be selected from a Bus + * based on certain hints provided by a Protocol or its + * various Exchanges. All that this specifies is that a + * given object must be able to send() and receive() data + * across its particular (encapsulated) Bus. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_TRANSFERHELPER_H +#define SEABREEZE_TRANSFERHELPER_H + +#include "common/SeaBreeze.h" +#include "common/exceptions/BusTransferException.h" +#include + +namespace seabreeze { + + class TransferHelper { + public: + TransferHelper(); + virtual ~TransferHelper(); + virtual int receive(std::vector &buffer, unsigned int length) + throw (BusTransferException) = 0; + virtual int send(const std::vector &buffer, unsigned int length) const + throw (BusTransferException) = 0; + }; + +} + +#endif diff --git a/source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h b/source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h new file mode 100644 index 0000000..d07309d --- /dev/null +++ b/source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h @@ -0,0 +1,75 @@ +/***************************************************//** + * @file IPv4NetworkProtocol.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_IPV4NETWORKPROTOCOL_H +#define SEABREEZE_IPV4NETWORKPROTOCOL_H + +#include +#include + +namespace seabreeze { + class IPv4NetworkProtocol { + public: + virtual ~IPv4NetworkProtocol(); + virtual std::string getName() const; + virtual bool equals(const IPv4NetworkProtocol &that) const; + + protected: + IPv4NetworkProtocol(std::string name, int id); + + private: + std::string protocolName; + int type; + }; + + class TCP_IPv4 : public IPv4NetworkProtocol { + public: + TCP_IPv4(); + virtual ~TCP_IPv4(); + }; + + class UDP_IPv4 : public IPv4NetworkProtocol { + public: + UDP_IPv4(); + virtual ~UDP_IPv4(); + }; + + class IPv4NetworkProtocols { + public: + const TCP_IPv4 TCP_IP4; + const UDP_IPv4 UDP_IP4; + + IPv4NetworkProtocols(); + ~IPv4NetworkProtocols(); + std::vector getAllIPv4NetworkProtocols(); + }; +} + +#endif /* SEABREEZE_IPV4NETWORKPROTOCOL_H */ + diff --git a/source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h b/source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h new file mode 100644 index 0000000..056fc90 --- /dev/null +++ b/source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h @@ -0,0 +1,66 @@ +/***************************************************//** + * @file IPv4SocketDeviceLocator.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_IPV4SOCKETDEVICELOCATOR_H +#define SEABREEZE_IPV4SOCKETDEVICELOCATOR_H + +#include "common/buses/DeviceLocatorInterface.h" +#include "common/buses/network/IPv4NetworkProtocol.h" +#include + +namespace seabreeze { + class IPv4SocketDeviceLocator : public DeviceLocatorInterface { + public: + IPv4SocketDeviceLocator(const IPv4NetworkProtocol &proto, std::string ip, + int portNumber); + virtual ~IPv4SocketDeviceLocator(); + + std::string getIPv4Address(); + int getPort(); + IPv4NetworkProtocol getIPv4NetworkProtocol(); + + /* Inherited from DeviceLocatorInterface */ + virtual unsigned long getUniqueLocation() const; + virtual bool equals(DeviceLocatorInterface &that); + virtual std::string getDescription(); + virtual BusFamily getBusFamily() const; + virtual DeviceLocatorInterface *clone() const; + + protected: + unsigned long computeLocationHash(); + + IPv4NetworkProtocol protocol; + std::string ipAddr; + int port; + unsigned long locationHash; + }; +} + +#endif /* SEABREEZE_IPV4SOCKETDEVICELOCATOR_H */ + diff --git a/source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h b/source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h new file mode 100644 index 0000000..47dee40 --- /dev/null +++ b/source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h @@ -0,0 +1,75 @@ +/***************************************************//** + * @file TCPIPv4SocketBus.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_TCPIPV4SOCKETBUS_H +#define SEABREEZE_TCPIPV4SOCKETBUS_H + +#include "common/buses/Bus.h" +#include "common/exceptions/IllegalArgumentException.h" +#include "native/network/Socket.h" +#include + +namespace seabreeze { + class TCPIPv4SocketBus : public Bus { + public: + TCPIPv4SocketBus(); + virtual ~TCPIPv4SocketBus(); + + virtual Socket *getSocketDescriptor(); + + virtual BusFamily getBusFamily() const; + + virtual void setLocation(const DeviceLocatorInterface &location) + throw (IllegalArgumentException); + virtual DeviceLocatorInterface *getLocation(); + virtual TransferHelper *getHelper( + const std::vector &hints) const; + + /* Pure virtual methods */ + virtual bool open() = 0; + virtual void close() = 0; + + + protected: + void addHelper(ProtocolHint *hint, TransferHelper *helper); + void clearHelpers(); + + Socket *socket; + DeviceLocatorInterface *deviceLocator; + + /* These vectors should really be in a map, but that didn't want to + * work easily. Since there will likely be about 2 entries in here, + * storing in a pair of vectors for now won't hurt anything. + */ + std::vector helperKeys; + std::vector helperValues; + }; +} + +#endif /* SEABREEZE_TCPIPV4SOCKETBUS_H */ diff --git a/source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h b/source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h new file mode 100644 index 0000000..d7e4b69 --- /dev/null +++ b/source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file TCPIPv4SocketTransferHelper.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_TCPIPV4SOCKETTRANSFERHELPER_H +#define SEABREEZE_TCPIPV4SOCKETTRANSFERHELPER_H + +#include "common/buses/TransferHelper.h" +#include "native/network/Socket.h" + +namespace seabreeze { + class TCPIPv4SocketTransferHelper : public TransferHelper { + public: + TCPIPv4SocketTransferHelper(Socket *sock); + virtual ~TCPIPv4SocketTransferHelper(); + + virtual int receive(std::vector &buffer, unsigned int length) + throw (BusTransferException); + virtual int send(const std::vector &buffer, unsigned int length) const + throw (BusTransferException); + + protected: + Socket *socket; + }; +} + +#endif /* SEABREEZE_TCPIPV4SOCKETTRANSFERHELPER_H */ diff --git a/source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h b/source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h new file mode 100644 index 0000000..1c8c20c --- /dev/null +++ b/source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h @@ -0,0 +1,65 @@ +/***************************************************//** + * @file RS232DeviceLocator.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This class encapsulates the information needed to open + * a device on an RS232 bus. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef RS232DEVICELOCATOR_H +#define RS232DEVICELOCATOR_H + +#include "common/buses/DeviceLocatorInterface.h" +#include + +namespace seabreeze { + + class RS232DeviceLocator : public DeviceLocatorInterface { + public: + RS232DeviceLocator(std::string devicePath, int baudRate); + virtual ~RS232DeviceLocator(); + + std::string &getDevicePath(); + int getBaudRate(); + + /* Inherited from DeviceLocatorInterface */ + virtual unsigned long getUniqueLocation() const; + virtual bool equals(DeviceLocatorInterface &that); + virtual std::string getDescription(); + virtual BusFamily getBusFamily() const; + virtual DeviceLocatorInterface *clone() const; + + private: + void computeLocationHash(); + std::string devicePath; + int baudRate; + unsigned long locationHash; + }; + +} + +#endif /* RS232DEVICELOCATOR_H */ diff --git a/source/OSIF/include/common/buses/rs232/RS232Interface.h b/source/OSIF/include/common/buses/rs232/RS232Interface.h new file mode 100644 index 0000000..fad0b1e --- /dev/null +++ b/source/OSIF/include/common/buses/rs232/RS232Interface.h @@ -0,0 +1,63 @@ +/***************************************************//** + * @file RS232Interface.h + * @date April 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef RS232INTERFACE_H +#define RS232INTERFACE_H + +#include "common/buses/Bus.h" +#include "native/rs232/NativeRS232.h" +#include "native/rs232/RS232.h" +#include "common/exceptions/IllegalArgumentException.h" + +namespace seabreeze { + + class RS232Interface : public Bus { + public: + RS232Interface(); + virtual ~RS232Interface(); + virtual RS232 *getRS232Descriptor(); + virtual DeviceLocatorInterface *getLocation(); + virtual void setLocation(const DeviceLocatorInterface &location) + throw (IllegalArgumentException); + virtual BusFamily getBusFamily() const; + + /* Pure virtual methods */ + virtual TransferHelper *getHelper( + const std::vector &hints) const = 0; + virtual bool open() = 0; + virtual void close() = 0; + + protected: + RS232 *rs232; + DeviceLocatorInterface *deviceLocator; + }; + +} + +#endif /* RS232INTERFACE_H */ diff --git a/source/OSIF/include/common/buses/rs232/RS232TransferHelper.h b/source/OSIF/include/common/buses/rs232/RS232TransferHelper.h new file mode 100644 index 0000000..e912f95 --- /dev/null +++ b/source/OSIF/include/common/buses/rs232/RS232TransferHelper.h @@ -0,0 +1,65 @@ +/***************************************************//** + * @file RS232TransferHelper.h + * @date April 2011 + * @author Ocean Optics, Inc. + * + * This provides an abstraction around the RS232 bus. + * RS232 is pretty simple once the port is opened and + * configured, so this mostly just takes care of ensuring + * that all bytes are sent and received as required. + * + * This will effectively block on reads and writes until + * they are complete. A non-blocking transfer helper + * could be created to complement this if there was + * some need, but it is not clear who would be responsible + * for delayed reads or retransmits. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef RS232TRANSFERHELPER_H +#define RS232TRANSFERHELPER_H + +#include "common/buses/TransferHelper.h" +#include "native/rs232/RS232.h" + +namespace seabreeze { + + class RS232TransferHelper : public TransferHelper { + public: + RS232TransferHelper(RS232 *rs232Descriptor); + virtual ~RS232TransferHelper(); + + virtual int receive(std::vector &buffer, unsigned int length) + throw (BusTransferException); + virtual int send(const std::vector &buffer, unsigned int length) const + throw (BusTransferException); + + protected: + RS232 *rs232; + }; + +} + +#endif /* USBTRANSFERHELPER_H */ diff --git a/source/OSIF/include/common/buses/usb/USBDeviceLocator.h b/source/OSIF/include/common/buses/usb/USBDeviceLocator.h new file mode 100644 index 0000000..ea9f1d2 --- /dev/null +++ b/source/OSIF/include/common/buses/usb/USBDeviceLocator.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file USBDeviceLocator.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This class encapsulates the information needed to open + * a device on a USB bus. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USBDEVICELOCATOR_H +#define USBDEVICELOCATOR_H + +#include "common/buses/DeviceLocatorInterface.h" +#include + +namespace seabreeze { + + class USBDeviceLocator : public DeviceLocatorInterface { + public: + USBDeviceLocator(unsigned long ID); + virtual ~USBDeviceLocator(); + + /* Inherited from DeviceLocatorInterface */ + virtual unsigned long getUniqueLocation() const; + virtual bool equals(DeviceLocatorInterface &that); + virtual std::string getDescription(); + virtual BusFamily getBusFamily() const; + virtual DeviceLocatorInterface *clone() const; + + private: + unsigned long deviceID; + }; + +} + +#endif /* USBDEVICELOCATOR_H */ diff --git a/source/OSIF/include/common/buses/usb/USBInterface.h b/source/OSIF/include/common/buses/usb/USBInterface.h new file mode 100644 index 0000000..0717e9f --- /dev/null +++ b/source/OSIF/include/common/buses/usb/USBInterface.h @@ -0,0 +1,64 @@ +/***************************************************//** + * @file USBInterface.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is an abstract base class intended to be an interface + * for USB control objects. This allows USB devices to + * be opened generically (just by providing the index of + * the device on the bus) without any concern for + * the vendor ID, product ID, or underlying USB implementation. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USBINTERFACE_H +#define USBINTERFACE_H + +#include "common/buses/Bus.h" +#include "native/usb/NativeUSB.h" +#include "native/usb/USB.h" +#include "common/exceptions/IllegalArgumentException.h" + +namespace seabreeze { + + class USBInterface : public Bus { + public: + USBInterface(); + virtual ~USBInterface(); + virtual USB *getUSBDescriptor() const; + virtual DeviceLocatorInterface *getLocation(); + virtual void setLocation(const DeviceLocatorInterface &location) throw (IllegalArgumentException); + virtual BusFamily getBusFamily() const; + virtual bool open() = 0; + virtual void close() = 0; + + protected: + USB *usb; + DeviceLocatorInterface *deviceLocator; + }; + +} + +#endif /* USBINTERFACE_H */ diff --git a/source/OSIF/include/common/buses/usb/USBTransferHelper.h b/source/OSIF/include/common/buses/usb/USBTransferHelper.h new file mode 100644 index 0000000..ffd0945 --- /dev/null +++ b/source/OSIF/include/common/buses/usb/USBTransferHelper.h @@ -0,0 +1,66 @@ +/***************************************************//** + * @file USBTransferHelper.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a TransferHelper intended for USB communications. + * Each USBTransferHelper must specify a sending and + * receiving endpoint, which will tend to vary according to + * the type of data transfer being conducted. This adapts + * the send() and receive() methods required of a TransferHelper + * according to a particular type of transfer, which may be + * inferred from a ProtocolHint. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USBTRANSFERHELPER_H +#define USBTRANSFERHELPER_H + +#include "common/buses/TransferHelper.h" +#include "native/usb/USB.h" + +namespace seabreeze { + + class USBTransferHelper : public TransferHelper { + public: + USBTransferHelper(USB *usbDescriptor, int sendEndpoint, + int receiveEndpoint); + USBTransferHelper(USB *usbDescriptor); + virtual ~USBTransferHelper(); + + virtual int receive(std::vector &buffer, unsigned int length) + throw (BusTransferException); + virtual int send(const std::vector &buffer, unsigned int length) const + throw (BusTransferException); + + protected: + USB *usb; + int sendEndpoint; + int receiveEndpoint; + }; + +} + +#endif /* USBTRANSFERHELPER_H */ diff --git a/source/OSIF/include/common/devices/Device.h b/source/OSIF/include/common/devices/Device.h new file mode 100644 index 0000000..2c23100 --- /dev/null +++ b/source/OSIF/include/common/devices/Device.h @@ -0,0 +1,129 @@ +/***************************************************//** + * @file Device.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a base class for all sorts of devices. A + * device is really just an aggregation of features + * with the protocols and buses required to access them. + * A Device is intended to represent a single discrete + * piece of equipment that may have several capabilities + * (features) inside. The device may communicate to the + * outside world via seqences of bytes (a protocol) that + * are transferred across a physical medium (the bus). + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef DEVICE_H +#define DEVICE_H + +#include +#include +#include "common/buses/Bus.h" +#include "common/buses/BusFamily.h" +#include "common/buses/DeviceLocatorInterface.h" +#include "common/features/Feature.h" +#include "common/features/FeatureFamily.h" +#include "common/protocols/Protocol.h" + + +// usb endpoints are associated with a particular device. +typedef enum usbEndpointType +{ + kEndpointTypePrimaryOut, // slow speed + kEndpointTypePrimaryIn, // slow speed + kEndpointTypeSecondaryOut, // could be high speed + kEndpointTypeSecondaryIn, // could be high speed + kEndpointTypeSecondaryIn2 // generally high speed +} usbEndpointType; + +namespace seabreeze { + + class Device { + public: + Device(); + virtual ~Device(); + std::vector &getBuses(); + std::vector &getFeatures(); + std::vector &getProtocols(); + std::string &getName(); + + // get the usb endpoints, according to the endpointType enumerator, + // if the endpoint type is not used, a 0 is returned + // TODO: this should be delegated down into a Bus instance + // (e.g. found by getBusesByFamily()) for USB. It is inappropriate here. + unsigned char getEndpoint(int *errorCode, usbEndpointType endpointType); + + /* This will allow the driver to probe the device and initialize itself + * based on what it finds there. This should be called shortly after + * open(). The Device instance should use the indicated Bus instance to + * communicate with the hardware and get everything set up. It can + * use any appropriate protocol or protocols that are valid for the Bus. + */ + virtual bool initialize(const Bus &bus); + + /* Each instance of a device is assumed to be associated with a unique + * location on a bus. If the device is connected via multiple buses, then + * a special DeviceLocator and TransferHelper will have to hide those + * details. Otherwise, each connection to the device will be considered + * independent of all others. + */ + virtual DeviceLocatorInterface *getLocation(); + virtual void setLocation(const DeviceLocatorInterface &loc); + + virtual int open(); + + virtual void close(); + + virtual std::vector getBusesByFamily(BusFamily &family); + + virtual seabreeze::ProtocolFamily getSupportedProtocol( + seabreeze::FeatureFamily family, BusFamily bus) = 0; + + virtual std::vector getProtocolsByFamily( + seabreeze::ProtocolFamily &family); + + virtual Bus *getOpenedBus(); + + protected: + std::vector buses; + std::vector features; + std::vector protocols; + + std::string name; + unsigned char usbEndpoint_primary_out; + unsigned char usbEndpoint_primary_in; + unsigned char usbEndpoint_secondary_out; + unsigned char usbEndpoint_secondary_in; + unsigned char usbEndpoint_secondary_in2; + + + DeviceLocatorInterface *location; + Bus *openedBus; + }; + +} + +#endif /* DEVICE_H */ diff --git a/source/OSIF/include/common/exceptions/BusConnectException.h b/source/OSIF/include/common/exceptions/BusConnectException.h new file mode 100644 index 0000000..134b32e --- /dev/null +++ b/source/OSIF/include/common/exceptions/BusConnectException.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file BusConnectException.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This exception should be used when an error is + * encountered when trying to connect to a bus, + * generally a failed open() or socket connect() call, or + * a failed read() or write() due to an EOF. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef BUSCONNECTEXCEPTION_H +#define BUSCONNECTEXCEPTION_H + +#include "common/exceptions/BusException.h" + +namespace seabreeze { + + class BusConnectException : public BusException { + public: + BusConnectException(const std::string &error); + }; + +} + +#endif /* BUSCONNECTEXCEPTION_H */ diff --git a/source/OSIF/include/common/exceptions/BusException.h b/source/OSIF/include/common/exceptions/BusException.h new file mode 100644 index 0000000..960ed53 --- /dev/null +++ b/source/OSIF/include/common/exceptions/BusException.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file BusException.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a base class for a family of exceptions that + * arise from errors in bus transfers. These may be thrown + * at the bus layer, and all exceptions thrown at + * that layer must extend this class so that they can be + * uniformly handled. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_BUSEXCEPTION_H +#define SEABREEZE_BUSEXCEPTION_H + +#include + +namespace seabreeze { + + class BusException : public std::runtime_error { + public: + BusException(const std::string &error); + }; + +} + +#endif diff --git a/source/OSIF/include/common/exceptions/BusTransferException.h b/source/OSIF/include/common/exceptions/BusTransferException.h new file mode 100644 index 0000000..a4be719 --- /dev/null +++ b/source/OSIF/include/common/exceptions/BusTransferException.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file BusTransferException.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This exception should be used when an error is + * encountered when trying to read from or write to + * a bus. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef BUSTRANSFEREXCEPTION_H +#define BUSTRANSFEREXCEPTION_H + +#include "common/exceptions/BusException.h" + +namespace seabreeze { + + class BusTransferException : public BusException { + public: + BusTransferException(const std::string &error); + }; + +} + +#endif /* BUSTRANSFEREXCEPTION_H */ diff --git a/source/OSIF/include/common/exceptions/FeatureControlException.h b/source/OSIF/include/common/exceptions/FeatureControlException.h new file mode 100644 index 0000000..21b3014 --- /dev/null +++ b/source/OSIF/include/common/exceptions/FeatureControlException.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file FeatureControlException.h + * @date March 2009 + * @author Ocean Optics, Inc. + * + * This exception should be used when an error is + * encountered when trying to interact with a feature. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef FEATURECONTROLEXCEPTION_H +#define FEATURECONTROLEXCEPTION_H + +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class FeatureControlException : public FeatureException { + public: + FeatureControlException(const std::string &error); + }; + +} + +#endif /* FEATURECONTROLEXCEPTION_H */ diff --git a/source/OSIF/include/common/exceptions/FeatureException.h b/source/OSIF/include/common/exceptions/FeatureException.h new file mode 100644 index 0000000..b0163d4 --- /dev/null +++ b/source/OSIF/include/common/exceptions/FeatureException.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file FeatureException.h + * @date March 2009 + * @author Ocean Optics, Inc. + * + * This is a base class for a family of exceptions that + * arise from errors in feature interaction. These may be thrown + * at the feature layer, and all exceptions thrown at + * that layer must extend this class so that they can be + * uniformly handled. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FEATUREEXCEPTION_H +#define SEABREEZE_FEATUREEXCEPTION_H + +#include + +namespace seabreeze { + + class FeatureException : public std::runtime_error { + public: + FeatureException(const std::string &error); + }; + +} + +#endif diff --git a/source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h b/source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h new file mode 100644 index 0000000..654af22 --- /dev/null +++ b/source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file FeatureProtocolNotFoundException.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This exception should be used when a protocol is + * specified, but no matching implementation of that + * protocol can be found for a particular feature. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef FEATUREPROTOCOLNOTFOUNDEXCEPTION_H +#define FEATUREPROTOCOLNOTFOUNDEXCEPTION_H + +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class FeatureProtocolNotFoundException : public FeatureException { + public: + FeatureProtocolNotFoundException(const std::string &error); + }; + +} + +#endif /* FEATUREPROTOCOLNOTFOUNDEXCEPTION_H */ diff --git a/source/OSIF/include/common/exceptions/IllegalArgumentException.h b/source/OSIF/include/common/exceptions/IllegalArgumentException.h new file mode 100644 index 0000000..aa457b5 --- /dev/null +++ b/source/OSIF/include/common/exceptions/IllegalArgumentException.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file IllegalArgumentException.h + * @date March 2009 + * @author Ocean Optics, Inc. + * + * This is an exception for use when a value is passed to + * a method that is not permitted. This may include + * specifying a parameter that is out of bounds or of + * the wrong type. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_ILLEGALARGUMENTEXCEPTION_H +#define SEABREEZE_ILLEGALARGUMENTEXCEPTION_H + +#include +#include + +namespace seabreeze { + + class IllegalArgumentException : public std::invalid_argument { + public: + IllegalArgumentException(const std::string &error); + }; + +} + +#endif diff --git a/source/OSIF/include/common/exceptions/NumberFormatException.h b/source/OSIF/include/common/exceptions/NumberFormatException.h new file mode 100644 index 0000000..0489345 --- /dev/null +++ b/source/OSIF/include/common/exceptions/NumberFormatException.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file NumberFormatException.h + * @date March 2009 + * @author Ocean Optics, Inc. + * + * This is an exception for use when a string is to be + * parsed into a number but the string does not contain + * a recognizable number. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_NUMBERFORMATEXCEPTION_H +#define SEABREEZE_NUMBERFORMATEXCEPTION_H + +#include +#include + +namespace seabreeze { + + class NumberFormatException : public std::runtime_error { + public: + NumberFormatException(const std::string &error); + }; + +} + +#endif diff --git a/source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h b/source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h new file mode 100644 index 0000000..e593994 --- /dev/null +++ b/source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file ProtocolBusMismatchException.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This exception should be used when a protocol is + * specified, but the bus and protocol are not suited to + * each other (e.g. there is no bus helper for the hints + * the protocol can provide). + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef PROTOCOLBUSMISMATCHEXCEPTION_H +#define PROTOCOLBUSMISMATCHEXCEPTION_H + +#include "common/exceptions/ProtocolException.h" + +namespace seabreeze { + + class ProtocolBusMismatchException : public ProtocolException { + public: + ProtocolBusMismatchException(const std::string &error); + }; + +} + +#endif /* PROTOCOLBUSMISMATCHEXCEPTION_H */ diff --git a/source/OSIF/include/common/exceptions/ProtocolException.h b/source/OSIF/include/common/exceptions/ProtocolException.h new file mode 100644 index 0000000..34dcb97 --- /dev/null +++ b/source/OSIF/include/common/exceptions/ProtocolException.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file ProtocolException.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a base class for a family of exceptions that + * arise from errors in protocols. These may be thrown + * at the protocol layer, and all exceptions thrown at + * that layer must extend this class so that they can be + * uniformly handled. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_PROTOCOLEXCEPTION_H +#define SEABREEZE_PROTOCOLEXCEPTION_H + +#include +#include + +namespace seabreeze { + + class ProtocolException : public std::runtime_error { + public: + ProtocolException(const std::string &error); + }; + +} + +#endif diff --git a/source/OSIF/include/common/exceptions/ProtocolFormatException.h b/source/OSIF/include/common/exceptions/ProtocolFormatException.h new file mode 100644 index 0000000..6067315 --- /dev/null +++ b/source/OSIF/include/common/exceptions/ProtocolFormatException.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file ProtocolFormatException.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This exception should be used when a protocol message + * cannot be decoded, fails a checksum, or otherwise is + * out of spec. This may indicate that the driver is now + * out of synch with this code and that measures should be + * taken to re-establish communications. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef PROTOCOLFORMATEXCEPTION_H +#define PROTOCOLFORMATEXCEPTION_H + +#include "common/exceptions/ProtocolException.h" + +namespace seabreeze { + + class ProtocolFormatException : public ProtocolException { + public: + ProtocolFormatException(const std::string &error); + }; + +} + +#endif /* PROTOCOLFORMATEXCEPTION_H */ diff --git a/source/OSIF/include/common/exceptions/ProtocolTransactionException.h b/source/OSIF/include/common/exceptions/ProtocolTransactionException.h new file mode 100644 index 0000000..edde640 --- /dev/null +++ b/source/OSIF/include/common/exceptions/ProtocolTransactionException.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file ProtocolTransactionException.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * This is a base class for a family of exceptions that + * arise from errors in during OBPTransactions. These may be thrown + * at the protocol layer, and all exceptions thrown at + * that layer must extend this class so that they can be + * uniformly handled. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_PROTOCOLTRANSACTIONEXCEPTION_H +#define SEABREEZE_PROTOCOLTRANSACTIONEXCEPTION_H + +#include +#include + +namespace seabreeze { + + class ProtocolTransactionException : public std::runtime_error { + public: + ProtocolTransactionException(const std::string &error); + }; + +} + +#endif diff --git a/source/OSIF/include/common/features/Feature.h b/source/OSIF/include/common/features/Feature.h new file mode 100644 index 0000000..ad6163c --- /dev/null +++ b/source/OSIF/include/common/features/Feature.h @@ -0,0 +1,71 @@ +/***************************************************//** + * @file Feature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is an abstract interface that other feature types will + * implement. A Feature is taken to be some capability of + * a Device that is relatively self-contained. For instance, + * an analog output voltage would be a Feature. Features can + * also contain multiple functions; for instance, a TEC may + * be able to report a temperature, take a temperature as a + * set point, and turn on or off. These capabilities are + * interrelated, and would be considered a single feature. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef FEATURE_H +#define FEATURE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "common/features/FeatureFamily.h" +#include "common/exceptions/FeatureException.h" +#include "common/protocols/Protocol.h" +#include + +namespace seabreeze { + + class Feature { + public: + virtual ~Feature() = 0; + + /* Allow the object that represents a given feature to initialize + * itself by reading from the corresponding feature on the real + * device, and/or put the real device feature into a known state. + * This should return true if the feature is ready to be used, and false + * otherwise. + */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException) = 0; + + virtual FeatureFamily getFeatureFamily() = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline Feature::~Feature() {} +} + +#endif /* FEATURE_H */ diff --git a/source/OSIF/include/common/features/FeatureFamily.h b/source/OSIF/include/common/features/FeatureFamily.h new file mode 100644 index 0000000..66d814e --- /dev/null +++ b/source/OSIF/include/common/features/FeatureFamily.h @@ -0,0 +1,56 @@ +/***************************************************//** + * @file FeatureFamily.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This provides a way to describe different kinds + * features (e.g. spectrometer, TEC) generically. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FEATUREFAMILY_H +#define SEABREEZE_FEATUREFAMILY_H + +#include + +namespace seabreeze { + class FeatureFamily { + public: + FeatureFamily(); + virtual ~FeatureFamily(); + virtual std::string getName(); + virtual bool equals(const FeatureFamily &that); + virtual unsigned short getType(); + + protected: + FeatureFamily(std::string name, unsigned short id); + + private: + std::string featureName; + unsigned short type; + }; +} + +#endif diff --git a/source/OSIF/include/common/features/FeatureImpl.h b/source/OSIF/include/common/features/FeatureImpl.h new file mode 100644 index 0000000..8c9349a --- /dev/null +++ b/source/OSIF/include/common/features/FeatureImpl.h @@ -0,0 +1,88 @@ +/***************************************************//** + * @file FeatureImpl.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * This is a simple base class that other feature types will + * extend. A Feature is taken to be some capability of + * a Device that is relatively self-contained. For instance, + * an analog output voltage would be a Feature. Features can + * also contain multiple functions; for instance, a TEC may + * be able to report a temperature, take a temperature as a + * set point, and turn on or off. These capabilities are + * interrelated, and would be considered a single feature. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef FEATUREIMPL_H +#define FEATUREIMPL_H + +#include "common/SeaBreeze.h" +#include "common/exceptions/FeatureProtocolNotFoundException.h" +#include "common/features/Feature.h" +#include "common/protocols/ProtocolHelper.h" +#include + +namespace seabreeze { + /* This does virtual inheritance from Feature because it is assumed that + * in some cases there will be diamond inheritance. This will generally + * only happen where one top-level Feature is implemented by deriving from + * another Feature. + */ + class FeatureImpl : public virtual Feature { + public: + FeatureImpl(); + virtual ~FeatureImpl(); + + /* Allow the object that represents a given feature to initialize + * itself by reading from the corresponding feature on the real + * device, and/or put the real device feature into a known state. + * Overriding this is not required. This should return true if + * the feature is ready to be used, and false otherwise. + */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + virtual FeatureFamily getFeatureFamily() = 0; + + protected: + std::vector protocols; + + /* Protocols are described by their base class (Protocol) + * and may be designated that way. However, different + * functionality within a given command set may be broken + * into different implementation types, all of which extend + * the base Protocol class. This is a simple lookup mechanism + * to use the Protocol that some anonymous caller might + * provide as a point of reference to then find the extended + * Protocol class that can be used to access certain features. + */ + ProtocolHelper *lookupProtocolImpl(const Protocol &protocol) + throw (FeatureProtocolNotFoundException); + }; + +} + +#endif /* FEATUREIMPL_H */ diff --git a/source/OSIF/include/common/globals.h b/source/OSIF/include/common/globals.h new file mode 100644 index 0000000..6195a3d --- /dev/null +++ b/source/OSIF/include/common/globals.h @@ -0,0 +1,65 @@ +/** +* @file globals.h +* @author Mark Zieg +* @date Sep 26, 2012 +* @brief Provides a single point of maintenance for anything you want +* included, defined, or set across every file in the application +* (such as memory profiling, etc). Normally empty. +* +* LICENSE: +* +* SeaBreeze Copyright (C) 2014, Ocean Optics Inc +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef SEABREEZE_GLOBALS_H +#define SEABREEZE_GLOBALS_H + +// change to "#if 1" to enable memory heap debugging under Visual Studio +#if 0 + #ifdef _WINDOWS + + // For these to work right, you need to #define _CRTDBG_MAP_ALLOC and + // _CRTDBG_MAP_ALLOC_NEW in your Visual Studio project (i.e., Project + // -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor + // Definitions). #Defining them here in your header files DOES NOT + // WORK, because Visual Studio will internally include many system + // headers (including stdafx.h) long before you get here. + // + // @see http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.80%29.aspx + // @see http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/ebc7dd7a-f3c6-49f1-8a60-e381052f21b6, + + #pragma message(" (Windows memory debugging enabled)") + + // these will provide leak profiling for C malloc(), etc + #include + #include + + // these will provide leak profiling for C++ 'new' + #ifndef DBG_NEW + #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ) + #define new DBG_NEW + #endif + + #endif +#endif + +#endif diff --git a/source/OSIF/include/common/protocols/Exchange.h b/source/OSIF/include/common/protocols/Exchange.h new file mode 100644 index 0000000..785a62c --- /dev/null +++ b/source/OSIF/include/common/protocols/Exchange.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file Exchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is simply an interface that other classes will + * extend to have a common transfer() and getHints methods + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_EXCHANGE_H +#define SEABREEZE_EXCHANGE_H + +#include +#include "common/buses/TransferHelper.h" +#include "common/protocols/ProtocolHint.h" +#include "common/Data.h" +#include "common/exceptions/ProtocolException.h" + +namespace seabreeze { + + class Exchange { + public: + Exchange(); + Exchange(std::vector *hints); + virtual ~Exchange(); + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException) = 0; + virtual const std::vector &getHints(); + + protected: + std::vector *hints; + }; + +} + +#endif /* SEABREEZE_EXCHANGE_H */ + diff --git a/source/OSIF/include/common/protocols/Protocol.h b/source/OSIF/include/common/protocols/Protocol.h new file mode 100644 index 0000000..a86fc53 --- /dev/null +++ b/source/OSIF/include/common/protocols/Protocol.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file Protocol.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a simple identifier cookie that will allow two + * objects to agree on whether they support a given command + * set (protocol). Each will hold Protocol objects that they + * can then compare to see if they agree. This allows a loose + * binding between sets of Exchanges (elsewhere called protocols) + * and buses. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_PROTOCOL_H +#define SEABREEZE_PROTOCOL_H + +#include "common/protocols/ProtocolFamily.h" + +namespace seabreeze { + + class Protocol { + public: + Protocol(int id); + /* Copy constructor */ + Protocol(Protocol const &that); + virtual ~Protocol(); + bool equals(Protocol const &that); + + virtual ProtocolFamily getProtocolFamily() = 0; + + protected: + /* Protected for derived classes to use. */ + Protocol(); + int id; + }; + +} + +#endif diff --git a/source/OSIF/include/common/protocols/ProtocolFamily.h b/source/OSIF/include/common/protocols/ProtocolFamily.h new file mode 100644 index 0000000..987092f --- /dev/null +++ b/source/OSIF/include/common/protocols/ProtocolFamily.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file ProtocolFamily.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This provides a way to describe different kinds + * protocols (e.g. OOI, OBP) generically. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_PROTOCOLFAMILY_H +#define SEABREEZE_PROTOCOLFAMILY_H + +#include + +namespace seabreeze { + class ProtocolFamily { + public: + virtual ~ProtocolFamily(); + virtual std::string getName(); + virtual bool equals(const ProtocolFamily &that); + virtual unsigned short getType(); + + protected: + ProtocolFamily(std::string name, unsigned short id); + + private: + std::string protocolName; + unsigned short type; + }; +} + +#endif diff --git a/source/OSIF/include/common/protocols/ProtocolHelper.h b/source/OSIF/include/common/protocols/ProtocolHelper.h new file mode 100644 index 0000000..7e4a663 --- /dev/null +++ b/source/OSIF/include/common/protocols/ProtocolHelper.h @@ -0,0 +1,60 @@ +/***************************************************//** + * @file ProtocolHelper.h + * @date July 2009 + * @author Ocean Optics, Inc. + * + * Feature instances may look up an implementation object + * that matches a particular Protocol. All such implementations + * should in some way derive from ProtocolHelper so that + * Feature's look up mechanism can return them. It is + * expected that each Feature will have a corresponding + * interface at the Protocol layer; those interface classes + * should derive from this class, and their implementations + * will thus extend this as well. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_PROTOCOLHELPER_H +#define SEABREEZE_PROTOCOLHELPER_H + +#include "common/protocols/Protocol.h" + +namespace seabreeze { + + class ProtocolHelper { + public: + ProtocolHelper(Protocol *proto); + virtual ~ProtocolHelper(); + Protocol &getProtocol(); + + protected: + /* Protected for derived classes to use. */ + ProtocolHelper(); + Protocol *protocol; + }; + +} + +#endif diff --git a/source/OSIF/include/common/protocols/ProtocolHint.h b/source/OSIF/include/common/protocols/ProtocolHint.h new file mode 100644 index 0000000..5cc2c14 --- /dev/null +++ b/source/OSIF/include/common/protocols/ProtocolHint.h @@ -0,0 +1,73 @@ +/***************************************************//** + * @file ProtocolHint.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * Hints are used to identify particular characteristics about + * protocol Transfer objects. A hint may be used to indicate + * to a bus some detail it needs about making a transfer, e.g. + * what endpoint would be appropriate for USB. Note that the + * bus (or its helpers) are under no obligation to respect hints. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_PROTOCOLHINT_H +#define SEABREEZE_PROTOCOLHINT_H + +#include "common/SeaBreeze.h" +#include + +namespace seabreeze { + + class ProtocolHint { + public: + ProtocolHint(int id, std::string desc); + + /* For derived classes that will fill in their own values + * and for containers to be able to initialize themselves. + * This does not set any meaningful values and should not be + * relied on to create a proper instance. + */ + ProtocolHint(); + + virtual ~ProtocolHint(); + std::string getDescription(); + int getID() const; + + /* Overloading the equality operator so that this can be + * used as a key for hash_map associations without the actual + * key objects having to be identical. + */ + bool operator==(const ProtocolHint &that); + + protected: + int id; + std::string description; + }; + +} + +#endif /* SEABREEZE_PROTOCOLHINT_H */ + diff --git a/source/OSIF/include/common/protocols/Transaction.h b/source/OSIF/include/common/protocols/Transaction.h new file mode 100644 index 0000000..f37a529 --- /dev/null +++ b/source/OSIF/include/common/protocols/Transaction.h @@ -0,0 +1,82 @@ +/***************************************************//** + * @file Transaction.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * The Transaction class is simply a wrapper + * around one or more Transfer objects that must + * be executed in a particular order. This is + * provided for convenience. Some transfers + * to Ocean Optics spectrometers put the spectrometer + * into a particular state where it expects another + * action to be taken, and Transaction objects can + * be used to ensure that all expected operations occur. + * + * Some actions, like requesting a spectrum, do not + * necessarily require that the next action be a read + * operation. Thus, some Transfers that appear to follow + * a causal chain may not in fact make good Transactions. + * In this case, reading the status of the device until + * it reports data ready is a common operation before + * reading the spectrum. + * + * Note that the Transaction class has no notion of buses + * or protocols, and this is by design. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_TRANSACTION_H +#define SEABREEZE_TRANSACTION_H + +#include +#include "common/protocols/Exchange.h" +#include "common/protocols/Transfer.h" +#include "common/buses/TransferHelper.h" +#include "common/protocols/ProtocolHint.h" +#include "common/Data.h" + +namespace seabreeze { + + class Transaction : public Exchange { + public: + Transaction(); + virtual ~Transaction(); + void addTransfer(Transfer *xfer); + + /* Inherited from Exchange */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + protected: + std::vector transfers; + + private: + void updateHints(); + + }; + +} + +#endif /* SEABREEZE_TRANSACTION_H */ + diff --git a/source/OSIF/include/common/protocols/Transfer.h b/source/OSIF/include/common/protocols/Transfer.h new file mode 100644 index 0000000..10e6b03 --- /dev/null +++ b/source/OSIF/include/common/protocols/Transfer.h @@ -0,0 +1,93 @@ +/***************************************************//** + * @file Transfer.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * The Transfer class captures a simplex + * data transfer to or from a device. At this + * level, there is no notion of a particular bus, + * just data, length, and direction. + * + * The bus aspects are encapsulated in a "helper" + * object that must be provided when the Transfer + * is executed. The helper must provide send() and + * receive() methods taking a buffer and length + * only. All of the details in getting the transfer to + * or from the other end must be handled by the helper. + * The helper is expected to be created by some aspect + * of the driver for the device in question. It contains + * information about the connection and the particulars + * about routing data in and out. + * + * Note that the Transfer class is completely orthagonal to any + * particular protocol. It is expected that a protocol may be + * built up as a collection of related Transfer types. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_TRANSFER_H +#define SEABREEZE_TRANSFER_H + +#include +#include "common/protocols/Exchange.h" +#include "common/protocols/ProtocolHint.h" +#include "common/Data.h" + +typedef unsigned int direction_t; + +namespace seabreeze { + + class Transfer : public Exchange { + public: + + /* Note that the size of the provided buffer and the specified length + * of the transfer itself do not need to agree. If the transfer requires + * more space than the buffer provides, the buffer will be resized. + * If the buffer is created larger than is needed, only the given length + * will be sent or received. This allows for some freedom in buffer + * management. + */ + Transfer(std::vector *hints, std::vector *buffer, + direction_t direction, unsigned int length); + + virtual ~Transfer(); + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + static const direction_t TO_DEVICE; + static const direction_t FROM_DEVICE; + + protected: + Transfer(); + void checkBufferSize(); + + unsigned int length; + std::vector *buffer; + direction_t direction; + }; + +} + +#endif /* SEABREEZE_TRANSFER_H */ + diff --git a/source/OSIF/include/native/network/Inet4Address.h b/source/OSIF/include/native/network/Inet4Address.h new file mode 100644 index 0000000..a52058a --- /dev/null +++ b/source/OSIF/include/native/network/Inet4Address.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file Inet4Address.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_INET4ADDRESS_H +#define SEABREEZE_INET4ADDRESS_H + +#include +#include "common/exceptions/IllegalArgumentException.h" +#include "common/SeaBreeze.h" + +#ifdef _WINDOWS +#include +#else +#include +#endif + +namespace seabreeze { + class Inet4Address { + public: + Inet4Address(); + Inet4Address(std::string ipAddressQuads) + throw (IllegalArgumentException); + Inet4Address(struct in_addr *ipAddr); + Inet4Address(const Inet4Address &that); + ~Inet4Address(); + + struct in_addr getAddress(); + + std::string getHostAddress(); + + private: + struct in_addr in; + }; +} + +#endif /* SEABREEZE_INET4ADDRESS_H */ diff --git a/source/OSIF/include/native/network/Socket.h b/source/OSIF/include/native/network/Socket.h new file mode 100644 index 0000000..0446b79 --- /dev/null +++ b/source/OSIF/include/native/network/Socket.h @@ -0,0 +1,80 @@ +/***************************************************//** + * @file Socket.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_SOCKET_H +#define SEABREEZE_SOCKET_H + +/* Includes */ +#include "common/SeaBreeze.h" +#include "common/exceptions/BusTransferException.h" +#include "common/exceptions/BusConnectException.h" +#include "native/network/SocketException.h" +#include "native/network/UnknownHostException.h" +#include "native/network/Inet4Address.h" +#include + +namespace seabreeze { + + class Socket { + public: + static Socket *create(); + + virtual ~Socket(); + + virtual void connect(Inet4Address &addr, int port) + throw (UnknownHostException, BusConnectException) = 0; + virtual void connect(const std::string host, int port) + throw (UnknownHostException, BusConnectException) = 0; + + virtual void close() throw (BusException) = 0; + virtual bool isClosed() = 0; + virtual bool isBound() = 0; + + /* Socket options */ + virtual int getSOLinger() throw (SocketException) = 0; + virtual void setSOLinger(bool enable, int linger) + throw (SocketException) = 0; + virtual unsigned long getReadTimeoutMillis() + throw (SocketException) = 0; + virtual void setReadTimeoutMillis(unsigned long timeout) + throw (SocketException) = 0; + + /* Data transfer */ + virtual int read(unsigned char *buffer, unsigned long length) + throw (BusTransferException) = 0; + virtual int write(const unsigned char *buffer, unsigned long length) + throw (BusTransferException) = 0; + + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline Socket::~Socket() {} +} + +#endif /* SEABREEZE_SOCKET_H */ diff --git a/source/OSIF/include/native/network/SocketException.h b/source/OSIF/include/native/network/SocketException.h new file mode 100644 index 0000000..f7ef56c --- /dev/null +++ b/source/OSIF/include/native/network/SocketException.h @@ -0,0 +1,44 @@ +/***************************************************//** + * @file SocketException.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_SOCKETEXCEPTION_H +#define SEABREEZE_SOCKETEXCEPTION_H + +#include "common/exceptions/BusException.h" + +namespace seabreeze { + + class SocketException : public BusException { + public: + SocketException(const std::string &error); + }; + +} + +#endif /* SEABREEZE_SOCKETEXCEPTION_H */ diff --git a/source/OSIF/include/native/network/SocketTimeoutException.h b/source/OSIF/include/native/network/SocketTimeoutException.h new file mode 100644 index 0000000..d591778 --- /dev/null +++ b/source/OSIF/include/native/network/SocketTimeoutException.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file SocketTimeoutException.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + + +#ifndef SEABREEZE_SOCKETTIMEOUTEXCEPTION_H +#define SEABREEZE_SOCKETTIMEOUTEXCEPTION_H + +#include "native/network/SocketException.h" + +namespace seabreeze { + + class SocketTimeoutException : public SocketException { + public: + SocketTimeoutException(const std::string &error); + }; + +} + +#endif /* SEABREEZE_SOCKETTIMEOUTEXCEPTION_H */ diff --git a/source/OSIF/include/native/network/UnknownHostException.h b/source/OSIF/include/native/network/UnknownHostException.h new file mode 100644 index 0000000..261f80b --- /dev/null +++ b/source/OSIF/include/native/network/UnknownHostException.h @@ -0,0 +1,44 @@ +/***************************************************//** + * @file UnknownHostException.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_UNKNOWNHOSTEXCEPTION_H +#define SEABREEZE_UNKNOWNHOSTEXCEPTION_H + +#include + +namespace seabreeze { + + class UnknownHostException : public std::runtime_error { + public: + UnknownHostException(const std::string &error); + }; + +} + +#endif /* SEABREEZE_UNKNOWNHOSTEXCEPTION_H */ diff --git a/source/OSIF/include/native/network/posix/NativeSocketPOSIX.h b/source/OSIF/include/native/network/posix/NativeSocketPOSIX.h new file mode 100644 index 0000000..d8715b5 --- /dev/null +++ b/source/OSIF/include/native/network/posix/NativeSocketPOSIX.h @@ -0,0 +1,71 @@ +/***************************************************//** + * @file NativeSocketPOSIX.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_NATIVESOCKETPOSIX_H +#define SEABREEZE_NATIVESOCKETPOSIX_H + +#include "native/network/Socket.h" +#include "native/network/Inet4Address.h" +#include "common/exceptions/BusConnectException.h" +#include + +namespace seabreeze { + class NativeSocketPOSIX : public Socket { + public: + NativeSocketPOSIX(); + virtual ~NativeSocketPOSIX(); + + virtual void connect(Inet4Address &addr, int port) + throw (UnknownHostException, BusConnectException); + virtual void connect(const std::string hostname, int port) + throw (UnknownHostException, BusConnectException); + + virtual void close() throw (BusException); + virtual bool isClosed(); + virtual bool isBound(); + + virtual int getSOLinger() throw (SocketException); + virtual void setSOLinger(bool enable, int linger) throw (SocketException); + virtual unsigned long getReadTimeoutMillis() throw (SocketException); + virtual void setReadTimeoutMillis(unsigned long timeout) throw (SocketException); + + virtual int read(unsigned char *buffer, unsigned long length) + throw (BusTransferException); + virtual int write(const unsigned char *buffer, unsigned long length) + throw (BusTransferException); + + private: + int sock; + bool bound; + bool closed; + Inet4Address address; + }; +} + +#endif /* SEABREEZE_NATIVESOCKETPOSIX_H */ diff --git a/source/OSIF/include/native/network/windows/NativeSocketWindows.h b/source/OSIF/include/native/network/windows/NativeSocketWindows.h new file mode 100644 index 0000000..c19d0bf --- /dev/null +++ b/source/OSIF/include/native/network/windows/NativeSocketWindows.h @@ -0,0 +1,73 @@ +/***************************************************//** + * @file NativeSocketWindows.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_NATIVESOCKETWINDOWS_H +#define SEABREEZE_NATIVESOCKETWINDOWS_H + +#include "common/SeaBreeze.h" +#include "native/network/Socket.h" +#include "native/network/Inet4Address.h" +#include "common/exceptions/BusConnectException.h" +#include +#include + +namespace seabreeze { + class NativeSocketWindows : public Socket { + public: + NativeSocketWindows(); + virtual ~NativeSocketWindows(); + + virtual void connect(Inet4Address &addr, int port) + throw (UnknownHostException, BusConnectException); + virtual void connect(const std::string hostname, int port) + throw (UnknownHostException, BusConnectException); + + virtual void close() throw (BusException); + virtual bool isClosed(); + virtual bool isBound(); + + virtual int getSOLinger() throw (SocketException); + virtual void setSOLinger(bool enable, int linger) throw (SocketException); + virtual unsigned long getReadTimeoutMillis() throw (SocketException); + virtual void setReadTimeoutMillis(unsigned long timeout) throw (SocketException); + + virtual int read(unsigned char *buffer, unsigned long length) + throw (BusTransferException); + virtual int write(const unsigned char *buffer, unsigned long length) + throw (BusTransferException); + + private: + SOCKET sock; + bool bound; + bool closed; + Inet4Address address; + }; +} + +#endif /* SEABREEZE_NATIVESOCKETWINDOWS_H */ diff --git a/source/OSIF/include/native/rs232/NativeRS232.h b/source/OSIF/include/native/rs232/NativeRS232.h new file mode 100644 index 0000000..974d06b --- /dev/null +++ b/source/OSIF/include/native/rs232/NativeRS232.h @@ -0,0 +1,61 @@ +/***************************************************//** + * @file NativeRS232.h + * @date April 21, 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ******************************************************/ + +#ifndef NATIVERS232_H +#define NATIVERS232_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define OPEN_OK 0 +#define NO_DEVICE_FOUND -1 + +void *RS232Open(char *device, int *errorCode); + +int RS232Close(void *handle); + +int RS232Write(void *handle, char *data, int numberOfBytes); + +int RS232Read(void *handle, char *buffer, int numberOfBytes); + +int RS232SetBaudRate(void *handle, int rate); + +int RS232ClearInputBuffer(void *handle); + +int RS232ClearOutputBuffer(void *handle); + +int RS232WaitForWrite(void *handle); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* NATIVERS232_H */ diff --git a/source/OSIF/include/native/rs232/RS232.h b/source/OSIF/include/native/rs232/RS232.h new file mode 100644 index 0000000..d257efc --- /dev/null +++ b/source/OSIF/include/native/rs232/RS232.h @@ -0,0 +1,66 @@ +/***************************************************//** + * @file RS232.h + * @date April 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_RS232_H +#define SEABREEZE_RS232_H + +#include "native/rs232/NativeRS232.h" + +namespace seabreeze { + + class RS232 { + public: + RS232(const char *devicePath, int baudRate); + virtual ~RS232(); + + bool open(); + bool close(); + int write(void *data, unsigned int length_bytes); + int read(void *data, unsigned int length_bytes); + + void setVerbose(bool v); + bool isOpened(); + + protected: + + /* These methods are primarily for debugging. */ + void rs232HexDump(void *x, int length, bool out); + void hexDump(void *x, int length); + void describeTransfer(int length, bool out); + + void *descriptor; + bool opened; + bool verbose; + char *devicePath; + int baudRate; + }; + +} + +#endif diff --git a/source/OSIF/include/native/rs232/windows/NativeRS232Windows.h b/source/OSIF/include/native/rs232/windows/NativeRS232Windows.h new file mode 100644 index 0000000..75d0e9b --- /dev/null +++ b/source/OSIF/include/native/rs232/windows/NativeRS232Windows.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file NativeRS232Windows.h + * @date April 21, 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ******************************************************/ + +#ifndef NATIVERS232WINDOWS_H +#define NATIVERS232WINDOWS_H + +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#include +#include +#include +#include +#include +#include + +#ifndef INVALID_HANDLE_VALUE +#define INVALID_HANDLE_VALUE (-1) +#endif + +#ifdef __BORLANDC__ +#define EXPORTED __declspec(dllexport) __stdcall +#else +#define EXPORTED __declspec(dllexport) +#endif /* __BORLANDC__ */ +#define int64 __int64 + +#endif /* NATIVERS232WINDOWS_H */ diff --git a/source/OSIF/include/native/system/NativeSystem.h b/source/OSIF/include/native/system/NativeSystem.h new file mode 100644 index 0000000..b3e34b3 --- /dev/null +++ b/source/OSIF/include/native/system/NativeSystem.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file NativeSystem.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This file has declarations for the native C functions + * needed to access certain non-portable system calls. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ +#ifndef NATIVE_SYSTEM_H +#define NATIVE_SYSTEM_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/* Native C prototypes */ + +void sleepMilliseconds(unsigned int msecs); +int systemInitialize(); +void systemShutdown(); + +/* End of C prototypes */ + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* NATIVE_SYSTEM_H */ diff --git a/source/OSIF/include/native/system/System.h b/source/OSIF/include/native/system/System.h new file mode 100644 index 0000000..757a527 --- /dev/null +++ b/source/OSIF/include/native/system/System.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file System.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * The System class provides an abstract interface to + * certain system calls. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_SYSTEM_H +#define SEABREEZE_SYSTEM_H + +namespace seabreeze { + + class System { + public: + System(); + virtual ~System(); + + static void sleepMilliseconds(unsigned int millis); + static bool initialize(); + static void shutdown(); + + }; + +} + +#endif diff --git a/source/OSIF/include/native/usb/NativeUSB.h b/source/OSIF/include/native/usb/NativeUSB.h new file mode 100644 index 0000000..ce054c7 --- /dev/null +++ b/source/OSIF/include/native/usb/NativeUSB.h @@ -0,0 +1,226 @@ +/***************************************************//** + * @file NativeUSB.h + * @date October 31, 2007 + * @author Ocean Optics, Inc. + * + * This provides a relatively simple interface for + * opening, closing, writing to, and reading from Ocean + * Optics USB Devices. It has been extended to provide + * more complete USB functionality at least for Linux, + * and equivalent functionality should be brought back + * in for Windows and MacOSX. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ******************************************************/ + +#ifndef NATIVEUSB_H +#define NATIVEUSB_H + +#ifdef __cplusplus +extern "C" { +#endif /* cplusplus */ + +#define OPEN_OK 0 +#define NO_DEVICE_FOUND -1 +#define NO_DEVICE_MATCH -2 +#define CLAIM_INTERFACE_FAILED -3 +#define CLOSE_OK 0 +#define CLOSE_ERROR -1 +#define WRITE_FAILED -1 +#define READ_FAILED -1 +#define ABORT_OK 0 +#define ABORT_FAILED -1 +#define RESET_OK 0 +#define RESET_FAILED -1 + +struct USBConfigurationDescriptor { + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short wTotalLength; + unsigned char bNumInterfaces; + unsigned char bConfigurationValue; + unsigned char iConfiguration; + unsigned char bmAttributes; + unsigned char MaxPower; +}; + +struct USBDeviceDescriptor { + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short bcdUSB; + unsigned char bDeviceClass; + unsigned char bDeviceSubClass; + unsigned char bDeviceProtocol; + unsigned char bMaxPacketSize0; + unsigned short idVendor; + unsigned short idProduct; + unsigned short bcdDevice; + unsigned char iManufacturer; + unsigned char iProduct; + unsigned char iSerialNumber; + unsigned char bNumConfigurations; +}; + +struct USBInterfaceDescriptor { + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bInterfaceNumber; + unsigned char bAlternateSetting; + unsigned char bNumEndpoints; + unsigned char bInterfaceClass; + unsigned char bInterfaceSubClass; + unsigned char bInterfaceProtocol; + unsigned char iInterface; +}; + +struct USBEndpointDescriptor { + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bEndpointAddress; + unsigned char bmAttributes; + unsigned short wMaxPacketSize; + unsigned char bInterval; +}; + +//------------------------------------------------------------------------------ +// This function attempts to discover all devices with the given product +// and vendor IDs. Descriptors for each found device will be placed in the +// provided long buffer. +// +// PARAMETERS: +// vendorID: The vendor ID to match with devices on the bus +// productID: The product ID to match with devices on the bus +// output: A buffer of longs that will be populated with unique IDs for each +// device found that matches the VID and PID +// max_devices: A limit on how many IDs can be put into the output buffer +// +// RETURN VALUE: +// The number of devices successfully found, or -1 if there was an error. +int +USBProbeDevices(int vendorID, int productID, unsigned long *output, + int max_devices); + +//------------------------------------------------------------------------------ +// This function attempts to open a device with the given product and vendor +// ID's at the specified index. +// +// PARAMETERS: +// deviceID: The ID of a device that has been provided by probeDevices(). +// errorCode: A pointer to an integer that will be set to an error code of +// either NO_DEVICE_FOUND or NO_DEVICE_MATCH if an error occured +// while trying to open the device or OPEN_OK if the device was +// found and opened. +// +// RETURN VALUE: +// Returns a void pointer which equals a handle to the device if the device was +// found and opened successfully, or NULL if the device was not opened +// successfully. The value of the 'errorCode' parameter should be checked +// against the following before using the handle: +// - NO_DEVICE_FOUND signifying that no device was found with the specified ID +// or that the device with the specified ID could not be opened +//------------------------------------------------------------------------------ +void * +USBOpen(unsigned long deviceID, int *errorCode); + +//------------------------------------------------------------------------------ +// This function attempts to close the device attached to the given handle. +// +// PARAMETERS: +// handle: The device handle obtained via the open() function. +// +// RETURN VALUE: +// Returns an integer which will be equal to either: +// - CLOSE_OK if the device was closed successfully +// - CLOSE_ERROR if some error occured +//------------------------------------------------------------------------------ +int +USBClose(void *handle); + +//------------------------------------------------------------------------------ +// This function writes the given data to the device attached to the given +// handle. +// +// PARAMETERS: +// handle: The device handle obtained via the open() function. +// endpoint: The endpoint on the device to write the data to. +// data: A pointer to the dynamically allocated byte array of data to be written +// size: The number of bytes to be written +// +// RETURN VALUE: +// Returns an integer which will be equal to either: +// - The number of bytes written to the endpoint if the write was successful +// - WRITE_FAILED if the data was not written to the device +//------------------------------------------------------------------------------ +int +USBWrite(void *handle, unsigned char endpoint, char * data, int numberOfBytes); + +//------------------------------------------------------------------------------ +// This function reads data from the device attached to the given handle into +// the specified byte array. +// +// PARAMETERS: +// handle: The device handle obtained via the open() function. +// endpoint: The endpoint on the device to read the data from. +// data: A pointer to the dynamically allocated byte array to store the data. +// size: The number of bytes to be read. +// +// RETURN VALUE: +// Returns an integer which will be equal to either: +// - The number of bytes read from the endpoint if the read was successful +// - READ_FAILED if the data was not successfully read from the device +//------------------------------------------------------------------------------ +int +USBRead(void *handle, unsigned char endpoint, char * data, int numberOfBytes); + +//------------------------------------------------------------------------------ +// This function attempts to clear any stall on the given endpoint. +// +// PARAMETERS: +// handle: The device handle obtained via the open() function. +// endpoint: The endpoint on the device to clear a stall condition on. +// +// RETURN VALUE: +// No value is returned (void). +//------------------------------------------------------------------------------ +void +USBClearStall(void *handle, unsigned char endpoint); + +int +USBGetDeviceDescriptor(void *handle, struct USBDeviceDescriptor *desc); + +int +USBGetInterfaceDescriptor(void *handle, struct USBInterfaceDescriptor *desc); + +int +USBGetEndpointDescriptor(void *handle, int endpoint_index, struct USBEndpointDescriptor *desc); + +int +USBGetStringDescriptor(void *handle, unsigned int string_index, char *buffer, int maxLength); + + +#ifdef __cplusplus +} +#endif /* _cplusplus */ + +#endif /* NATIVEUSB_H */ diff --git a/source/OSIF/include/native/usb/USB.h b/source/OSIF/include/native/usb/USB.h new file mode 100644 index 0000000..70a014f --- /dev/null +++ b/source/OSIF/include/native/usb/USB.h @@ -0,0 +1,84 @@ +/***************************************************//** + * @file USB.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_USB_H +#define SEABREEZE_USB_H + +#include "native/usb/USBDiscovery.h" +#include "native/usb/NativeUSB.h" +#include + +namespace seabreeze { + + /* Empty declaration of USBDiscovery to deal with cross-includes */ + class USBDiscovery; + + class USB { + public: + virtual ~USB(); + + bool open(); + bool close(); + int write(int endpoint, void *data, unsigned int length_bytes); + int read(int endpoint, void *data, unsigned int length_bytes); + void clearStall(int endpoint); + + static void setVerbose(bool v); + + int getDeviceDescriptor(struct USBDeviceDescriptor *desc); + int getInterfaceDescriptor(struct USBInterfaceDescriptor *desc); + /* Get the endpoint descriptor where index is the endpoint index. */ + int getEndpointDescriptor(int index, struct USBEndpointDescriptor *epDesc); + std::string *getStringDescriptor(int index); + int getMaxPacketSize(); + + bool isOpened(); + + /* This allows the USBDiscovery class to access the protected + * constructor and act as a factory for USB instances. + */ + friend class USBDiscovery; + + protected: + + /* These methods are primarily for debugging. */ + void usbHexDump(void *x, int length, int endpoint); + void hexDump(void *x, int length); + void describeTransfer(const char *label, int length, void* data, int endpoint, bool hexdump); + USB(unsigned long deviceID); + + void *descriptor; + bool opened; + static bool verbose; + unsigned long deviceID; + }; + +} + +#endif diff --git a/source/OSIF/include/native/usb/USBDiscovery.h b/source/OSIF/include/native/usb/USBDiscovery.h new file mode 100644 index 0000000..fda1c0d --- /dev/null +++ b/source/OSIF/include/native/usb/USBDiscovery.h @@ -0,0 +1,64 @@ +/***************************************************//** + * @file USBDiscovery.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ +#ifndef USBDISCOVERY_H +#define USBDISCOVERY_H + +#include "native/usb/USB.h" +#include + +namespace seabreeze { + + /* Empty declaration of USB to deal with cross-includes */ + class USB; + + class USBDiscovery { + public: + USBDiscovery(); + ~USBDiscovery(); + + /** + * Probes the bus for devices of the given VID and PID and returns + * a vector of identifiers. Note that these IDs are implementation- + * specific and are not necessarily portable between platforms. They + * are not guaranteed to be constant from one program execution to the + * next, though they should remain constant from one invocation of this + * method to the next within one execution if no devices change status. + */ + std::vector *probeDevices(int vendorID, int productID); + + /** + * Given an identifier from probeDevices(), create a USB interface to + * the device that can be used to open/write/read/close the device. + */ + USB *createUSBInterface(unsigned long deviceID); + }; + +} + +#endif /* USBDISCOVERY_H */ diff --git a/source/OSIF/include/native/usb/winusb/WindowsGUID.h b/source/OSIF/include/native/usb/winusb/WindowsGUID.h new file mode 100644 index 0000000..de3d140 --- /dev/null +++ b/source/OSIF/include/native/usb/winusb/WindowsGUID.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file WindowsGUID.h + * @date June 2009 + * @author Ocean Optics, Inc. + * + * This provides GUID definitions for supported devices. + * These must match what appears in the .inf file for the + * devices to be found properly through the WinUSB API. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#pragma once + +#ifndef SEABREEZE_WINDOWS_GUID_H +#define SEABREEZE_WINDOWS_GUID_H + +// {BAD36DAB-A3D2-4a0e-8B2E-DA36202187D4} +DEFINE_GUID(GUID_DEVCLASS_OCEANOPTICS_USB, +0xbad36dab, 0xa3d2, 0x4a0e, 0x8b, 0x2e, 0xda, 0x36, 0x20, 0x21, 0x87, 0xd4); + +// {DBBAD306-1786-4f2e-A8AB-340D45F0653F} +DEFINE_GUID(GUID_DEVINTERFACE_OCEANOPTICS_USB, +0xdbbad306, 0x1786, 0x4f2e, 0xa8, 0xab, 0x34, 0xd, 0x45, 0xf0, 0x65, 0x3f); + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h b/source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h new file mode 100644 index 0000000..b1f33e5 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file BlazeTCPIPv4.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_BLAZETCPIPV4_H +#define SEABREEZE_BLAZETCPIPV4_H + +#include "common/buses/network/TCPIPv4SocketBus.h" + +namespace seabreeze { + class BlazeTCPIPv4 : public TCPIPv4SocketBus { + public: + BlazeTCPIPv4(); + virtual ~BlazeTCPIPv4(); + + virtual bool open(); + virtual void close(); + }; +} + +#endif /* SEABREEZE_BLAZETCPIPV4_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h b/source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h new file mode 100644 index 0000000..2586c2f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file JazTCPIPv4.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_JAZTCPIPV4_H +#define SEABREEZE_JAZTCPIPV4_H + +#include "common/buses/network/TCPIPv4SocketBus.h" + +namespace seabreeze { + class JazTCPIPv4 : public TCPIPv4SocketBus { + public: + JazTCPIPv4(); + virtual ~JazTCPIPv4(); + + virtual bool open(); + virtual void close(); + }; +} + +#endif /* SEABREEZE_JAZTCPIPV4_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h b/source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h new file mode 100644 index 0000000..885ba18 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file OOIRS232Interface.h + * @date April 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIRS232INTERFACE_H +#define OOIRS232INTERFACE_H + +#include "common/buses/rs232/RS232Interface.h" +#include "common/protocols/ProtocolHint.h" +#include "common/buses/TransferHelper.h" + +namespace seabreeze { + + class OOIRS232Interface : public RS232Interface { + public: + OOIRS232Interface(); + virtual ~OOIRS232Interface(); + + /* Inherited from Bus */ + virtual TransferHelper *getHelper(const std::vector &hints) const; + virtual void setLocation(const DeviceLocatorInterface &location) throw (IllegalArgumentException); + virtual bool open(); + virtual void close(); + + protected: + TransferHelper *rs232Helper; + + int baudRate; + }; + +} + +#endif /* OOIRS232INTERFACE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h new file mode 100644 index 0000000..82ee675 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file ApexUSB.h + * @date January 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef APEXUSB_H +#define APEXUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class ApexUSB : public OOIUSBInterface { + public: + ApexUSB(); + virtual ~ApexUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* APEXUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h new file mode 100644 index 0000000..0c10e68 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file BlazeUSB.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef BLAZEUSB_H +#define BLAZEUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class BlazeUSB : public OOIUSBInterface { + public: + BlazeUSB(); + virtual ~BlazeUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* BLAZEUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h new file mode 100644 index 0000000..8a915b6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h @@ -0,0 +1,61 @@ +/***************************************************//** + * @file BlazeUSBTransferHelper.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * This class encapsulates the behavior of the USB4000 and HR4000 + * in the case where they are connected via a USB2.0 bus. For the + * case where the device is connected via USB 1.1, then the + * OOIUSBSpectrumTransferHelper should be used instead. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef BLAZEUSBTRANSFERHELPER_H +#define BLAZEUSBTRANSFERHELPER_H + +#include "common/buses/usb/USBTransferHelper.h" +#include "vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h" + +namespace seabreeze { + + class BlazeUSBTransferHelper : public USBTransferHelper { + public: + BlazeUSBTransferHelper(USB *usb, + const OOIUSBBidrectionalEndpointMap &map); + virtual ~BlazeUSBTransferHelper(); + + /* Inherited */ + virtual int receive(std::vector &buffer, unsigned int length) + throw (BusTransferException); + virtual int send(const std::vector &buffer, unsigned int length) const + throw (BusTransferException); + + private: + static const int WORD_SIZE_BYTES; + }; + +} + +#endif /* BLAZEUSBTRANSFERHELPER_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h new file mode 100644 index 0000000..1312f92 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file FlameNIRUSB.h + * @date Apr 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef FLAMENIRUSB_H +#define FLAMENIRUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class FlameNIRUSB : public OOIUSBInterface { + public: + FlameNIRUSB(); + virtual ~FlameNIRUSB(); + + virtual bool open(); + }; + +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h new file mode 100644 index 0000000..c52d326 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file HR2000PlusUSB.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef HR2000PLUSUSB_H +#define HR2000PLUSUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class HR2000PlusUSB : public OOIUSBInterface { + public: + HR2000PlusUSB(); + virtual ~HR2000PlusUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + + }; + +} + +#endif /* HR2000PLUSUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h new file mode 100644 index 0000000..d1642cf --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file HR2000USB.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef HR2000USB_H +#define HR2000USB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class HR2000USB : public OOIUSBInterface { + public: + HR2000USB(); + virtual ~HR2000USB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* HR2000USB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h new file mode 100644 index 0000000..78a8413 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file HR4000USB.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef HR4000USB_H +#define HR4000USB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class HR4000USB : public OOIUSBInterface { + public: + HR4000USB(); + virtual ~HR4000USB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* HR4000USB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h new file mode 100644 index 0000000..db03827 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file JazUSB.h + * @date November 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef JAZUSB_H +#define JAZUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class JazUSB : public OOIUSBInterface { + public: + JazUSB(); + virtual ~JazUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* JAZUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h new file mode 100644 index 0000000..95195f6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file Maya2000ProUSB.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef MAYA2000PROUSB_H +#define MAYA2000PROUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class Maya2000ProUSB : public OOIUSBInterface { + public: + Maya2000ProUSB(); + virtual ~Maya2000ProUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* MAYA2000PROUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h new file mode 100644 index 0000000..2c3163f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file Maya2000USB.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef MAYA2000USB_H +#define MAYA2000USB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class Maya2000USB : public OOIUSBInterface { + public: + Maya2000USB(); + virtual ~Maya2000USB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* MAYA2000USB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h new file mode 100644 index 0000000..bbeef85 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file MayaLSLUSB.h + * @date 13-Jan-2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef MAYALSLUSB_H +#define MAYALSLUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class MayaLSLUSB : public OOIUSBInterface { + public: + MayaLSLUSB(); + virtual ~MayaLSLUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* MAYALSLUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h new file mode 100644 index 0000000..5aefeed --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file NIRQuest256USB.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NIRQUEST256USB_H +#define NIRQUEST256USB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class NIRQuest256USB : public OOIUSBInterface { + public: + NIRQuest256USB(); + virtual ~NIRQuest256USB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* NIRQUEST256USB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h new file mode 100644 index 0000000..c9b587f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file NIRQuest512USB.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NIRQUEST512USB_H +#define NIRQUEST512USB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class NIRQuest512USB : public OOIUSBInterface { + public: + NIRQuest512USB(); + virtual ~NIRQuest512USB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* NIRQUEST512USB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h new file mode 100644 index 0000000..e7be862 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h @@ -0,0 +1,61 @@ +/***************************************************//** + * @file OOIUSB4KSpectrumTransferHelper.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This class encapsulates the behavior of the USB4000 and HR4000 + * in the case where they are connected via a USB2.0 bus. For the + * case where the device is connected via USB 1.1, then the + * OOIUSBSpectrumTransferHelper should be used instead. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIUSB4KSPECTRUMTRANSFERHELPER_H +#define OOIUSB4KSPECTRUMTRANSFERHELPER_H + +#include "common/buses/usb/USBTransferHelper.h" +#include "vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h" + +namespace seabreeze { + + class OOIUSB4KSpectrumTransferHelper : public USBTransferHelper { + public: + OOIUSB4KSpectrumTransferHelper(USB *usb, + const OOIUSBCypressEndpointMap &map); + virtual ~OOIUSB4KSpectrumTransferHelper(); + + /* Inherited */ + virtual int receive(std::vector &buffer, unsigned int length) + throw (BusTransferException); + + private: + int secondaryHighSpeedEP; + std::vector primaryReadBuffer; + std::vector secondaryReadBuffer; + }; + +} + +#endif /* OOIUSB4KSPECTRUMTRANSFERHELPER_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h new file mode 100644 index 0000000..9a9564c --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file OOIUSBControlTransferHelper.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIUSBCONTROLTRANSFERHELPER_H +#define OOIUSBCONTROLTRANSFERHELPER_H + +#include "common/buses/usb/USBTransferHelper.h" +#include "vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h" + +namespace seabreeze { + + class OOIUSBControlTransferHelper : public USBTransferHelper { + public: + OOIUSBControlTransferHelper(USB *usb, + const OOIUSBCypressEndpointMap &map); + virtual ~OOIUSBControlTransferHelper(); + }; + +} + +#endif /* OOIUSBCONTROLTRANSFERHELPER_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h new file mode 100644 index 0000000..a0b8290 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h @@ -0,0 +1,123 @@ +/***************************************************//** + * @file OOIUSBEndpointMaps.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIUSBENDPOINTMAPS_H +#define OOIUSBENDPOINTMAPS_H + +namespace seabreeze { + + class OOIUSBCypressEndpointMap { + public: + int getLowSpeedInEP() const; + int getLowSpeedOutEP() const; + int getHighSpeedInEP() const; + int getHighSpeedIn2EP() const; + + protected: + int lowSpeedIn; + int lowSpeedOut; + int highSpeedIn; + int highSpeedIn2; + }; + + /* This map is appropriate for the following spectrometers: + * USB2000 (and its variants), HR2000, ADC1000-USB, + * NIR256, NIR512, SAS + */ + class OOIUSBLegacy2KEndpointMap : public OOIUSBCypressEndpointMap { + public: + OOIUSBLegacy2KEndpointMap(); + virtual ~OOIUSBLegacy2KEndpointMap(); + + }; + + /* This map is appropriate for the following spectrometers: + * HR2000+, HR4000, Maya, Maya2000Pro, MayaLSL, QE65000, USB2000+, USB4000 + */ + class OOIUSBFPGAEndpointMap : public OOIUSBCypressEndpointMap { + public: + OOIUSBFPGAEndpointMap(); + virtual ~OOIUSBFPGAEndpointMap(); + + }; + + class OOIUSBJazEndpointMap : public OOIUSBCypressEndpointMap { + public: + OOIUSBJazEndpointMap(); + virtual ~OOIUSBJazEndpointMap(); + }; + + /* This defines a simple interface for an endpoint map that has a one input + * and one output endpoint. + */ + class OOIUSBBidrectionalEndpointMap { + public: + OOIUSBBidrectionalEndpointMap(); + virtual ~OOIUSBBidrectionalEndpointMap(); + virtual int getPrimaryInEndpoint() const; + virtual int getPrimaryOutEndpoint() const; + protected: + int primaryInEndpoint; + int primaryOutEndpoint; + }; + + /* This map is appropriate for the following spectrometers: + * Ventana + */ + class OOIUSBVentanaEndpointMap : public OOIUSBBidrectionalEndpointMap { + public: + OOIUSBVentanaEndpointMap(); + virtual ~OOIUSBVentanaEndpointMap(); + }; + + class OOIUSBDualBidirectionalEndpointMap : public OOIUSBBidrectionalEndpointMap { + public: + OOIUSBDualBidirectionalEndpointMap(); + virtual ~OOIUSBDualBidirectionalEndpointMap(); + int getSecondaryInEndpoint() const; + int getSecondaryOutEndpoint() const; + + protected: + int secondaryInEndpoint; + int secondaryOutEndpoint; + }; + + /* This map is appropriate for the following spectrometers: + * STS, QEPro + */ + class OOIUSBSimpleDualEndpointMap : public OOIUSBDualBidirectionalEndpointMap { + public: + OOIUSBSimpleDualEndpointMap(); + virtual ~OOIUSBSimpleDualEndpointMap(); + }; + +} + + +#endif /* OOIUSBENDPOINTMAPS_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h new file mode 100644 index 0000000..f6e84cc --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h @@ -0,0 +1,76 @@ +/***************************************************//** + * @file OOIUSBInterface.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIUSBINTERFACE_H +#define OOIUSBINTERFACE_H + +#include "common/buses/usb/USBInterface.h" +#include "common/protocols/ProtocolHint.h" +#include "common/buses/TransferHelper.h" +#include "common/buses/DeviceLocationProberInterface.h" + +#define OCEAN_OPTICS_USB_VID 0x2457 + +namespace seabreeze { + + class OOIUSBInterface : public USBInterface, public DeviceLocationProberInterface { + public: + OOIUSBInterface(); + virtual ~OOIUSBInterface(); + + int getProductID(); + int getVendorID(); + + /* Inherited from Bus */ + virtual TransferHelper *getHelper(const std::vector &hints) const; + virtual void setLocation(const DeviceLocatorInterface &location) throw (IllegalArgumentException); + virtual bool open(); + virtual void close(); + + /* Inherited from DeviceLocationProberInterface */ + virtual std::vector *probeDevices(); + + protected: + void addHelper(ProtocolHint *hint, TransferHelper *helper); + void clearHelpers(); + + int vendorID; + int productID; + + /* These vectors should really be in a map, but that didn't want to + * work easily. Since there will likely be about 2 entries in here, + * storing in a pair of vectors for now won't hurt anything. + */ + std::vector helperKeys; + std::vector helperValues; + }; + +} + +#endif /* OOIUSBINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h new file mode 100644 index 0000000..996ad15 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h @@ -0,0 +1,56 @@ +/***************************************************//** + * @file OOIUSBProductID.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIUSBPRODUCTID_H +#define OOIUSBPRODUCTID_H + +#define USB2000_USB_PID 0x1002 +#define HR2000_USB_PID 0x100a +#define HR4000_USB_PID 0x1012 +#define HR2000PLUS_USB_PID 0x1016 +#define QE65000_USB_PID 0x1018 +#define USB2000PLUS_USB_PID 0x101E +#define USB4000_USB_PID 0x1022 +#define NIRQUEST512_USB_PID 0x1026 +#define NIRQUEST256_USB_PID 0x1028 +#define MAYA2000PRO_USB_PID 0x102a +#define MAYA2000_USB_PID 0x102c +#define MAYALSL_USB_PID 0x1046 +#define TORUS_USB_PID 0x1040 +#define APEX_USB_PID 0x1044 +#define FLAMENIR_USB_PID 0x104b +#define JAZ_USB_PID 0x2000 +#define BLAZE_USB_PID 0x2001 +#define STS_USB_PID 0x4000 +#define QEPRO_USB_PID 0x4004 +#define SPARK_USB_PID 0x4200 +#define VENTANA_USB_PID 0x5000 +#define GENERIC_SMARTPHONE_MODULE_PID 0x7002 + +#endif /* OOIUSBPRODUCTID_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h new file mode 100644 index 0000000..ff08b12 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file OOIUSBSpectrumTransferHelper.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIUSBSPECTRUMTRANSFERHELPER_H +#define OOIUSBSPECTRUMTRANSFERHELPER_H + +#include "common/buses/usb/USBTransferHelper.h" +#include "vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h" + +namespace seabreeze { + + class OOIUSBSpectrumTransferHelper : public USBTransferHelper { + public: + OOIUSBSpectrumTransferHelper(USB *usb, + const OOIUSBCypressEndpointMap &map); + virtual ~OOIUSBSpectrumTransferHelper(); + }; + +} + +#endif /* OOIUSBSPECTRUMTRANSFERHELPER_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h new file mode 100644 index 0000000..cb9e897 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OOIUSBTrivialTransferHelper.h + * @date June 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIUSBTRIVIALTRANSFERHELPER_H +#define OOIUSBTRIVIALTRANSFERHELPER_H + +#include "common/buses/usb/USBTransferHelper.h" +#include "vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h" + +namespace seabreeze { + + class OOIUSBTrivialTransferHelper : public USBTransferHelper { + public: + OOIUSBTrivialTransferHelper(USB *usb, const OOIUSBBidrectionalEndpointMap &map); + virtual ~OOIUSBTrivialTransferHelper(); + }; + +} + +#endif /* OOIUSBTRIVIALTRANSFERHELPER_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h new file mode 100644 index 0000000..ef24f1f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file QE65000USB.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef QE65000USB_H +#define QE65000USB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class QE65000USB : public OOIUSBInterface { + public: + QE65000USB(); + virtual ~QE65000USB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* QE65000USB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h new file mode 100644 index 0000000..a15af3e --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file QEProUSB.h + * @date Jane 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef QEPROUSB_H +#define QEPROUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class QEProUSB : public OOIUSBInterface { + public: + QEProUSB(); + virtual ~QEProUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* QEPROUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h new file mode 100644 index 0000000..80cc82b --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file STSUSB.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STSUSB_H +#define STSUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class STSUSB : public OOIUSBInterface { + public: + STSUSB(); + virtual ~STSUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* STSUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h new file mode 100644 index 0000000..be188b2 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file SparkUSB.h + * @date January 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SPARKUSB_H +#define SPARKUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class SparkUSB : public OOIUSBInterface { + public: + SparkUSB(); + virtual ~SparkUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* SPARKUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h new file mode 100644 index 0000000..90b63ef --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file TorusUSB.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef TORUSUSB_H +#define TORUSUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class TorusUSB : public OOIUSBInterface { + public: + TorusUSB(); + virtual ~TorusUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* TORUSUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h new file mode 100644 index 0000000..c360985 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file USB2000PlusUSB.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USB2000PLUSUSB_H +#define USB2000PLUSUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class USB2000PlusUSB : public OOIUSBInterface { + public: + USB2000PlusUSB(); + virtual ~USB2000PlusUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* USB2000PLUSUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h new file mode 100644 index 0000000..396af57 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file USB2000USB.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USB2000USB_H +#define USB2000USB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class USB2000USB : public OOIUSBInterface { + public: + USB2000USB(); + virtual ~USB2000USB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* USB2000USB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h new file mode 100644 index 0000000..09993a3 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file USB4000USB.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USB4000USB_H +#define USB4000USB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class USB4000USB : public OOIUSBInterface { + public: + USB4000USB(); + virtual ~USB4000USB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* USB4000USB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h b/source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h new file mode 100644 index 0000000..a750f61 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file VentanaUSB.h + * @date January 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef VENTANAUSB_H +#define VENTANAUSB_H + +#include "vendors/OceanOptics/buses/usb/OOIUSBInterface.h" + +namespace seabreeze { + + class VentanaUSB : public OOIUSBInterface { + public: + VentanaUSB(); + virtual ~VentanaUSB(); + + /* Inherited from OOIUSBInterface */ + virtual bool open(); + }; + +} + +#endif /* STSUSB_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/Apex.h b/source/OSIF/include/vendors/OceanOptics/devices/Apex.h new file mode 100644 index 0000000..eb3fa31 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/Apex.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file Apex.h + * @date January 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef APEX_H +#define APEX_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class Apex : public Device { + public: + Apex(); + virtual ~Apex(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* APEX_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/Blaze.h b/source/OSIF/include/vendors/OceanOptics/devices/Blaze.h new file mode 100644 index 0000000..20b08d4 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/Blaze.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file Blaze.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef BLAZE_H +#define BLAZE_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class Blaze : public Device { + public: + Blaze(); + virtual ~Blaze(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* BLAZE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h b/source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h new file mode 100644 index 0000000..8e19baa --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file FlameNIR.h + * @date Apr 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef FLAMENIR_H +#define FLAMENIR_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class FlameNIR : public Device { + public: + FlameNIR(); + virtual ~FlameNIR(); + + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/devices/HR2000.h b/source/OSIF/include/vendors/OceanOptics/devices/HR2000.h new file mode 100644 index 0000000..c614cc3 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/HR2000.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file HR2000.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef HR2000_H +#define HR2000_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class HR2000 : public Device { + public: + HR2000(); + virtual ~HR2000(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + + }; + +} + +#endif /* HR2000_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h b/source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h new file mode 100644 index 0000000..85acf18 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file HR2000Plus.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef HR2000PLUS_H +#define HR2000PLUS_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class HR2000Plus : public Device { + public: + HR2000Plus(); + virtual ~HR2000Plus(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* HR2000PLUS_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/HR4000.h b/source/OSIF/include/vendors/OceanOptics/devices/HR4000.h new file mode 100644 index 0000000..07d9902 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/HR4000.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file HR4000.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef HR4000_H +#define HR4000_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class HR4000 : public Device { + public: + HR4000(); + virtual ~HR4000(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* HR4000_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/Jaz.h b/source/OSIF/include/vendors/OceanOptics/devices/Jaz.h new file mode 100644 index 0000000..3cd3895 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/Jaz.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file Jaz.h + * @date November 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef JAZ_H +#define JAZ_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class Jaz : public Device { + public: + Jaz(); + virtual ~Jaz(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* JAZ_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h b/source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h new file mode 100644 index 0000000..7024bc7 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file Maya2000.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef MAYA2000_H +#define MAYA2000_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class Maya2000 : public Device { + public: + Maya2000(); + virtual ~Maya2000(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* MAYA2000_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h b/source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h new file mode 100644 index 0000000..45f29aa --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file Maya2000Pro.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef MAYA2000PRO_H +#define MAYA2000PRO_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class Maya2000Pro : public Device { + public: + Maya2000Pro(); + virtual ~Maya2000Pro(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* MAYA2000PRO_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h b/source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h new file mode 100644 index 0000000..24d57cc --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file MayaLSL.h + * @date 13-Jan-2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef VENDORS_OCEANOPTICS_DEVICES_MAYALSL_H +#define VENDORS_OCEANOPTICS_DEVICES_MAYALSL_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class MayaLSL : public Device { + public: + MayaLSL(); + virtual ~MayaLSL(); + + // Must be overridden from Device + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* VENDORS_OCEANOPTICS_DEVICES_MAYALSL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h b/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h new file mode 100644 index 0000000..ce6dd2c --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file NIRQuest256.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NIRQUEST256_H +#define NIRQUEST256_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class NIRQuest256 : public Device { + public: + NIRQuest256(); + virtual ~NIRQuest256(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* NIRQUEST256_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h b/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h new file mode 100644 index 0000000..8a62761 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file NIRQuest512.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NIRQUEST512_H +#define NIRQUEST512_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class NIRQuest512 : public Device { + public: + NIRQuest512(); + virtual ~NIRQuest512(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* NIRQUEST512_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/QE65000.h b/source/OSIF/include/vendors/OceanOptics/devices/QE65000.h new file mode 100644 index 0000000..ddd4c1e --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/QE65000.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file QE65000.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef QE65000_H +#define QE65000_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class QE65000 : public Device { + public: + QE65000(); + virtual ~QE65000(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* QE65000_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/QEPro.h b/source/OSIF/include/vendors/OceanOptics/devices/QEPro.h new file mode 100644 index 0000000..d8bef4d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/QEPro.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file QEPro.h + * @date June 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef QEPRO_H +#define QEPRO_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class QEPro : public Device { + public: + QEPro(); + virtual ~QEPro(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* QEPRO_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/STS.h b/source/OSIF/include/vendors/OceanOptics/devices/STS.h new file mode 100644 index 0000000..fad5a7a --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/STS.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file STS.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STS_H +#define STS_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class STS : public Device { + public: + STS(); + virtual ~STS(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* STS_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/Spark.h b/source/OSIF/include/vendors/OceanOptics/devices/Spark.h new file mode 100644 index 0000000..ebbf402 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/Spark.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file Spark.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SPARK_H +#define SPARK_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class Spark : public Device { + public: + Spark(); + virtual ~Spark(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* SPARK_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/Torus.h b/source/OSIF/include/vendors/OceanOptics/devices/Torus.h new file mode 100644 index 0000000..76ace9f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/Torus.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file Torus.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef TORUS_H +#define TORUS_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class Torus : public Device { + public: + Torus(); + virtual ~Torus(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* TORUS_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/USB2000.h b/source/OSIF/include/vendors/OceanOptics/devices/USB2000.h new file mode 100644 index 0000000..1791d44 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/USB2000.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file USB2000.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USB2000_H +#define USB2000_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class USB2000 : public Device { + public: + USB2000(); + virtual ~USB2000(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* USB2000_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h b/source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h new file mode 100644 index 0000000..aab3a48 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file USB2000Plus.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USB2000PLUS_H +#define USB2000PLUS_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class USB2000Plus : public Device { + public: + USB2000Plus(); + virtual ~USB2000Plus(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* USB2000PLUS_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/USB4000.h b/source/OSIF/include/vendors/OceanOptics/devices/USB4000.h new file mode 100644 index 0000000..a9edddb --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/USB4000.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file USB4000.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USB4000_H +#define USB4000_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class USB4000 : public Device { + public: + USB4000(); + virtual ~USB4000(); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* USB4000_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/devices/Ventana.h b/source/OSIF/include/vendors/OceanOptics/devices/Ventana.h new file mode 100644 index 0000000..6bc250b --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/devices/Ventana.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file Ventana.h + * @date January 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef VENTANA_H +#define VENTANA_H + +#include "common/devices/Device.h" + +namespace seabreeze { + + class Ventana : public Device { + public: + Ventana(); + virtual ~Ventana(); + + /* Overridden from Device to allow detection of thermoelectric + * capability. + */ + virtual bool initialize(const Bus &bus); + + /* Must be overridden from Device */ + virtual ProtocolFamily getSupportedProtocol(FeatureFamily family, BusFamily bus); + }; + +} + +#endif /* VENTANA_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h b/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h new file mode 100644 index 0000000..e0bacf3 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h @@ -0,0 +1,81 @@ +/***************************************************//** + * @file AcquisitionDelayFeature.h + * @date November 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef ACQUISITION_DELAY_FEATURE_H +#define ACQUISITION_DELAY_FEATURE_H + +#include "common/features/FeatureImpl.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h" + +namespace seabreeze { + + class AcquisitionDelayFeature : public FeatureImpl, + public AcquisitionDelayFeatureInterface { + public: + AcquisitionDelayFeature(std::vector helpers); + virtual ~AcquisitionDelayFeature(); + + virtual void setAcquisitionDelayMicroseconds( + const Protocol &protocol, const Bus &bus, + const unsigned long delayMicros) + throw (FeatureException); + + virtual unsigned long getAcquisitionDelayMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + /* Methods that remain pure virtual since the protocol interface does + * not necessarily provide clean methods for these. A derived + * class will be necessary to specify the limits. + */ + virtual unsigned long getAcquisitionDelayIncrementMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException) = 0; + virtual unsigned long getAcquisitionDelayMaximumMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException) = 0; + virtual unsigned long getAcquisitionDelayMinimumMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException) = 0; + + protected: + unsigned long lastAcquisitionDelayMicroseconds; + bool lastAcquisitionDelayValid; + }; + +} /* end namespace seabreeze */ + +#endif /* ACQUISITION_DELAY_FEATURE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h new file mode 100644 index 0000000..bf7a90a --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h @@ -0,0 +1,67 @@ +/***************************************************//** + * @file AcquisitionDelayFeatureInterface.h + * @date November 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_ACQUISITION_DELAY_FEATURE_INTERFACE_H +#define SEABREEZE_ACQUISITION_DELAY_FEATURE_INTERFACE_H + +#include "common/features/Feature.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class AcquisitionDelayFeatureInterface { + public: + virtual ~AcquisitionDelayFeatureInterface(); + virtual unsigned long getAcquisitionDelayIncrementMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException) = 0; + virtual unsigned long getAcquisitionDelayMaximumMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException) = 0; + virtual unsigned long getAcquisitionDelayMinimumMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException) = 0; + virtual unsigned long getAcquisitionDelayMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException) = 0; + virtual void setAcquisitionDelayMicroseconds( + const Protocol &Protocol, const Bus &bus, + const unsigned long delayMicros) + throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline AcquisitionDelayFeatureInterface::~AcquisitionDelayFeatureInterface() {} + +} /* end namespace */ + +#endif /* SEABREEZE_ACQUISITION_DELAY_FEATURE_INTERFACE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h b/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h new file mode 100644 index 0000000..c637ee5 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h @@ -0,0 +1,79 @@ +/***************************************************//** + * @file AcquisitionDelayFeature_FPGA.h + * @date November 2015 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the acquisition + * delay feature that is controlled by the FPGA in many + * devices. This is likely to be derived from to + * override the device limits. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef ACQUISITION_DELAY_FEATURE_FPGA_H +#define ACQUISITION_DELAY_FEATURE_FPGA_H + +#include "vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h" +#include + +namespace seabreeze { + + class AcquisitionDelayFeature_FPGA : public AcquisitionDelayFeature { + public: + AcquisitionDelayFeature_FPGA(std::vector helpers); + virtual ~AcquisitionDelayFeature_FPGA(); + + /* Inherited from AcquisitionDelayFeature */ + + virtual void setAcquisitionDelayMicroseconds( + const Protocol &protocol, const Bus &bus, + const unsigned long delayMicros) + throw (FeatureException); + + virtual unsigned long getAcquisitionDelayIncrementMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException); + virtual unsigned long getAcquisitionDelayMaximumMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException); + virtual unsigned long getAcquisitionDelayMinimumMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + protected: + virtual unsigned long countsToMicroseconds(unsigned long counts); + virtual unsigned long microsecondsToCounts(unsigned long microseconds); + + unsigned char acquisitionDelayRegister; + unsigned long countsPerMicrosecond; + unsigned long minimumDelayCounts; + unsigned long maximumDelayCounts; + unsigned long incrementMicroseconds; + }; + +} /* end namespace seabreeze */ + +#endif /* ACQUISITION_DELAY_FEATURE_FPGA_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h b/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h new file mode 100644 index 0000000..c44368e --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h @@ -0,0 +1,60 @@ +/***************************************************//** + * @file STSAcquisitionDelayFeature.h + * @date November 2015 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the acquisition + * delay feature in the STS. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STSACQUISITIONDELAYFEATURE_H +#define STSACQUISITIONDELAYFEATURE_H + +#include "vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h" + +namespace seabreeze { + + class STSAcquisitionDelayFeature : public AcquisitionDelayFeature { + public: + STSAcquisitionDelayFeature(std::vector helpers); + virtual ~STSAcquisitionDelayFeature(); + + /* Inherited from AcquisitionDelayFeature */ + virtual unsigned long getAcquisitionDelayIncrementMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException); + virtual unsigned long getAcquisitionDelayMaximumMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException); + virtual unsigned long getAcquisitionDelayMinimumMicroseconds( + const Protocol &protocol, const Bus &bus) + throw (FeatureException); + }; + +} /* end namespace seabreeze */ + +#endif /* STSACQUISITIONDELAYFEATURE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h b/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h new file mode 100644 index 0000000..8625b8a --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file ContinuousStrobeFeature.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_CONTINUOUS_STROBE_FEATURE_H +#define SEABREEZE_CONTINUOUS_STROBE_FEATURE_H + +#include "common/features/FeatureImpl.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h" + +namespace seabreeze { + + class ContinuousStrobeFeature : public FeatureImpl, + public ContinuousStrobeFeatureInterface { + public: + ContinuousStrobeFeature(std::vector helpers); + virtual ~ContinuousStrobeFeature(); + virtual void setContinuousStrobePeriodMicroseconds(const Protocol &protocol, + const Bus &bus, unsigned short strobe_id, unsigned long period_usec) + throw (FeatureException); + virtual void setContinuousStrobeEnable(const Protocol &protocol, + const Bus &bus, unsigned short strobe_id, bool enable) + throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + }; +} + +#endif /* SEABREEZE_CONTINUOUS_STROBE_FEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h new file mode 100644 index 0000000..755c3ca --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file ContinuousStrobeFeatureInterface.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_CONTINUOUS_STROBE_FEATURE_INTERFACE_H +#define SEABREEZE_CONTINUOUS_STROBE_FEATURE_INTERFACE_H + +#include "common/features/Feature.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class ContinuousStrobeFeatureInterface { + public: + virtual ~ContinuousStrobeFeatureInterface() = 0; + virtual void setContinuousStrobePeriodMicroseconds(const Protocol &protocol, + const Bus &bus, unsigned short strobe_id, unsigned long period_usec) + throw (FeatureException) = 0; + virtual void setContinuousStrobeEnable(const Protocol &protocol, + const Bus &bus, unsigned short strobe_id, bool enable) + throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline ContinuousStrobeFeatureInterface::~ContinuousStrobeFeatureInterface() {} +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h b/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h new file mode 100644 index 0000000..1bd3c0c --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file ContinuousStrobeFeature_FPGA.h + * @date February 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_CONTINUOUS_STROBE_FEATURE_FPGA_H +#define SEABREEZE_CONTINUOUS_STROBE_FEATURE_FPGA_H + +#include "common/features/FeatureImpl.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h" + +namespace seabreeze { + + class ContinuousStrobeFeature_FPGA : public FeatureImpl, + public ContinuousStrobeFeatureInterface { + public: + ContinuousStrobeFeature_FPGA(); + virtual ~ContinuousStrobeFeature_FPGA(); + virtual void setContinuousStrobePeriodMicroseconds(const Protocol &protocol, + const Bus &bus, unsigned short strobe_id, unsigned long period_usec) + throw (FeatureException); + virtual void setContinuousStrobeEnable(const Protocol &protocol, + const Bus &bus, unsigned short strobe_id, bool enable) + throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + }; +} + +#endif /* SEABREEZE_CONTINUOUS_STROBE_FEATURE_FPGA_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h b/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h new file mode 100644 index 0000000..928db97 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h @@ -0,0 +1,80 @@ +/***************************************************//** + * @file DataBufferFeature.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef DATABUFFERFEATUREBASE_H +#define DATABUFFERFEATUREBASE_H + +#include + +#include "vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h" +#include "common/features/FeatureImpl.h" + +namespace seabreeze { + + class DataBufferFeatureBase : public FeatureImpl, public DataBufferFeatureInterface { + public: + DataBufferFeatureBase(); + virtual ~DataBufferFeatureBase(); + + virtual DataBufferCount_t getNumberOfBuffers(); + virtual void clearBuffer(const Protocol &protocol, const Bus &bus, + const DataBufferIndex_t bufferIndex) + throw (FeatureException); + virtual DataBufferElementCount_t getNumberOfElements( + const Protocol &protocol, const Bus &bus, + const DataBufferIndex_t bufferIndex) + throw (FeatureException); + virtual DataBufferElementCount_t getBufferCapacity( + const Protocol &protocol, + const Bus &bus, const DataBufferIndex_t bufferIndex) + throw (FeatureException); + virtual DataBufferElementCount_t getBufferCapacityMinimum( + const Protocol &protocol, const Bus &bus, + const DataBufferIndex_t bufferIndex) + throw (FeatureException); + virtual DataBufferElementCount_t getBufferCapacityMaximum( + const Protocol &protocol, const Bus &bus, + const DataBufferIndex_t bufferIndex) + throw (FeatureException); + virtual void setBufferCapacity(const Protocol &protocol, const Bus &bus, + const DataBufferIndex_t bufferIndex, + const DataBufferElementCount_t bufferSize) + throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + protected: + DataBufferIndex_t numberOfBuffers; + }; + +} /* end namespace */ + +#endif /* DATABUFFERFEATUREBASE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h new file mode 100644 index 0000000..2b086e4 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h @@ -0,0 +1,75 @@ +/***************************************************//** + * @file DataBufferFeatureInterface.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef DATABUFFERFEATUREINTERFACE_H +#define DATABUFFERFEATUREINTERFACE_H + +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + typedef unsigned char DataBufferIndex_t; + typedef DataBufferIndex_t DataBufferCount_t; + typedef unsigned long DataBufferElementCount_t; + + class DataBufferFeatureInterface { + public: + virtual ~DataBufferFeatureInterface() = 0; + + virtual DataBufferCount_t getNumberOfBuffers() = 0; + virtual void clearBuffer(const Protocol &protocol, const Bus &bus, + const DataBufferIndex_t bufferIndex) throw (FeatureException) = 0; + virtual DataBufferElementCount_t getBufferCapacity(const Protocol &protocol, + const Bus &bus, const DataBufferIndex_t bufferIndex) + throw (FeatureException) = 0; + virtual DataBufferElementCount_t getBufferCapacityMaximum( + const Protocol &protocol, const Bus &bus, + const DataBufferIndex_t bufferIndex) throw (FeatureException) = 0; + virtual DataBufferElementCount_t getBufferCapacityMinimum( + const Protocol &protocol, const Bus &bus, + const DataBufferIndex_t bufferIndex) throw (FeatureException) = 0; + virtual DataBufferElementCount_t getNumberOfElements( + const Protocol &protocol, const Bus &bus, + const DataBufferIndex_t bufferIndex) throw (FeatureException) = 0; + virtual void setBufferCapacity(const Protocol &protocol, const Bus &bus, + const DataBufferIndex_t bufferIndex, + const DataBufferElementCount_t bufferSize) + throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline DataBufferFeatureInterface::~DataBufferFeatureInterface() {} + +} /* end namespace */ + + +#endif /* DATABUFFERFEATUREINTERFACE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h b/source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h new file mode 100644 index 0000000..c9ad005 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file QEProDataBufferFeature.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the spectral + * data buffer in the QE-PRO. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef QEPRODATABUFFERFEATURE_H +#define QEPRODATABUFFERFEATURE_H + +#include "vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h" + +namespace seabreeze { + + class QEProDataBufferFeature : public DataBufferFeatureBase { + public: + QEProDataBufferFeature(); + virtual ~QEProDataBufferFeature(); + }; + +} /* end namespace */ + +#endif /* QEPRODATABUFFERFEATURE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h new file mode 100644 index 0000000..4de6785 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file EEPROMSlotFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef EEPROMSLOTFEATURE_H +#define EEPROMSLOTFEATURE_H + +#include "vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h" +#include "vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h" +#include + +namespace seabreeze { + + class EEPROMSlotFeature : public EEPROMSlotFeatureBase, public EEPROMSlotFeatureInterface { + public: + EEPROMSlotFeature(unsigned int numberOfSlots); + virtual ~EEPROMSlotFeature(); + virtual std::vector< std::vector * > *readAllEEPROMSlots(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Overriding this to change its visibility */ + virtual std::vector *readEEPROMSlot(const Protocol &protocol, + const Bus &bus, unsigned int slot) throw (FeatureException, IllegalArgumentException); + virtual int writeEEPROMSlot(const Protocol &protocol, + const Bus &bus, unsigned int slot, const std::vector &data) + throw (FeatureException, IllegalArgumentException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + private: + unsigned int numberOfSlots; + }; + +} + +#endif /* EEPROMSLOTFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h new file mode 100644 index 0000000..9c274e1 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h @@ -0,0 +1,75 @@ +/***************************************************//** + * @file EEPROMSlotFeatureBase.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef EEPROMSLOTFEATUREBASE_H +#define EEPROMSLOTFEATUREBASE_H + +#include "common/features/FeatureImpl.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/SeaBreeze.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/NumberFormatException.h" +#include "common/exceptions/IllegalArgumentException.h" +#include + +namespace seabreeze { + + class EEPROMSlotFeatureBase : public FeatureImpl { + /* Keeping most of this class protected to force use of the derived + * classes, e.g. EEPROMSlotFeature, which can provide better control + * over which slots are accessed. + */ + + protected: + + EEPROMSlotFeatureBase(); + virtual ~EEPROMSlotFeatureBase(); + virtual std::vector *readEEPROMSlot(const Protocol &protocol, + const Bus &bus, unsigned int slot) throw (FeatureException, IllegalArgumentException); + virtual int writeEEPROMSlot(const Protocol &protocol, + const Bus &bus, unsigned int slot, const std::vector &data) + throw (FeatureException, IllegalArgumentException); + + /* This is a utility function that reads out the given EEPROM slot and + * parses it into a double value. If for some reason the parse fails, + * this will throw a NumberFormatException. + */ + double readDouble(const Protocol &protocol, const Bus &bus, + unsigned int slot) throw (FeatureException, NumberFormatException); + + /* As with readDouble(), this will read a slot and parse into an integer */ + long readLong(const Protocol &protocol, const Bus &bus, + unsigned int slot) throw (FeatureException, NumberFormatException); + + }; + +} + +#endif /* EEPROMSLOTFEATUREBASE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h new file mode 100644 index 0000000..7a5f3dc --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h @@ -0,0 +1,60 @@ +/***************************************************//** + * @file EEPROMSlotFeature.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef EEPROMSLOTFEATUREINTERFACE_H +#define EEPROMSLOTFEATUREINTERFACE_H + +#include +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" + +namespace seabreeze { + + class EEPROMSlotFeatureInterface { + public: + virtual ~EEPROMSlotFeatureInterface() = 0; + virtual std::vector< std::vector * > *readAllEEPROMSlots(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + + virtual std::vector *readEEPROMSlot(const Protocol &protocol, + const Bus &bus, unsigned int slot) throw (FeatureException, IllegalArgumentException) = 0; + virtual int writeEEPROMSlot(const Protocol &protocol, + const Bus &bus, unsigned int slot, const std::vector &data) + throw (FeatureException, IllegalArgumentException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline EEPROMSlotFeatureInterface::~EEPROMSlotFeatureInterface() {} + +} + +#endif /* EEPROMSLOTFEATUREINTERFACE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h new file mode 100644 index 0000000..db8e6be --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file NonlinearityEEPROMSlotFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NONLINEARITYEEPROMSLOTFEATURE_H +#define NONLINEARITYEEPROMSLOTFEATURE_H + +#include "vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h" +#include "vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include + +namespace seabreeze { + + class NonlinearityEEPROMSlotFeature + : public NonlinearityCoeffsFeatureInterface, public EEPROMSlotFeatureBase { + public: + NonlinearityEEPROMSlotFeature(); + virtual ~NonlinearityEEPROMSlotFeature(); + std::vector *readNonlinearityCoefficients(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* NONLINEARITYEEPROMSLOTFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h new file mode 100644 index 0000000..5fa8fd6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file SaturationEEPROMSlotFeature_EEPROM.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SATURATIONEEPROMSLOTFEATURE_EEPROM_H +#define SATURATIONEEPROMSLOTFEATURE_EEPROM_H + +#include "vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h" + +namespace seabreeze { + + /* This class is intended for most devices that store their saturation level + * in EEPROM in the so-called "autonulling" configuration. Note that the + * NIRQuest, MayaPro, Apex and some others do not do things quite the same + * way, so they should not use this class. + */ + class SaturationEEPROMSlotFeature + : public SaturationEEPROMSlotFeatureBase { + public: + SaturationEEPROMSlotFeature(int slot); + virtual ~SaturationEEPROMSlotFeature(); + + protected: + /* Inherited from SaturationEEPROMSlotFeatureBase */ + virtual unsigned int getSaturation(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + private: + int autonullingSlot; + }; + +} /* end namespace seabreeze */ + +#endif /* SATURATIONEEPROMSLOTFEATURE_EEPROM_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h new file mode 100644 index 0000000..a56ab41 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h @@ -0,0 +1,67 @@ +/***************************************************//** + * @file SaturationEEPROMSlotFeatureBase.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SATURATIONEEPROMSLOTFEATUREBASE_H +#define SATURATIONEEPROMSLOTFEATUREBASE_H + +#include "vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h" +#include "vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h" + +namespace seabreeze { + + class SaturationEEPROMSlotFeatureBase + : public EEPROMSlotFeatureBase, public ProgrammableSaturationFeatureBase { + public: + SaturationEEPROMSlotFeatureBase(); + virtual ~SaturationEEPROMSlotFeatureBase(); + + /* Inherited from ProgrammableSaturationFeature */ + virtual unsigned int getSaturation() throw (FeatureException); + + /* Inherited from Feature */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + virtual FeatureFamily getFeatureFamily(); + + protected: + /* Derived classes must implement this in whatever way is appropriate + * to get the saturation level for the device. + */ + virtual unsigned int getSaturation(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + + private: + unsigned int saturation; + bool valid; + }; + +} /* end namespace seabreeze */ + +#endif /* SATURATIONEEPROMSLOTFEATUREBASE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h new file mode 100644 index 0000000..5caf4c5 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file SaturationEEPROMSlotFeature_MayaPro.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ +#ifndef SATURATIONEEPROMSLOTFEATURE_MAYAPRO_H +#define SATURATIONEEPROMSLOTFEATURE_MAYAPRO_H + +#include "vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h" +#include + +namespace seabreeze { + + /* This class is intended specifically for getting the saturation level + * from a MayaPro or devices that are closely related to it. + */ + class SaturationEEPROMSlotFeature_MayaPro + : public SaturationEEPROMSlotFeatureBase { + public: + SaturationEEPROMSlotFeature_MayaPro(int slot); + virtual ~SaturationEEPROMSlotFeature_MayaPro(); + + protected: + /* Inherited from SaturationEEPROMSlotFeatureBase */ + virtual unsigned int getSaturation(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + private: + int saturationSlot; + }; + +} /* end namespace seabreeze */ + +#endif /* SATURATIONEEPROMSLOTFEATURE_MAYAPRO_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h new file mode 100644 index 0000000..f13391d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file SaturationEEPROMSlotFeature_NIRQuest.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ +#ifndef SATURATIONEEPROMSLOTFEATURE_NIRQUEST_H +#define SATURATIONEEPROMSLOTFEATURE_NIRQUEST_H + +#include "vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h" +#include + +namespace seabreeze { + + /* This class is intended specifically for getting the saturation level + * from a NIRQuest256/512. No other devices should use this class. + */ + class SaturationEEPROMSlotFeature_NIRQuest + : public SaturationEEPROMSlotFeatureBase { + public: + SaturationEEPROMSlotFeature_NIRQuest(int slot); + virtual ~SaturationEEPROMSlotFeature_NIRQuest(); + + protected: + /* Inherited from SaturationEEPROMSlotFeatureBase */ + virtual unsigned int getSaturation(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + private: + int saturationSlot; + }; + +} /* end namespace seabreeze */ + +#endif /* SATURATIONEEPROMSLOTFEATURE_NIRQUEST_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h new file mode 100644 index 0000000..3464d9d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file SerialNumberEEPROMSlotFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SERIALNUMBEREEPROMSLOTFEATURE_H +#define SERIALNUMBEREEPROMSLOTFEATURE_H + +#include "vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h" +#include "vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h" +#include + +namespace seabreeze { + + class SerialNumberEEPROMSlotFeature + : public EEPROMSlotFeatureBase, public SerialNumberFeatureInterface { + public: + SerialNumberEEPROMSlotFeature(); + virtual ~SerialNumberEEPROMSlotFeature(); + std::string *readSerialNumber(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + unsigned char readSerialNumberMaximumLength(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* SERIALNUMBEREEPROMSLOTFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h new file mode 100644 index 0000000..f9bfa70 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file StrayLightEEPROMSlotFeature.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STRAYLIGHTEEPROMSLOTFEATURE_H +#define STRAYLIGHTEEPROMSLOTFEATURE_H + +#include "vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h" +#include "vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include + +namespace seabreeze { + + class StrayLightEEPROMSlotFeature + : public StrayLightCoeffsFeatureInterface, public EEPROMSlotFeatureBase { + public: + StrayLightEEPROMSlotFeature(); + virtual ~StrayLightEEPROMSlotFeature(); + std::vector *readStrayLightCoefficients(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* STRAYLIGHTEEPROMSLOTFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h new file mode 100644 index 0000000..a256bff --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h @@ -0,0 +1,61 @@ +/***************************************************//** + * @file WavelengthEEPROMSlotFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef WAVELENGTHEEPROMSLOTFEATURE_H +#define WAVELENGTHEEPROMSLOTFEATURE_H + +#include "vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h" +#include "vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include + +namespace seabreeze { + + class WavelengthEEPROMSlotFeature + : public WaveCalFeatureInterface, public EEPROMSlotFeatureBase { + public: + WavelengthEEPROMSlotFeature(unsigned int numberOfPixels); + virtual ~WavelengthEEPROMSlotFeature(); + std::vector *readWavelengths(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + protected: + virtual std::vector *computeWavelengths( + double polynomial[], int length); + unsigned int numberOfPixels; + }; + +} + +#endif /* WAVELENGTHEEPROMSLOTFEATURE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h new file mode 100644 index 0000000..a586359 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file WavelengthEEPROMSlotFeature_QE65000.h + * @date March 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef WAVELENGTHEEPROMSLOTFEATUREQE65000_H +#define WAVELENGTHEEPROMSLOTFEATUREQE65000_H + +#include "vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include + +namespace seabreeze { + + class WavelengthEEPROMSlotFeature_QE65000 + : public WavelengthEEPROMSlotFeature { + public: + WavelengthEEPROMSlotFeature_QE65000(unsigned int numberOfPixels); + virtual ~WavelengthEEPROMSlotFeature_QE65000(); + + protected: + /* Overriding from WavelengthEEPROMSlotFeature */ + virtual std::vector *computeWavelengths(double polynomial[], + int length); + }; + +} + +#endif /* WAVELENGTHEEPROMSLOTFEATUREQE65000_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h b/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h new file mode 100644 index 0000000..a29c8bc --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file FPGARegisterFeature.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FPGA_REGISTER_FEATURE_H +#define SEABREEZE_FPGA_REGISTER_FEATURE_H + +#include "common/features/FeatureImpl.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h" + +namespace seabreeze { + + class FPGARegisterFeature : public FeatureImpl, public FPGARegisterFeatureInterface { + public: + FPGARegisterFeature(); + virtual ~FPGARegisterFeature(); + virtual unsigned int readRegister(const Bus &bus, byte address) + throw (FeatureException); + virtual void writeRegister(const Bus &bus, byte address, unsigned int value) + throw (FeatureException); + virtual unsigned char getMajorVersion(const Bus &bus) + throw (FeatureException); + + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h new file mode 100644 index 0000000..54fa0bc --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file FPGARegisterFeatureInterface.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FPGA_REGISTER_FEATURE_INTERFACE_H +#define SEABREEZE_FPGA_REGISTER_FEATURE_INTERFACE_H + +#include "common/features/Feature.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class FPGARegisterFeatureInterface { + public: + virtual ~FPGARegisterFeatureInterface() = 0; + virtual unsigned int readRegister(const Bus &bus, byte address) + throw (FeatureException) = 0; + virtual void writeRegister(const Bus &bus, byte address, unsigned int value) + throw (FeatureException) = 0; + virtual unsigned char getMajorVersion(const Bus &bus) + throw (FeatureException) = 0; + }; + + inline FPGARegisterFeatureInterface::~FPGARegisterFeatureInterface() {} +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h b/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h new file mode 100644 index 0000000..b85a3c6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h @@ -0,0 +1,71 @@ +/***************************************************//** + * @file IrradCalFeature.h + * @date March 2010 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the + * irradiance calibration storage available on some + * devices (such as the USB2000+). + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef IRRADCALFEATURE_H +#define IRRADCALFEATURE_H + +#include "common/buses/Bus.h" +#include "common/protocols/Protocol.h" +#include "common/features/FeatureImpl.h" +#include "common/exceptions/FeatureException.h" +#include "common/FloatVector.h" +#include "vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h" + +namespace seabreeze { + + class IrradCalFeature : public FeatureImpl, public IrradCalFeatureInterface { + public: + IrradCalFeature(std::vector helpers, int numPixels); + virtual ~IrradCalFeature(); + virtual std::vector *readIrradCalibration(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual int writeIrradCalibration(const Protocol &protocol, + const Bus &bus, const std::vector &values) throw (FeatureException); + int getNumberOfPixels(); + virtual int hasCollectionArea(const Protocol &protocol, + const Bus &bus); + virtual double readCollectionArea(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual void writeCollectionArea(const Protocol &protocol, + const Bus &bus, double area) throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + private: + int numberOfPixels; + }; + +} + +#endif /* IRRADCALFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h new file mode 100644 index 0000000..5805481 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file IrradCalFeatureInterface.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the + * irradiance calibration storage available on some + * devices (such as the USB2000+). + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef IRRADCALFEATUREINTERFACE_H +#define IRRADCALFEATUREINTERFACE_H + +#include "common/buses/Bus.h" +#include "common/protocols/Protocol.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class IrradCalFeatureInterface { + public: + virtual ~IrradCalFeatureInterface() = 0; + virtual std::vector *readIrradCalibration(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual int writeIrradCalibration(const Protocol &protocol, + const Bus &bus, const std::vector &values) throw (FeatureException) = 0; + virtual int hasCollectionArea(const Protocol &protocol, + const Bus &bus) = 0; + virtual double readCollectionArea(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual void writeCollectionArea(const Protocol &protocol, + const Bus &bus, double area) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline IrradCalFeatureInterface::~IrradCalFeatureInterface() {} +} + +#endif /* IRRADCALFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h b/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h new file mode 100644 index 0000000..c114c34 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h @@ -0,0 +1,76 @@ +/***************************************************//** + * @file LightSourceFeatureBase.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef LIGHTSOURCEFEATUREBASE_H +#define LIGHTSOURCEFEATUREBASE_H + +#include "common/features/FeatureImpl.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h" + +namespace seabreeze { + + class LightSourceFeatureBase : public FeatureImpl, + public LightSourceFeatureInterface { + public: + LightSourceFeatureBase(std::vector helpers, int lampModuleIndex); + virtual ~LightSourceFeatureBase(); + + /* Enable controls */ + virtual bool hasLightSourceEnable(const Protocol &protocol, + const Bus &bus, int lightSourceIndex) throw (FeatureException); + + virtual bool isLightSourceEnabled(const Protocol &protocol, + const Bus &bus, int lightSourceIndex) throw (FeatureException); + + virtual void setLightSourceEnable(const Protocol &protocol, + const Bus &bus, int lightSourceIndex, bool enable) throw (FeatureException); + + /* Intensity controls */ + virtual bool hasVariableIntensity(const Protocol &protocol, + const Bus &bus, int lightSourceIndex) throw (FeatureException); + + virtual double getLightSourceIntensity(const Protocol &protocol, + const Bus &bus, int lightSourceIndex) throw (FeatureException); + + virtual void setLightSourceIntensity(const Protocol &protocol, + const Bus &bus, int lightSourceIndex, double intensity) throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + protected: + int moduleIndex; + }; + +} + +#endif /* LIGHTSOURCEFEATUREBASE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h b/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h new file mode 100644 index 0000000..cc94855 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file LightSourceFeatureImpl.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * This is a trivial implementation of LightSourceFeatureInterface + * that can manage a single module with one or more light sources + * (e.g. light bulbs, lasers, LEDs). + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef LIGHTSOURCEFEATUREIMPL_H +#define LIGHTSOURCEFEATUREIMPL_H + +#include "vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h" + +namespace seabreeze { + + class LightSourceFeatureImpl : public LightSourceFeatureBase { + public: + LightSourceFeatureImpl(std::vector helpers, + int lampModuleIndex, int lightSources); + virtual ~LightSourceFeatureImpl(); + + /* Override from LightSourceFeatureBase */ + virtual int getLightSourceCount(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + protected: + int lightSourceCount; + }; + +} + +#endif /* LIGHTSOURCEFEATUREIMPL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h new file mode 100644 index 0000000..4a96948 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h @@ -0,0 +1,72 @@ +/***************************************************//** + * @file LightSourceFeatureInterface.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef LIGHTSOURCEFEATUREINTERFACE_H +#define LIGHTSOURCEFEATUREINTERFACE_H + +#include "common/features/Feature.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class LightSourceFeatureInterface { + public: + virtual ~LightSourceFeatureInterface() = 0; + + virtual int getLightSourceCount(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + + virtual bool hasLightSourceEnable(const Protocol &protocol, + const Bus &bus, int lightSourceIndex) throw (FeatureException) = 0; + + virtual bool isLightSourceEnabled(const Protocol &protocol, + const Bus &bus, int lightSourceIndex) throw (FeatureException) = 0; + + virtual void setLightSourceEnable(const Protocol &protocol, + const Bus &bus, int lightSourceIndex, bool enable) throw (FeatureException) = 0; + + virtual bool hasVariableIntensity(const Protocol &protocol, + const Bus &bus, int lightSourceIndex) throw (FeatureException) = 0; + + virtual double getLightSourceIntensity(const Protocol &protocol, + const Bus &bus, int lightSourceIndex) throw (FeatureException) = 0; + + virtual void setLightSourceIntensity(const Protocol &protocol, + const Bus &bus, int lightSourceIndex, double intensity) throw (FeatureException) = 0; + + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline LightSourceFeatureInterface::~LightSourceFeatureInterface() {} + +} + +#endif /* LIGHTSOURCEFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h b/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h new file mode 100644 index 0000000..7f3be9d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file StrobeLampFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STROBELAMPFEATURE_H +#define STROBELAMPFEATURE_H + +#include "common/features/FeatureImpl.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h" + +namespace seabreeze { + + class StrobeLampFeature : public FeatureImpl, public StrobeLampFeatureInterface { + public: + StrobeLampFeature(std::vector helpers); + virtual ~StrobeLampFeature(); + virtual void setStrobeLampEnable(const Protocol &protocol, + const Bus &bus, bool enable) throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + }; + +} + +#endif /* STROBELAMPFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h new file mode 100644 index 0000000..b2d7df5 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file StrobeLampFeatureInterface.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STROBELAMPFEATUREINTERFACE_H +#define STROBELAMPFEATUREINTERFACE_H + +#include "common/features/Feature.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class StrobeLampFeatureInterface { + public: + virtual ~StrobeLampFeatureInterface() = 0; + virtual void setStrobeLampEnable(const Protocol &protocol, + const Bus &bus, bool enable) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline StrobeLampFeatureInterface::~StrobeLampFeatureInterface() {} +} + +#endif /* STROBELAMPFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h b/source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h new file mode 100644 index 0000000..5f440b9 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file VentanaLightSourceFeature.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef VENTANALIGHTSOURCEFEATURE_H +#define VENTANALIGHTSOURCEFEATURE_H + +#include "vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h" + +namespace seabreeze { + + class VentanaLightSourceFeature : public LightSourceFeatureImpl { + public: + VentanaLightSourceFeature(std::vector helpers); + virtual ~VentanaLightSourceFeature(); + + /* Overriding from Feature */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + }; + +} + +#endif /* VENTANALIGHTSOURCEFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h b/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h new file mode 100644 index 0000000..997f678 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file NonlinearityCoeffsFeature.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NONLINEARITYCOEFFSFEATURE_H +#define NONLINEARITYCOEFFSFEATURE_H + +#include + +#include "vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/features/FeatureImpl.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class NonlinearityCoeffsFeature : public FeatureImpl, + public NonlinearityCoeffsFeatureInterface { + public: + NonlinearityCoeffsFeature(std::vector helpers); + virtual ~NonlinearityCoeffsFeature(); + virtual std::vector *readNonlinearityCoefficients(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* NONLINEARITYCOEFFSFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h new file mode 100644 index 0000000..c13f551 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file NonlinearityCoeffsFeatureInterface.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NONLINEARITYCOEFFSFEATUREINTERFACE_H +#define NONLINEARITYCOEFFSFEATUREINTERFACE_H + +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class NonlinearityCoeffsFeatureInterface { + public: + virtual ~NonlinearityCoeffsFeatureInterface() = 0; + virtual std::vector *readNonlinearityCoefficients(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline NonlinearityCoeffsFeatureInterface::~NonlinearityCoeffsFeatureInterface() {} +} + +#endif /* NONLINEARITYCOEFFSFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h b/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h new file mode 100644 index 0000000..4b1fd6f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h @@ -0,0 +1,70 @@ +/***************************************************//** + * @file OpticalBenchFeature.h + * @date January 2015 + * @author Kirk Clendinning, Heliospecgtra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc, Heliospectra AB + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OPTICALBENCHEFEATURE_H +#define OPTICALBENCHEFEATURE_H + +#include + +#include "vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/features/FeatureImpl.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class OpticalBenchFeature + : public FeatureImpl, public OpticalBenchFeatureInterface { + public: + OpticalBenchFeature(std::vector helpers); + virtual ~OpticalBenchFeature(); + virtual unsigned short int readOpticalBenchFiberDiameterMicrons(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual unsigned short int readOpticalBenchSlitWidthMicrons(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual std::string *readOpticalBenchID(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual std::string *readOpticalBenchSerialNumber(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual std::string *readOpticalBenchCoating(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual std::string *readOpticalBenchFilter(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual std::string *readOpticalBenchGrating(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* OPTICALBENCHEFEATURE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h new file mode 100644 index 0000000..b42389a --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file OpticalBenchFeatureInterface.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OPTICALBENCHFEATUREINTERFACE_H +#define OPTICALBENCHFEATUREINTERFACE_H + +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class OpticalBenchFeatureInterface { + public: + virtual ~OpticalBenchFeatureInterface() = 0; + virtual unsigned short int readOpticalBenchFiberDiameterMicrons(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual unsigned short int readOpticalBenchSlitWidthMicrons(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual std::string *readOpticalBenchID(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual std::string *readOpticalBenchSerialNumber(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual std::string *readOpticalBenchCoating(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual std::string *readOpticalBenchFilter(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual std::string *readOpticalBenchGrating(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline OpticalBenchFeatureInterface::~OpticalBenchFeatureInterface() {} +} + +#endif /* OPTICALBENCHFEATUREINTERFACE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h new file mode 100644 index 0000000..81e96f6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h @@ -0,0 +1,61 @@ +/***************************************************//** + * @file PixelBinningFeatureInterface.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the thermo- + * electric cooler (TEC) feature. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef PIXELBINNINGFEATUREINTERFACE_H +#define PIXELBINNINGFEATUREINTERFACE_H + +#include "common/buses/Bus.h" +#include "common/protocols/Protocol.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" + +namespace seabreeze { + + class PixelBinningFeatureInterface { + public: + virtual ~PixelBinningFeatureInterface() = 0; + virtual void setPixelBinningFactor(const Protocol &protocol, + const Bus &bus, const unsigned char binningFactor) throw (FeatureException) = 0; + virtual unsigned char getPixelBinningFactor(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual void setDefaultPixelBinningFactor(const Protocol &protocol, + const Bus &bus, const unsigned char binningFactor) throw (FeatureException) = 0; + virtual void setDefaultPixelBinningFactor(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual unsigned char getDefaultPixelBinningFactor(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual unsigned char getMaxPixelBinningFactor(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + }; +} + +#endif /* PIXELBINNINGFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h b/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h new file mode 100644 index 0000000..72fb1de --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h @@ -0,0 +1,89 @@ +/***************************************************//** + * @file STSPixelBinningFeature.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the thermo- + * electric unit for devices with a clean + * protocol implementation. This is an abstract base + * class but it does much of the work needed for most + * implementations that can delegate almost everything + * to the protocol layer. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STSPIXELBINNINGFEATURE_H +#define STSPIXELBINNINGFEATURE_H + +#include "common/buses/Bus.h" +#include "common/protocols/Protocol.h" +#include "common/protocols/ProtocolHelper.h" +#include "common/features/FeatureImpl.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" +#include "vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h" + +namespace seabreeze { + + class STSSpectrometerFeature; + + class STSPixelBinningFeature : public FeatureImpl, + public PixelBinningFeatureInterface { + public: + STSPixelBinningFeature(std::vector helpers, + STSSpectrometerFeature *spectroFeature); + virtual ~STSPixelBinningFeature(); + + virtual void setPixelBinningFactor(const Protocol &protocol, + const Bus &bus, const unsigned char binningFactor) + throw (FeatureException); + virtual unsigned char getPixelBinningFactor(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual void setDefaultPixelBinningFactor(const Protocol &protocol, + const Bus &bus, const unsigned char binningFactor) + throw (FeatureException); + virtual void setDefaultPixelBinningFactor(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual unsigned char getDefaultPixelBinningFactor(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual unsigned char getMaxPixelBinningFactor(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Inherited from Feature */ + /* This is still abstract in case the device needs to do anything + * special with regards to defaults when it is initialized. + */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + + virtual FeatureFamily getFeatureFamily(); + + protected: + STSSpectrometerFeature *spectrometerFeature; + }; +} + +#endif /* STSPIXELBINNINGFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h b/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h new file mode 100644 index 0000000..2e5f91f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file RawUSBBusAccessFeature.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_RAW_USB_BUS_ACCESS_FEATURE_H +#define SEABREEZE_RAW_USB_BUS_ACCESS_FEATURE_H + +#include "common/features/FeatureImpl.h" +#include "common/exceptions/FeatureException.h" +#include "vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h" +#include "common/buses/usb/USBInterface.h" + +namespace seabreeze { + + class RawUSBBusAccessFeature : public FeatureImpl, + public RawUSBBusAccessFeatureInterface { + public: + RawUSBBusAccessFeature(); + virtual ~RawUSBBusAccessFeature(); + virtual std::vector readUSB(const USBInterface *bus, int endpoint, + unsigned int length) throw (FeatureException); + virtual int writeUSB(const USBInterface *bus, int endpoint, + const std::vector &data) throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h new file mode 100644 index 0000000..0814f81 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file RawUSBBusAccessFeatureInterface.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_RAW_USB_BUS_ACCESS_FEATURE_INTERFACE_H +#define SEABREEZE_RAW_USB_BUS_ACCESS_FEATURE_INTERFACE_H + +#include "common/features/Feature.h" +#include "common/exceptions/FeatureException.h" +#include "common/buses/usb/USBInterface.h" + +namespace seabreeze { + + class RawUSBBusAccessFeatureInterface { + public: + virtual ~RawUSBBusAccessFeatureInterface() = 0; + virtual std::vector readUSB(const USBInterface *bus, int endpoint, + unsigned int length ) throw (FeatureException) = 0; + virtual int writeUSB(const USBInterface *bus, int endpoint, + const std::vector &data) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline RawUSBBusAccessFeatureInterface::~RawUSBBusAccessFeatureInterface() {} +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h b/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h new file mode 100644 index 0000000..bbd3c39 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file RevisionFeature.h + * @date January 2015 + * @author Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc, Heliospectra AB + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef REVISIONFEATURE_H +#define REVISIONFEATURE_H + +#include + +#include "vendors/OceanOptics/features/revision/RevisionFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/features/FeatureImpl.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class RevisionFeature + : public FeatureImpl, public RevisionFeatureInterface { + public: + RevisionFeature(std::vector helpers); + virtual ~RevisionFeature(); + virtual unsigned char readHardwareRevision(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual unsigned short int readFirmwareRevision(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* REVISIONFEATURE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h new file mode 100644 index 0000000..28db95d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file RevisionFeatureInterface.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef REVISIONFEATUREINTERFACE_H +#define REVISIONFEATUREINTERFACE_H + +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class RevisionFeatureInterface { + public: + virtual ~RevisionFeatureInterface() = 0; + virtual unsigned char readHardwareRevision(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual unsigned short int readFirmwareRevision(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline RevisionFeatureInterface::~RevisionFeatureInterface() {} +} + +#endif /* REVISIONFEATUREINTERFACE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h b/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h new file mode 100644 index 0000000..1b7adb6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h @@ -0,0 +1,58 @@ +/***************************************************//** + * @file SerialNumberFeature.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SERIALNUMBERFEATURE_H +#define SERIALNUMBERFEATURE_H + +#include + +#include "vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/features/FeatureImpl.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class SerialNumberFeature : public FeatureImpl, public SerialNumberFeatureInterface { + public: + SerialNumberFeature(std::vector helpers); + virtual ~SerialNumberFeature(); + virtual std::string *readSerialNumber(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual unsigned char readSerialNumberMaximumLength(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* SERIALNUMBERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h new file mode 100644 index 0000000..2597d48 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file SerialNumberFeatureInterface.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SERIALNUMBERFEATUREINTERFACE_H +#define SERIALNUMBERFEATUREINTERFACE_H + +#include +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class SerialNumberFeatureInterface { + public: + virtual ~SerialNumberFeatureInterface() = 0; + virtual unsigned char readSerialNumberMaximumLength(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual std::string *readSerialNumber(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline SerialNumberFeatureInterface::~SerialNumberFeatureInterface() {} +} + +#endif /* SERIALNUMBERFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h b/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h new file mode 100644 index 0000000..d0a1b88 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h @@ -0,0 +1,56 @@ +/***************************************************//** + * @file ShutterFeature.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SHUTTERFEATURE_H +#define SHUTTERFEATURE_H + +#include + +#include "vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/features/FeatureImpl.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class ShutterFeature : public FeatureImpl, public ShutterFeatureInterface { + public: + ShutterFeature(std::vector helpers); + virtual ~ShutterFeature(); + virtual void setShutterOpen(const Protocol &protocol, + const Bus &bus, bool opened) throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* SHUTTERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h new file mode 100644 index 0000000..5eb35bb --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file ShutterFeatureInterface.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SHUTTERFEATUREINTERFACE_H +#define SHUTTERFEATUREINTERFACE_H + +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class ShutterFeatureInterface { + public: + virtual ~ShutterFeatureInterface() = 0; + virtual void setShutterOpen(const Protocol &protocol, + const Bus &bus, bool opened) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline ShutterFeatureInterface::~ShutterFeatureInterface() {} +} + +#endif /* SHUTTERFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h new file mode 100644 index 0000000..661a266 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file ApexSpectrometerFeature.h + * @date January 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef APEXSPECTROMETERFEATURE_H +#define APEXSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + + class ApexSpectrometerFeature : public GainAdjustedSpectrometerFeature { + public: + ApexSpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~ApexSpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* APEXSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h new file mode 100644 index 0000000..b51fd73 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h @@ -0,0 +1,56 @@ +/***************************************************//** + * @file BlazeSpectrometerFeature.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef BLAZESPECTROMETERFEATURE_H +#define BLAZESPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + + class BlazeSpectrometerFeature : public GainAdjustedSpectrometerFeature { + public: + BlazeSpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~BlazeSpectrometerFeature(); + + /* The Blaze gets wavelengths a bit differently */ + virtual std::vector *getWavelengths(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* BLAZESPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h new file mode 100644 index 0000000..64dda46 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file FlameNIRSpectrometerFeature.h + * @date Apr 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef FLAMENIRSPECTROMETERFEATURE_H +#define FLAMENIRSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + + class FlameNIRSpectrometerFeature + : public GainAdjustedSpectrometerFeature { + public: + FlameNIRSpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~FlameNIRSpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h new file mode 100644 index 0000000..a38b63d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h @@ -0,0 +1,56 @@ +/***************************************************//** + * @file GainAdjustedSpectrometerFeature.h + * @date July 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef GAINADJUSTEDSPECTROMETERFEATURE_H +#define GAINADJUSTEDSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" +#include "vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h" + +namespace seabreeze { + + class GainAdjustedSpectrometerFeature : public OOISpectrometerFeature { + public: + GainAdjustedSpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~GainAdjustedSpectrometerFeature(); + + virtual unsigned int getSaturationLevel(); + + /* Inherited from Feature */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + protected: + ProgrammableSaturationFeature *saturation; + }; + +} + +#endif /* GAINADJUSTEDSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h new file mode 100644 index 0000000..8d591f1 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file HR2000PlusSpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef HR2000PLUSSPECTROMETERFEATURE_H +#define HR2000PLUSSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" + +namespace seabreeze { + + class HR2000PlusSpectrometerFeature : public OOISpectrometerFeature { + public: + HR2000PlusSpectrometerFeature(); + virtual ~HR2000PlusSpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* HR2000PLUSSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h new file mode 100644 index 0000000..c50692a --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file HR2000SpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef HR2000SPECTROMETERFEATURE_H +#define HR2000SPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" + +namespace seabreeze { + + class HR2000SpectrometerFeature : public OOISpectrometerFeature { + public: + HR2000SpectrometerFeature(); + virtual ~HR2000SpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* HR2000SPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h new file mode 100644 index 0000000..dad72b0 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file HR4000SpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef HR4000SPECTROMETERFEATURE_H +#define HR4000SPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" + +namespace seabreeze { + + class HR4000SpectrometerFeature : public OOISpectrometerFeature { + public: + HR4000SpectrometerFeature(); + virtual ~HR4000SpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* HR4000SPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h new file mode 100644 index 0000000..be865fe --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file JazSpectrometerFeature.h + * @date November 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef JAZSPECTROMETERFEATURE_H +#define JAZSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + + class JazSpectrometerFeature + : public GainAdjustedSpectrometerFeature { + public: + JazSpectrometerFeature(ProgrammableSaturationFeature *saturationFeature); + virtual ~JazSpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* JAZSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h new file mode 100644 index 0000000..792625a --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file Maya2000ProSpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef MAYA2000PROSPECTROMETERFEATURE_H +#define MAYA2000PROSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + + class Maya2000ProSpectrometerFeature + : public GainAdjustedSpectrometerFeature { + public: + Maya2000ProSpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~Maya2000ProSpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* MAYA2000PROSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h new file mode 100644 index 0000000..ff2da12 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file Maya2000SpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef MAYA2000SPECTROMETERFEATURE_H +#define MAYA2000SPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" + +namespace seabreeze { + + class Maya2000SpectrometerFeature : public OOISpectrometerFeature { + public: + Maya2000SpectrometerFeature(); + virtual ~Maya2000SpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* MAYA2000SPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h new file mode 100644 index 0000000..5c73755 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file MayaLSLSpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef MAYALSLSPECTROMETERFEATURE_H +#define MAYALSLSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + + class MayaLSLSpectrometerFeature : public GainAdjustedSpectrometerFeature { + public: + MayaLSLSpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~MayaLSLSpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* MAYALSLSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h new file mode 100644 index 0000000..c550920 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file NIRQuest256SpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NIRQUEST256SPECTROMETERFEATURE_H +#define NIRQUEST256SPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h" + +namespace seabreeze { + + class NIRQuest256SpectrometerFeature : public NIRQuestSpectrometerFeature { + public: + NIRQuest256SpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~NIRQuest256SpectrometerFeature(); + }; + +} + +#endif /* NIRQUEST256SPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h new file mode 100644 index 0000000..9331054 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file NIRQuest512SpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NIRQUEST512SPECTROMETERFEATURE_H +#define NIRQUEST512SPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h" + +namespace seabreeze { + + class NIRQuest512SpectrometerFeature : public NIRQuestSpectrometerFeature { + public: + NIRQuest512SpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~NIRQuest512SpectrometerFeature(); + }; + +} + +#endif /* NIRQUEST512SPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h new file mode 100644 index 0000000..365a59d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file NIRQuestSpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NIRQUESTSPECTROMETERFEATURE_H +#define NIRQUESTSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + + class NIRQuestSpectrometerFeature : public GainAdjustedSpectrometerFeature { + public: + NIRQuestSpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~NIRQuestSpectrometerFeature(); + + protected: + void setupExchanges(int readoutLength); + + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* NIRQUESTSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h new file mode 100644 index 0000000..ad2ceae --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h @@ -0,0 +1,111 @@ +/***************************************************//** + * @file OOISpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOISPECTROMETERFEATURE_H +#define OOISPECTROMETERFEATURE_H + +#include +#include "common/features/FeatureImpl.h" +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" +#include "vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h" +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h" + +namespace seabreeze { + + class OOISpectrometerFeature : public FeatureImpl, + public OOISpectrometerFeatureInterface { + public: + OOISpectrometerFeature(); + virtual ~OOISpectrometerFeature(); + /* Request and read out a spectrum formatted into intensity (A/D counts) */ + virtual std::vector *getSpectrum(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Request and read out the raw spectrum data stream */ + virtual std::vector *getUnformattedSpectrum(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Request and read out the wavelengths in nanometers as a vector of doubles */ + virtual std::vector *getWavelengths(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Read the raw spectrum data stream. No request is made first. */ + virtual std::vector *readUnformattedSpectrum(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Set the integration time of the spectrometer */ + virtual void setIntegrationTimeMicros(const Protocol &protocol, + const Bus &bus, unsigned long time_usec) + throw (FeatureException, IllegalArgumentException); + + /* Request that the spectrometer make a spectrum available for + * reading (e.g. with readUnformattedSpectrum()) + */ + virtual void writeRequestSpectrum(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Setting the external trigger mode for the spectrometer */ + virtual void setTriggerMode(const Protocol &protocol, + const Bus &bus, SpectrometerTriggerMode &mode) throw (FeatureException); + + virtual std::vector getTriggerModes() const; + + virtual std::vector getElectricDarkPixelIndices() const; + + virtual long getIntegrationTimeMinimum() const; + virtual long getIntegrationTimeMaximum() const; + virtual long getIntegrationTimeIncrement() const; + + virtual int getNumberOfPixels() const; + virtual int getMaximumIntensity() const; + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + protected: + /* Detector details */ + int numberOfPixels; + int maxIntensity; + + /* Integration time parameters (measured in microseconds) */ + long integrationTimeMinimum; + long integrationTimeMaximum; + long integrationTimeBase; + long integrationTimeIncrement; + + std::vector triggerModes; + std::vector electricDarkPixelIndices; + }; + +} + +#endif /* OOISPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h new file mode 100644 index 0000000..8d896e7 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h @@ -0,0 +1,95 @@ +/***************************************************//** + * @file OOISpectrometerFeatureInterface.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOISPECTROMETERFEATUREINTERFACE_H +#define OOISPECTROMETERFEATUREINTERFACE_H + +#include +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" +#include "vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h" + +namespace seabreeze { + + class OOISpectrometerFeatureInterface { + public: + virtual ~OOISpectrometerFeatureInterface() = 0; + + /* Request and read out a spectrum formatted into intensity (A/D counts) */ + virtual std::vector *getSpectrum(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + + /* Request and read out the raw spectrum data stream */ + virtual std::vector *getUnformattedSpectrum(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + + /* Request and read out the wavelengths in nanometers as a vector of doubles */ + virtual std::vector *getWavelengths(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + + /* Read the raw spectrum data stream. No request is made first. */ + virtual std::vector *readUnformattedSpectrum(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + + /* Set the integration time of the spectrometer */ + virtual void setIntegrationTimeMicros(const Protocol &protocol, + const Bus &bus, unsigned long time_usec) + throw (FeatureException, IllegalArgumentException) = 0; + + /* Request that the spectrometer make a spectrum available for + * reading (e.g. with readUnformattedSpectrum()) + */ + virtual void writeRequestSpectrum(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + + /* Setting the external trigger mode for the spectrometer */ + virtual void setTriggerMode(const Protocol &protocol, + const Bus &bus, SpectrometerTriggerMode &mode) throw (FeatureException) = 0; + + virtual std::vector getTriggerModes() const = 0; + + virtual std::vector getElectricDarkPixelIndices() const = 0; + + virtual long getIntegrationTimeMinimum() const = 0; + virtual long getIntegrationTimeMaximum() const = 0; + virtual long getIntegrationTimeIncrement() const = 0; + + virtual int getNumberOfPixels() const = 0; + virtual int getMaximumIntensity() const = 0; + + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline OOISpectrometerFeatureInterface::~OOISpectrometerFeatureInterface() {} + +} + +#endif /* OOISPECTROMETERFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h new file mode 100644 index 0000000..bb21810 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h @@ -0,0 +1,60 @@ +/***************************************************//** + * @file ProgrammableSaturationFeature.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef PROGRAMMABLESATURATIONFEATURE_H +#define PROGRAMMABLESATURATIONFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h" +#include "common/features/Feature.h" +#include + +namespace seabreeze { + /* ProgrammableSaturationFeature might be implemented by extending another + * Feature, so this needs to use virtual inheritance to solve the + * diamond problem. + */ + class ProgrammableSaturationFeature : public virtual Feature, + public ProgrammableSaturationFeatureInterface { + + public: + ProgrammableSaturationFeature(); + virtual ~ProgrammableSaturationFeature(); + + virtual unsigned int getSaturation() throw (FeatureException) = 0; + + /* Overriding from Feature */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException) = 0; + + virtual FeatureFamily getFeatureFamily() = 0; + }; + +} /* end namespace seabreeze */ + +#endif /* PROGRAMMABLESATURATIONFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h new file mode 100644 index 0000000..762b7fa --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h @@ -0,0 +1,66 @@ +/***************************************************//** + * @file ProgrammableSaturationFeatureBase.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef PROGRAMMABLESATURATIONFEATUREBASE_H +#define PROGRAMMABLESATURATIONFEATUREBASE_H + +#include "vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h" + +namespace seabreeze { + + class ProgrammableSaturationFeatureBase + : public ProgrammableSaturationFeature { + public: + ProgrammableSaturationFeatureBase(); + virtual ~ProgrammableSaturationFeatureBase(); + + /* Inherited from ProgrammableSaturationFeature */ + virtual unsigned int getSaturation() throw (FeatureException); + + /* Overriding from Feature */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + virtual FeatureFamily getFeatureFamily(); + + protected: + /* Derived classes must implement this in whatever way is appropriate + * to get the saturation level for the device. + */ + virtual unsigned int getSaturation(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + + private: + unsigned int saturation; + bool valid; + }; + +} /* end namespace seabreeze */ + +#endif /* PROGRAMMABLESATURATIONFEATUREBASE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h new file mode 100644 index 0000000..b54a333 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h @@ -0,0 +1,61 @@ +/***************************************************//** + * @file ProgrammableSaturationFeatureImpl.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef PROGRAMMABLESATURATIONFEATUREIMPL_H +#define PROGRAMMABLESATURATIONFEATUREIMPL_H + +#include "vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h" +#include "common/features/FeatureImpl.h" +#include "common/protocols/ProtocolHelper.h" +#include + +namespace seabreeze { + /* This class is intended for devices that have a clean protocol + * interface for reading out the saturation level directly. + */ + class ProgrammableSaturationFeatureImpl + : public ProgrammableSaturationFeatureBase, FeatureImpl { + public: + ProgrammableSaturationFeatureImpl(std::vector helpers); + virtual ~ProgrammableSaturationFeatureImpl(); + + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + virtual FeatureFamily getFeatureFamily(); + + protected: + /* Inherited from ProgrammableSaturationFeatureBase */ + virtual unsigned int getSaturation(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + }; + +} /* end namespace seabreeze */ + +#endif /* PROGRAMMABLESATURATIONFEATUREIMPL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h new file mode 100644 index 0000000..f4e9893 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file ProgrammableSaturationFeatureInterface.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef PROGRAMMABLESATURATIONFEATUREINTERFACE_H +#define PROGRAMMABLESATURATIONFEATUREINTERFACE_H + +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class ProgrammableSaturationFeatureInterface { + public: + virtual ~ProgrammableSaturationFeatureInterface() = 0; + + /* + * Get the detector saturation level from the device. + */ + virtual unsigned int getSaturation() throw (FeatureException) = 0; + }; + + + /* Default implementation for (otherwise) pure virtual destructor */ + inline ProgrammableSaturationFeatureInterface::~ProgrammableSaturationFeatureInterface() {} + +} /* end namespace seabreeze */ + +#endif /* PROGRAMMABLESATURATIONFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h new file mode 100644 index 0000000..61f6113 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file QE65000SpectrometerFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef QE65000SPECTROMETERFEATURE_H +#define QE65000SPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" + +namespace seabreeze { + + class QE65000SpectrometerFeature : public OOISpectrometerFeature { + public: + QE65000SpectrometerFeature(); + virtual ~QE65000SpectrometerFeature(); + + /* Overridden from OOISpectrometerFeature because the QE65000 + * wavelength calibration is done differently than in most others + */ + virtual std::vector *getWavelengths(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* QE65000SPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h new file mode 100644 index 0000000..2e4dde6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file QEProSpectrometerFeature.h + * @date June 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef QEPROSPECTROMETERFEATURE_H +#define QEPROSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" + +namespace seabreeze { + + class QEProSpectrometerFeature : public OOISpectrometerFeature { + public: + QEProSpectrometerFeature(); + virtual ~QEProSpectrometerFeature(); + + /* The QE-PRO gets wavelengths a bit differently */ + virtual std::vector *getWavelengths(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* QEPROSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h new file mode 100644 index 0000000..6c46dcb --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h @@ -0,0 +1,74 @@ +/***************************************************//** + * @file STSSpectrometerFeature.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STSSPECTROMETERFEATURE_H +#define STSSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/temperature/TemperatureFeature.h" +#include "vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h" +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" + + +#define STS_TEMPERATURE_DETECTOR_INDEX 0 +#define STS_TEMPERATURE_RESERVED_INDEX 1 +#define STS_TEMPERATURE_CPU_INDEX 2 + +namespace seabreeze { + + namespace oceanBinaryProtocol { + class OBPReadRawSpectrumExchange; + class OBPReadSpectrumExchange; + } + + class STSSpectrometerFeature : public OOISpectrometerFeature { + public: + STSSpectrometerFeature(); + virtual ~STSSpectrometerFeature(); + + void setPixelBinningFactor(unsigned char binningFactor); + + /* The STS gets wavelengths a bit differently */ + virtual std::vector *getWavelengths(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + private: + oceanBinaryProtocol::OBPReadRawSpectrumExchange *unformattedSpectrum; + oceanBinaryProtocol::OBPReadSpectrumExchange *formattedSpectrum; + unsigned char binningFactor; + + static const unsigned int unbinnedNumberOfPixels = 1024; + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* STSSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h new file mode 100644 index 0000000..9d26c0d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file SparkSpectrometerFeature.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SPARKSPECTROMETERFEATURE_H +#define SPARKSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/temperature/TemperatureFeature.h" +#include "vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h" +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" + + +#define SPARK_TEMPERATURE_DETECTOR_INDEX 0 +#define SPARK_TEMPERATURE_RESERVED_INDEX 1 +#define SPARK_TEMPERATURE_CPU_INDEX 2 + +namespace seabreeze { + + class SparkSpectrometerFeature : public OOISpectrometerFeature { + public: + SparkSpectrometerFeature(); + virtual ~SparkSpectrometerFeature(); + + /* The Spark gets wavelengths a bit differently */ + virtual std::vector *getWavelengths(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* SPARKSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h new file mode 100644 index 0000000..3a4443c --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h @@ -0,0 +1,70 @@ +/***************************************************//** + * @file SpectrometerTriggerMode.h + * @date August 2009 + * @author Ocean Optics, Inc. + * + * This file describes the different kinds of trigger modes + * that spectrometers may support. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SPECTROMETER_TRIGGER_MODE_H +#define SPECTROMETER_TRIGGER_MODE_H + +#define SPECTROMETER_TRIGGER_MODE_NORMAL 0x00 +#define SPECTROMETER_TRIGGER_MODE_SOFTWARE 0x01 +#define SPECTROMETER_TRIGGER_MODE_LEVEL 0x01 +#define SPECTROMETER_TRIGGER_MODE_SYNCHRONIZATION 0x02 +#define SPECTROMETER_TRIGGER_MODE_HARDWARE 0x03 +#define SPECTROMETER_TRIGGER_MODE_EDGE 0x03 +#define SPECTROMETER_TRIGGER_MODE_SINGLE_SHOT 0x04 +#define SPECTROMETER_TRIGGER_MODE_SELF_NORMAL 0x80 +#define SPECTROMETER_TRIGGER_MODE_SELF_SOFTWARE 0x81 +#define SPECTROMETER_TRIGGER_MODE_SELF_SYNCHRONIZATION 0x82 +#define SPECTROMETER_TRIGGER_MODE_SELF_HARDWARE 0x83 + +#define SPECTROMETER_TRIGGER_MODE_OBP_NORMAL 0x00 +#define SPECTROMETER_TRIGGER_MODE_OBP_EXTERNAL 0x01 +#define SPECTROMETER_TRIGGER_MODE_OBP_INTERNAL 0x02 + +namespace seabreeze { + + class SpectrometerTriggerMode { + public: + SpectrometerTriggerMode(int mode); + virtual ~SpectrometerTriggerMode(); + + int getTriggerMode(); + + /* Overriding equality operator so that modes can be compared. */ + bool operator==(const SpectrometerTriggerMode &that); + + private: + int triggerMode; + }; + +} + +#endif /* SPECTROMETER_TRIGGER_MODE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h new file mode 100644 index 0000000..afe62e8 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file USB2000PlusSpectrometerFeature.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USB2000PLUSSPECTROMETERFEATURE_H +#define USB2000PLUSSPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + + class USB2000PlusSpectrometerFeature + : public GainAdjustedSpectrometerFeature { + public: + USB2000PlusSpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~USB2000PlusSpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* USB2000PLUSSPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h new file mode 100644 index 0000000..d470c37 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file USB2000SpectrometerFeature.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USB2000SPECTROMETERFEATURE_H +#define USB2000SPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" + +namespace seabreeze { + + class USB2000SpectrometerFeature : public OOISpectrometerFeature { + public: + USB2000SpectrometerFeature(); + virtual ~USB2000SpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* USB2000SPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h new file mode 100644 index 0000000..b43b6ef --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file USB4000SpectrometerFeature.h + * @date May 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef USB4000SPECTROMETERFEATURE_H +#define USB4000SPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + + class USB4000SpectrometerFeature : public GainAdjustedSpectrometerFeature { + public: + USB4000SpectrometerFeature( + ProgrammableSaturationFeature *saturationFeature); + virtual ~USB4000SpectrometerFeature(); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* USB4000SPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h new file mode 100644 index 0000000..ee24b9e --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file VentanaSpectrometerFeature.h + * @date January 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef VENTANASPECTROMETERFEATURE_H +#define VENTANASPECTROMETERFEATURE_H + +#include "vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h" + +namespace seabreeze { + + class VentanaSpectrometerFeature : public OOISpectrometerFeature { + public: + VentanaSpectrometerFeature(); + virtual ~VentanaSpectrometerFeature(); + + /* The Ventana gets wavelengths a bit differently */ + virtual std::vector *getWavelengths(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + private: + static const long INTEGRATION_TIME_MINIMUM; + static const long INTEGRATION_TIME_MAXIMUM; + static const long INTEGRATION_TIME_INCREMENT; + static const long INTEGRATION_TIME_BASE; + }; + +} + +#endif /* VENTANASPECTROMETERFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h b/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h new file mode 100644 index 0000000..a41a265 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h @@ -0,0 +1,68 @@ +/***************************************************//** + * @file SpectrumProcessingFeature.h + * @date February 2015 + * @author Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SPECTRUMPROCESSINGFEATURE_H +#define SPECTRUMPROCESSINGFEATURE_H + +#include + +#include "vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/features/FeatureImpl.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" + +namespace seabreeze { + + class SpectrumProcessingFeature + : public FeatureImpl, public SpectrumProcessingFeatureInterface { + public: + SpectrumProcessingFeature(std::vector helpers); + virtual ~SpectrumProcessingFeature(); + virtual unsigned char readSpectrumProcessingBoxcarWidth( + const Protocol &protocol, const Bus &bus) + throw (FeatureException); + virtual unsigned short int readSpectrumProcessingScansToAverage( + const Protocol &protocol, const Bus &bus) + throw (FeatureException); + virtual void writeSpectrumProcessingBoxcarWidth(const Protocol &protocol, + const Bus &bus, unsigned char boxcarWidth) + throw (FeatureException, IllegalArgumentException); + virtual void writeSpectrumProcessingScansToAverage(const Protocol &protocol, + const Bus &bus, unsigned short int scansToAverage) + throw (FeatureException, IllegalArgumentException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* SPECTRUMPROCESSINGFEATURE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h new file mode 100644 index 0000000..95d1e63 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file SpectrumProcessingFeatureInterface.h + * @date February 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SPECTRUMPROCESSINGFEATUREINTERFACE_H +#define SPECTRUMPROCESSINGFEATUREINTERFACE_H + +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" + +namespace seabreeze { + + class SpectrumProcessingFeatureInterface { + public: + virtual ~SpectrumProcessingFeatureInterface() = 0; + virtual unsigned char readSpectrumProcessingBoxcarWidth(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual unsigned short int readSpectrumProcessingScansToAverage(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual void writeSpectrumProcessingBoxcarWidth(const Protocol &protocol, + const Bus &bus, unsigned char boxcarWidth) + throw (FeatureException, IllegalArgumentException) = 0; + virtual void writeSpectrumProcessingScansToAverage(const Protocol &protocol, + const Bus &bus, unsigned short int scansToAverage) + throw (FeatureException, IllegalArgumentException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline SpectrumProcessingFeatureInterface::~SpectrumProcessingFeatureInterface() {} +} + +#endif /* SPECTRUMPROCESSINGFEATUREINTERFACE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h b/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h new file mode 100644 index 0000000..712c26f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file StrayLightCoeffsFeature.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STRAYLIGHTCOEFFSFEATURE_H +#define STRAYLIGHTCOEFFSFEATURE_H + +#include + +#include "vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/features/FeatureImpl.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class StrayLightCoeffsFeature + : public FeatureImpl, public StrayLightCoeffsFeatureInterface { + public: + StrayLightCoeffsFeature(std::vector helpers); + virtual ~StrayLightCoeffsFeature(); + virtual std::vector *readStrayLightCoefficients(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* STRAYLIGHTCOEFFSFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h new file mode 100644 index 0000000..1fbe6d1 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file StrayLightCoeffsFeatureInterface.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STRAYLIGHTCOEFFSFEATUREINTERFACE_H +#define STRAYLIGHTCOEFFSFEATUREINTERFACE_H + +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class StrayLightCoeffsFeatureInterface { + public: + virtual ~StrayLightCoeffsFeatureInterface() = 0; + virtual std::vector *readStrayLightCoefficients(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline StrayLightCoeffsFeatureInterface::~StrayLightCoeffsFeatureInterface() {} +} + +#endif /* STRAYLIGHTCOEFFSFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h b/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h new file mode 100644 index 0000000..c28ac96 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h @@ -0,0 +1,65 @@ +/***************************************************//** + * @file TemperatureFeature.h + * @date January 2015 + * @author Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc, Heliospectra AB + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef TEMPERATUREFEATURE_H +#define TEMPERATUREFEATURE_H + +#include + +#include "vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/features/FeatureImpl.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class TemperatureFeature + : public FeatureImpl, public TemperatureFeatureInterface { + public: + TemperatureFeature(std::vector helpers); + virtual ~TemperatureFeature(); + + virtual unsigned char readTemperatureCount(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + virtual double readTemperature(const Protocol &protocol, + const Bus &bus, int index) throw (FeatureException); + + virtual std::vector *readAllTemperatures( + const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* TEMPERATUREFEATURE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h new file mode 100644 index 0000000..7c8ed22 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file TemperatureFeatureInterface.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef TEMPERATUREFEATUREINTERFACE_H +#define TEMPERATUREFEATUREINTERFACE_H + +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class TemperatureFeatureInterface { + public: + virtual ~TemperatureFeatureInterface() = 0; + virtual unsigned char readTemperatureCount(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual double readTemperature(const Protocol &protocol, + const Bus &bus, int index) throw (FeatureException) = 0; + virtual std::vector *readAllTemperatures(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline TemperatureFeatureInterface::~TemperatureFeatureInterface() {} +} + +#endif /* TEMPERATUREFEATUREINTERFACE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h b/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h new file mode 100644 index 0000000..e73c22d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file QEProThermoElectricFeature.h + * @date September 2013 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the thermo- + * electric unit (TEC) on the QE-PRO. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ +#ifndef QEPROTHERMOELECTRICFEATURE_H +#define QEPROTHERMOELECTRICFEATURE_H + +#include "vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h" + +namespace seabreeze { + class QEProThermoElectricFeature : public ThermoElectricFeatureBase { + public: + QEProThermoElectricFeature(); + virtual ~QEProThermoElectricFeature(); + + /* Inherited from ThermoElectricFeatureBase where they are pure virtual */ + virtual double getDefaultSetPointCelsius(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual bool getDefaultThermoElectricEnable(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Override from Feature */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + }; +} + +#endif /* QEPROTHERMOELECTRICFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h b/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h new file mode 100644 index 0000000..70fe887 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h @@ -0,0 +1,84 @@ +/***************************************************//** + * @file ThermoElectricFeatureBase.h + * @date March 2013 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the thermo- + * electric unit for devices with a clean + * protocol implementation. This is an abstract base + * class but it does much of the work needed for most + * implementations that can delegate almost everything + * to the protocol layer. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef THERMOELECTRICFEATUREBASE_H +#define THERMOELECTRICFEATUREBASE_H + +#include "common/buses/Bus.h" +#include "common/protocols/Protocol.h" +#include "common/protocols/ProtocolHelper.h" +#include "common/features/FeatureImpl.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" +#include "vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h" + +namespace seabreeze { + + class ThermoElectricFeatureBase : public FeatureImpl, + public ThermoElectricFeatureInterface { + public: + ThermoElectricFeatureBase(); + virtual ~ThermoElectricFeatureBase(); + virtual void setThermoElectricEnable(const Protocol &protocol, + const Bus &bus, bool enable) throw (FeatureException); + virtual double getTemperatureCelsius(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual void setTemperatureSetPointCelsius(const Protocol &protocol, + const Bus &bus, double degreesC) + throw (FeatureException, IllegalArgumentException); + + /* These remain abstract because the limits of any given device will + * depend on its implementation. They will either need to be hardcoded + * into the implementation or be queried from the device. + */ + virtual double getDefaultSetPointCelsius(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual bool getDefaultThermoElectricEnable(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + + /* Inherited from Feature */ + /* This is still abstract in case the device needs to do anything + * special with regards to defaults when it is initialized. + */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException) = 0; + + virtual FeatureFamily getFeatureFamily(); + }; + +} + +#endif /* THERMOELECTRICFEATUREBASE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h new file mode 100644 index 0000000..bf4771d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h @@ -0,0 +1,64 @@ +/***************************************************//** + * @file ThermoElectricFeatureInterface.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the thermo- + * electric cooler (TEC) feature. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef THERMOELECTRICFEATUREINTERFACE_H +#define THERMOELECTRICFEATUREINTERFACE_H + +#include "common/buses/Bus.h" +#include "common/protocols/Protocol.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" + +namespace seabreeze { + + class ThermoElectricFeatureInterface { + public: + virtual ~ThermoElectricFeatureInterface() = 0; + virtual void setThermoElectricEnable(const Protocol &protocol, + const Bus &bus, bool enable) throw (FeatureException) = 0; + virtual double getTemperatureCelsius(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual void setTemperatureSetPointCelsius(const Protocol &protocol, + const Bus &bus, double degreesC) + throw (FeatureException, IllegalArgumentException) = 0; + + virtual double getDefaultSetPointCelsius(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + virtual bool getDefaultThermoElectricEnable(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline ThermoElectricFeatureInterface::~ThermoElectricFeatureInterface() {} +} + +#endif /* THERMOELECTRICFEATUREINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h b/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h new file mode 100644 index 0000000..3dd787c --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h @@ -0,0 +1,68 @@ +/***************************************************//** + * @file ThermoElectricQEFeature.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the thermo- + * electric cooler (TEC) on the QE65000 and similar + * spectrometers (including the NIRQuest). + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef THERMOELECTRICQEFEATURE_H +#define THERMOELECTRICQEFEATURE_H + +#include "common/buses/Bus.h" +#include "common/protocols/Protocol.h" +#include "common/features/Feature.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" +#include "vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h" + +namespace seabreeze { + + class ThermoElectricQEFeature : public ThermoElectricFeatureBase { + public: + ThermoElectricQEFeature(); + virtual ~ThermoElectricQEFeature(); + + /* Inherited from ThermoElectricFeatureBase where they are pure virtual */ + double getDefaultSetPointCelsius(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + bool getDefaultThermoElectricEnable(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Override from Feature */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + + private: + std::vector *readTECDefaults(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + }; + +} + +#endif /* THERMOELECTRICQEFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h b/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h new file mode 100644 index 0000000..a1bf4eb --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h @@ -0,0 +1,63 @@ +/***************************************************//** + * @file VentanaThermoElectricFeature.h + * @date March 2013 + * @author Ocean Optics, Inc. + * + * This feature provides an interface to the thermo- + * electric unit (TEC) on the Ventana. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef VENTANATHERMOELECTRICFEATURE_H +#define VENTANATHERMOELECTRICFEATURE_H + +#include "common/buses/Bus.h" +#include "common/protocols/Protocol.h" +#include "common/features/Feature.h" +#include "common/exceptions/FeatureException.h" +#include "common/exceptions/IllegalArgumentException.h" +#include "vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h" + +namespace seabreeze { + + class VentanaThermoElectricFeature : public ThermoElectricFeatureBase { + public: + VentanaThermoElectricFeature(); + virtual ~VentanaThermoElectricFeature(); + + /* Inherited from ThermoElectricFeatureBase where they are pure virtual */ + virtual double getDefaultSetPointCelsius(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + virtual bool getDefaultThermoElectricEnable(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Override from Feature, used to detect whether capability is present */ + virtual bool initialize(const Protocol &protocol, const Bus &bus) + throw (FeatureException); + }; + +} + +#endif /* VENTANATHERMOELECTRICFEATURE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h b/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h new file mode 100644 index 0000000..f2f1c32 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file WaveCalFeature.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef WAVECALFEATURE_H +#define WAVECALFEATURE_H + +#include "vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h" +#include "common/protocols/Protocol.h" +#include "common/features/FeatureImpl.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + class WaveCalFeature : public FeatureImpl, public WaveCalFeatureInterface { + public: + WaveCalFeature(std::vector helpers, + unsigned int numberOfPixels); + virtual ~WaveCalFeature(); + virtual std::vector *readWavelengths(const Protocol &protocol, + const Bus &bus) throw (FeatureException); + + /* Overriding from Feature */ + virtual FeatureFamily getFeatureFamily(); + + protected: + unsigned int numberOfPixels; + }; + +} + +#endif /* WAVECALFEATURE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h b/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h new file mode 100644 index 0000000..eb2daae --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file WaveCalFeatureInterface.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef WAVECALFEATUREINTERFACE_H +#define WAVECALFEATUREINTERFACE_H + +#include "common/protocols/Protocol.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + class WaveCalFeatureInterface { + public: + virtual ~WaveCalFeatureInterface() = 0; + virtual std::vector *readWavelengths(const Protocol &protocol, + const Bus &bus) throw (FeatureException) = 0; + }; + + /* Default implementation for (otherwise) pure virtual destructor */ + inline WaveCalFeatureInterface::~WaveCalFeatureInterface() {} +} + +#endif /* WAVECALFEATUREINTERFACE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h new file mode 100644 index 0000000..2ca2ca6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h @@ -0,0 +1,64 @@ +/***************************************************//** + * @file AcquisitionDelayProtocolInterface.h + * @date November 2015 + * @author Ocean Optics, Inc. + * + * This is a generic interface into thermoelectric functionality + * at the protocol level, agnostic to any particular protocol. + * Each Protocol offering this functionality should implement + * this interface. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef ACQUISITION_DELAY_PROTOCOL_INTERFACE_H +#define ACQUISITION_DELAY_PROTOCOL_INTERFACE_H + +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class AcquisitionDelayProtocolInterface : public ProtocolHelper { + public: + AcquisitionDelayProtocolInterface(Protocol *protocol); + virtual ~AcquisitionDelayProtocolInterface(); + + virtual void setAcquisitionDelayMicroseconds(const Bus &bus, + const unsigned long delayMicros) throw (ProtocolException) = 0; + + /* At this point, the supported devices don't have protocol + * messages to get the current delay or the range of valid + * settings. Later, such functions could be added here if + * they are needed, but for now the protocol interface is + * being kept to a minimum. + */ + + }; + +} /* end namespace seabreeze */ + +#endif /* ACQUISITION_DELAY_PROTOCOL_INTERFACE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h new file mode 100644 index 0000000..966cfc6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h @@ -0,0 +1,58 @@ +/***************************************************//** + * @file ContinuousStrobeProtocolInterface.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * This is a generic interface into lamp functionality + * at the protocol level, agnostic to any particular protocol. + * Each Protocol offering this functionality should implement + * this interface. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_CONTINUOUS_STROBE_PROTOCOL_INTERFACE_H +#define SEABREEZE_CONTINUOUS_STROBE_PROTOCOL_INTERFACE_H + +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class ContinuousStrobeProtocolInterface : public ProtocolHelper { + public: + ContinuousStrobeProtocolInterface(Protocol *proto); + virtual ~ContinuousStrobeProtocolInterface(); + virtual void setContinuousStrobePeriodMicroseconds(const Bus &bus, + unsigned short strobe_id, unsigned long period_usec) + throw (ProtocolException) = 0; + virtual void setContinuousStrobeEnable(const Bus &bus, + unsigned short strobe_id, bool enable) + throw (ProtocolException) = 0; + }; + +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h new file mode 100644 index 0000000..8f73656 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h @@ -0,0 +1,77 @@ +/***************************************************//** + * @file DataBufferProtocolInterface.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * This is a generic interface into thermoelectric functionality + * at the protocol level, agnostic to any particular protocol. + * Each Protocol offering this functionality should implement + * this interface. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef DATABUFFERPROTOCOLINTERFACE_H +#define DATABUFFERPROTOCOLINTERFACE_H + +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class DataBufferProtocolInterface : public ProtocolHelper { + public: + DataBufferProtocolInterface(Protocol *protocol); + virtual ~DataBufferProtocolInterface(); + + virtual void clearBuffer(const Bus &bus, unsigned char bufferIndex) + throw (ProtocolException) = 0; + + virtual unsigned long getNumberOfElements(const Bus &bus, + unsigned char bufferIndex) + throw (ProtocolException) = 0; + + virtual unsigned long getBufferCapacity(const Bus &bus, + unsigned char bufferIndex) + throw (ProtocolException) = 0; + + virtual unsigned long getBufferCapacityMinimum(const Bus &bus, + unsigned char bufferIndex) + throw (ProtocolException) = 0; + + virtual unsigned long getBufferCapacityMaximum(const Bus &bus, + unsigned char bufferIndex) + throw (ProtocolException) = 0; + + virtual void setBufferCapacity(const Bus &bus, + unsigned char bufferIndex, + const unsigned long capacity) + throw (ProtocolException) = 0; + }; + +} /* end namespace */ + +#endif /* DATABUFFERPROTOCOLINTERFACE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h new file mode 100644 index 0000000..92add4a --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h @@ -0,0 +1,63 @@ +/***************************************************//** + * @file EEPROMProtocolInterface.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * an EEPROM slot on an Ocean Optics device. + * + * This does not extend Protocol or otherwise get involved + * in that hierarchy because it might interfere with the + * lookup process for getting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef EEPROMPROTOCOLINTERFACE_H +#define EEPROMPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" +#include + +namespace seabreeze { + + class EEPROMProtocolInterface : public ProtocolHelper { + public: + EEPROMProtocolInterface(Protocol *protocol); + virtual ~EEPROMProtocolInterface(); + virtual std::vector *readEEPROMSlot(const Bus &bus, int slot) + throw (ProtocolException) = 0; + virtual int writeEEPROMSlot(const Bus &bus, int slot, + const std::vector &data) throw (ProtocolException) = 0; + }; + +} + +#endif /* EEPROMPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h new file mode 100644 index 0000000..38b92fb --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file FPGARegisterProtocolInterface.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * an FPGARegister slot on an Ocean Optics device. + * + * This does not extend Protocol or otherwise get involved + * in that hierarchy because it might interfere with the + * lookup process for getting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FPGA_REGISTER_PROTOCOL_INTERFACE_H +#define SEABREEZE_FPGA_REGISTER_PROTOCOL_INTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class FPGARegisterProtocolInterface : public ProtocolHelper { + public: + FPGARegisterProtocolInterface(Protocol *protocol); + virtual ~FPGARegisterProtocolInterface(); + virtual unsigned int readRegister(const Bus &bus, byte address) + throw (ProtocolException) = 0; + virtual void writeRegister(const Bus &bus, byte address, + unsigned int value) throw (ProtocolException) = 0; + }; + +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h new file mode 100644 index 0000000..d9bbdab --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h @@ -0,0 +1,82 @@ +/***************************************************//** + * @file IrradCalProtocolInterface.h + * @date March 2010 + * @author Ocean Optics, Inc. + * + * This is a generic interface into irradiance calibration + * storage functionality at the protocol level, agnostic to + * any particular protocol. Each Protocol offering this + * functionality should implement this interface. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef IRRADCALPROTOCOLINTERFACE_H +#define IRRADCALPROTOCOLINTERFACE_H + +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class IrradCalProtocolInterface : public ProtocolHelper { + public: + IrradCalProtocolInterface(Protocol *protocol); + virtual ~IrradCalProtocolInterface(); + + /** + * Get the irradiance calibration from the device. + */ + virtual std::vector *readIrradCal(const Bus &bus) + throw (ProtocolException) = 0; + /** + * Write a new irradiance calibration to the device. + */ + virtual int writeIrradCal(const Bus &bus, const std::vector &cal) + throw (ProtocolException) = 0; + + /** + * Determine whether the device has a stored irradiance collection area. + * This will trap any exceptions so it is always safe to call. + */ + virtual int hasCollectionArea(const Bus &bus) = 0; + + /** + * Get the irradiance collection area from the device. + */ + virtual float readCollectionArea(const Bus &bus) + throw (ProtocolException) = 0; + + /** + * Write a new irradiance collection area to the device. + */ + virtual void writeCollectionArea(const Bus &bus, float area) + throw (ProtocolException) = 0; + + }; + +} + +#endif /* IRRADCALPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h new file mode 100644 index 0000000..068765f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h @@ -0,0 +1,95 @@ +/***************************************************//** + * @file LightSourceProtocolInterface.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef LIGHTSOURCEPROTOCOLINTERFACE_H +#define LIGHTSOURCEPROTOCOLINTERFACE_H + +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class LightSourceProtocolInterface : public ProtocolHelper { + public: + LightSourceProtocolInterface(Protocol *proto); + virtual ~LightSourceProtocolInterface(); + + virtual bool hasLightSourceEnable(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException) = 0; + + virtual bool isLightSourceEnabled(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException) = 0; + + virtual bool hasVariableIntensity(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException) = 0; + + virtual void setLightSourceEnable(const Bus &bus, int moduleIndex, + int lightSourceIndex, bool enable) throw (ProtocolException) = 0; + }; + + class LightSourceProtocolInterface_NormalizedIntensity { + public: + LightSourceProtocolInterface_NormalizedIntensity(); + virtual ~LightSourceProtocolInterface_NormalizedIntensity(); + + virtual double getIntensity(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException) = 0; + + virtual void setIntensity(const Bus &bus, int moduleIndex, + int lightSourceIndex, double intensity) throw (ProtocolException) = 0; + + virtual double getIntensityMinimum(const Bus &bus, int moduleIndex, + int lightSourceIndex) = 0; + + virtual double getIntensityMaximum(const Bus &bus, int moduleIndex, + int lightSourceIndex) = 0; + }; + + class LightSourceProtocolInterface_Counts { + public: + LightSourceProtocolInterface_Counts(); + virtual ~LightSourceProtocolInterface_Counts(); + + virtual int getIntensityCounts(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException) = 0; + + virtual int getIntensityMinimumCounts(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException) = 0; + + virtual int getIntensityMaximumCounts(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException) = 0; + + virtual void setIntensityCounts(const Bus &bus, int moduleIndex, + int lightSourceIndex, int counts) throw (ProtocolException) = 0; + }; + +} + +#endif /* LIGHTSOURCEPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h new file mode 100644 index 0000000..9136e5a --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h @@ -0,0 +1,61 @@ +/***************************************************//** + * @file NonlinearityCoeffsProtocolInterface.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * nonlinearity calibrations on an Ocean Optics device. + * + * This does not extend Protocol or otherwise get involved + * in that hierarchy because it might interfere with the + * lookup process for getting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef NONLINEARITYCOEFFSPROTOCOLINTERFACE_H +#define NONLINEARITYCOEFFSPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class NonlinearityCoeffsProtocolInterface : public ProtocolHelper { + public: + NonlinearityCoeffsProtocolInterface(Protocol *protocol); + virtual ~NonlinearityCoeffsProtocolInterface(); + virtual std::vector *readNonlinearityCoeffs(const Bus &bus) + throw (ProtocolException) = 0; + }; + +} + +#endif /* NONLINEARITYCOEFFSPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h new file mode 100644 index 0000000..0ca98f8 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h @@ -0,0 +1,73 @@ +/***************************************************//** + * @file OpticalBenchProtocolInterface.h + * @date Janaure 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * Optical Bench Parameters on an Ocean Optics device. + * + * This does not extend Protocol or otherwise read involved + * in that hierarchy because it might interfere with the + * lookup process for readting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OPTICALBENCHPROTOCOLINTERFACE_H +#define OPTICALBENCHPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class OpticalBenchProtocolInterface : public ProtocolHelper { + public: + OpticalBenchProtocolInterface(Protocol *protocol); + virtual ~OpticalBenchProtocolInterface(); + virtual std::string *readOpticalBenchID(const Bus &bus) + throw (ProtocolException) = 0; + virtual std::string *readOpticalBenchSerialNumber(const Bus &bus) + throw (ProtocolException) = 0; + virtual unsigned short int readOpticalBenchSlitWidthMicrons(const Bus &bus) + throw (ProtocolException) = 0; + virtual unsigned short int readOpticalBenchFiberDiameterMicrons(const Bus &bus) + throw (ProtocolException) = 0; + virtual std::string *readOpticalBenchGrating(const Bus &bus) + throw (ProtocolException) = 0; + virtual std::string *readOpticalBenchFilter(const Bus &bus) + throw (ProtocolException) = 0; + virtual std::string *readOpticalBenchCoating(const Bus &bus) + throw (ProtocolException) = 0; + }; + +} + +#endif /* OPTICALBENCHPROTOCOLINTERFACE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h new file mode 100644 index 0000000..19cebeb --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h @@ -0,0 +1,87 @@ +/***************************************************//** + * @file PixelBinningProtocolInterface.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * This is a generic interface into thermoelectric functionality + * at the protocol level, agnostic to any particular protocol. + * Each Protocol offering this functionality should implement + * this interface. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef PIXELBINNINGPROTOCOLINTERFACE_H +#define PIXELBINNINGPROTOCOLINTERFACE_H + +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class PixelBinningProtocolInterface : public ProtocolHelper { + public: + PixelBinningProtocolInterface(Protocol *protocol); + virtual ~PixelBinningProtocolInterface(); + + /** + * Get the pixel binning factor of the device. + */ + virtual unsigned char readPixelBinningFactor(const Bus &bus) + throw (ProtocolException) = 0; + + /** + * Set the pixel binning factor on the device. + */ + virtual void writePixelBinningFactor(const Bus &bus, const unsigned char binningFactor) + throw (ProtocolException) = 0; + + /** + * Get the default pixel binning factor of the device. + */ + virtual unsigned char readDefaultPixelBinningFactor(const Bus &bus) + throw (ProtocolException) = 0; + + /** + * Set the default pixel binning factor on the device. + */ + virtual void writeDefaultPixelBinningFactor(const Bus &bus, const unsigned char binningFactor) + throw (ProtocolException) = 0; + + /** + * Reset the default pixel binning factor on the device. This will reinstate the factory default of 0. + */ + virtual void writeDefaultPixelBinningFactor(const Bus &bus) + throw (ProtocolException) = 0; + + /** + * Get the maximum pixel binning factor of the device. + */ + virtual unsigned char readMaxPixelBinningFactor(const Bus &bus) + throw (ProtocolException) = 0; + }; +} + +#endif /* PIXELBINNINGPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h new file mode 100644 index 0000000..ff0d75b --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file ProgrammableSaturationProtocolInterface.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef PROGRAMMABLESATURATIONPROTOCOLINTERFACE_H +#define PROGRAMMABLESATURATIONPROTOCOLINTERFACE_H + +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class ProgrammableSaturationProtocolInterface : public ProtocolHelper { + public: + ProgrammableSaturationProtocolInterface(Protocol *protocol); + virtual ~ProgrammableSaturationProtocolInterface(); + + virtual unsigned int getSaturation(const Bus &bus) + throw (ProtocolException) = 0; + }; + +} /* end namespace seabreeze */ + +#endif /* PROGRAMMABLESATURATIONPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h new file mode 100644 index 0000000..c8fc925 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h @@ -0,0 +1,65 @@ +/***************************************************//** + * @file RevisionProtocolInterface.h + * @date Janaure 2015 + * @author Kirk Clendinning, Heliospectra + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * temperature sensors on an Ocean Optics device. + * + * This does not extend Protocol or otherwise get involved + * in that hierarchy because it might interfere with the + * lookup process for getting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef REVISIONPROTOCOLINTERFACE_H +#define REVISIONPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class RevisionProtocolInterface : public ProtocolHelper { + public: + RevisionProtocolInterface(Protocol *protocol); + virtual ~RevisionProtocolInterface(); + + virtual unsigned char readHardwareRevision(const Bus &bus) + throw (ProtocolException) = 0; + + virtual unsigned short int readFirmwareRevision(const Bus &bus) + throw (ProtocolException) = 0; + }; + +} + +#endif /* REVISIONPROTOCOLINTERFACE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h new file mode 100644 index 0000000..8124705 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h @@ -0,0 +1,63 @@ +/***************************************************//** + * @file SerialNumberProtocolInterface.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * serial numbers on an Ocean Optics device. + * + * This does not extend Protocol or otherwise get involved + * in that hierarchy because it might interfere with the + * lookup process for getting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SERIALNUMBERPROTOCOLINTERFACE_H +#define SERIALNUMBERPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" +#include + +namespace seabreeze { + + class SerialNumberProtocolInterface : public ProtocolHelper { + public: + SerialNumberProtocolInterface(Protocol *protocol); + virtual ~SerialNumberProtocolInterface(); + virtual std::string *readSerialNumber(const Bus &bus) + throw (ProtocolException) = 0; + virtual unsigned char readSerialNumberMaximumLength(const Bus &bus) + throw (ProtocolException) = 0; + }; + +} + +#endif /* SERIALNUMBERPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h new file mode 100644 index 0000000..47118c8 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h @@ -0,0 +1,60 @@ +/***************************************************//** + * @file ShutterProtocolInterface.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * a built-in shutter on an Ocean Optics device. + * + * This does not extend Protocol or otherwise get involved + * in that hierarchy because it might interfere with the + * lookup process for getting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SHUTTERPROTOCOLINTERFACE_H +#define SHUTTERPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class ShutterProtocolInterface : public ProtocolHelper { + public: + ShutterProtocolInterface(Protocol *protocol); + virtual ~ShutterProtocolInterface(); + virtual void setShutterOpen(const Bus &bus, bool opened) + throw (ProtocolException) = 0; + }; + +} + +#endif /* SHUTTERPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h new file mode 100644 index 0000000..87c0a10 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h @@ -0,0 +1,64 @@ +/***************************************************//** + * @file SpectrometerProtocolInterface.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a generic interface into spectrometer functionality + * at the protocol level, agnostic to any particular protocol. + * Each Protocol offering this functionality should implement + * this interface. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SPECTROMETERPROTOCOLINTERFACE_H +#define SPECTROMETERPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" +#include "vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h" +#include + +namespace seabreeze { + + class SpectrometerProtocolInterface : public ProtocolHelper { + public: + SpectrometerProtocolInterface(Protocol *protocol); + virtual ~SpectrometerProtocolInterface(); + virtual std::vector *readUnformattedSpectrum(const Bus &bus) + throw (ProtocolException) = 0; + virtual std::vector *readSpectrum(const Bus &bus) + throw (ProtocolException) = 0; + virtual void requestSpectrum(const Bus &bus) throw (ProtocolException) = 0; + virtual void setIntegrationTimeMicros(const Bus &bus, + unsigned long time_usec) throw (ProtocolException) = 0; + virtual void setTriggerMode(const Bus &bus, + SpectrometerTriggerMode &mode) throw (ProtocolException) = 0; + }; + +} + +#endif /* SPECTROMETERPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h new file mode 100644 index 0000000..a31a93d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h @@ -0,0 +1,67 @@ +/***************************************************//** + * @file SpectrumProcessingProtocolInterface.h + * @date February 2015 + * @author Kirk Clendinning, Heliospectra + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * spectrum processing features on an Ocean Optics device. + * + * This does not extend Protocol or otherwise get involved + * in that hierarchy because it might interfere with the + * lookup process for getting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SPECTRUMPROCESSINGPROTOCOLINTERFACE_H +#define SPECTRUMPROCESSINGPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class SpectrumProcessingProtocolInterface : public ProtocolHelper { + public: + SpectrumProcessingProtocolInterface(Protocol *protocol); + virtual ~SpectrumProcessingProtocolInterface(); + virtual unsigned char readSpectrumProcessingBoxcarWidth(const Bus &bus) + throw (ProtocolException) = 0; + virtual unsigned short int readSpectrumProcessingScansToAverage(const Bus &bus) + throw (ProtocolException) = 0; + virtual void writeSpectrumProcessingBoxcarWidth(const Bus &bus, unsigned char boxcarWidth) + throw (ProtocolException) = 0; + virtual void writeSpectrumProcessingScansToAverage(const Bus &bus, unsigned short int scansToAverage) + throw (ProtocolException) = 0; + }; + +} + +#endif /* SPECTRUMPROCESSINGPROTOCOLINTERFACE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h new file mode 100644 index 0000000..f5e4acb --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h @@ -0,0 +1,61 @@ +/***************************************************//** + * @file StrayLightCoeffsProtocolInterface.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * stray light calibrations on an Ocean Optics device. + * + * This does not extend Protocol or otherwise get involved + * in that hierarchy because it might interfere with the + * lookup process for getting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STRAYLIGHTCOEFFSPROTOCOLINTERFACE_H +#define STRAYLIGHTCOEFFSPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" +#include + +namespace seabreeze { + + class StrayLightCoeffsProtocolInterface : public ProtocolHelper { + public: + StrayLightCoeffsProtocolInterface(Protocol *protocol); + virtual ~StrayLightCoeffsProtocolInterface(); + virtual std::vector *readStrayLightCoeffs(const Bus &bus) + throw (ProtocolException) = 0; + }; + +} + +#endif /* STRAYLIGHTCOEFFSPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h new file mode 100644 index 0000000..d2e10c7 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file StrobeLampProtocolInterface.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a generic interface into lamp functionality + * at the protocol level, agnostic to any particular protocol. + * Each Protocol offering this functionality should implement + * this interface. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef STROBELAMPPROTOCOLINTERFACE_H +#define STROBELAMPPROTOCOLINTERFACE_H + +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class StrobeLampProtocolInterface : public ProtocolHelper { + public: + StrobeLampProtocolInterface(Protocol *proto); + virtual ~StrobeLampProtocolInterface(); + virtual void setStrobeLampEnable(const Bus &bus, bool enable) + throw (ProtocolException) = 0; + }; + +} + +#endif /* LAMPPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h new file mode 100644 index 0000000..64adf98 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h @@ -0,0 +1,65 @@ +/***************************************************//** + * @file TemperatureProtocolInterface.h + * @date Janaure 2015 + * @author Kirk Clendinning, Heliospectra + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * temperature sensors on an Ocean Optics device. + * + * This does not extend Protocol or otherwise get involved + * in that hierarchy because it might interfere with the + * lookup process for getting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef TEMPERATUREPROTOCOLINTERFACE_H +#define TEMPERATUREPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class TemperatureProtocolInterface : public ProtocolHelper { + public: + TemperatureProtocolInterface(Protocol *protocol); + virtual ~TemperatureProtocolInterface(); + virtual unsigned char readTemperatureCount(const Bus &bus) + throw (ProtocolException) = 0; + virtual double readTemperature(const Bus &bus, int index) + throw (ProtocolException) = 0; + virtual std::vector *readAllTemperatures(const Bus &bus) + throw (ProtocolException) = 0; + }; + +} + +#endif /* TEMPERATUREPROTOCOLINTERFACE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h new file mode 100644 index 0000000..66e4737 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h @@ -0,0 +1,73 @@ +/***************************************************//** + * @file ThermoElectricProtocolInterface.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a generic interface into thermoelectric functionality + * at the protocol level, agnostic to any particular protocol. + * Each Protocol offering this functionality should implement + * this interface. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef THERMOELECTRICPROTOCOLINTERFACE_H +#define THERMOELECTRICPROTOCOLINTERFACE_H + +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" + +namespace seabreeze { + + class ThermoElectricProtocolInterface : public ProtocolHelper { + public: + ThermoElectricProtocolInterface(Protocol *protocol); + virtual ~ThermoElectricProtocolInterface(); + + /** + * Get the temperature of the thermoelectric device. + */ + virtual double readThermoElectricTemperatureCelsius(const Bus &bus) + throw (ProtocolException) = 0; + + /** + * Enable the thermoelectric unit on the device. + */ + virtual void writeThermoElectricEnable(const Bus &bus, bool enable) + throw (ProtocolException) = 0; + + /** + * Set the target temperature for the thermoelectric in degrees + * Celsius. The actual temperature that the device + * can reach may be a function of ambient temperature. + */ + virtual void writeThermoElectricSetPointCelsius(const Bus &bus, double degreesC) + throw (ProtocolException) = 0; + + }; + +} + +#endif /* THERMOELECTRICPROTOCOLINTERFACE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h new file mode 100644 index 0000000..47af129 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h @@ -0,0 +1,62 @@ +/***************************************************//** + * @file WaveCalProtocolInterface.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * This is a simple interface for any protocol to implement + * that provides a protocol-agnostic mechanism for accessing + * wavelength calibrations on an Ocean Optics device. + * + * This does not extend Protocol or otherwise get involved + * in that hierarchy because it might interfere with the + * lookup process for getting a Protocol object to delegate + * these methods to. Worse, it could end up inheriting + * twice from the same base class, which is just messy. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef WAVECALPROTOCOLINTERFACE_H +#define WAVECALPROTOCOLINTERFACE_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "common/protocols/ProtocolHelper.h" +#include + +namespace seabreeze { + + class WaveCalProtocolInterface : public ProtocolHelper { + public: + WaveCalProtocolInterface(Protocol *protocol); + virtual ~WaveCalProtocolInterface(); + virtual std::vector *readWavelengthCoeffs(const Bus &bus) + throw (ProtocolException) = 0; + }; + +} + +#endif /* WAVECALPROTOCOLINTERFACE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h new file mode 100644 index 0000000..ac5275d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h @@ -0,0 +1,166 @@ +/***************************************************//** + * @file OBPMessageTypes.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * This class contains legal values for the messageType + * field in the OBPMessage class. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPMESSAGETYPES_H +#define OBPMESSAGETYPES_H + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPMessageTypes { + public: +// Basic hardware and firmware information +// static const unsigned int OBP_RESET = 0x00000000; +// static const unsigned int OBP_RESET_DEFAULTS = 0x00000001; + static const unsigned int OBP_GET_HARDWARE_REVISION = 0x00000080; + static const unsigned int OBP_GET_FIRMWARE_REVISION = 0x00000090; + static const unsigned int OBP_GET_SERIAL_NUMBER = 0x00000100; + static const unsigned int OBP_GET_SERIAL_NUMBER_LENGTH = 0x00000101; + static const unsigned int OBP_GET_DEVICE_ALIAS = 0x00000200; + static const unsigned int OBP_GET_DEVICE_ALIAS_LENGTH = 0x00000201; + static const unsigned int OBP_SET_DEVICE_ALIAS = 0x00000210; + static const unsigned int OBP_GET_USER_STRING_COUNT = 0x00000300; + static const unsigned int OBP_GET_USER_STRING_LENGTH = 0x00000301; + static const unsigned int OBP_GET_USER_STRING = 0x00000302; + static const unsigned int OBP_SET_USER_STRING = 0x00000310; + +// Serial Interface + static const unsigned int OBP_GET_RS232_BAUD_RATE = 0x00000800; + static const unsigned int OBP_GET_RS232_FLOW_COTROL_MODE = 0x00000804; + static const unsigned int OBP_SET_RS232_BAUD_RATE = 0x00000810; + static const unsigned int OBP_SET_RS232_FLOW_COTROL_MODE = 0x00000814; + static const unsigned int OBP_GET_RS232_SAVE_SETTINGS = 0x000008F0; + +// Miscellaneous + static const unsigned int OBP_CONFIGURE_STATUS_LED = 0x00001010; +// static const unsigned int OBP_ENTER_REPROGRAMMING_MODE = 0x000FFF00; + + +// Buffering + static const unsigned int OBP_GET_BUFFER_SIZE_MAX = 0x00100820; + static const unsigned int OBP_GET_BUFFER_SIZE_ACTIVE = 0x00100822; + static const unsigned int OBP_CLEAR_BUFFER_ALL = 0x00100830; + static const unsigned int OBP_SET_BUFFER_SIZE_ACTIVE = 0x00100832; + static const unsigned int OBP_GET_BUFFERED_SPEC_COUNT = 0x00100900; + +//Spectra queries + static const unsigned int OBP_GET_BUF_SPEC32_META = 0x00100928; + static const unsigned int OBP_GET_CORRECTED_SPECTRUM_NOW = 0x00101000; + static const unsigned int OBP_GET_SATURATION_LEVEL = 0x001010A0; + static const unsigned int OBP_GET_RAW_SPECTRUM_NOW = 0x00101100; + static const unsigned int OBP_GET_PARTIAL_SPECTRUM_MODE = 0x00102000; + static const unsigned int OBP_SET_PARTIAL_SPECTRUM_MODE = 0x00102010; + static const unsigned int OBP_GET_PARTIAL_SPECTRUM_NOW = 0x00102080; + +// Integration, binning, lamps, shutters etc. + static const unsigned int OBP_SET_ITIME_USEC = 0x00110010; + static const unsigned int OBP_SET_TRIG_MODE = 0x00110110; + static const unsigned int OBP_SIMULATE_TRIG_PULSE = 0x00110120; + static const unsigned int OBP_GET_PIXEL_BINNING_FACTOR = 0x00110280; + static const unsigned int OBP_GET_MAX_BINNING_FACTOR = 0x00110281; + static const unsigned int OBP_GET_DEFAULT_BINNING_FACTOR = 0x00110285; + static const unsigned int OBP_SET_PIXEL_BINNING_FACTOR = 0x00110290; + static const unsigned int OBP_SET_DEFAULT_BINNING_FACTOR = 0x00110295; + static const unsigned int OBP_SET_LAMP_ENABLE = 0x00110410; + static const unsigned int OBP_SET_TRIG_DELAY_USEC = 0x00110510; + static const unsigned int OBP_SET_SHUTTER = 0x00110610; + +// Spectrum filtering and averaging + static const unsigned int OBP_GET_SCANS_TO_AVERAGE = 0x00120000; + static const unsigned int OBP_SET_SCANS_TO_AVERAGE = 0x00120010; + static const unsigned int OBP_GET_BOXCAR_WIDTH = 0x00121000; + static const unsigned int OBP_SET_BOXCAR_WIDTH = 0x00121010; + +// Spectral correction and calibration + static const unsigned int OBP_GET_WL_COEFF_COUNT = 0x00180100; + static const unsigned int OBP_GET_WL_COEFF = 0x00180101; + static const unsigned int OBP_SET_WL_COEFF = 0x00180111; + static const unsigned int OBP_GET_NL_COEFF_COUNT = 0x00181100; + static const unsigned int OBP_GET_NL_COEFF = 0x00181101; + static const unsigned int OBP_SET_NL_COEFF = 0x00181111; + static const unsigned int OBP_GET_IRRAD_CAL_ALL = 0x00182001; + static const unsigned int OBP_GET_IRRAD_CAL_COUNT = 0x00182002; + static const unsigned int OBP_GET_IRRAD_CAL_COLL_AREA = 0x00182003; + static const unsigned int OBP_SET_IRRAD_CAL_ALL = 0x00182011; + static const unsigned int OBP_SET_IRRAD_CAL_COLL_AREA = 0x00182013; + static const unsigned int OBP_GET_STRAY_COEFF_COUNT = 0x00183100; + static const unsigned int OBP_GET_STRAY_COEFF = 0x00183101; + static const unsigned int OBP_SET_STRAY_COEFF = 0x00183111; + static const unsigned int OBP_SPEC_GET_HOT_PIXEL_INDICES = 0x00186000; + static const unsigned int OBP_SPEC_SET_HOT_PIXEL_INDICES = 0x00186010; + +// Optical Bench + static const unsigned int OBP_GET_BENCH_ID = 0x001B0000; + static const unsigned int OBP_GET_BENCH_SERIAL_NUMBER = 0x001B0100; + static const unsigned int OBP_GET_BENCH_SLIT_WIDTH_MICRONS = 0x001B0200; + static const unsigned int OBP_GET_BENCH_FIBER_DIAM_MICRONS = 0x001B0300; + static const unsigned int OBP_GET_BENCH_GRATING = 0x001B0400; + static const unsigned int OBP_GET_BENCH_FILTER = 0x001B0500; + static const unsigned int OBP_GET_BENCH_COATING = 0x001B0600; + +// GPIO + static const unsigned int OBP_GET_GPIO_NUMBER_OF_PINS = 0x00200000; + static const unsigned int OBP_GET_GPIO_OUTPUT_ENABLE_VECTOR = 0x00200100; + static const unsigned int OBP_SET_GPIO_OUTPUT_ENABLE_VECTOR = 0x00200110; + static const unsigned int OBP_GET_GPIO_VALUE = 0x00200300; + static const unsigned int OBP_SET_GPIO_VALUE = 0x00200310; + +// Strobe + static const unsigned int OBP_SET_SINGLE_STROBE_DELAY = 0x00300010; + static const unsigned int OBP_SET_SINGLE_STROBE_WIDTH = 0x00300011; + static const unsigned int OBP_SET_SINGLE_STROBE_ENABLE = 0x00300012; + static const unsigned int OBP_SET_CONT_STROBE_PERIOD = 0x00310010; + static const unsigned int OBP_SET_CONT_STROBE_ENABLE = 0x00310011; + +// Temperature control and sensing + static const unsigned int OBP_GET_TEMPERATURE_COUNT = 0x00400000; + static const unsigned int OBP_GET_TEMPERATURE = 0x00400001; + static const unsigned int OBP_GET_TEMPERATURE_ALL = 0x00400002; + static const unsigned int OBP_GET_TE_ENABLE = 0x00420000; + static const unsigned int OBP_GET_TE_SETPOINT = 0x00420001; + static const unsigned int OBP_GET_TE_FAN_ENABLE = 0x00420002; + static const unsigned int OBP_GET_TE_IS_STABLE = 0x00420003; + static const unsigned int OBP_GET_TE_TEMPERATURE = 0x00420004; + static const unsigned int OBP_SET_TE_ENABLE = 0x00420010; + static const unsigned int OBP_SET_TE_SETPOINT = 0x00420011; + static const unsigned int OBP_SET_TE_FAN_ENABLE = 0x00420012; + +// light source control + static const unsigned int OBP_GET_LIGHT_SOURCE_ENABLE = 0x00810021; + static const unsigned int OBP_SET_LIGHT_SOURCE_ENABLE = 0x00810031; + static const unsigned int OBP_GET_LIGHT_SOURCE_INTENSITY = 0x00810041; + static const unsigned int OBP_SET_LIGHT_SOURCE_INTENSITY = 0x00810051; + }; + } +} + +#endif /* OBPMESSAGETYPES_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h new file mode 100644 index 0000000..bf143c6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file OBPCommand.h + * @date May 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPCOMMAND_H +#define OBPCOMMAND_H + +#include +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPCommand : public OBPTransaction { + public: + OBPCommand(); + virtual ~OBPCommand(); + + using OBPTransaction::sendCommandToDevice; + virtual bool sendCommandToDevice(TransferHelper *helper) throw (ProtocolException); + + protected: + int messageType; + std::vector payload; + }; + } +} + +#endif /* OBPCOMMAND_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h new file mode 100644 index 0000000..ef968bd --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPContinuousStrobeEnableExchange.h + * @date February 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPCONTINUOUS_STROBE_ENABLE_EXCHANGE_H +#define OBPCONTINUOUS_STROBE_ENABLE_EXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPContinuousStrobeEnableExchange : public OBPCommand { + public: + OBPContinuousStrobeEnableExchange(); + virtual ~OBPContinuousStrobeEnableExchange(); + void setContinuousStrobeEnable(bool enable); + }; + } +} + +#endif /* OBPCONTINUOUS_STROBE_ENABLE_EXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h new file mode 100644 index 0000000..4a9fcb6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPContinuousStrobePeriodExchange.h + * @date February 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPCONTINUOUS_STROBE_PERIOD_EXCHANGE_H +#define OBPCONTINUOUS_STROBE_PERIOD_EXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPContinuousStrobePeriodExchange : public OBPCommand { + public: + OBPContinuousStrobePeriodExchange(); + virtual ~OBPContinuousStrobePeriodExchange(); + void setContinuousStrobePeriodMicroseconds(unsigned long period_usec); + }; + } +} + +#endif /* OBPCONTINUOUS_STROBE_PERIOD_EXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h new file mode 100644 index 0000000..e4dd76c --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPDataBufferClearExchange.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPDATABUFFERCLEAREXCHANGE_H +#define OBPDATABUFFERCLEAREXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPDataBufferClearExchange : public OBPCommand { + public: + OBPDataBufferClearExchange(); + virtual ~OBPDataBufferClearExchange(); + }; + } /* end namespace oceanBinaryProtocol */ +} /* end namespace seabreeze */ + +#endif /* OBPDATABUFFERCLEAREXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h new file mode 100644 index 0000000..5a7b4c2 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetAllTemperaturesExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETALLTEMPERATURESEXCHANGE_H +#define OBPGETALLTEMPERATURESEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetAllTemperaturesExchange : public OBPQuery { + public: + OBPGetAllTemperaturesExchange(); + virtual ~OBPGetAllTemperaturesExchange(); + }; + } +} + +#endif /* OBPGETALLTEMPERATURESEXCHANGE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h new file mode 100644 index 0000000..c586f7f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetBoxcarWidthExchange.h + * @date February 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETBOXCARWIDTHEXCHANGE_H +#define OBPGETBOXCARWIDTHEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetBoxcarWidthExchange : public OBPQuery { + public: + OBPGetBoxcarWidthExchange(); + virtual ~OBPGetBoxcarWidthExchange(); + }; + } +} + +#endif /* OBPGETBOXCARWIDTHEXCHANGE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h new file mode 100644 index 0000000..006e4d6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file OBPGetDataBufferCapacityExchange.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETDATABUFFERCAPACITYEXCHANGE_H +#define OBPGETDATABUFFERCAPACITYEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetDataBufferCapacityExchange : public OBPQuery { + public: + OBPGetDataBufferCapacityExchange(); + virtual ~OBPGetDataBufferCapacityExchange(); + + unsigned long queryBufferCapacity(TransferHelper *helper) + throw (ProtocolException); + }; + } /* end namespace oceanBinaryProtocol */ +} /* end namespace seabreeze */ + +#endif /* OBPGETDATABUFFERCAPACITYEXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h new file mode 100644 index 0000000..7bf4ceb --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file OBPGetDataBufferElementCountExchange.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETDATABUFFERELEMENTCOUNTEXCHANGE_H +#define OBPGETDATABUFFERELEMENTCOUNTEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetDataBufferElementCountExchange : public OBPQuery { + public: + OBPGetDataBufferElementCountExchange(); + virtual ~OBPGetDataBufferElementCountExchange(); + + unsigned long queryNumberOfElements(TransferHelper *helper) + throw (ProtocolException); + }; + } /* end namespace oceanBinaryProtocol */ +} /* end namespace seabreeze */ + +#endif /* OBPGETDATABUFFERELEMENTCOUNTEXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h new file mode 100644 index 0000000..f1bebfc --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file OBPGetDataBufferMaximumCapacityExchange.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETDATABUFFERMAXIMUMCAPACITYEXCHANGE_H +#define OBPGETDATABUFFERMAXIMUMCAPACITYEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetDataBufferMaximumCapacityExchange : public OBPQuery { + public: + OBPGetDataBufferMaximumCapacityExchange(); + virtual ~OBPGetDataBufferMaximumCapacityExchange(); + + unsigned long queryBufferMaximumCapacity( + TransferHelper *helper) throw (ProtocolException); + }; + } /* end namespace oceanBinaryProtocol */ +} /* end namespace seabreeze */ + +#endif /* OBPGETDATABUFFERMAXIMUMCAPACITYEXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h new file mode 100644 index 0000000..0726a85 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPGetDefaultPixelBinningExchange.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETDEFAULTPIXELBINNINGEXCHANGE_H +#define OBPGETDEFAULTPIXELBINNINGEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetDefaultPixelBinningExchange : public OBPQuery { + public: + OBPGetDefaultPixelBinningExchange(); + virtual ~OBPGetDefaultPixelBinningExchange(); + unsigned char getDefaultPixelBinningFactor(); + }; + } +} + +#endif /* OBPGETDEFAULTPIXELBINNINGEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h new file mode 100644 index 0000000..73ddbcf --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetFirmwareRevisionExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETFIRMWAREREVISIONEXCHANGE_H +#define OBPGETFIRMWAREREVISIONEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetFirmwareRevisionExchange : public OBPQuery { + public: + OBPGetFirmwareRevisionExchange(); + virtual ~OBPGetFirmwareRevisionExchange(); + }; + } +} + +#endif /* OBPGETFIRMWAREREVISIONEXCHANGE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h new file mode 100644 index 0000000..f24b906 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetHardwareRevisionExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETHARDWAREREVISIONEXCHANGE_H +#define OBPGETHARDWAREREVISIONEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetHardwareRevisionExchange : public OBPQuery { + public: + OBPGetHardwareRevisionExchange(); + virtual ~OBPGetHardwareRevisionExchange(); + }; + } +} + +#endif /* OBPGETHARDWAREREVISIONEXCHANGE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h new file mode 100644 index 0000000..af9b3ea --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetIrradCalExchange.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETIRRADCALEXCHANGE_H +#define OBPGETIRRADCALEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetIrradCalExchange : public OBPQuery { + public: + OBPGetIrradCalExchange(); + virtual ~OBPGetIrradCalExchange(); + }; + } +} + +#endif /* OBPGETIRRADCALEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h new file mode 100644 index 0000000..b8e03c9 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetIrradCollectionAreaExchange.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETIRRADCOLLECTIONAREAEXCHANGE_H +#define OBPGETIRRADCOLLECTIONAREAEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetIrradCollectionAreaExchange : public OBPQuery { + public: + OBPGetIrradCollectionAreaExchange(); + virtual ~OBPGetIrradCollectionAreaExchange(); + }; + } +} + +#endif /* OBPGETIRRADCOLLECTIONAREAEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h new file mode 100644 index 0000000..dd19e5b --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPGetMaxPixelBinningExchange.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETMAXPIXELBINNINGEXCHANGE_H +#define OBPGETMAXPIXELBINNINGEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetMaxPixelBinningExchange : public OBPQuery { + public: + OBPGetMaxPixelBinningExchange(); + virtual ~OBPGetMaxPixelBinningExchange(); + unsigned char getMaxPixelBinningFactor(); + }; + } +} + +#endif /* OBPGETMAXPIXELBINNINGEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h new file mode 100644 index 0000000..77f5840 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file OBPGetNonlinearityCoeffExchange.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETNONLINEARITYCOEFFEXCHANGE_H +#define OBPGETNONLINEARITYCOEFFEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetNonlinearityCoeffExchange : public OBPQuery { + public: + OBPGetNonlinearityCoeffExchange(); + virtual ~OBPGetNonlinearityCoeffExchange(); + + void setCoefficientIndex(unsigned int index); + }; + } +} + +#endif /* OBPGETNONLINEARITYCOEFFEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h new file mode 100644 index 0000000..315e673 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetNonlinearityCoeffsCountExchange.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETNONLINEARITYCOEFFSCOUNTEXCHANGE_H +#define OBPGETNONLINEARITYCOEFFSCOUNTEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetNonlinearityCoeffsCountExchange : public OBPQuery { + public: + OBPGetNonlinearityCoeffsCountExchange(); + virtual ~OBPGetNonlinearityCoeffsCountExchange(); + }; + } +} + +#endif /* OBPGETNONLINEARITYCOEFFSCOUNTEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h new file mode 100644 index 0000000..e6964d4 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetOpticalBenchCoatingExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETOPTICALBENCHCOATINGEXCHANGE_H +#define OBPGETOPTICALBENCHCOATINGEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetOpticalBenchCoatingExchange : public OBPQuery { + public: + OBPGetOpticalBenchCoatingExchange(); + virtual ~OBPGetOpticalBenchCoatingExchange(); + }; + } +} + +#endif /* OBPGETOPTICALBENCHCOATINGEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h new file mode 100644 index 0000000..268a2ee --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetOpticalBenchFiberDiameterMicronsExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETOPTICALBENCHFIBERDIAMETERMIRCONSEXCHANGE_H +#define OBPGETOPTICALBENCHFIBERDIAMETERMIRCONSEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetOpticalBenchFiberDiameterMicronsExchange : public OBPQuery { + public: + OBPGetOpticalBenchFiberDiameterMicronsExchange(); + virtual ~OBPGetOpticalBenchFiberDiameterMicronsExchange(); + }; + } +} + +#endif /* OBPGETOPTICALBENCHFIBERDIAMETERMIRCONSEXCHANGE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h new file mode 100644 index 0000000..c314138 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetOpticalBenchFilterExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETOPTICALBENCHFILTEREXCHANGE_H +#define OBPGETOPTICALBENCHFILTEREXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetOpticalBenchFilterExchange : public OBPQuery { + public: + OBPGetOpticalBenchFilterExchange(); + virtual ~OBPGetOpticalBenchFilterExchange(); + }; + } +} + +#endif /* OBPGETOPTICALBENCHFILTEREXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h new file mode 100644 index 0000000..1bb9b07 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetOpticalBenchGratingExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETOPTICALBENCHGRATINGEXCHANGE_H +#define OBPGETOPTICALBENCHGRATINGEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetOpticalBenchGratingExchange : public OBPQuery { + public: + OBPGetOpticalBenchGratingExchange(); + virtual ~OBPGetOpticalBenchGratingExchange(); + }; + } +} + +#endif /* OBPGETOPTICALBENCHGRATINGEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h new file mode 100644 index 0000000..725430d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetOpticalBenchIDExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETOPTICALBENCHIDEXCHANGE_H +#define OBPGETOPTICALBENCHIDEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetOpticalBenchIDExchange : public OBPQuery { + public: + OBPGetOpticalBenchIDExchange(); + virtual ~OBPGetOpticalBenchIDExchange(); + }; + } +} + +#endif /* OBPGETOPTICALBENCHIDEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h new file mode 100644 index 0000000..75b862c --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetOpticalBenchSerialNumberExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETOPTICALBENCHSERIALNUMBEREXCHANGE_H +#define OBPGETOPTICALBENCHSERIALNUMBEREXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetOpticalBenchSerialNumberExchange : public OBPQuery { + public: + OBPGetOpticalBenchSerialNumberExchange(); + virtual ~OBPGetOpticalBenchSerialNumberExchange(); + }; + } +} + +#endif /* OBPGETOPTICALBENCHSERIALNUMBEREXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h new file mode 100644 index 0000000..87aa8d6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetOpticalBenchSlitWidthMicronsExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETOPTICALBENCHSLITWIDTHMIRCONSEXCHANGE_H +#define OBPGETOPTICALBENCHSLITWIDTHMIRCONSEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetOpticalBenchSlitWidthMicronsExchange : public OBPQuery { + public: + OBPGetOpticalBenchSlitWidthMicronsExchange(); + virtual ~OBPGetOpticalBenchSlitWidthMicronsExchange(); + }; + } +} + +#endif /* OBPGETOPTICALBENCHSLITWIDTHMIRCONSEXCHANGE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h new file mode 100644 index 0000000..bc1c40b --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPGetPixelBinningExchange.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETPIXELBINNINGEXCHANGE_H +#define OBPGETPIXELBINNINGEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetPixelBinningExchange : public OBPQuery { + public: + OBPGetPixelBinningExchange(); + virtual ~OBPGetPixelBinningExchange(); + unsigned char getPixelBinningFactor(); + }; + } +} + +#endif /* OBPGETPIXELBINNINGEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h new file mode 100644 index 0000000..0b7d015 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file OBPGetSaturationExchange.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETSATURATIONEXCHANGE_H +#define OBPGETSATURATIONEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetSaturationExchange : public OBPQuery { + public: + OBPGetSaturationExchange(); + virtual ~OBPGetSaturationExchange(); + + unsigned int querySaturationLevel(TransferHelper *helper) + throw (ProtocolException); + }; + } +} + +#endif /* OBPGETSATURATIONEXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h new file mode 100644 index 0000000..184b91e --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetScansToAverageExchange.h + * @date February 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETSCANSTOAVERAGEEXCHANGE_H +#define OBPGETSCANSTOAVERAGEEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetScansToAverageExchange : public OBPQuery { + public: + OBPGetScansToAverageExchange(); + virtual ~OBPGetScansToAverageExchange(); + }; + } +} + +#endif /* OBPGETSCANSTOAVERAGEEXCHANGE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h new file mode 100644 index 0000000..62e82e1 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetSerialNumberExchange.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETSERIALNUMBEREXCHANGE_H +#define OBPGETSERIALNUMBEREXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetSerialNumberExchange : public OBPQuery { + public: + OBPGetSerialNumberExchange(); + virtual ~OBPGetSerialNumberExchange(); + }; + } +} + +#endif /* OBPGETSERIALNUMBEREXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h new file mode 100644 index 0000000..25aaa52 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetSerialNumberMaximumLengthExchange.h + * @date Janaury 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETSERIALNUMBERMAXIMUMLENGTHEXCHANGE_H +#define OBPGETSERIALNUMBERMAXIMUMLENGTHEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetSerialNumberMaximumLengthExchange : public OBPQuery { + public: + OBPGetSerialNumberMaximumLengthExchange(); + virtual ~OBPGetSerialNumberMaximumLengthExchange(); + }; + } +} + +#endif /* OBPGETSERIALNUMBERMAXIMUMLENGTHEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h new file mode 100644 index 0000000..d301f3c --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file OBPGetStrayLightCoeffExchange.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETSTRAYLIGHTCOEFFEXCHANGE_H +#define OBPGETSTRAYLIGHTCOEFFEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetStrayLightCoeffExchange : public OBPQuery { + public: + OBPGetStrayLightCoeffExchange(); + virtual ~OBPGetStrayLightCoeffExchange(); + + void setCoefficientIndex(unsigned int index); + }; + } +} + +#endif /* OBPGETSTRAYLIGHTCOEFFEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h new file mode 100644 index 0000000..71d4edf --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetStrayLightCoeffsCountExchange.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETSTRAYLIGHTCOEFFSCOUNTEXCHANGE_H +#define OBPGETSTRAYLIGHTCOEFFSCOUNTEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetStrayLightCoeffsCountExchange : public OBPQuery { + public: + OBPGetStrayLightCoeffsCountExchange(); + virtual ~OBPGetStrayLightCoeffsCountExchange(); + }; + } +} + +#endif /* OBPGETSTRAYLIGHTCOEFFSCOUNTEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h new file mode 100644 index 0000000..b2aa762 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetTemperatureCountExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc, Heliospectra AB + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETTEMPERATURECOUNTEXCHANGE_H +#define OBPGETTEMPERATURECOUNTEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetTemperatureCountExchange : public OBPQuery { + public: + OBPGetTemperatureCountExchange(); + virtual ~OBPGetTemperatureCountExchange(); + }; + } +} + +#endif /* OBPGETTEMPERATURECOUNTEXCHANGE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h new file mode 100644 index 0000000..8008932 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file OBPGetTemperatureExchange.h + * @date January 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETTEMPERATUREEXCHANGE_H +#define OBPGETTEMPERATUREEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetTemperatureExchange : public OBPQuery { + public: + OBPGetTemperatureExchange(); + virtual ~OBPGetTemperatureExchange(); + + void setTemperatureIndex(unsigned int index); + }; + } +} + +#endif /* OBPGETTEMPERATUREEXCHANGE_H */ \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h new file mode 100644 index 0000000..dc287ff --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPGetThermoElectricTemperatureExchange.h + * @date March 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETTHERMOELECTRICTEMPERATUREEXCHANGE_H +#define OBPGETTHERMOELECTRICTEMPERATUREEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetThermoElectricTemperatureExchange : public OBPQuery { + public: + OBPGetThermoElectricTemperatureExchange(); + virtual ~OBPGetThermoElectricTemperatureExchange(); + }; + } +} + +#endif /* OBPGETTHERMOELECTRICTEMPERATUREEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h new file mode 100644 index 0000000..b317dfc --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file OBPGetWaveCalExchange.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPGETWAVECALEXCHANGE_H +#define OBPGETWAVECALEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPGetWaveCalExchange : public OBPQuery { + public: + OBPGetWaveCalExchange(); + virtual ~OBPGetWaveCalExchange(); + + void setCoefficientIndex(unsigned int index); + }; + } +} + +#endif /* OBPGETWAVECALEXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h new file mode 100644 index 0000000..d83ab16 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file OBPIntegrationTimeExchange.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPINTEGRATIONTIMEEXCHANGE_H +#define OBPINTEGRATIONTIMEEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h" +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPIntegrationTimeExchange : public OBPCommand { + public: + OBPIntegrationTimeExchange(unsigned long integrationTimeBase_usec); + virtual ~OBPIntegrationTimeExchange(); + void setIntegrationTimeMicros(unsigned long integrationTime_usec); + + private: + unsigned long integrationTimeBase_usec; + unsigned long integrationTime_usec; + }; + } +} + +#endif /* OBPINTEGRATIONTIMEEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h new file mode 100644 index 0000000..9c376d1 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file OBPLampEnableCommand.cpp + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPLAMPENABLECOMMAND_H +#define OBPLAMPENABLECOMMAND_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPLampEnableCommand : public OBPCommand { + public: + OBPLampEnableCommand(); + virtual ~OBPLampEnableCommand(); + + void setEnable(TransferHelper *helper, bool enable) + throw (ProtocolException); + }; + } /* end namespace oceanBinaryProtocol */ +} /* end namespace seabreeze */ + + +#endif /* OBPLAMPENABLECOMMAND_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h new file mode 100644 index 0000000..245109f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file OBPLightSourceEnableCommand.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPLIGHTSOURCEENABLECOMMAND_H +#define OBPLIGHTSOURCEENABLECOMMAND_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + + class OBPLightSourceEnableCommand : public OBPCommand { + public: + OBPLightSourceEnableCommand(); + virtual ~OBPLightSourceEnableCommand(); + + virtual void setLightSourceEnable(int moduleIndex, int source, bool enable); + }; + + } +} + +#endif /* OBPLIGHTSOURCEENABLECOMMAND_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h new file mode 100644 index 0000000..82d618c --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file OBPLightSourceEnabledQuery.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPLIGHTSOURCEENABLEDQUERY_H +#define OBPLIGHTSOURCEENABLEDQUERY_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + + class OBPLightSourceEnabledQuery : public OBPQuery { + public: + OBPLightSourceEnabledQuery(int module, int source); + virtual ~OBPLightSourceEnabledQuery(); + + bool queryEnable(TransferHelper *helper) throw (ProtocolException); + + private: + int moduleIndex; + int lightSourceIndex; + }; + + } +} + +#endif /* OBPLIGHTSOURCEENABLEDQUERY_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h new file mode 100644 index 0000000..07eb3e7 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file OBPLightSourceIntensityCommand.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPLIGHTSOURCEINTENSITYCOMMAND_H +#define OBPLIGHTSOURCEINTENSITYCOMMAND_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + + class OBPLightSourceIntensityCommand : public OBPCommand { + public: + OBPLightSourceIntensityCommand(); + virtual ~OBPLightSourceIntensityCommand(); + + virtual void setLightSourceIntensity(int moduleIndex, int source, + float intensity); + }; + + } +} + +#endif /* OBPLIGHTSOURCEINTENSITYCOMMAND_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h new file mode 100644 index 0000000..e53a3bd --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file OBPLightSourceIntensityQuery.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPLIGHTSOURCEINTENSITYQUERY_H +#define OBPLIGHTSOURCEINTENSITYQUERY_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + + class OBPLightSourceIntensityQuery : public OBPQuery { + public: + OBPLightSourceIntensityQuery(int module, int source); + virtual ~OBPLightSourceIntensityQuery(); + + float queryIntensity(TransferHelper *helper) throw (ProtocolException); + + private: + int moduleIndex; + int lightSourceIndex; + }; + + } +} + +#endif /* OBPLIGHTSOURCEINTENSITYQUERY_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h new file mode 100644 index 0000000..fc6d557 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h @@ -0,0 +1,105 @@ +/***************************************************//** + * @file OBPMessage.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * All messages in the Ocean Binary Protocol begin with + * a standard 64-byte header. It is always safe to read + * 64 bytes for the start of a new transfer from a device + * that supports this protocol, which works nicely with + * the USB minimum packet size. + * + * This class simplifies the task of getting data into + * and out of the header. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPMESSAGE_H +#define OBPMESSAGE_H + +#include +#include "common/SeaBreeze.h" +#include "common/exceptions/IllegalArgumentException.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPMessage { + public: + OBPMessage(); + ~OBPMessage(); + + static OBPMessage *parseHeaderFromByteStream(std::vector *stream) throw (IllegalArgumentException); + static OBPMessage *parseByteStream(std::vector *stream) throw (IllegalArgumentException); + + std::vector *toByteStream(); + std::vector *getData(); + unsigned int getBytesRemaining(); + byte getChecksumType(); + unsigned short getErrno(); + unsigned short getFlags(); + std::vector *getImmediateData(); + byte getImmediateDataLength(); + unsigned int getMessageType(); + std::vector *getPayload(); + unsigned short getProtocolVersion(); + unsigned int getRegarding(); + + bool isAckFlagSet(); + bool isNackFlagSet(); + + void setAckRequestedFlag(); + void setBytesRemaining(unsigned int bytesRemaining); + void setChecksumType(byte checksumType); + void setData(std::vector *data); + void setErrorNumber(unsigned short errorNumber); + void setFlags(unsigned short flags); + void setImmediateData(std::vector *immediateData); + void setImmediateDataLength(byte immediateDataLength); + void setMessageType(unsigned int messageType); + void setPayload(std::vector *payload); + void setProtocolVersion(unsigned short protocolVersion); + void setRegarding(unsigned int regarding); + + protected: + void setupMessage(); + std::vector *header; + unsigned short protocolVersion; + unsigned short flags; + unsigned short errorNumber; + unsigned int messageType; + unsigned int regarding; + byte checksumType; + byte immediateDataLength; + std::vector *immediateData; + unsigned int bytesRemaining; + std::vector *payload; + std::vector *checksum; + std::vector *footer; + }; + + } +} + +#endif /* OBPMESSAGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h new file mode 100644 index 0000000..679a860 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file OBPQuery.h + * @date May 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPQUERY_H +#define OBPQUERY_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPQuery : public OBPTransaction { + public: + OBPQuery(); + virtual ~OBPQuery(); + + using OBPTransaction::queryDevice; + virtual std::vector *queryDevice(TransferHelper *helper) throw (ProtocolException) ; + + protected: + int messageType; + std::vector payload; + }; + } +} + +#endif /* OBPQUERY_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h new file mode 100644 index 0000000..bca0170 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file OBPReadRawSpectrum32AndMetadataExchange.h + * @date September 2013 + * @author Ocean Optics, Inc. + * + * This message type is intended for the QE-PRO which + * aligns pixel data to 32-bit words and includes a + * metadata block at the start of each spectrum. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPREADRAWSPECTRUM32ANDMETADATAEXCHANGE_H +#define OBPREADRAWSPECTRUM32ANDMETADATAEXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPReadRawSpectrum32AndMetadataExchange : public Transfer { + public: + OBPReadRawSpectrum32AndMetadataExchange(unsigned int numberOfPixels); + virtual ~OBPReadRawSpectrum32AndMetadataExchange(); + + void setNumberOfPixels(int numberOfPixels); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + protected: + unsigned int isLegalMessageType(unsigned int t); + unsigned int numberOfPixels; + unsigned int metadataLength; + }; + } +} + +#endif /* OBPREADRAWSPECTRUM32ANDMETADATAEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h new file mode 100644 index 0000000..ebc0304 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file OBPReadRawSpectrumExchange.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPREADRAWSPECTRUMEXCHANGE_H +#define OBPREADRAWSPECTRUMEXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPReadRawSpectrumExchange : public Transfer { + public: + OBPReadRawSpectrumExchange(unsigned int readoutLength, unsigned int numberOfPixels); + virtual ~OBPReadRawSpectrumExchange(); + + // Allow the number of pixels to be altered for pixel binning + void setNumberOfPixels(unsigned int readoutLength, unsigned int numPixels); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + protected: + unsigned int isLegalMessageType(unsigned int t); + unsigned int numberOfPixels; + }; + } +} + +#endif /* OBPREADRAWSPECTRUMEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h new file mode 100644 index 0000000..c7dc738 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file OBPReadSpectrum32AndMetadataExchange.h + * @date September 2013 + * @author Ocean Optics, Inc. + * + * This message type is intended for the QE-PRO which + * aligns pixel data to 32-bit words and includes a + * metadata block at the start of each spectrum. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPREADSPECTRUM32ANDMETADATAEXCHANGE_H +#define OBPREADSPECTRUM32ANDMETADATAEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPReadSpectrum32AndMetadataExchange + : public OBPReadRawSpectrum32AndMetadataExchange { + + public: + OBPReadSpectrum32AndMetadataExchange(unsigned int numberOfPixels); + virtual ~OBPReadSpectrum32AndMetadataExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + }; + } +} + +#endif /* OBPREADSPECTRUM32ANDMETADATAEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h new file mode 100644 index 0000000..cbc564b --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file OBPReadSpectrumExchange.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPREADSPECTRUMEXCHANGE_H +#define OBPREADSPECTRUMEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPReadSpectrumExchange : public OBPReadRawSpectrumExchange { + public: + OBPReadSpectrumExchange(unsigned int readoutLength, unsigned int numberOfPixels); + virtual ~OBPReadSpectrumExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + }; + } +} + +#endif /* OBPREADSPECTRUMEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h new file mode 100644 index 0000000..c8488a0 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file OBPReadSpectrumWithGainExchange.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPREADSPECTRUMWITHGAINEXCHANGE_H +#define OBPREADSPECTRUMWITHGAINEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h" +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPReadSpectrumWithGainExchange : public OBPReadSpectrumExchange { + public: + OBPReadSpectrumWithGainExchange(unsigned int readoutLength, + unsigned int numberOfPixels, GainAdjustedSpectrometerFeature *spec); + virtual ~OBPReadSpectrumWithGainExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + private: + GainAdjustedSpectrometerFeature *spectrometerFeature; + }; + } +} + +#endif /* OBPREADSPECTRUMWITHGAINEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h new file mode 100644 index 0000000..d5c5992 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPRequestBufferedSpectrum32AndMetadataExchange.h + * @date September 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPREQUESTBUFFEREDSPECTRUM32ANDMETADATAEXCHANGE_H +#define OBPREQUESTBUFFEREDSPECTRUM32ANDMETADATAEXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPRequestBufferedSpectrum32AndMetadataExchange : public Transfer { + public: + OBPRequestBufferedSpectrum32AndMetadataExchange(); + virtual ~OBPRequestBufferedSpectrum32AndMetadataExchange(); + }; + } +} + +#endif /* OBPREQUESTBUFFEREDSPECTRUM32ANDMETADATAEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h new file mode 100644 index 0000000..596b461 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPRequestRawSpectrumExchange.h + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPREQUESTRAWSPECTRUMEXCHANGE_H +#define OBPREQUESTRAWSPECTRUMEXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPRequestRawSpectrumExchange : public Transfer { + public: + OBPRequestRawSpectrumExchange(); + virtual ~OBPRequestRawSpectrumExchange(); + }; + } +} + +#endif /* OBPREQUESTRAWSPECTRUMEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h new file mode 100644 index 0000000..6c6fef0 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPRequestSpectrumExchange.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPREQUESTSPECTRUMEXCHANGE_H +#define OBPREQUESTSPECTRUMEXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPRequestSpectrumExchange : public Transfer { + public: + OBPRequestSpectrumExchange(); + virtual ~OBPRequestSpectrumExchange(); + }; + } +} + +#endif /* OBPREQUESTSPECTRUMEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h new file mode 100644 index 0000000..d7aa956 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file OBPSetAcquisitionDelayExchange.h + * @date November 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSETACQUISITIONDELAYEXCHANGE_H +#define OBPSETACQUISITIONDELAYEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + + class OBPSetAcquisitionDelayExchange : public OBPCommand { + public: + OBPSetAcquisitionDelayExchange(); + virtual ~OBPSetAcquisitionDelayExchange(); + + void setAcquisitionDelayMicros(unsigned long delayMicros); + }; + + } /* end namespace oceanBinaryProtocol */ +} /* end namespace seabreeze */ + +#endif /* OBPSETACQUISITIONDELAYEXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h new file mode 100644 index 0000000..5d01977 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPSetBoxcarWidthExchange.h + * @date Februayr 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSETBOXCARWIDTHEXCHANGE_H +#define OBPSETBOXCARWIDTHEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSetBoxcarWidthExchange : public OBPCommand { + public: + OBPSetBoxcarWidthExchange(); + virtual ~OBPSetBoxcarWidthExchange(); + void setBoxcarWidth(unsigned char boxcarWidth); + }; + } +} + +#endif /* OBPSETBOXCARWIDTHEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h new file mode 100644 index 0000000..f991292 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file OBPSetDataBufferCapacityExchange.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSETDATABUFFERCAPACITYEXCHANGE_H +#define OBPSETDATABUFFERCAPACITYEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSetDataBufferCapacityExchange : public OBPCommand { + public: + OBPSetDataBufferCapacityExchange(); + virtual ~OBPSetDataBufferCapacityExchange(); + + void setBufferCapacity(unsigned long capacity); + }; + } /* end namespace oceanBinaryProtocol */ +} /* end namespace seabreeze */ + +#endif /* OBPSETDATABUFFERCAPACITYEXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h new file mode 100644 index 0000000..95934da --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file OBPSetDefaultPixelBinningExchange.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSETDEFAULTPIXELBINNINGEXCHANGE_H +#define OBPSETDEFAULTPIXELBINNINGEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSetDefaultPixelBinningExchange : public OBPCommand { + public: + OBPSetDefaultPixelBinningExchange(); + virtual ~OBPSetDefaultPixelBinningExchange(); + void setDefaultPixelBinningFactor(const unsigned char binning); + void setDefaultPixelBinningFactor(); + }; + } +} + +#endif /* OBPSETDEFAULTPIXELBINNINGEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h new file mode 100644 index 0000000..2bd55db --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPSetIrradCalExchange.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSETIRRADCALEXCHANGE_H +#define OBPSETIRRADCALEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSetIrradCalExchange : public OBPCommand { + public: + OBPSetIrradCalExchange(int maximumPixels); + virtual ~OBPSetIrradCalExchange(); + void setIrradianceCalibration(std::vector &values); + }; + } +} + +#endif /* OBPSETIRRADCALEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h new file mode 100644 index 0000000..289e2f6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPSetIrradCollectionAreaExchange.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSETIRRADCOLLECTIONAREAEXCHANGE_H +#define OBPSETIRRADCOLLECTIONAREAEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSetIrradCollectionAreaExchange : public OBPCommand { + public: + OBPSetIrradCollectionAreaExchange(); + virtual ~OBPSetIrradCollectionAreaExchange(); + void setCollectionArea(float area); + }; + } +} + +#endif /* OBPSETIRRADCOLLECTIONAREAEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h new file mode 100644 index 0000000..0f2d6fb --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPSetPixelBinningExchange.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSETPIXELBINNINGEXCHANGE_H +#define OBPSETPIXELBINNINGEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSetPixelBinningExchange : public OBPCommand { + public: + OBPSetPixelBinningExchange(); + virtual ~OBPSetPixelBinningExchange(); + void setPixelBinningFactor(const unsigned char binning); + }; + } +} + +#endif /* OBPSETPIXELBINNINGEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h new file mode 100644 index 0000000..d07fd74 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPSetScansToAverageExchange.h + * @date Februayr 2015 + * @author Ocean Optics, Inc., Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSETSCANSTOAVERAGEEXCHANGE_H +#define OBPSETSCANSTOAVERAGEEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSetScansToAverageExchange : public OBPCommand { + public: + OBPSetScansToAverageExchange(); + virtual ~OBPSetScansToAverageExchange(); + void setScansToAverage(unsigned short int scansToAverage); + }; + } +} + +#endif /* OBPSETSCANSTOAVERAGEEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h new file mode 100644 index 0000000..f848bed --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPSetThermoElectricEnableExchange.h + * @date March 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSETTHERMOELECTRICENABLEEXCHANGE_H +#define OBPSETTHERMOELECTRICENABLEEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSetThermoElectricEnableExchange : public OBPCommand { + public: + OBPSetThermoElectricEnableExchange(); + virtual ~OBPSetThermoElectricEnableExchange(); + void setThermoElectricEnable(bool enable); + }; + } +} + +#endif /* OBPSETTHERMOELECTRICENABLEEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h new file mode 100644 index 0000000..bef32d9 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPSetThermoElectricSetpointExchange.h + * @date March 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSETTHERMOELECTRICSETPOINTEXCHANGE_H +#define OBPSETTHERMOELECTRICSETPOINTEXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSetThermoElectricSetpointExchange : public OBPCommand { + public: + OBPSetThermoElectricSetpointExchange(); + virtual ~OBPSetThermoElectricSetpointExchange(); + void setThermoElectricSetpointCelsius(float setpoint); + }; + } +} + +#endif /* OBPSETTHERMOELECTRICSETPOINTEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h new file mode 100644 index 0000000..7c56fcf --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file OBPShutterExchange.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSHUTTEREXCHANGE_H +#define OBPSHUTTEREXCHANGE_H + +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPShutterExchange : public OBPCommand { + public: + OBPShutterExchange(); + virtual ~OBPShutterExchange(); + void setShutterOpen(bool openShutter); + }; + } +} + +#endif /* OBPSHUTTEREXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h new file mode 100644 index 0000000..8238eae --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h @@ -0,0 +1,84 @@ +/***************************************************//** + * @file OBPTransaction.h + * @date March 2011 + * @author Ocean Optics, Inc. + * + * All messages in the Ocean Binary Protocol begin with + * a standard 64-byte header. It is always safe to read + * 64 bytes for the start of a new transfer from a device + * that supports this protocol, which works nicely with + * the USB minimum packet size. + * + * This class simplifies the task of performing transactions + * with the device, where a command is always followed + * by a response. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPTRANSACTION_H +#define OBPTRANSACTION_H + +#include +#include "common/buses/TransferHelper.h" +#include "common/protocols/ProtocolHint.h" +#include "common/exceptions/ProtocolException.h" +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPTransaction { + public: + OBPTransaction(); + virtual ~OBPTransaction(); + + virtual const std::vector &getHints(); + + protected: + /* This creates a message of the given type and payload and sends it + * to the device. The reply is formatted into a byte vector. Any + * errors will be indicated via an exception. + */ + virtual std::vector *queryDevice(TransferHelper *helper, + unsigned int messageType, + std::vector &data) throw (ProtocolException); + + /* This creates a message of the given type and payload and sends it + * to the device. No response (other than an acknowledgment) is + * expected. This will return true if the command was acknowledged + * correctly, or false if there was a negative acknowledgment (NACK). Note + * that some commands will normally return a NACK even though it was + * a correct command (e.g. trying to read out a calibration that does + * not exist) so this does not throw an exception on a NACK. + */ + virtual bool sendCommandToDevice(TransferHelper *helper, + unsigned int messageType, + std::vector &data) throw (ProtocolException); + + std::vector *hints; + }; + } +} + +#endif /* OBPTRANSACTION_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h new file mode 100644 index 0000000..620f2db --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h @@ -0,0 +1,47 @@ +/***************************************************//** + * @file OBPTriggerModeExchange.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPTRIGGERMODEEXCHANGE_H +#define OBPTRIGGERMODEEXCHANGE_H + +#include "vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h" +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPTriggerModeExchange : public OBPCommand { + public: + OBPTriggerModeExchange(); + virtual ~OBPTriggerModeExchange(); + void setTriggerMode(SpectrometerTriggerMode &mode); + }; + } +} + +#endif /* OBPTRIGGERMODEEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h new file mode 100644 index 0000000..81e91c4 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPControlHint.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPCONTROLHINT_H +#define OBPCONTROLHINT_H + +#include "common/protocols/ProtocolHint.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPControlHint : public ProtocolHint { + public: + OBPControlHint(); + virtual ~OBPControlHint(); + }; + } +} + +#endif /* OBPCONTROLHINT_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h new file mode 100644 index 0000000..34c149f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file OBPSpectrumHint.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSPECTRUMHINT_H +#define OBPSPECTRUMHINT_H + +#include "common/protocols/ProtocolHint.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSpectrumHint : public ProtocolHint { + public: + OBPSpectrumHint(); + virtual ~OBPSpectrumHint(); + }; + } +} + +#endif /* OBPSPECTRUMHINT_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h new file mode 100644 index 0000000..b26c0e6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file OBPAcquisitionDelayProtocol.h + * @date November 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPACQUISITIONDELAYPROTOCOL_H +#define OBPACQUISITIONDELAYPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPAcquisitionDelayProtocol : public AcquisitionDelayProtocolInterface { + public: + OBPAcquisitionDelayProtocol(); + virtual ~OBPAcquisitionDelayProtocol(); + + virtual void setAcquisitionDelayMicroseconds(const Bus &bus, + const unsigned long delayMicros) throw (ProtocolException); + }; + } /* end namespace oceanBinaryProtocol */ +} /* end namespace seabreeze */ + +#endif /* OBPACQUISITIONDELAYPROTOCOL_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h new file mode 100644 index 0000000..b0db171 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h @@ -0,0 +1,60 @@ +/***************************************************//** + * @file OBPContinuousStrobeProtocol.h + * @date February 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPCONTINUOUS_STROBE_PROTOCOL_H +#define OBPCONTINUOUS_STROBE_PROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h" +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h" +#include "vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPContinuousStrobeProtocol : public ContinuousStrobeProtocolInterface { + public: + OBPContinuousStrobeProtocol(); + virtual ~OBPContinuousStrobeProtocol(); + + virtual void setContinuousStrobePeriodMicroseconds(const Bus &bus, + unsigned short strobe_id, unsigned long period_usec) + throw (ProtocolException); + virtual void setContinuousStrobeEnable(const Bus &bus, + unsigned short strobe_id, bool enable) + throw (ProtocolException); + + protected: + OBPContinuousStrobePeriodExchange *setPeriodExchange; + OBPContinuousStrobeEnableExchange *setEnableExchange; + }; + } +} + +#endif /* OBPCONTINUOUS_STROBE_PROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h new file mode 100644 index 0000000..918434b --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h @@ -0,0 +1,71 @@ +/***************************************************//** + * @file OBPDataBufferProtocol.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPDATABUFFERPROTOCOL_H +#define OBPDATABUFFERPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPDataBufferProtocol : public DataBufferProtocolInterface { + public: + OBPDataBufferProtocol(); + virtual ~OBPDataBufferProtocol(); + + virtual void clearBuffer(const Bus &bus, unsigned char bufferIndex) + throw (ProtocolException); + + virtual unsigned long getNumberOfElements(const Bus &bus, + unsigned char bufferIndex) + throw (ProtocolException); + + virtual unsigned long getBufferCapacity(const Bus &bus, + unsigned char bufferIndex) + throw (ProtocolException); + + virtual unsigned long getBufferCapacityMinimum(const Bus &bus, + unsigned char bufferIndex) + throw (ProtocolException); + + virtual unsigned long getBufferCapacityMaximum(const Bus &bus, + unsigned char bufferIndex) + throw (ProtocolException); + + virtual void setBufferCapacity(const Bus &bus, + unsigned char bufferIndex, + const unsigned long capacity) + throw (ProtocolException); + }; + } /* end namespace oceanBinaryProtocol */ +} /* end namespace seabreeze */ + +#endif /* OBPDATABUFFERPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h new file mode 100644 index 0000000..417f63d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h @@ -0,0 +1,63 @@ +/***************************************************//** + * @file OBPIrradCalProtocol.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPIRRADCALPROTOCOL_H +#define OBPIRRADCALPROTOCOL_H + +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h" +#include "common/exceptions/ProtocolException.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPIrradCalProtocol : public IrradCalProtocolInterface { + public: + OBPIrradCalProtocol(int maximumNumberOfPixels); + + virtual ~OBPIrradCalProtocol(); + + /* Inherited from IrradCalProtocolInterface */ + virtual std::vector *readIrradCal(const Bus &bus) + throw (ProtocolException); + virtual int writeIrradCal(const Bus &bus, const std::vector &cal) + throw (ProtocolException); + virtual int hasCollectionArea(const Bus &bus); + virtual float readCollectionArea(const Bus &bus) + throw (ProtocolException); + virtual void writeCollectionArea(const Bus &bus, float area) + throw (ProtocolException); + + private: + unsigned int pixelCountMaximum; + + }; + } +} + +#endif /* OBPIRRADCALPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h new file mode 100644 index 0000000..57c9f44 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h @@ -0,0 +1,86 @@ +/***************************************************//** + * @file OBPLightSourceProtocol.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OBPLIGHTSOURCEPROTOCOL_H +#define SEABREEZE_OBPLIGHTSOURCEPROTOCOL_H + +#include "vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + + class OBPLightSourceProtocol : public LightSourceProtocolInterface { + + public: + OBPLightSourceProtocol(); + virtual ~OBPLightSourceProtocol(); + + /* Required by LightSourceProtocolInterface */ + virtual bool isLightSourceEnabled(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException); + + virtual void setLightSourceEnable(const Bus &bus, int moduleIndex, + int lightSourceIndex, bool enable) throw (ProtocolException); + + protected: + virtual int getModuleCount() = 0; + virtual int getLightSourceCount(int moduleIndex) = 0; + + }; + + class OBPLightSourceProtocol_NormalizedIntensity : public OBPLightSourceProtocol, + public LightSourceProtocolInterface_NormalizedIntensity { + public: + OBPLightSourceProtocol_NormalizedIntensity(); + virtual ~OBPLightSourceProtocol_NormalizedIntensity(); + + virtual double getIntensity(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException); + + virtual void setIntensity(const Bus &bus, int moduleIndex, + int lightSourceIndex, double intensity) throw (ProtocolException); + }; + + class OBPLightSourceProtocol_Counts : public OBPLightSourceProtocol, + public LightSourceProtocolInterface_Counts { + public: + OBPLightSourceProtocol_Counts(); + virtual ~OBPLightSourceProtocol_Counts(); + + virtual int getIntensityCounts(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException); + + virtual void setIntensityCounts(const Bus &bus, int moduleIndex, + int lightSourceIndex, int counts) throw (ProtocolException); + }; + + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h new file mode 100644 index 0000000..ec8727d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h @@ -0,0 +1,66 @@ +/***************************************************//** + * @file OBPLightSourceProtocol_Ventana.h + * @date April 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OBPLIGHTSOURCEPROTOCOL_VENTANA_H +#define SEABREEZE_OBPLIGHTSOURCEPROTOCOL_VENTANA_H + +#include "vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + + class OBPLightSourceProtocol_Ventana + : public OBPLightSourceProtocol_NormalizedIntensity { + public: + OBPLightSourceProtocol_Ventana(); + virtual ~OBPLightSourceProtocol_Ventana(); + + /* Required by OBPLightSourceProtocol */ + virtual int getModuleCount(); + virtual int getLightSourceCount(int moduleIndex); + + /* Required by LightSourceProtocolInterface */ + virtual bool hasLightSourceEnable(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException); + + virtual bool hasVariableIntensity(const Bus &bus, int moduleIndex, + int lightSourceIndex) throw (ProtocolException); + + /* Required by LightSourceProtocolInterface_NormalizedIntensity */ + virtual double getIntensityMinimum(const Bus &bus, int moduleIndex, + int lightSourceIndex); + + virtual double getIntensityMaximum(const Bus &bus, int moduleIndex, + int lightSourceIndex); + }; + + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h new file mode 100644 index 0000000..eb10f75 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file OBPNonlinearityCoeffsProtocol.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OBP_NONLINEARITYCOEFFSPROTOCOL_H +#define SEABREEZE_OBP_NONLINEARITYCOEFFSPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPNonlinearityCoeffsProtocol : public NonlinearityCoeffsProtocolInterface { + public: + OBPNonlinearityCoeffsProtocol(); + virtual ~OBPNonlinearityCoeffsProtocol(); + + virtual std::vector *readNonlinearityCoeffs(const Bus &bus) + throw (ProtocolException); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h new file mode 100644 index 0000000..fa273e8 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h @@ -0,0 +1,63 @@ +/***************************************************//** + * @file OBPOpticalBenchProtocol.h + * @date January 2015 + * @author Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc, Heliospectra AB + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OBP_OPTICAL_BENCHROTOCOL_H +#define SEABREEZE_OBP_OPTICAL_BENCHROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPOpticalBenchProtocol : public OpticalBenchProtocolInterface { + public: + OBPOpticalBenchProtocol(); + virtual ~OBPOpticalBenchProtocol(); + + virtual unsigned short int readOpticalBenchSlitWidthMicrons(const Bus &bus) + throw (ProtocolException); + virtual unsigned short int readOpticalBenchFiberDiameterMicrons(const Bus &bus) + throw (ProtocolException); + virtual std::string *readOpticalBenchID(const Bus &bus) + throw (ProtocolException); + virtual std::string *readOpticalBenchSerialNumber(const Bus &bus) + throw (ProtocolException); + virtual std::string *readOpticalBenchCoating(const Bus &bus) + throw (ProtocolException); + virtual std::string *readOpticalBenchFilter(const Bus &bus) + throw (ProtocolException); + virtual std::string *readOpticalBenchGrating(const Bus &bus) + throw (ProtocolException); + }; + } +} + +#endif \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h new file mode 100644 index 0000000..e890fe6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h @@ -0,0 +1,84 @@ +/***************************************************//** + * @file OBPPixelBinningProtocol.h + * @date October 2015 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPPIXELBINNINGPROTOCOL_H +#define OBPPIXELBINNINGPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPPixelBinningProtocol : public PixelBinningProtocolInterface { + public: + OBPPixelBinningProtocol(); + virtual ~OBPPixelBinningProtocol(); + + /** + * Get the pixel binning factor of the device. + */ + virtual unsigned char readPixelBinningFactor(const Bus &bus) + throw (ProtocolException); + + /** + * Set the pixel binning factor on the device. + */ + virtual void writePixelBinningFactor(const Bus &bus, const unsigned char binningFactor) + throw (ProtocolException); + + /** + * Get the default pixel binning factor of the device. + */ + virtual unsigned char readDefaultPixelBinningFactor(const Bus &bus) + throw (ProtocolException); + + /** + * Set the default pixel binning factor on the device. + */ + virtual void writeDefaultPixelBinningFactor(const Bus &bus, const unsigned char binningFactor) + throw (ProtocolException); + + /** + * Reset the default pixel binning factor on the device. This will reinstate the factory default of 0. + */ + virtual void writeDefaultPixelBinningFactor(const Bus &bus) + throw (ProtocolException); + + /** + * Get the maximum pixel binning factor of the device. + */ + virtual unsigned char readMaxPixelBinningFactor(const Bus &bus) + throw (ProtocolException); + }; + } +} + +#endif /* OBPPIXELBINNINGPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h new file mode 100644 index 0000000..01525f9 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file OBPProgrammableSaturationProtocol.h + * @date March 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPPROGRAMMABLESATURATIONPROTOCOL_H +#define OBPPROGRAMMABLESATURATIONPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPProgrammableSaturationProtocol + : public ProgrammableSaturationProtocolInterface { + public: + OBPProgrammableSaturationProtocol(); + virtual ~OBPProgrammableSaturationProtocol(); + + /* Inherited from ProgrammableSaturationProtocolInterface */ + virtual unsigned int getSaturation(const Bus &bus) + throw (ProtocolException); + }; + } /* end namespace oceanBinaryProtocol */ +} /* end namespace seabreeze */ + +#endif /* OBPPROGRAMMABLESATURATIONPROTOCOL_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h new file mode 100644 index 0000000..7f05484 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file OBPRevisionProtocol.h + * @date January 2015 + * @author Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc, Heliospectra AB + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OBP_REVISIONPROTOCOL_H +#define SEABREEZE_OBP_REVISIONPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPRevisionProtocol : public RevisionProtocolInterface { + public: + OBPRevisionProtocol(); + virtual ~OBPRevisionProtocol(); + + virtual unsigned char readHardwareRevision(const Bus &bus) + throw (ProtocolException); + + virtual unsigned short int readFirmwareRevision(const Bus &bus) + throw (ProtocolException); + }; + } +} + +#endif \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h new file mode 100644 index 0000000..de9dcd6 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file OBPSerialNumberProtocol.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSERIALNUMBERPROTOCOL_H +#define OBPSERIALNUMBERPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSerialNumberProtocol : public SerialNumberProtocolInterface { + public: + OBPSerialNumberProtocol(); + virtual ~OBPSerialNumberProtocol(); + + virtual std::string *readSerialNumber(const Bus &bus) + throw (ProtocolException); + virtual unsigned char readSerialNumberMaximumLength(const Bus &bus) + throw (ProtocolException); + }; + } +} + +#endif /* OBPSERIALNUMBERPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h new file mode 100644 index 0000000..2b1a4b2 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file OBPShutterProtocol.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSHUTTERPROTOCOL_H +#define OBPSHUTTERPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h" +#include "vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPShutterProtocol : public ShutterProtocolInterface { + public: + OBPShutterProtocol(); + virtual ~OBPShutterProtocol(); + + virtual void setShutterOpen(const Bus &bus, bool opened) + throw (ProtocolException); + + protected: + OBPShutterExchange *shutterExchange; + }; + } +} + +#endif /* OBPSHUTTERPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h new file mode 100644 index 0000000..69697d8 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h @@ -0,0 +1,79 @@ +/***************************************************//** + * @file OBPSpectrometerProtocol.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSPECTROMETERPROTOCOL_H +#define OBPSPECTROMETERPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/protocols/Transfer.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h" +#include "vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h" +#include "vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSpectrometerProtocol : public SpectrometerProtocolInterface { + public: + OBPSpectrometerProtocol( + OBPIntegrationTimeExchange *integrationTimeExchange, + Transfer *requestSpectrumExchange, + Transfer *unformattedSpectrumExchange, + Transfer *spectrumTransferExchange, + OBPTriggerModeExchange *triggerMode); + virtual ~OBPSpectrometerProtocol(); + + /* FIXME: instead of returning primitive vectors, should this return Data* so that + * metadata (units, etc.) can also be attached? + */ + virtual std::vector *readUnformattedSpectrum(const Bus &bus) + throw (ProtocolException); + virtual std::vector *readSpectrum(const Bus &bus) + throw (ProtocolException); + virtual void requestSpectrum(const Bus &bus) throw (ProtocolException); + virtual void setIntegrationTimeMicros(const Bus &bus, + unsigned long time_usec) throw (ProtocolException); + virtual void setTriggerMode(const Bus &bus, + SpectrometerTriggerMode &mode) throw (ProtocolException); + + private: + OBPIntegrationTimeExchange *integrationTimeExchange; + /* These are Transfers instead of Exchanges so that we can call getHints() on them. + * if getHints is promoted up to the level of Exchange, then these can revert back. + */ + Transfer *unformattedSpectrumExchange; + Transfer *requestSpectrumExchange; + Transfer *spectrumTransferExchange; + OBPTriggerModeExchange *triggerModeExchange; + }; + } +} + +#endif /* OBPSPECTROMETERPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h new file mode 100644 index 0000000..e953db4 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file OBPSpectrumProcessingProtocol.h + * @date February 2015 + * @author Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc, Heliospectra AB + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OBP_SPECTRUMPROCESSINGPROTOCOL_H +#define SEABREEZE_OBP_SPECTRUMPROCESSINGPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPSpectrumProcessingProtocol : public SpectrumProcessingProtocolInterface { + public: + OBPSpectrumProcessingProtocol(); + virtual ~OBPSpectrumProcessingProtocol(); + + virtual unsigned short int readSpectrumProcessingScansToAverage(const Bus &bus) + throw (ProtocolException); + virtual unsigned char readSpectrumProcessingBoxcarWidth(const Bus &bus) + throw (ProtocolException); + virtual void writeSpectrumProcessingScansToAverage(const Bus &bus, unsigned short int scansToAverage) + throw (ProtocolException); + virtual void writeSpectrumProcessingBoxcarWidth(const Bus &bus, unsigned char boxcarWidth) + throw (ProtocolException); + }; + } +} + +#endif \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h new file mode 100644 index 0000000..1ea14c9 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file OBPStrayLightCoeffsProtocol.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OBP_STRAYLIGHTCOEFFSPROTOCOL_H +#define SEABREEZE_OBP_STRAYLIGHTCOEFFSPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPStrayLightCoeffsProtocol : public StrayLightCoeffsProtocolInterface { + public: + OBPStrayLightCoeffsProtocol(); + virtual ~OBPStrayLightCoeffsProtocol(); + + virtual std::vector *readStrayLightCoeffs(const Bus &bus) + throw (ProtocolException); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h new file mode 100644 index 0000000..9401c99 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file OBPStrobeLampProtocol.cpp + * @date February 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPSTROBELAMPPROTOCOL_H +#define OBPSTROBELAMPPROTOCOL_H + +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h" +#include "common/exceptions/ProtocolException.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPStrobeLampProtocol : public StrobeLampProtocolInterface { + public: + OBPStrobeLampProtocol(); + virtual ~OBPStrobeLampProtocol(); + + virtual void setStrobeLampEnable(const Bus &bus, bool enable) + throw (ProtocolException); + }; + } +} + +#endif /* OBPSTROBELAMPPROTOCOL_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h new file mode 100644 index 0000000..24b5682 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h @@ -0,0 +1,56 @@ +/***************************************************//** + * @file OBPTemperatureProtocol.h + * @date January 2015 + * @author Kirk Clendinning, Heliospectra + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2015, Ocean Optics Inc, Heliospectra AB + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OBP_TEMPERATUREPROTOCOL_H +#define SEABREEZE_OBP_TEMPERATUREPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPTemperatureProtocol : public TemperatureProtocolInterface { + public: + OBPTemperatureProtocol(); + virtual ~OBPTemperatureProtocol(); + + virtual unsigned char readTemperatureCount(const Bus &bus) + throw (ProtocolException); + virtual double readTemperature(const Bus &bus, int index) + throw (ProtocolException); + + virtual std::vector *readAllTemperatures(const Bus &bus) + throw (ProtocolException); + }; + } +} + +#endif \ No newline at end of file diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h new file mode 100644 index 0000000..e5379ac --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file OBPThermoElectricProtocol.h + * @date March 2013 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPTHERMOELECTRICPROTOCOL_H +#define OBPTHERMOELECTRICPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPThermoElectricProtocol : public ThermoElectricProtocolInterface { + public: + OBPThermoElectricProtocol(); + virtual ~OBPThermoElectricProtocol(); + + virtual double readThermoElectricTemperatureCelsius(const Bus &bus) + throw (ProtocolException); + + virtual void writeThermoElectricEnable(const Bus &bus, bool enable) + throw (ProtocolException); + + virtual void writeThermoElectricSetPointCelsius(const Bus &bus, + double degreesC) throw (ProtocolException); + }; + } +} + +#endif /* OBPTHERMOELECTRICPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h new file mode 100644 index 0000000..06f7aa5 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file OBPWaveCalProtocol.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OBPWAVECALPROTOCOL_H +#define OBPWAVECALPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h" +#include + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OBPWaveCalProtocol : public WaveCalProtocolInterface { + public: + OBPWaveCalProtocol(); + virtual ~OBPWaveCalProtocol(); + + virtual std::vector *readWavelengthCoeffs(const Bus &bus) + throw (ProtocolException); + }; + } +} + +#endif /* OBPWAVECALPROTOCOL_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h new file mode 100644 index 0000000..294010a --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file OceanBinaryProtocol.h + * @date January 2011 + * @author Ocean Optics, Inc. + * + * This provides a singleton object that identifies the + * Ocean Binary Protocol command set. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OCEANBINARYPROTOCOL_H +#define OCEANBINARYPROTOCOL_H + +#include "common/protocols/Protocol.h" + +namespace seabreeze { + namespace oceanBinaryProtocol { + class OceanBinaryProtocol : public Protocol { + public: + OceanBinaryProtocol(); + virtual ~OceanBinaryProtocol(); + + /* Must be overridden from Protocol */ + virtual ProtocolFamily getProtocolFamily(); + }; + } +} + +#endif /* OCEANBINARYPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h new file mode 100644 index 0000000..182890d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h @@ -0,0 +1,81 @@ +/***************************************************//** + * @file FPGARegisterCodes.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FPGA_REGISTER_CODES_H +#define SEABREEZE_FPGA_REGISTER_CODES_H + +#include "common/features/Feature.h" +#include "common/buses/Bus.h" +#include "common/exceptions/FeatureException.h" + +namespace seabreeze { + + namespace ooiProtocol { + + namespace FPGARegisterCodes { + + /** + * These codes were taken from the USB2000+ Data Sheet as it existed + * in October 2012. They are believed to apply to the vast majority + * of Ocean Optics spectrometers, but because some variance is expected + * between models and over time (especially with custom OEM firmware), + * you should check your spectrometer's documentation before assuming + * these codes are correct for your device. + */ + class Base { + public: + static const byte FIRMWARE_VERSION; + static const byte SINGLE_STROBE_HIGH_CLOCK_TRANSITION_DELAY_COUNT; + static const byte SINGLE_STROBE_LOW_CLOCK_TRANSITION_DELAY_COUNT; + static const byte LAMP_ENABLE; + static const byte GPIO_MUX_REGISTER; + static const byte GPIO_OUTPUT_ENABLE; + static const byte GPIO_DATA_REGISTER; + static const byte OFFSET_VALUE; + static const byte OFFSET_CONTROL; + static const byte MAXIMUM_SATURATION_LEVEL; + + }; + + class V1 : public Base { + public: + static const byte CONTINUOUS_STROBE_TIMER_INTERVAL_DIVISOR; + static const byte CONTINUOUS_STROBE_BASE_CLOCK_DIVISOR; + }; + + class V3 : public Base { + public: + static const byte CONTINUOUS_STROBE_TIMER_MSB; + static const byte CONTINUOUS_STROBE_TIMER_LSB; + }; + } + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h new file mode 100644 index 0000000..f35331d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h @@ -0,0 +1,83 @@ +/***************************************************//** + * @file OpCodes.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OPCODES_H +#define SEABREEZE_OPCODES_H + +#include "common/SeaBreeze.h" + +namespace seabreeze { + namespace ooiProtocol { + class OpCodes { + public: + + /* Set the integration time */ + static const byte OP_ITIME; + + /* Set the strobe/lamp enable */ + static const byte OP_STROBE; + + /* Read 15 bytes from an EEPROM slot */ + static const byte OP_GETINFO; + + /* Write 15 bytes to an EEPROM slot */ + static const byte OP_SETINFO; + + /* Request a spectrum */ + static const byte OP_REQUESTSPEC; + + /* Set the trigger mode */ + static const byte OP_SETTRIGMODE; + + /* Set the thermoelectric cooling enable on the QE */ + static const byte OP_TECENABLE_QE; + + /* Read the current TEC temperature on the QE */ + static const byte OP_READTEC_QE; + + /* Set the TEC set point on the QE */ + static const byte OP_TECSETTEMP_QE; + + /* Write a field to the FPGA status register */ + static const byte OP_WRITE_REGISTER; + + /* Read a field from the FPGA status register */ + static const byte OP_READ_REGISTER; + + /* Read the irradiance calibration from EEPROM (if available) */ + static const byte OP_READ_IRRAD_CAL; + + /* Write the irradiance calibration to EEPROM (if available) */ + static const byte OP_WRITE_IRRAD_CAL; + + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h new file mode 100644 index 0000000..1be1f3d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h @@ -0,0 +1,36 @@ +/***************************************************//** + * @file QETECConstants.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_QETECCONSTANTS_H +#define SEABREEZE_QETECCONSTANTS_H + +// TEC cooler understands increments of 0.1 degrees C per encoder count. +#define QE_TEC_COUNTS_PER_DEGREE_C 10 + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h new file mode 100644 index 0000000..6c26a45 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file FPGARegisterReadExchange.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FPGA_REGISTER_READ_EXCHANGE_H +#define SEABREEZE_FPGA_REGISTER_READ_EXCHANGE_H + +#include "common/protocols/Transaction.h" + +namespace seabreeze { + + class FPGARegisterReadExchange : public Transaction { + public: + FPGARegisterReadExchange(byte address); + virtual ~FPGARegisterReadExchange(); + }; + +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h new file mode 100644 index 0000000..9cb0ddb --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file FPGARegisterWriteExchange.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FPGA_REGISTER_WRITE_EXCHANGE_H +#define SEABREEZE_FPGA_REGISTER_WRITE_EXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + + class FPGARegisterWriteExchange : public Transfer { + public: + FPGARegisterWriteExchange(byte address, unsigned short value); + virtual ~FPGARegisterWriteExchange(); + }; + +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h new file mode 100644 index 0000000..9baa85b --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file FPGASpectrumExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FPGASPECTRUMEXCHANGE_H +#define SEABREEZE_FPGASPECTRUMEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h" +#include "common/Data.h" + +namespace seabreeze { + namespace ooiProtocol { + class FPGASpectrumExchange : public ReadSpectrumExchange { + public: + FPGASpectrumExchange(unsigned int readoutLength, + unsigned int numberOfPixels); + virtual ~FPGASpectrumExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h new file mode 100644 index 0000000..2471b7f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h @@ -0,0 +1,59 @@ +/***************************************************//** + * @file FlameNIRSpectrumExchange.h + * @date Apr 2016 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2016, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FLAMENIRSPECTRUMEXCHANGE_H +#define SEABREEZE_FLAMENIRSPECTRUMEXCHANGE_H + +#include "common/Data.h" +#include "vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h" +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + namespace ooiProtocol { + /** + * @brief Spectrum exchange for FlameNIR spectrometer + * + * This class was needed because unlike other FX2-era spectrometers, + * the Flame-NIR does not return a "sync byte" at the end of a spectrum. + */ + class FlameNIRSpectrumExchange : public ReadSpectrumExchange { + public: + FlameNIRSpectrumExchange(unsigned int readoutLength, + unsigned int numberOfPixels, GainAdjustedSpectrometerFeature *feature); + virtual ~FlameNIRSpectrumExchange(); + + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + protected: + GainAdjustedSpectrometerFeature *spectrometerFeature; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h new file mode 100644 index 0000000..e872d76 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file HRFPGASpectrumExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_HRFPGASPECTRUMEXCHANGE_H +#define SEABREEZE_HRFPGASPECTRUMEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h" +#include "common/Data.h" + +namespace seabreeze { + namespace ooiProtocol { + class HRFPGASpectrumExchange : public ReadSpectrumExchange { + public: + HRFPGASpectrumExchange(unsigned int readoutLength, + unsigned int numberOfPixels); + virtual ~HRFPGASpectrumExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h new file mode 100644 index 0000000..f388edd --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file IntegrationTimeExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_INTEGRATIONTIMEEXCHANGE_H +#define SEABREEZE_INTEGRATIONTIMEEXCHANGE_H + +#include "common/protocols/Transfer.h" +#include "common/Data.h" + +namespace seabreeze { + namespace ooiProtocol { + class IntegrationTimeExchange : public Transfer { + public: + IntegrationTimeExchange(unsigned long integrationTimeBase_usec); + virtual ~IntegrationTimeExchange(); + void setIntegrationTimeMicros(unsigned long integrationTime_usec); + + /* Inherited from Transfer */ + Data *transfer(TransferHelper *helper) throw (ProtocolException); + + private: + unsigned long integrationTimeBase_usec; + unsigned long integrationTime_usec; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h new file mode 100644 index 0000000..40c83ef --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file JazSpectrumExchange.h + * @date November 2011 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_JAZSPECTRUMEXCHANGE_H +#define SEABREEZE_JAZSPECTRUMEXCHANGE_H + +#include "common/Data.h" +#include "vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h" +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + namespace ooiProtocol { + class JazSpectrumExchange : public ReadSpectrumExchange { + public: + JazSpectrumExchange(unsigned int readoutLength, + unsigned int numberOfPixels, GainAdjustedSpectrometerFeature *feature); + virtual ~JazSpectrumExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + protected: + /* This is necessary so that the saturation level which is determined + * at initialization is available to certain protocol messages. + */ + GainAdjustedSpectrometerFeature *spectrometerFeature; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h new file mode 100644 index 0000000..675b77b --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h @@ -0,0 +1,58 @@ +/***************************************************//** + * @file MayaProSpectrumExchange.h + * @date November 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_MAYAPROSPECTRUMEXCHANGE_H +#define SEABREEZE_MAYAPROSPECTRUMEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h" +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" +#include "common/Data.h" + +namespace seabreeze { + namespace ooiProtocol { + class MayaProSpectrumExchange : public ReadSpectrumExchange { + public: + MayaProSpectrumExchange(unsigned int readoutLength, + unsigned int numberOfPixels, + GainAdjustedSpectrometerFeature *spectrometer); + virtual ~MayaProSpectrumExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + private: + /* This is necessary so that the saturation level which is determined + * at initialization is available to certain protocol messages. + */ + GainAdjustedSpectrometerFeature *spectrometerFeature; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h new file mode 100644 index 0000000..e5af731 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file NIRQuestSpectrumExchange.h + * @date July 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_NIRQUESTSPECTRUMEXCHANGE_H +#define SEABREEZE_NIRQUESTSPECTRUMEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h" +#include "common/Data.h" +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + namespace ooiProtocol { + class NIRQuestSpectrumExchange : public QESpectrumExchange { + public: + NIRQuestSpectrumExchange(unsigned int readoutLength, + unsigned int numberOfPixels, GainAdjustedSpectrometerFeature *feature); + virtual ~NIRQuestSpectrumExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + protected: + /* This is necessary so that the saturation level which is determined + * at initialization is available to certain protocol messages. + */ + GainAdjustedSpectrometerFeature *spectrometerFeature; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h new file mode 100644 index 0000000..a6f3c2d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file OOI2KSpectrumExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is a protocol exchange that can be used for the + * HR2000 (as well as some other early OOI spectrometers). + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OOI2KSPECTRUMEXCHANGE_H +#define SEABREEZE_OOI2KSPECTRUMEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h" +#include "common/Data.h" + +namespace seabreeze { + namespace ooiProtocol { + class OOI2KSpectrumExchange : public ReadSpectrumExchange { + public: + OOI2KSpectrumExchange(unsigned int readoutLength, unsigned int numberOfPixels); + virtual ~OOI2KSpectrumExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h new file mode 100644 index 0000000..971aaaa --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file OOIIrradCalExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OOIIRRADCALEXCHANGE_H +#define SEABREEZE_OOIIRRADCALEXCHANGE_H + +#include "common/protocols/Transaction.h" +#include "common/protocols/ProtocolHint.h" +#include + +namespace seabreeze { + namespace ooiProtocol { + class OOIIrradCalExchange : public Transaction { + public: + OOIIrradCalExchange(int numberOfPixels); + virtual ~OOIIrradCalExchange(); + + protected: + unsigned int numberOfPixels; + }; + } +} + +#endif /* SEABREEZE_OOIIRRADCALEXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h new file mode 100644 index 0000000..c1898e2 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file OOIReadIrradCalExchange.h + * @date March 2010 + * @author Ocean Optics, Inc. + * + * This is a protocol exchange that can be used for the + * USB2000+ and some others. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OOIREADIRRADCALEXCHANGE_H +#define SEABREEZE_OOIREADIRRADCALEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h" +#include "common/Data.h" + +namespace seabreeze { + namespace ooiProtocol { + class OOIReadIrradCalExchange : public OOIIrradCalExchange { + public: + OOIReadIrradCalExchange(int numberOfPixels); + virtual ~OOIReadIrradCalExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper* helper) throw (ProtocolException); + }; + } +} + +#endif /* SEABREEZE_OOIREADIRRADCALEXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h new file mode 100644 index 0000000..e22e788 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file OOIWriteIrradCalExchange.h + * @date February 2012 + * @author Ocean Optics, Inc. + * + * This is a protocol exchange that can be used for the + * USB2000+ and some others. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_OOIWRITEIRRADCALEXCHANGE_H +#define SEABREEZE_OOIWRITEIRRADCALEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h" +#include "common/Data.h" + +namespace seabreeze { + namespace ooiProtocol { + class OOIWriteIrradCalExchange : public OOIIrradCalExchange { + public: + OOIWriteIrradCalExchange(int numberOfPixels); + virtual ~OOIWriteIrradCalExchange(); + int setCalibration(const std::vector &calibration); + + /* Inherited */ + virtual Data *transfer(TransferHelper* helper) throw (ProtocolException); + }; + } +} + +#endif /* SEABREEZE_OOIWRITEIRRADCALEXCHANGE_H */ + diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h new file mode 100644 index 0000000..5c67535 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h @@ -0,0 +1,50 @@ +/***************************************************//** + * @file QESpectrumExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_QESPECTRUMEXCHANGE_H +#define SEABREEZE_QESPECTRUMEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h" +#include "common/Data.h" + +namespace seabreeze { + namespace ooiProtocol { + class QESpectrumExchange : public ReadSpectrumExchange { + public: + QESpectrumExchange(unsigned int readoutLength, + unsigned int numberOfPixels); + virtual ~QESpectrumExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h new file mode 100644 index 0000000..8856a18 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h @@ -0,0 +1,46 @@ +/***************************************************//** + * @file ReadEEPROMSlotExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_READEEPROMSLOTEXCHANGE_H +#define SEABREEZE_READEEPROMSLOTEXCHANGE_H + +#include "common/protocols/Transaction.h" + +namespace seabreeze { + + class ReadEEPROMSlotExchange : public Transaction { + public: + ReadEEPROMSlotExchange(int slot); + virtual ~ReadEEPROMSlotExchange(); + + }; + +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h new file mode 100644 index 0000000..d711cf9 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h @@ -0,0 +1,48 @@ +/***************************************************//** + * @file ReadSpectrumExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_READSPECTRUMEXCHANGE_H +#define SEABREEZE_READSPECTRUMEXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + namespace ooiProtocol { + class ReadSpectrumExchange : public Transfer { + public: + ReadSpectrumExchange(unsigned int readoutLength, unsigned int numberOfPixels); + virtual ~ReadSpectrumExchange(); + + protected: + unsigned int numberOfPixels; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h new file mode 100644 index 0000000..b36ac61 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h @@ -0,0 +1,49 @@ +/***************************************************//** + * @file ReadTECQETemperatureExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_READTECQETEMPERATUREEXCHANGE_H +#define SEABREEZE_READTECQETEMPERATUREEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h" + +namespace seabreeze { + namespace ooiProtocol { + class ReadTECQETemperatureExchange : public ReadTECTemperatureExchange { + public: + ReadTECQETemperatureExchange(); + virtual ~ReadTECQETemperatureExchange(); + + /* Inherited from Transaction */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h new file mode 100644 index 0000000..0d5aa72 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file ReadTECTemperatureExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_READTECTEMPERATUREEXCHANGE_H +#define SEABREEZE_READTECTEMPERATUREEXCHANGE_H + +#include "common/protocols/Transaction.h" + +namespace seabreeze { + namespace ooiProtocol { + class ReadTECTemperatureExchange : public Transaction { + public: + ReadTECTemperatureExchange(); + virtual ~ReadTECTemperatureExchange(); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h new file mode 100644 index 0000000..c48231f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file RequestSpectrumExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_REQUESTSPECTRUMEXCHANGE_H +#define SEABREEZE_REQUESTSPECTRUMEXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + namespace ooiProtocol { + class RequestSpectrumExchange : public Transfer { + public: + RequestSpectrumExchange(); + virtual ~RequestSpectrumExchange(); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h new file mode 100644 index 0000000..1e2cc6f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file StrobeEnableExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_STROBEENABLEEXCHANGE_H +#define SEABREEZE_STROBEENABLEEXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + namespace ooiProtocol { + class StrobeEnableExchange : public Transfer { + public: + StrobeEnableExchange(); + virtual ~StrobeEnableExchange(); + + void setEnable(bool enable); + + /* Inherited from Transfer */ + Data *transfer(TransferHelper *helper) throw (ProtocolException); + + private: + bool strobeEnable; + + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h new file mode 100644 index 0000000..09009ae --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file TECEnableExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is made abstract so that subclasses specific to + * the QE/NIRQuest protocol and the old legacy NIR256/512 + * can coexist. The NIR256/512 are not going to be supported + * at first, but the design will leave room for them. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_TECENABLEEXCHANGE_H +#define SEABREEZE_TECENABLEEXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + namespace ooiProtocol { + class TECEnableExchange : public Transfer { + public: + TECEnableExchange(); + virtual ~TECEnableExchange(); + + virtual void setEnable(bool enable) = 0; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h new file mode 100644 index 0000000..1267a98 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h @@ -0,0 +1,58 @@ +/***************************************************//** + * @file TECQEEnableExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is specifically for the QE-style of TEC, including + * the QE65000 and NIRQuest thermoelectric coolers. This + * will not work for the legacy NIR256/512 TEC, but a + * corresponding implementation could be derived adjacent + * to this class. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_TECQEENABLEEXCHANGE_H +#define SEABREEZE_TECQEENABLEEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h" + +namespace seabreeze { + namespace ooiProtocol { + class TECQEEnableExchange : public TECEnableExchange { + public: + TECQEEnableExchange(); + virtual ~TECQEEnableExchange(); + + /* Inherited from TECEnableExchange */ + virtual void setEnable(bool enable); + Data *transfer(TransferHelper *helper) throw (ProtocolException); + + private: + bool tecEnable; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h new file mode 100644 index 0000000..00de06b --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h @@ -0,0 +1,54 @@ +/***************************************************//** + * @file TriggerModeExchange.h + * @date August 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_TRIGGERMODEEXCHANGE_H +#define SEABREEZE_TRIGGERMODEEXCHANGE_H + +#include "common/protocols/Transfer.h" +#include "common/Data.h" +#include "vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h" + +namespace seabreeze { + namespace ooiProtocol { + class TriggerModeExchange : public Transfer { + public: + TriggerModeExchange(); + virtual ~TriggerModeExchange(); + void setTriggerMode(SpectrometerTriggerMode &mode); + + /* Inherited from Transfer */ + Data *transfer(TransferHelper *helper) throw (ProtocolException); + + private: + int triggerMode; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h new file mode 100644 index 0000000..ffb9b11 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h @@ -0,0 +1,57 @@ +/***************************************************//** + * @file USBFPGASpectrumExchange.h + * @date July 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_USBFPGASPECTRUMEXCHANGE_H +#define SEABREEZE_USBFPGASPECTRUMEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h" +#include "common/Data.h" +#include "vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h" + +namespace seabreeze { + namespace ooiProtocol { + class USBFPGASpectrumExchange : public FPGASpectrumExchange { + public: + USBFPGASpectrumExchange(unsigned int readoutLength, + unsigned int numberOfPixels, GainAdjustedSpectrometerFeature *feature); + virtual ~USBFPGASpectrumExchange(); + + /* Inherited */ + virtual Data *transfer(TransferHelper *helper) throw (ProtocolException); + + protected: + /* This is necessary so that the saturation level which is determined + * at initialization is available to certain protocol messages. + */ + GainAdjustedSpectrometerFeature *spectrometerFeature; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h new file mode 100644 index 0000000..3c9d3a8 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h @@ -0,0 +1,43 @@ +/***************************************************//** + * @file WriteEEPROMSlotExchange.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_WRITE_EEPROM_SLOT_EXCHANGE_H +#define SEABREEZE_WRITE_EEPROM_SLOT_EXCHANGE_H + +#include "common/protocols/Transaction.h" + +namespace seabreeze { + class WriteEEPROMSlotExchange : public Transaction { + public: + WriteEEPROMSlotExchange(int slot, const std::vector& data); + virtual ~WriteEEPROMSlotExchange(); + }; +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h new file mode 100644 index 0000000..4670365 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h @@ -0,0 +1,58 @@ +/***************************************************//** + * @file WriteTECQESetPointExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is made abstract so that subclasses specific to + * the QE/NIRQuest protocol and the old legacy NIR256/512 + * can coexist. The NIR256/512 are not going to be supported + * at first, but the design will leave room for them. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_WRITETECQESETPOINTEXCHANGE_H +#define SEABREEZE_WRITETECQESETPOINTEXCHANGE_H + +#include "vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h" + +namespace seabreeze { + namespace ooiProtocol { + class WriteTECQESetPointExchange : public WriteTECSetPointExchange { + public: + WriteTECQESetPointExchange(); + virtual ~WriteTECQESetPointExchange(); + + /** Inherited from WriteTECSetPointExchange */ + virtual void setSetPointCelsius(double degreesC); + Data *transfer(TransferHelper *helper) throw (ProtocolException); + + private: + int tecCounts; + + }; + } +} + +#endif /* OOIPROTOCOLWRITETECQESETPOINTEXCHANGE_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h new file mode 100644 index 0000000..82e077f --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file WriteTECSetPointExchange.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This is made abstract so that subclasses specific to + * the QE/NIRQuest protocol and the old legacy NIR256/512 + * can coexist. The NIR256/512 are not going to be supported + * at first, but the design will leave room for them. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_WRITETECSETPOINTEXCHANGE_H +#define SEABREEZE_WRITETECSETPOINTEXCHANGE_H + +#include "common/protocols/Transfer.h" + +namespace seabreeze { + namespace ooiProtocol { + class WriteTECSetPointExchange : public Transfer { + public: + WriteTECSetPointExchange(); + virtual ~WriteTECSetPointExchange(); + + virtual void setSetPointCelsius(double degreesC) = 0; + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h new file mode 100644 index 0000000..0123724 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file ControlHint.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_CONTROLHINT_H +#define SEABREEZE_CONTROLHINT_H + +#include "common/protocols/ProtocolHint.h" + +namespace seabreeze { + namespace ooiProtocol { + class ControlHint : public ProtocolHint { + public: + ControlHint(); + virtual ~ControlHint(); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h new file mode 100644 index 0000000..f24c4f5 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h @@ -0,0 +1,45 @@ +/***************************************************//** + * @file SpectrumHint.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_SPECTRUMHINT_H +#define SEABREEZE_SPECTRUMHINT_H + +#include "common/protocols/ProtocolHint.h" + +namespace seabreeze { + namespace ooiProtocol { + class SpectrumHint : public ProtocolHint { + public: + SpectrumHint(); + virtual ~SpectrumHint(); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h new file mode 100644 index 0000000..8f9a667 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h @@ -0,0 +1,52 @@ +/***************************************************//** + * @file FPGARegisterProtocol.h + * @date October 2012 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef SEABREEZE_FPGA_REGISTER_PROTOCOL_H +#define SEABREEZE_FPGA_REGISTER_PROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h" + +namespace seabreeze { + namespace ooiProtocol { + class FPGARegisterProtocol : public FPGARegisterProtocolInterface { + public: + FPGARegisterProtocol(); + virtual ~FPGARegisterProtocol(); + virtual unsigned int readRegister(const Bus &bus, byte address) + throw (ProtocolException); + virtual void writeRegister(const Bus &bus, byte address, + unsigned int value) throw (ProtocolException); + }; + } +} + +#endif diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h new file mode 100644 index 0000000..a409a1d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h @@ -0,0 +1,53 @@ +/***************************************************//** + * @file OOIEEPROMProtocol.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIEEPROMPROTOCOL_H +#define OOIEEPROMPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/buses/Bus.h" +#include "common/exceptions/ProtocolException.h" +#include "vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h" +#include + +namespace seabreeze { + namespace ooiProtocol { + class OOIEEPROMProtocol : public EEPROMProtocolInterface { + public: + OOIEEPROMProtocol(); + virtual ~OOIEEPROMProtocol(); + virtual std::vector *readEEPROMSlot(const Bus &bus, int slot) + throw (ProtocolException); + virtual int writeEEPROMSlot(const Bus &bus, int slot, + const std::vector &data) throw (ProtocolException); + }; + } +} + +#endif /* OOIEEPROMPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h new file mode 100644 index 0000000..012abb2 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h @@ -0,0 +1,63 @@ +/***************************************************//** + * @file OOIIrradCalProtocol.h + * @date March 2010 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIIRRADCALPROTOCOL_H +#define OOIIRRADCALPROTOCOL_H + +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h" +#include "vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h" +#include "vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h" +#include "common/exceptions/ProtocolException.h" + +namespace seabreeze { + namespace ooiProtocol { + class OOIIrradCalProtocol : public IrradCalProtocolInterface { + public: + OOIIrradCalProtocol(unsigned int numberOfPixels); + virtual ~OOIIrradCalProtocol(); + + /* Inherited from IrradCalProtocolInterface */ + virtual std::vector *readIrradCal(const Bus &bus) + throw (ProtocolException); + virtual int writeIrradCal(const Bus &bus, const std::vector &cal) + throw (ProtocolException); + virtual int hasCollectionArea(const Bus &bus); + virtual float readCollectionArea(const Bus &bus) + throw (ProtocolException); + virtual void writeCollectionArea(const Bus &bus, float area) + throw (ProtocolException); + + private: + unsigned int numberOfPixels; + }; + } +} + +#endif /* OOIIRRADCALPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h new file mode 100644 index 0000000..cac8845 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h @@ -0,0 +1,51 @@ +/***************************************************//** + * @file OOIProtocol.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * This provides a singleton object that identifies the + * OOI legacy USB command set. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOIPROTOCOL_H +#define OOIPROTOCOL_H + +#include "common/protocols/Protocol.h" + +namespace seabreeze { + namespace ooiProtocol { + class OOIProtocol : public Protocol { + public: + OOIProtocol(); + virtual ~OOIProtocol(); + + /* Must be overridden from Protocol */ + virtual ProtocolFamily getProtocolFamily(); + }; + } +} + +#endif /* OOIPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h new file mode 100644 index 0000000..5b2a30d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h @@ -0,0 +1,79 @@ +/***************************************************//** + * @file OOISpectrometerProtocol.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOISPECTROMETERPROTOCOL_H +#define OOISPECTROMETERPROTOCOL_H + +#include "common/SeaBreeze.h" +#include "common/protocols/Exchange.h" +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h" +#include "vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h" +#include "vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h" +#include + +namespace seabreeze { + namespace ooiProtocol { + class OOISpectrometerProtocol : public SpectrometerProtocolInterface { + public: + OOISpectrometerProtocol( + IntegrationTimeExchange *integrationTimeExchange, + Transfer *requestSpectrumExchange, + Transfer *unformattedSpectrumExchange, + Transfer *spectrumTransferExchange, + TriggerModeExchange *triggerMode); + virtual ~OOISpectrometerProtocol(); + + /* FIXME: instead of returning primitive vectors, should this return Data* so that + * metadata (units, etc.) can also be attached? + */ + virtual std::vector *readUnformattedSpectrum(const Bus &bus) + throw (ProtocolException); + virtual std::vector *readSpectrum(const Bus &bus) + throw (ProtocolException); + virtual void requestSpectrum(const Bus &bus) throw (ProtocolException); + virtual void setIntegrationTimeMicros(const Bus &bus, + unsigned long time_usec) throw (ProtocolException); + virtual void setTriggerMode(const Bus &bus, + SpectrometerTriggerMode &mode) throw (ProtocolException); + + private: + IntegrationTimeExchange *integrationTimeExchange; + /* These are Transfers instead of Exchanges so that we can call getHints() on them. + * if getHints is promoted up to the level of Exchange, then these can revert back. + */ + Transfer *unformattedSpectrumExchange; + Transfer *requestSpectrumExchange; + Transfer *spectrumTransferExchange; + TriggerModeExchange *triggerModeExchange; + }; + } +} + +#endif /* OOISPECTROMETERPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h new file mode 100644 index 0000000..edf1df2 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h @@ -0,0 +1,55 @@ +/***************************************************//** + * @file OOIStrobeLampProtocol.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOISTROBELAMPPROTOCOL_H +#define OOISTROBELAMPPROTOCOL_H + +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h" +#include "vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h" +#include "common/exceptions/ProtocolException.h" + +namespace seabreeze { + namespace ooiProtocol { + class OOIStrobeLampProtocol : public StrobeLampProtocolInterface { + public: + OOIStrobeLampProtocol(); + virtual ~OOIStrobeLampProtocol(); + + virtual void setStrobeLampEnable(const Bus &bus, bool enable) + throw (ProtocolException); + + private: + StrobeEnableExchange *strobeEnableExchange; + + }; + } +} + +#endif /* OOISTROBELAMPPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h new file mode 100644 index 0000000..89e930d --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h @@ -0,0 +1,65 @@ +/***************************************************//** + * @file OOITECProtocol.h + * @date February 2009 + * @author Ocean Optics, Inc. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************/ + +#ifndef OOITECPROTOCOL_H +#define OOITECPROTOCOL_H + +#include "common/buses/Bus.h" +#include "vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h" +#include "vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h" +#include "vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h" +#include "vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h" +#include "common/exceptions/ProtocolException.h" + +namespace seabreeze { + namespace ooiProtocol { + class OOITECProtocol : public ThermoElectricProtocolInterface { + public: + OOITECProtocol(TECEnableExchange *enableExchange, + WriteTECSetPointExchange *writeSetPointExchange, + ReadTECTemperatureExchange *readTECTempExchange); + virtual ~OOITECProtocol(); + + /* Inherited from ThermoElectricProtocolInterface */ + virtual double readThermoElectricTemperatureCelsius(const Bus &bus) + throw (ProtocolException); + virtual void writeThermoElectricEnable(const Bus &bus, bool enable) + throw (ProtocolException); + virtual void writeThermoElectricSetPointCelsius(const Bus &bus, double degreesC) + throw (ProtocolException); + + private: + TECEnableExchange *tecEnable; + WriteTECSetPointExchange *tecWriteSetPoint; + ReadTECTemperatureExchange *tecReadTemperature; + }; + } +} + +#endif /* OOITECPROTOCOL_H */ diff --git a/source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h b/source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h new file mode 100644 index 0000000..5d1ff15 --- /dev/null +++ b/source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h @@ -0,0 +1,111 @@ +/***************************************************//** + * @file Polynomial.h + * @date February 2011 + * @author Ocean Optics, Inc. + * + * The template type for this class must be either + * double or float. Any other type may cause unexpected + * results or a failure to compile. + * + * The implementation for this class is also contained + * in the header file so that it is compiled consistently + * when needed. Otherwise, there could be linker + * issues. + * + * LICENSE: + * + * SeaBreeze Copyright (C) 2014, Ocean Optics Inc + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ******************************************************/ +#ifndef POLYNOMIAL_H +#define POLYNOMIAL_H + +#include + +namespace seabreeze { + template + class Polynomial { + public: + Polynomial(std::vector *coefficients); + Polynomial(T *coefficients, unsigned int length); + ~Polynomial(); + T evaluate(T x); + private: + std::vector *coefficients; + }; + + template + Polynomial::Polynomial(std::vector *coeffs) { + unsigned int i; + + if(NULL == coeffs) { + this->coefficients = new std::vector(0); + } else { + this->coefficients = new std::vector(coeffs->size()); + } + for(i = 0; i < coeffs->size(); i++) { + (*(this->coefficients))[i] = (*coeffs)[i]; + } + } + + template + Polynomial::Polynomial(T *coeffs, unsigned int length) { + unsigned int i; + + if(NULL == coeffs) { + this->coefficients = new std::vector(0); + } else { + this->coefficients = new std::vector(length); + } + for(i = 0; i < length; i++) { + (*(this->coefficients))[i] = coeffs[i]; + } + } + + + template + Polynomial::~Polynomial() { + delete this->coefficients; + } + + + template + T Polynomial::evaluate(T x) { + T acc; + T retval = 0.0; + unsigned int order; + + if(NULL == this->coefficients || 0 == this->coefficients->size()) { + return 0; + } + + retval = this->coefficients->at(0); /* Initialize to A */ + acc = 1; + for(order = 1; order < this->coefficients->size(); order++) { + acc *= x; + retval += this->coefficients->at(order) * acc; /* Add x^n term (Bx^2, Cx^3, ...) */ + } + return retval; + } + +} + +#endif /* POLYNOMIAL_H */ diff --git a/source/Settings/SystemConfigger.cpp b/source/Settings/SystemConfigger.cpp index 46e8800..d5cf283 100644 --- a/source/Settings/SystemConfigger.cpp +++ b/source/Settings/SystemConfigger.cpp @@ -92,6 +92,18 @@ return 0; } + int ZZ_SysConfigger::GetECParams(EContext &struEC) + { + struEC = m_struEC; + return 0; + } + + int ZZ_SysConfigger::GetMECParams(MEContext &struMEC) + { + struMEC = m_struMEC; + return 0; + } + int ZZ_SysConfigger::LoadSettingsFromFile_IS1() { m_struIS1Info.qstrCalFile_U0 = m_qjoJObj.value("IS1UpCalFile").toString(); diff --git a/source/Settings/SystemConfigger.h b/source/Settings/SystemConfigger.h index 6f237a2..868d821 100644 --- a/source/Settings/SystemConfigger.h +++ b/source/Settings/SystemConfigger.h @@ -14,6 +14,8 @@ public: public: int Initialize(); int GetGrabberRunParams(RunTimeGrabberParams &struGrabberRTParams); + int GetECParams(EContext &struEC); + int GetMECParams(MEContext &struMEC); int LoadSettingsFromFile_IS1(); int LoadSettingsFromFile_iSIF(); @@ -33,7 +35,7 @@ public: Q_ENUM(ConfiggerDeviceModel); //////////////////////////////////////////////////////////////////////////run-time settings AcqTimeSettings m_struAcqTime; - FSContext m_struDeviceContext; + FSContext m_struDeviceContext; AcqPosSettings m_struAcqPosition; ////////////////////////////////////////////////////////////////////////// EContext m_struEC; diff --git a/source/Thread/AbstractFSController.cpp b/source/Thread/AbstractFSController.cpp index 8aebeed..9bfffb9 100644 --- a/source/Thread/AbstractFSController.cpp +++ b/source/Thread/AbstractFSController.cpp @@ -33,21 +33,47 @@ int CAbstractFSController::InitializeFSControl() switch (m_fsInfo.ucDeviceModel) { case DeviceModel::OSIFAlpha: - + m_pFSCtrl = new OceanOptics_lib; + if (m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, m_fsInfo.strSN) != 0) + { + qDebug() << "OSIFAlpha Not Opened"; + return 2; + } break; case DeviceModel::OSIFBeta: + m_pFSCtrl = new OceanOptics_lib; +// if (m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, m_fsInfo.strSN) !=0) +// { +// qDebug() << "OSIFBeta Not Opened"; +// return 2; +// } break; case DeviceModel::ISIF: m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, NULL); + if (m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, m_fsInfo.strSN) != 0) + { + qDebug() << "ISIF Not Opened"; + return 3; + } break; case DeviceModel::IS1: m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, NULL); + if (m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, m_fsInfo.strSN) != 0) + { + qDebug() << "IS1 Not Opened"; + return 3; + } break; case DeviceModel::IS2: m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, NULL); + if (m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, m_fsInfo.strSN) != 0) + { + qDebug() << "IS2 Not Opened"; + return 3; + } break; default: break; @@ -55,20 +81,69 @@ int CAbstractFSController::InitializeFSControl() return 0; } -int CAbstractFSController::StartAcquisition() +int CAbstractFSController::PerformAutoExposure() +{ + qDebug() << "Starting PerformAutoExposure" << " Thread ID:" << m_iThreadID; + QThread::msleep(5000); + qDebug() << "Stop PerformAutoExposure" << " Thread ID:" << m_iThreadID; + //emit SignalAcqFinished(m_iThreadID, 1); + return 0; +} + +int CAbstractFSController::TakeDarkFrame() +{ + qDebug() << "Starting TakeDarkFrame" << " Thread ID:" << m_iThreadID; + QThread::msleep(1000); + qDebug() << "Stop TakeDarkFrame" << " Thread ID:" << m_iThreadID; + //emit SignalAcqFinished(m_iThreadID, 1); + return 0; +} + +int CAbstractFSController::TakeSignal() +{ + qDebug() << "Starting TakeSignal" << " Thread ID:" << m_iThreadID; + QThread::msleep(5000); + qDebug() << "Stop TakeSignal" << " Thread ID:" << m_iThreadID; + //emit SignalAcqFinished(m_iThreadID, 1); + return 0; +} + +int CAbstractFSController::SaveDataFile() +{ + return 0; +} + +int CAbstractFSController::StartAcquisitionSignal() { // - qDebug() << "Starting acq" << " Thread ID:" << m_iThreadID; - QThread::msleep(5000); - qDebug() << "Stop acq" << " Thread ID:" << m_iThreadID; - emit SignalAcqFinished(m_iThreadID, 1); + qDebug() << "Starting acq Signal" << " Thread ID:" << m_iThreadID; +// DataFrame struDF; +// int iii; +// m_pFSCtrl->SetExposureTime(10000000); +// m_pFSCtrl->GetExposureTime(iii); +// m_pFSCtrl->SingleShot(struDF); + PerformAutoExposure(); + TakeSignal(); + + qDebug() << "Stop acq Signal" << " Thread ID:" << m_iThreadID; + emit SignalAcqFinished_Signal(m_iThreadID, 1); + return 0; +} + +int CAbstractFSController::StartAcquisitionDark() +{ + qDebug() << "Starting acq Dark" << " Thread ID:" << m_iThreadID; + TakeDarkFrame(); + qDebug() << "Stop acq Dark"<< " Thread ID:" << m_iThreadID; + emit SignalAcqFinished_Dark(m_iThreadID, 1); + return 0; } int CAbstractFSController::StopAcquisition() { - return 0; } + diff --git a/source/Thread/AbstractFSController.h b/source/Thread/AbstractFSController.h index 0788356..5a52126 100644 --- a/source/Thread/AbstractFSController.h +++ b/source/Thread/AbstractFSController.h @@ -1,6 +1,7 @@ #pragma once #include "pch.h" #include "ATPControl_Serial_QT.h" +#include "OControl_USB.h" #include typedef struct tagFSInfo @@ -23,16 +24,27 @@ public: //create derived class from base class virtual int InitializeFSControl(); + DataFrame GetLastDataFrame(); + private: CIrisFSBase *m_pFSCtrl; int m_iThreadID; FSInfo m_fsInfo; + DataFrame m_dfDark,m_dfSignal; +private: + int PerformAutoExposure(); + int TakeDarkFrame(); + int TakeSignal(); + int SaveDataFile(); public slots: - virtual int StartAcquisition(); + virtual int StartAcquisitionSignal(); + virtual int StartAcquisitionDark(); + virtual int StopAcquisition(); signals: void SignalAcqStarted(); - void SignalAcqFinished(int iThreadID, int iFlagStatus); + void SignalAcqFinished_Signal(int iThreadID, int iFlagStatus); + void SignalAcqFinished_Dark (int iThreadID, int iFlagStatus); }; \ No newline at end of file diff --git a/source/Thread/MainDataGrabber.cpp b/source/Thread/MainDataGrabber.cpp index 21e77ee..838eb15 100644 --- a/source/Thread/MainDataGrabber.cpp +++ b/source/Thread/MainDataGrabber.cpp @@ -2,7 +2,10 @@ CMainDataGrabber::CMainDataGrabber(QObject* parent /*= nullptr*/) { - m_piFlagCaptureThreadStatus = NULL; + m_piFlagCaptureThreadStatus_Signal = NULL; + m_piFlagCaptureThreadStatus_Dark = NULL; + m_GrabTimer = new QTimer(this); + m_iFlagIsCapturing = false; } CMainDataGrabber::~CMainDataGrabber() @@ -16,9 +19,21 @@ CMainDataGrabber::~CMainDataGrabber() } m_pControlThread.clear(); - if (m_piFlagCaptureThreadStatus!=NULL) + if (m_piFlagCaptureThreadStatus_Signal!=NULL) { - delete m_piFlagCaptureThreadStatus; + delete m_piFlagCaptureThreadStatus_Signal; + } + + if (m_piFlagCaptureThreadStatus_Dark != NULL) + { + delete m_piFlagCaptureThreadStatus_Dark; + } + + + if (m_GrabTimer!=NULL) + { + m_GrabTimer->stop(); + delete m_GrabTimer; } } @@ -26,20 +41,34 @@ int CMainDataGrabber::SetGrabberParams(RunTimeGrabberParams struGrabberRTParams) { m_struAcqTime = struGrabberRTParams.atsParams; m_struDeviceContext = struGrabberRTParams.fscParams; + m_struAcqPosSetting = struGrabberRTParams.apsParams; + m_struLinearShutterContext = struGrabberRTParams.lscParam; + m_iTotalThreads = m_struDeviceContext.ucDeviceNumber; return 0; } int CMainDataGrabber::InitThreadStatus() { - if (m_piFlagCaptureThreadStatus!=NULL) + if (m_piFlagCaptureThreadStatus_Signal!=NULL) { - delete m_piFlagCaptureThreadStatus; + delete m_piFlagCaptureThreadStatus_Signal; } - m_piFlagCaptureThreadStatus = new int[m_iTotalThreads]; + m_piFlagCaptureThreadStatus_Signal = new int[m_iTotalThreads]; for (int i = 0; i < m_iTotalThreads; i++) { - m_piFlagCaptureThreadStatus[i] = 0; + m_piFlagCaptureThreadStatus_Signal[i] = 0; + } + + + if (m_piFlagCaptureThreadStatus_Dark != NULL) + { + delete m_piFlagCaptureThreadStatus_Dark; + } + m_piFlagCaptureThreadStatus_Dark = new int[m_iTotalThreads]; + for (int i = 0; i < m_iTotalThreads; i++) + { + m_piFlagCaptureThreadStatus_Dark[i] = 0; } return 0; } @@ -48,7 +77,8 @@ int CMainDataGrabber::InitializeWorkers() { for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++) { - m_piFlagCaptureThreadStatus[i] = 0; + m_piFlagCaptureThreadStatus_Signal[i] = 0; + m_piFlagCaptureThreadStatus_Dark[i] = 0; FSInfo fsInfo; fsInfo.iInterface = m_struDeviceContext.iInterface[i]; @@ -57,7 +87,7 @@ int CMainDataGrabber::InitializeWorkers() CAbstractFSController* m_pWorkThread = new CAbstractFSController; m_pWorkThread->SetRunParas(i, fsInfo); - //m_pWorkThread->InitializeFSControl(); + m_pWorkThread->InitializeFSControl(); m_pControlThread.push_back(m_pWorkThread); } return 0; @@ -82,23 +112,56 @@ int CMainDataGrabber::SetupMsgPipelines() for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++) { - connect(this, &CMainDataGrabber::SignalStartGrabOnce, m_pControlThread[i], &CAbstractFSController::StartAcquisition); - connect(m_pControlThread[i], &CAbstractFSController::SignalAcqFinished, this, &CMainDataGrabber::HandleThreadEvent); + connect(this, &CMainDataGrabber::SignalStartGrabOnce_Signal, m_pControlThread[i], &CAbstractFSController::StartAcquisitionSignal); + connect(this, &CMainDataGrabber::SignalStartGrabOnce_Dark, m_pControlThread[i], &CAbstractFSController::StartAcquisitionDark); + connect(m_pControlThread[i], &CAbstractFSController::SignalAcqFinished_Signal, this, &CMainDataGrabber::HandleThreadEvent_Signal); + connect(m_pControlThread[i], &CAbstractFSController::SignalAcqFinished_Dark, this, &CMainDataGrabber::HandleThreadEvent_Dark); } - connect(this, &CMainDataGrabber::SignalGrabOnceFinished, this, &CMainDataGrabber::GrabFinished); + connect(this, &CMainDataGrabber::SignalGrabOnceFinished, this, &CMainDataGrabber::GrabOnceFinished); + + connect(m_GrabTimer, &QTimer::timeout, this, &CMainDataGrabber::OnTimeCounter); + + connect(this, &CMainDataGrabber::SignalStartGrab, this, &CMainDataGrabber::StartGrabTimer); return 0; } -int CMainDataGrabber::HandleThreadEvent(int iThreadID, int iFlagStatus) +int CMainDataGrabber::StartGrab() { - m_piFlagCaptureThreadStatus[iThreadID] = iFlagStatus; + emit SignalStartGrab(); + return 0; +} + +int CMainDataGrabber::HandleThreadEvent_Signal(int iThreadID, int iFlagStatus) +{ + m_piFlagCaptureThreadStatus_Signal[iThreadID] = iFlagStatus; bool bFinished = true; for (int i = 0; i < m_iTotalThreads; i++) { - if (m_piFlagCaptureThreadStatus[i] != 1) + if (m_piFlagCaptureThreadStatus_Signal[i] != 1) + { + bFinished = false; + break; + } + } + + if (bFinished) + { + emit SignalStartGrabOnce_Dark(); + } + return 0; +} + +int CMainDataGrabber::HandleThreadEvent_Dark(int iThreadID, int iFlagStatus) +{ + m_piFlagCaptureThreadStatus_Dark[iThreadID] = iFlagStatus; + + bool bFinished = true; + for (int i = 0; i < m_iTotalThreads; i++) + { + if (m_piFlagCaptureThreadStatus_Dark[i] != 1) { bFinished = false; break; @@ -112,29 +175,74 @@ int CMainDataGrabber::HandleThreadEvent(int iThreadID, int iFlagStatus) return 0; } -int CMainDataGrabber::StartGrab() +int CMainDataGrabber::StartGrabTimer() { - m_iFlagIsCapturing = true; - emit SignalStartGrabOnce(); - while (m_iFlagIsCapturing) - { - QThread::msleep(1000); - } + //////////////////////////////////////////////////////////////////////////start + ////check start time +// bool bStopWait = false; +// while (!bStopWait) +// { +// QTime qtTime = QTime::currentTime(); +// if (m_struAcqTime.qtStartTime >= qtTime && qtTimestart(iIntervalInMS); + + //////////////////////////////////////////////////////////////////////////test +// m_iFlagIsCapturing = true; +// emit SignalStartGrabOnce(); +// while (m_iFlagIsCapturing) +// { +// QThread::msleep(1000); +// } +// +// m_iFlagIsCapturing = true; +// InitThreadStatus(); +// emit SignalStartGrabOnce(); +// while (m_iFlagIsCapturing) +// { +// QThread::msleep(1000); +// } +// qDebug() << "Allgrab stopped" << " Thread ID:" <<2; return 0; } -int CMainDataGrabber::GrabFinished() +int CMainDataGrabber::GrabOnceFinished() { m_iFlagIsCapturing = false; return 0; } +int CMainDataGrabber::OnTimeCounter() +{ + + if (m_iFlagIsCapturing) + { + qDebug() << "busy"; + return 0; + } + m_iFlagIsCapturing = true; + m_struAcqPosSetting.iTotalPosition = 5; + + emit SignalStartGrabOnce_Signal(); + for (int i=0;i< m_struAcqPosSetting.iTotalPosition;i++) + { + + + m_iFlagIsCapturing = true; + while (m_iFlagIsCapturing) + { + QThread::msleep(1000); + } + + } + + + return 0; +} + diff --git a/source/Thread/MainDataGrabber.h b/source/Thread/MainDataGrabber.h index 3d3abb2..b0b943a 100644 --- a/source/Thread/MainDataGrabber.h +++ b/source/Thread/MainDataGrabber.h @@ -17,13 +17,19 @@ private: vector m_pControlThread; vector m_pqThreadHolder; - int *m_piFlagCaptureThreadStatus; + int *m_piFlagCaptureThreadStatus_Signal; + int *m_piFlagCaptureThreadStatus_Dark; int m_iTotalThreads; - int m_iFlagIsCapturing; - AcqTimeSettings m_struAcqTime; - FSContext m_struDeviceContext; + + FSContext m_struDeviceContext; + LSContext m_struLinearShutterContext; + AcqPosSettings m_struAcqPosSetting; + AcqTimeSettings m_struAcqTime; + + + QTimer *m_GrabTimer; public: //Call this first @@ -32,17 +38,24 @@ public: int InitThreadStatus(); int InitializeWorkers(); int StartWorkers(); - int SetupMsgPipelines(); -public slots: - int HandleThreadEvent(int iThreadID, int iFlagStatus); int StartGrab(); - int GrabFinished(); + +public slots: + int HandleThreadEvent_Signal(int iThreadID, int iFlagStatus); + int HandleThreadEvent_Dark(int iThreadID, int iFlagStatus); + int StartGrabTimer(); + int GrabOnceFinished(); + int OnTimeCounter(); signals: - void SignalStartGrabOnce(); - void SignalStopGrab(); + void SignalStartGrabOnce_Signal(); + void SignalStartGrabOnce_Dark(); + void SignalGrabOnceFinished(); + + + void SignalStopGrab(); void SignalStartGrab(); }; \ No newline at end of file